]> git.sur5r.net Git - openldap/blob - tests/progs/slapd-modrdn.c
Update BDB requirements
[openldap] / tests / progs / slapd-modrdn.c
1 /* $OpenLDAP$ */
2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
3  *
4  * Copyright 1999-2007 The OpenLDAP Foundation.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted only as authorized by the OpenLDAP
9  * Public License.
10  *
11  * A copy of this license is available in file LICENSE in the
12  * top-level directory of the distribution or, alternatively, at
13  * <http://www.OpenLDAP.org/license.html>.
14  */
15 /* ACKNOWLEDGEMENTS:
16  * This work was initially developed by Howard Chu, based in part
17  * on other OpenLDAP test tools, for inclusion in OpenLDAP Software.
18  */
19
20 #include "portable.h"
21
22 #include <stdio.h>
23
24 #include <ac/stdlib.h>
25
26 #include <ac/ctype.h>
27 #include <ac/param.h>
28 #include <ac/socket.h>
29 #include <ac/string.h>
30 #include <ac/unistd.h>
31 #include <ac/wait.h>
32
33 #define LDAP_DEPRECATED 1
34 #include <ldap.h>
35 #include <lutil.h>
36
37 #define LOOPS   100
38 #define RETRIES 0
39
40 static void
41 do_modrdn( char *uri, char *host, int port, char *manager, char *passwd,
42                 char *entry, int maxloop, int maxretries, int delay,
43                 int friendly );
44
45 static void
46 usage( char *name )
47 {
48         fprintf( stderr,
49                 "usage: %s "
50                 "-H <uri> | ([-h <host>] -p <port>) "
51                 "-D <manager> "
52                 "-w <passwd> "
53                 "-e <entry> "
54                 "[-l <loops>] "
55                 "[-r <maxretries>] "
56                 "[-t <delay>] "
57                 "[-F]\n",
58                         name );
59         exit( EXIT_FAILURE );
60 }
61
62 int
63 main( int argc, char **argv )
64 {
65         int             i;
66         char            *uri = NULL;
67         char            *host = "localhost";
68         int             port = -1;
69         char            *manager = NULL;
70         char            *passwd = NULL;
71         char            *entry = NULL;
72         int             loops = LOOPS;
73         int             retries = RETRIES;
74         int             delay = 0;
75         int             friendly = 0;
76
77         while ( (i = getopt( argc, argv, "FH:h:p:D:w:e:l:r:t:" )) != EOF ) {
78                 switch( i ) {
79                 case 'F':
80                         friendly++;
81                         break;
82
83                 case 'H':               /* the server uri */
84                         uri = strdup( optarg );
85                         break;
86
87                 case 'h':               /* the servers host */
88                         host = strdup( optarg );
89                         break;
90
91                 case 'p':               /* the servers port */
92                         if ( lutil_atoi( &port, optarg ) != 0 ) {
93                                 usage( argv[0] );
94                         }
95                         break;
96
97                 case 'D':               /* the servers manager */
98                         manager = strdup( optarg );
99                         break;
100
101                 case 'w':               /* the server managers password */
102                         passwd = strdup( optarg );
103                         break;
104
105                 case 'e':               /* entry to rename */
106                         entry = strdup( optarg );
107                         break;
108
109                 case 'l':               /* the number of loops */
110                         if ( lutil_atoi( &loops, optarg ) != 0 ) {
111                                 usage( argv[0] );
112                         }
113                         break;
114
115                 case 'r':               /* the number of retries */
116                         if ( lutil_atoi( &retries, optarg ) != 0 ) {
117                                 usage( argv[0] );
118                         }
119                         break;
120
121                 case 't':               /* delay in seconds */
122                         if ( lutil_atoi( &delay, optarg ) != 0 ) {
123                                 usage( argv[0] );
124                         }
125                         break;
126
127                 default:
128                         usage( argv[0] );
129                         break;
130                 }
131         }
132
133         if (( entry == NULL ) || ( port == -1 && uri == NULL ))
134                 usage( argv[0] );
135
136         if ( *entry == '\0' ) {
137
138                 fprintf( stderr, "%s: invalid EMPTY entry DN.\n",
139                                 argv[0] );
140                 exit( EXIT_FAILURE );
141
142         }
143
144         do_modrdn( uri, host, port, manager, passwd, entry,
145                         loops, retries, delay, friendly );
146         exit( EXIT_SUCCESS );
147 }
148
149
150 static void
151 do_modrdn( char *uri, char *host, int port, char *manager,
152         char *passwd, char *entry, int maxloop, int maxretries, int delay,
153         int friendly )
154 {
155         LDAP    *ld = NULL;
156         int     i = 0, do_retry = maxretries;
157         pid_t   pid;
158         char *DNs[2];
159         char *rdns[2];
160         int         rc = LDAP_SUCCESS;
161
162
163         pid = getpid();
164         DNs[0] = entry;
165         DNs[1] = strdup( entry );
166
167         /* reverse the RDN, make new DN */
168         {
169                 char *p1, *p2;
170
171                 p1 = strchr( entry, '=' ) + 1;
172                 p2 = strchr( p1, ',' );
173
174                 *p2 = '\0';
175                 rdns[1] = strdup( entry );
176                 *p2-- = ',';
177
178                 for (i = p1 - entry;p2 >= p1;)
179                         DNs[1][i++] = *p2--;
180                 
181                 DNs[1][i] = '\0';
182                 rdns[0] = strdup( DNs[1] );
183                 DNs[1][i] = ',';
184         }
185
186 retry:;
187         if ( uri ) {
188                 ldap_initialize( &ld, uri );
189         } else {
190                 ld = ldap_init( host, port );
191         }
192         if ( ld == NULL ) {
193                 perror( "ldap_init" );
194                 exit( EXIT_FAILURE );
195         }
196
197         {
198                 int version = LDAP_VERSION3;
199                 (void) ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION,
200                         &version ); 
201         }
202
203         if ( do_retry == maxretries ) {
204                 fprintf( stderr, "PID=%ld - Modrdn(%d): entry=\"%s\".\n",
205                         (long) pid, maxloop, entry );
206         }
207
208         rc = ldap_bind_s( ld, manager, passwd, LDAP_AUTH_SIMPLE );
209         if ( rc != LDAP_SUCCESS ) {
210                 ldap_perror( ld, "ldap_bind" );
211                 switch ( rc ) {
212                 case LDAP_BUSY:
213                 case LDAP_UNAVAILABLE:
214                         if ( do_retry > 0 ) {
215                                 do_retry--;
216                                 if ( delay > 0) {
217                                     sleep( delay );
218                                 }
219                                 goto retry;
220                         }
221                 /* fallthru */
222                 default:
223                         break;
224                 }
225                 exit( EXIT_FAILURE );
226         }
227
228         for ( ; i < maxloop; i++ ) {
229                 rc = ldap_modrdn2_s( ld, DNs[0], rdns[0], 0 );
230                 if ( rc != LDAP_SUCCESS ) {
231                         ldap_perror( ld, "ldap_modrdn" );
232                         switch ( rc ) {
233                         case LDAP_NO_SUCH_OBJECT:
234                                 /* NOTE: this likely means
235                                  * the second modrdn failed
236                                  * during the previous round... */
237                                 if ( !friendly ) {
238                                         goto done;
239                                 }
240                                 break;
241
242                         case LDAP_BUSY:
243                         case LDAP_UNAVAILABLE:
244                                 if ( do_retry > 0 ) {
245                                         do_retry--;
246                                         goto retry;
247                                 }
248                                 /* fall thru */
249
250                         default:
251                                 goto done;
252                         }
253                 }
254                 rc = ldap_modrdn2_s( ld, DNs[1], rdns[1], 1 );
255                 if ( rc != LDAP_SUCCESS ) {
256                         ldap_perror( ld, "ldap_modrdn" );
257                         switch ( rc ) {
258                         case LDAP_NO_SUCH_OBJECT:
259                                 /* NOTE: this likely means
260                                  * the first modrdn failed
261                                  * during the previous round... */
262                                 if ( !friendly ) {
263                                         goto done;
264                                 }
265                                 break;
266
267                         case LDAP_BUSY:
268                         case LDAP_UNAVAILABLE:
269                                 if ( do_retry > 0 ) {
270                                         do_retry--;
271                                         goto retry;
272                                 }
273                                 /* fall thru */
274
275                         default:
276                                 goto done;
277                         }
278                 }
279         }
280
281 done:;
282         fprintf( stderr, " PID=%ld - Modrdn done (%d).\n", (long) pid, rc );
283
284         ldap_unbind( ld );
285 }
286
287