]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/modrdn.c
Happy New Year
[openldap] / libraries / libldap / modrdn.c
index 4d033fc875043fa3918377adb7527429854fd5a2..72198b3456b52363dd1221a77230a71dcd3b6d4d 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2014 The OpenLDAP Foundation.
+ * Copyright 1998-2018 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  *     }
  */
 
-
-/*
- * ldap_rename - initiate an ldap extended modifyDN operation.
- *
- * Parameters:
- *     ld                              LDAP descriptor
- *     dn                              DN of the object to modify
- *     newrdn                  RDN to give the object
- *     deleteoldrdn    nonzero means to delete old rdn values from the entry
- *     newSuperior             DN of the new parent if applicable
- *
- * Returns the LDAP error code.
- */
-
-int
-ldap_rename(
+BerElement *
+ldap_build_moddn_req(
        LDAP *ld,
        LDAP_CONST char *dn,
        LDAP_CONST char *newrdn,
@@ -71,61 +57,96 @@ ldap_rename(
        int deleteoldrdn,
        LDAPControl **sctrls,
        LDAPControl **cctrls,
-       int *msgidp )
+       ber_int_t *msgidp )
 {
        BerElement      *ber;
        int rc;
-       ber_int_t id;
-
-       Debug( LDAP_DEBUG_TRACE, "ldap_rename\n", 0, 0, 0 );
-
-       /* check client controls */
-       rc = ldap_int_client_controls( ld, cctrls );
-       if( rc != LDAP_SUCCESS ) return rc;
 
        /* create a message to send */
        if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
-               return( LDAP_NO_MEMORY );
+               return( NULL );
        }
 
-       LDAP_NEXT_MSGID( ld, id );
+       LDAP_NEXT_MSGID( ld, *msgidp );
        if( newSuperior != NULL ) {
                /* must be version 3 (or greater) */
                if ( ld->ld_version < LDAP_VERSION3 ) {
                        ld->ld_errno = LDAP_NOT_SUPPORTED;
                        ber_free( ber, 1 );
-                       return( ld->ld_errno );
+                       return( NULL );
                }
                rc = ber_printf( ber, "{it{ssbtsN}", /* '}' */ 
-                       id, LDAP_REQ_MODDN,
+                       *msgidp, LDAP_REQ_MODDN,
                        dn, newrdn, (ber_int_t) deleteoldrdn,
                        LDAP_TAG_NEWSUPERIOR, newSuperior );
 
        } else {
                rc = ber_printf( ber, "{it{ssbN}", /* '}' */ 
-                       id, LDAP_REQ_MODDN,
+                       *msgidp, LDAP_REQ_MODDN,
                        dn, newrdn, (ber_int_t) deleteoldrdn );
        }
 
        if ( rc < 0 ) {
                ld->ld_errno = LDAP_ENCODING_ERROR;
                ber_free( ber, 1 );
-               return( ld->ld_errno );
+               return( NULL );
        }
 
        /* Put Server Controls */
        if( ldap_int_put_controls( ld, sctrls, ber ) != LDAP_SUCCESS ) {
                ber_free( ber, 1 );
-               return ld->ld_errno;
+               return( NULL );
        }
 
        rc = ber_printf( ber, /*{*/ "N}" );
        if ( rc < 0 ) {
                ld->ld_errno = LDAP_ENCODING_ERROR;
                ber_free( ber, 1 );
-               return( ld->ld_errno );
+               return( NULL );
        }
 
+       return( ber );
+}
+
+/*
+ * ldap_rename - initiate an ldap extended modifyDN operation.
+ *
+ * Parameters:
+ *     ld                              LDAP descriptor
+ *     dn                              DN of the object to modify
+ *     newrdn                  RDN to give the object
+ *     deleteoldrdn    nonzero means to delete old rdn values from the entry
+ *     newSuperior             DN of the new parent if applicable
+ *
+ * Returns the LDAP error code.
+ */
+
+int
+ldap_rename(
+       LDAP *ld,
+       LDAP_CONST char *dn,
+       LDAP_CONST char *newrdn,
+       LDAP_CONST char *newSuperior,
+       int deleteoldrdn,
+       LDAPControl **sctrls,
+       LDAPControl **cctrls,
+       int *msgidp )
+{
+       BerElement      *ber;
+       int rc;
+       ber_int_t id;
+
+       Debug( LDAP_DEBUG_TRACE, "ldap_rename\n", 0, 0, 0 );
+
+       /* check client controls */
+       rc = ldap_int_client_controls( ld, cctrls );
+       if( rc != LDAP_SUCCESS ) return rc;
+
+       ber = ldap_build_moddn_req( ld, dn, newrdn, newSuperior,
+               deleteoldrdn, sctrls, cctrls, &id );
+       if( !ber )
+               return ld->ld_errno;
+
        /* send the message */
        *msgidp = ldap_send_initial_request( ld, LDAP_REQ_MODRDN, dn, ber, id );