1/* 2 * 3 * Copyright 1998 Sun Microsystems, Inc. All rights reserved. 4 * Use is subject to license terms. 5 * 6 * 7 * Comments: 8 * 9 */ 10 11#pragma ident "%Z%%M% %I% %E% SMI" 12 13#include <stdio.h> 14#include <string.h> 15 16#ifdef MACOS 17#include "macos.h" 18#endif /* MACOS */ 19 20#if !defined( MACOS ) && !defined( DOS ) 21#include <sys/types.h> 22#include <sys/socket.h> 23#endif 24 25#include "lber.h" 26#include "ldap.h" 27#include "ldap-private.h" 28#include "ldap-int.h" 29 30BerElement * ldap_build_rename_req ( LDAP *ld, char *dn, char *newrdn, char *newparent, 31 int deleteoldrdn, LDAPControl **serverctrls) 32{ 33 BerElement *ber; 34 int rc; 35 36 /* 37 * A modify rdn request looks like this: 38 * ModifyRDNRequest ::= SEQUENCE { 39 * entry LDAPDN, 40 * newrdn RelativeLDAPDN, 41 * deleteoldrdn BOOLEAN 42 * newSuperior [0] LDAPDN OPTIONAL 43 * } 44 */ 45 46 /* create a message to send */ 47 if ( (ber = alloc_ber_with_options( ld )) == NULLBER ) { 48 return( NULLBER ); 49 } 50 51 if ( ber_printf( ber, "{it{ssb", ++ld->ld_msgid, LDAP_REQ_MODRDN, dn, 52 newrdn, deleteoldrdn ) == -1 ) { 53 ld->ld_errno = LDAP_ENCODING_ERROR; 54 ber_free( ber, 1 ); 55 return( NULLBER ); 56 } 57 58 if (newparent) { 59 if ( ber_printf( ber, "ts}", LDAP_TAG_NEWPARENT, newparent) == -1){ 60 ld->ld_errno = LDAP_ENCODING_ERROR; 61 ber_free( ber, 1 ); 62 return( NULLBER ); 63 } 64 65 } else if ( ber_printf( ber, "}" ) == -1 ) { 66 ld->ld_errno = LDAP_ENCODING_ERROR; 67 ber_free( ber, 1 ); 68 return( NULLBER ); 69 } 70 /* LDAPv3 */ 71 /* Code controls if any */ 72 if (serverctrls && serverctrls[0]) { 73 if (ldap_controls_code(ber, serverctrls) != LDAP_SUCCESS){ 74 ld->ld_errno = LDAP_ENCODING_ERROR; 75 ber_free( ber, 1 ); 76 return( NULLBER ); 77 } 78 } else if (ld->ld_srvctrls && ld->ld_srvctrls[0]) { 79 /* Otherwise, is there any global server ctrls ? */ 80 if (ldap_controls_code(ber, ld->ld_srvctrls) != LDAP_SUCCESS){ 81 ld->ld_errno = LDAP_ENCODING_ERROR; 82 ber_free( ber, 1 ); 83 return( NULLBER ); 84 } 85 } 86 87 if ( ber_printf( ber, "}" ) == -1 ) { 88 ld->ld_errno = LDAP_ENCODING_ERROR; 89 ber_free( ber, 1 ); 90 return( NULLBER ); 91 } 92 93 return (ber); 94} 95 96/* ldap_rename - Modify the name of an entry. 97 * Parameters : 98 * ld : LDAP descriptor. 99 * dn : DN of the object to rename. 100 * newrdn : New RDN to give to the entry. 101 * newparent : the parent or superior entry. If NULL only RDN is changed. 102 * "" means the root DN. 103 * deleteoldrdn : Boolean to indicate wether or not to remove the old RDN value. 104 * serverctrls : List of Server controls. 105 * clientctrls : List of client controls. 106 * msgidp : the msg id return if renamed succeded. 107 */ 108 109int ldap_rename(LDAP *ld, char *dn, char *newrdn, char *newparent, int deleteoldrdn, 110 LDAPControl ** serverctrls, LDAPControl **clientctrls, int *msgidp) 111{ 112 BerElement *ber; 113 int rv; 114 115#ifdef _REENTRANT 116 LOCK_LDAP(ld); 117#endif 118 Debug( LDAP_DEBUG_TRACE, catgets(slapdcat, 1, 87, "ldap_rename\n"), 0, 0, 0 ); 119 120 if ((ber = ldap_build_rename_req(ld, dn, newrdn, newparent, deleteoldrdn, serverctrls)) == NULLBER){ 121 rv = ld->ld_errno; 122 if (rv == LDAP_SUCCESS) 123 rv = LDAP_OTHER; 124#ifdef _REENTRANT 125 UNLOCK_LDAP(ld); 126#endif 127 return (rv); 128 } 129 130 /* send the message */ 131 rv = send_initial_request( ld, LDAP_REQ_MODRDN, dn, ber ); 132 if (rv == -1) { 133 rv = ld->ld_errno; 134 if (rv == LDAP_SUCCESS){ 135 rv = LDAP_OTHER; 136 } 137 138#ifdef _REENTRANT 139 UNLOCK_LDAP(ld); 140#endif 141 return (rv); 142 } 143 144 *msgidp = rv; 145#ifdef _REENTRANT 146 UNLOCK_LDAP(ld); 147#endif 148 return (LDAP_SUCCESS); 149 150} 151 152 153int ldap_rename_s(LDAP *ld, char *dn, char *newrdn, char *newparent, int deleteoldrdn, 154 LDAPControl ** serverctrls, LDAPControl **clientctrls) 155{ 156 int msgid; 157 int retcode = LDAP_SUCCESS; 158 LDAPMessage *res; 159 160 if ((retcode = ldap_rename(ld, dn, newrdn, newparent, deleteoldrdn, serverctrls, clientctrls, &msgid)) != LDAP_SUCCESS) 161 return (retcode); 162 if (ldap_result(ld, msgid, 1, (struct timeval *)NULL, &res ) == -1) 163 return (ld->ld_errno ); 164 165#ifdef _REENTRANT 166 LOCK_LDAP(ld); 167#endif 168 retcode = ldap_parse_result( ld, res, &ld->ld_errno, &ld->ld_matched, &ld->ld_error, 169 &ld->ld_referrals, &ld->ld_ret_ctrls, 1); 170 if (retcode == LDAP_SUCCESS) 171 retcode = ld->ld_errno; 172#ifdef _REENTRANT 173 UNLOCK_LDAP(ld); 174#endif 175 return (retcode); 176} 177