X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=inline;f=libraries%2Flibldap%2Fmodrdn.c;h=964942fd47a513d3ac8e5ea9cbe73bb37d21a0b0;hb=4d29df5bd1fabcdc50975651c746365686b62b53;hp=d148ab552b2b6e9f38bd6bb13015a25736b67a33;hpb=24fd4404d290693e107f73402d6b519e4c97b00f;p=openldap
diff --git a/libraries/libldap/modrdn.c b/libraries/libldap/modrdn.c
index d148ab552b..964942fd47 100644
--- a/libraries/libldap/modrdn.c
+++ b/libraries/libldap/modrdn.c
@@ -1,25 +1,44 @@
-/*
- * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
- */
-/* Portions
- * Copyright (c) 1990 Regents of the University of Michigan.
- * All rights reserved.
+/* $OpenLDAP$ */
+/* This work is part of OpenLDAP Software .
*
- * modrdn.c
- */
-
-/*
- * Support for MODIFYDN REQUEST V3 (newSuperior) by:
+ * Copyright 1998-2003 The OpenLDAP Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
*
- * Copyright 1999, Juan C. Gomez, All rights reserved.
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * .
+ */
+/* Portions Copyright (c) 1990 Regents of the University of Michigan.
+ * All rights reserved.
+ */
+/* Copyright 1999, Juan C. Gomez, All rights reserved.
* This software is not subject to any license of Silicon Graphics
* Inc. or Purdue University.
*
* Redistribution and use in source and binary forms are permitted
* without restriction or fee of any kind as long as this notice
* is preserved.
- *
+ */
+/* Portions Copyright (C) The Internet Society (1997)
+ * ASN.1 fragments are from RFC 2251; see RFC 2251 for full legal notices.
+ */
+
+/* ACKNOWLEDGEMENTS:
+ * Juan C. Gomez
+ */
+
+/*
+ * A modify rdn request looks like this:
+ * ModifyRDNRequest ::= SEQUENCE {
+ * entry DistinguishedName,
+ * newrdn RelativeDistinguishedName,
+ * deleteoldrdn BOOLEAN
+ * newSuperior [0] DistinguishedName [v3 only]
+ * }
*/
#include "portable.h"
@@ -33,163 +52,211 @@
#include "ldap-int.h"
/*
- * ldap_rename2 - initiate an ldap (and X.500) modifyDN operation. Parameters:
- * (LDAP V3 MODIFYDN REQUEST)
- * ld LDAP descriptor
- * dn DN of the object to modify
- * newrdn RDN to give the object
+ * 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
+ * newSuperior DN of the new parent if applicable
+ *
+ * Returns the LDAP error code.
*/
int
-ldap_rename2( LDAP *ld,
- char *dn,
- char *newrdn,
- int deleteoldrdn,
- char *newSuperior )
+ldap_rename(
+ LDAP *ld,
+ LDAP_CONST char *dn,
+ LDAP_CONST char *newrdn,
+ LDAP_CONST char *newSuperior,
+ int deleteoldrdn,
+ LDAPControl **sctrls,
+ LDAPControl **cctrls,
+ int *msgidp )
{
- /*
- * A modify rdn request looks like this:
- * ModifyRDNRequest ::= SEQUENCE {
- * entry DistinguishedName,
- * newrdn RelativeDistinguishedName,
- * deleteoldrdn BOOLEAN
- * newSuperior [0] DistinguishedName [v3 only]
- * }
- */
+ BerElement *ber;
+ int rc;
+ ber_int_t id;
- Debug( LDAP_DEBUG_TRACE, "ldap_rename2\n", 0, 0, 0 );
+#ifdef NEW_LOGGING
+ LDAP_LOG ( OPERATION, ENTRY, "ldap_rename\n", 0, 0, 0 );
+#else
+ Debug( LDAP_DEBUG_TRACE, "ldap_rename\n", 0, 0, 0 );
+#endif
- if( newSuperior != NULL ) {
- BerElement *ber;
-
- /* create a message to send */
- if ( (ber = ldap_alloc_ber_with_options( ld )) == NULLBER ) {
- return( -1 );
- }
-
- if ( ber_printf( ber, "{it{ssbts}}",
- ++ld->ld_msgid,
- LDAP_REQ_MODRDN,
- dn,
- newrdn,
- deleteoldrdn,
- LDAP_TAG_NEWSUPERIOR,
- newSuperior )
- == -1 ) {
+ /* check client controls */
+ rc = ldap_int_client_controls( ld, cctrls );
+ if( rc != LDAP_SUCCESS ) return rc;
- ld->ld_errno = LDAP_ENCODING_ERROR;
- ber_free( ber, 1 );
- return( -1 );
+ /* create a message to send */
+ if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
+ return( LDAP_NO_MEMORY );
+ }
- }
+ LDAP_NEXT_MSGID( ld, id );
+ 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 );
+ }
+ rc = ber_printf( ber, "{it{ssbtsN}", /* '}' */
+ id, LDAP_REQ_MODDN,
+ dn, newrdn, (ber_int_t) deleteoldrdn,
+ LDAP_TAG_NEWSUPERIOR, newSuperior );
- /* send the message */
- return ldap_send_initial_request( ld, LDAP_REQ_MODRDN, dn, ber );
-
} else {
+ rc = ber_printf( ber, "{it{ssbN}", /* '}' */
+ id, LDAP_REQ_MODDN,
+ dn, newrdn, (ber_int_t) deleteoldrdn );
+ }
- /* If no newSuperior fall through to ldap_modrdn2() */
+ if ( rc < 0 ) {
+ ld->ld_errno = LDAP_ENCODING_ERROR;
+ ber_free( ber, 1 );
+ return( ld->ld_errno );
+ }
+
+ /* Put Server Controls */
+ if( ldap_int_put_controls( ld, sctrls, ber ) != LDAP_SUCCESS ) {
+ ber_free( ber, 1 );
+ return ld->ld_errno;
+ }
- return ldap_modrdn2( ld, dn, newrdn, deleteoldrdn );
+ rc = ber_printf( ber, /*{*/ "N}" );
+ if ( rc < 0 ) {
+ ld->ld_errno = LDAP_ENCODING_ERROR;
+ ber_free( ber, 1 );
+ return( ld->ld_errno );
+ }
+ /* send the message */
+ *msgidp = ldap_send_initial_request( ld, LDAP_REQ_MODRDN, dn, ber, id );
+
+ if( *msgidp < 0 ) {
+ return( ld->ld_errno );
}
-}/* int ldap_rename2() */
+ return LDAP_SUCCESS;
+}
/*
- * ldap_modrdn2 - initiate an ldap (and X.500) modifyRDN operation. Parameters:
- *
+ * ldap_rename2 - initiate an ldap (and X.500) modifyDN operation. Parameters:
+ * (LDAP V3 MODIFYDN REQUEST)
* 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
*
- * Example:
- * msgid = ldap_modrdn( ld, dn, newrdn );
+ * ldap_rename2 uses a U-Mich Style API. It returns the msgid.
*/
+
int
-ldap_modrdn2( LDAP *ld, char *dn, char *newrdn, int deleteoldrdn )
+ldap_rename2(
+ LDAP *ld,
+ LDAP_CONST char *dn,
+ LDAP_CONST char *newrdn,
+ LDAP_CONST char *newSuperior,
+ int deleteoldrdn )
{
- BerElement *ber;
+ int msgid;
+ int rc;
- /*
- * A modify rdn request looks like this:
- * ModifyRDNRequest ::= SEQUENCE {
- * entry DistinguishedName,
- * newrdn RelativeDistinguishedName,
- * deleteoldrdn BOOLEAN
- * }
- */
+#ifdef NEW_LOGGING
+ LDAP_LOG ( OPERATION, ENTRY, "ldap_rename2\n", 0, 0, 0 );
+#else
+ Debug( LDAP_DEBUG_TRACE, "ldap_rename2\n", 0, 0, 0 );
+#endif
- Debug( LDAP_DEBUG_TRACE, "ldap_modrdn\n", 0, 0, 0 );
+ rc = ldap_rename( ld, dn, newrdn, newSuperior,
+ deleteoldrdn, NULL, NULL, &msgid );
- /* create a message to send */
- if ( (ber = ldap_alloc_ber_with_options( ld )) == NULLBER ) {
- return( -1 );
- }
+ return rc == LDAP_SUCCESS ? msgid : -1;
+}
- if ( ber_printf( ber, "{it{ssb}}", ++ld->ld_msgid, LDAP_REQ_MODRDN, dn,
- newrdn, deleteoldrdn ) == -1 ) {
- ld->ld_errno = LDAP_ENCODING_ERROR;
- ber_free( ber, 1 );
- return( -1 );
- }
- /* send the message */
- return ( ldap_send_initial_request( ld, LDAP_REQ_MODRDN, dn, ber ));
+/*
+ * ldap_modrdn2 - initiate an ldap modifyRDN 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
+ *
+ * Example:
+ * msgid = ldap_modrdn( ld, dn, newrdn );
+ */
+int
+ldap_modrdn2( LDAP *ld,
+ LDAP_CONST char *dn,
+ LDAP_CONST char *newrdn,
+ int deleteoldrdn )
+{
+ return ldap_rename2( ld, dn, newrdn, NULL, deleteoldrdn );
}
int
-ldap_modrdn( LDAP *ld, char *dn, char *newrdn )
+ldap_modrdn( LDAP *ld, LDAP_CONST char *dn, LDAP_CONST char *newrdn )
{
- return( ldap_modrdn2( ld, dn, newrdn, 1 ) );
+ return( ldap_rename2( ld, dn, newrdn, NULL, 1 ) );
}
+
int
-ldap_rename2_s( LDAP *ld, char *dn, char *newrdn, int deleteoldrdn,
- char *newSuperior )
+ldap_rename_s(
+ LDAP *ld,
+ LDAP_CONST char *dn,
+ LDAP_CONST char *newrdn,
+ LDAP_CONST char *newSuperior,
+ int deleteoldrdn,
+ LDAPControl **sctrls,
+ LDAPControl **cctrls )
{
- int msgid;
- LDAPMessage *res;
+ int rc;
+ int msgid;
+ LDAPMessage *res;
+ rc = ldap_rename( ld, dn, newrdn, newSuperior,
+ deleteoldrdn, sctrls, cctrls, &msgid );
- if ( (msgid = ldap_rename2( ld,
- dn,
- newrdn,
- deleteoldrdn,
- newSuperior ))
- == -1 )
- return( ld->ld_errno );
+ if( rc != LDAP_SUCCESS ) {
+ return rc;
+ }
- if ( ldap_result( ld, msgid, 1, (struct timeval *) NULL, &res )
- == -1 )
- return( ld->ld_errno );
+ rc = ldap_result( ld, msgid, 1, NULL, &res );
- return( ldap_result2error( ld, res, 1 ) );
+ if( rc == -1 ) {
+ return ld->ld_errno;
+ }
+ return ldap_result2error( ld, res, 1 );
}
int
-ldap_modrdn2_s( LDAP *ld, char *dn, char *newrdn, int deleteoldrdn )
+ldap_rename2_s(
+ LDAP *ld,
+ LDAP_CONST char *dn,
+ LDAP_CONST char *newrdn,
+ LDAP_CONST char *newSuperior,
+ int deleteoldrdn )
{
- int msgid;
- LDAPMessage *res;
-
- if ( (msgid = ldap_modrdn2( ld, dn, newrdn, deleteoldrdn )) == -1 )
- return( ld->ld_errno );
-
- if ( ldap_result( ld, msgid, 1, (struct timeval *) NULL, &res ) == -1 )
- return( ld->ld_errno );
+ return ldap_rename_s( ld, dn, newrdn, newSuperior,
+ deleteoldrdn, NULL, NULL );
+}
- return( ldap_result2error( ld, res, 1 ) );
+int
+ldap_modrdn2_s( LDAP *ld, LDAP_CONST char *dn, LDAP_CONST char *newrdn, int deleteoldrdn )
+{
+ return ldap_rename_s( ld, dn, newrdn, NULL, deleteoldrdn, NULL, NULL );
}
int
-ldap_modrdn_s( LDAP *ld, char *dn, char *newrdn )
+ldap_modrdn_s( LDAP *ld, LDAP_CONST char *dn, LDAP_CONST char *newrdn )
{
- return( ldap_modrdn2_s( ld, dn, newrdn, 1 ) );
+ return ldap_rename_s( ld, dn, newrdn, NULL, 1, NULL, NULL );
}