/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2014 The OpenLDAP Foundation.
+ * Copyright 1998-2016 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,
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 );