X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fmodrdn.c;h=4d010c4563b2c8d7165e69ae27232223b3f2ed93;hb=91ebfc82ea75dee6b9751353c39220b8236f496e;hp=4d033fc875043fa3918377adb7527429854fd5a2;hpb=55957253ccf9e9e5dfa122194a0ab10659b0624f;p=openldap diff --git a/libraries/libldap/modrdn.c b/libraries/libldap/modrdn.c index 4d033fc875..4d010c4563 100644 --- a/libraries/libldap/modrdn.c +++ b/libraries/libldap/modrdn.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2014 The OpenLDAP Foundation. + * Copyright 1998-2017 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,22 +48,8 @@ * } */ - -/* - * 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 );