]> git.sur5r.net Git - openldap/blob - libraries/libldap/modrdn.c
Add ber_strdup(), remove ldap_int_strdup(), add LDAP_STRDUP macro
[openldap] / libraries / libldap / modrdn.c
1 /*
2  * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
3  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
4  */
5 /*  Portions
6  *  Copyright (c) 1990 Regents of the University of Michigan.
7  *  All rights reserved.
8  *
9  *  modrdn.c
10  */
11
12 /*
13  * Support for MODIFYDN REQUEST V3 (newSuperior) by:
14  *
15  * Copyright 1999, Juan C. Gomez, All rights reserved.
16  * This software is not subject to any license of Silicon Graphics 
17  * Inc. or Purdue University.
18  *
19  * Redistribution and use in source and binary forms are permitted
20  * without restriction or fee of any kind as long as this notice
21  * is preserved.
22  *
23  */
24
25 #include "portable.h"
26
27 #include <stdio.h>
28
29 #include <ac/socket.h>
30 #include <ac/string.h>
31 #include <ac/time.h>
32
33 #include "ldap-int.h"
34
35 /*
36  * ldap_rename - initiate an ldap extended modifyDN operation.
37  *
38  * Parameters:
39  *      ld                              LDAP descriptor
40  *      dn                              DN of the object to modify
41  *      newrdn                  RDN to give the object
42  *      deleteoldrdn    nonzero means to delete old rdn values from the entry
43  *      newSuperior             DN of the new parent if applicable
44  *
45  * Returns the LDAP error code.
46  */
47
48 int
49 ldap_rename(
50         LDAP *ld,
51         LDAP_CONST char *dn,
52         LDAP_CONST char *newrdn,
53         int deleteoldrdn,
54         LDAP_CONST char *newSuperior,
55         LDAPControl **sctrls,
56         LDAPControl **cctrls,
57         int *msgidp )
58 {
59         /*
60          * A modify rdn request looks like this:
61          *      ModifyRDNRequest ::= SEQUENCE {
62          *              entry           DistinguishedName,
63          *              newrdn          RelativeDistinguishedName,
64          *              deleteoldrdn    BOOLEAN
65          *              newSuperior     [0] DistinguishedName   [v3 only]
66          *      }
67          */
68
69         BerElement      *ber;
70         int rc;
71
72         Debug( LDAP_DEBUG_TRACE, "ldap_rename\n", 0, 0, 0 );
73
74         /* create a message to send */
75         if ( (ber = ldap_alloc_ber_with_options( ld )) == NULLBER ) {
76                 return( LDAP_NO_MEMORY );
77         }
78
79         if( newSuperior != NULL ) {
80                 /* must be version 3 (or greater) */
81                 if ( ld->ld_version == 0 ) {
82                         ld->ld_version = LDAP_VERSION3;
83                 }
84
85                 if ( ld->ld_version < LDAP_VERSION3 ) {
86                         ld->ld_errno = LDAP_NOT_SUPPORTED;
87                         ber_free( ber, 1 );
88                         return( ld->ld_errno );
89                 }
90
91                 rc = ber_printf( ber, "{it{ssbts}", /* leave '}' for later */ 
92                         ++ld->ld_msgid, LDAP_REQ_MODDN,
93                         dn, newrdn, deleteoldrdn,
94                         LDAP_TAG_NEWSUPERIOR, newSuperior );
95
96         } else {
97                 rc = ber_printf( ber, "{it{ssb}", /* leave '}' for later */ 
98                         ++ld->ld_msgid, LDAP_REQ_MODDN,
99                         dn, newrdn, deleteoldrdn );
100         }
101
102         if ( rc < 0 ) {
103                 ld->ld_errno = LDAP_ENCODING_ERROR;
104                 ber_free( ber, 1 );
105                 return( ld->ld_errno );
106         }
107
108         /* Put Server Controls */
109         if( ldap_int_put_controls( ld, sctrls, ber ) != LDAP_SUCCESS ) {
110                 ber_free( ber, 1 );
111                 return ld->ld_errno;
112         }
113
114         /* close the '{' */
115         rc = ber_printf( ber, "}" );
116         if ( rc < 0 ) {
117                 ld->ld_errno = LDAP_ENCODING_ERROR;
118                 ber_free( ber, 1 );
119                 return( ld->ld_errno );
120         }
121
122         /* send the message */
123         *msgidp = ldap_send_initial_request( ld, LDAP_REQ_MODRDN, dn, ber );
124         
125         if( *msgidp < 0 ) {
126                 return( ld->ld_errno );
127         }
128
129         return LDAP_SUCCESS;
130 }
131
132
133 /*
134  * ldap_rename2 - initiate an ldap (and X.500) modifyDN operation. Parameters:
135  *      (LDAP V3 MODIFYDN REQUEST)
136  *      ld              LDAP descriptor
137  *      dn              DN of the object to modify
138  *      newrdn          RDN to give the object
139  *      deleteoldrdn    nonzero means to delete old rdn values from the entry
140  *      newSuperior     DN of the new parent if applicable
141  *
142  * ldap_rename2 uses a U-Mich Style API.  It returns the msgid.
143  */
144
145 int
146 ldap_rename2(
147         LDAP *ld,
148         LDAP_CONST char *dn,
149         LDAP_CONST char *newrdn,
150         int deleteoldrdn,
151         LDAP_CONST char *newSuperior )
152 {
153         int msgid;
154         int rc;
155
156         Debug( LDAP_DEBUG_TRACE, "ldap_rename2\n", 0, 0, 0 );
157
158         rc = ldap_rename( ld, dn, newrdn, deleteoldrdn, newSuperior,
159                 NULL, NULL, &msgid );
160
161         return rc == LDAP_SUCCESS ? msgid : -1;
162 }
163
164
165 /*
166  * ldap_modrdn2 - initiate an ldap modifyRDN operation. Parameters:
167  *
168  *      ld              LDAP descriptor
169  *      dn              DN of the object to modify
170  *      newrdn          RDN to give the object
171  *      deleteoldrdn    nonzero means to delete old rdn values from the entry
172  *
173  * Example:
174  *      msgid = ldap_modrdn( ld, dn, newrdn );
175  */
176 int
177 ldap_modrdn2( LDAP *ld,
178         LDAP_CONST char *dn,
179         LDAP_CONST char *newrdn,
180         int deleteoldrdn )
181 {
182         return ldap_rename2( ld, dn, newrdn, deleteoldrdn, NULL );
183 }
184
185 int
186 ldap_modrdn( LDAP *ld, LDAP_CONST char *dn, LDAP_CONST char *newrdn )
187 {
188         return( ldap_rename2( ld, dn, newrdn, 1, NULL ) );
189 }
190
191
192 int
193 ldap_rename_s(
194         LDAP *ld,
195         LDAP_CONST char *dn,
196         LDAP_CONST char *newrdn,
197         int deleteoldrdn,
198         LDAP_CONST char *newSuperior,
199         LDAPControl **sctrls,
200         LDAPControl **cctrls )
201 {
202         int rc;
203         int msgid;
204         LDAPMessage *res;
205
206         rc = ldap_rename( ld, dn, newrdn, deleteoldrdn,
207                 newSuperior, sctrls, cctrls, &msgid );
208
209         if( rc != LDAP_SUCCESS ) {
210                 return rc;
211         }
212
213         rc = ldap_result( ld, msgid, 1, NULL, &res );
214
215         if( rc == -1 ) {
216                 return ld->ld_errno;
217         }
218
219         return ldap_result2error( ld, res, 1 );
220 }
221
222 int
223 ldap_rename2_s(
224         LDAP *ld,
225         LDAP_CONST char *dn,
226         LDAP_CONST char *newrdn,
227         int deleteoldrdn,
228         LDAP_CONST char *newSuperior )
229 {
230         return ldap_rename_s( ld, dn, newrdn, deleteoldrdn, newSuperior, NULL, NULL );
231 }
232
233 int
234 ldap_modrdn2_s( LDAP *ld, LDAP_CONST char *dn, LDAP_CONST char *newrdn, int deleteoldrdn )
235 {
236         return ldap_rename_s( ld, dn, newrdn, deleteoldrdn, NULL, NULL, NULL );
237 }
238
239 int
240 ldap_modrdn_s( LDAP *ld, LDAP_CONST char *dn, LDAP_CONST char *newrdn )
241 {
242         return ldap_rename_s( ld, dn, newrdn, 1, NULL, NULL, NULL );
243 }
244