]> git.sur5r.net Git - openldap/blob - tests/progs/slapd-modrdn.c
Notices and Acknowledgements
[openldap] / tests / progs / slapd-modrdn.c
1 /* $OpenLDAP$ */
2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
3  *
4  * Copyright 1999-2003 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 #include <ldap.h>
34
35 #define LOOPS   100
36
37 static void
38 do_modrdn( char *uri, char *host, int port, char *manager, char *passwd, char *entry, int maxloop );
39
40 static void
41 usage( char *name )
42 {
43         fprintf( stderr, "usage: %s [-h <host>] -p port -D <managerDN> -w <passwd> -e <entry> [-l <loops>]\n",
44                         name );
45         exit( EXIT_FAILURE );
46 }
47
48 int
49 main( int argc, char **argv )
50 {
51         int             i;
52         char            *uri = NULL;
53         char        *host = "localhost";
54         int                     port = -1;
55         char            *manager = NULL;
56         char            *passwd = NULL;
57         char            *entry = NULL;
58         int                     loops = LOOPS;
59
60         while ( (i = getopt( argc, argv, "H:h:p:D:w:e:l:" )) != EOF ) {
61                 switch( i ) {
62                         case 'H':               /* the server uri */
63                                 uri = strdup( optarg );
64                         break;
65                         case 'h':               /* the servers host */
66                                 host = strdup( optarg );
67                         break;
68
69                         case 'p':               /* the servers port */
70                                 port = atoi( optarg );
71                                 break;
72                         case 'D':               /* the servers manager */
73                                 manager = strdup( optarg );
74                         break;
75
76                         case 'w':               /* the server managers password */
77                                 passwd = strdup( optarg );
78                         break;
79                         case 'e':               /* entry to rename */
80                                 entry = strdup( optarg );
81                                 break;
82
83                         case 'l':               /* the number of loops */
84                                 loops = atoi( optarg );
85                                 break;
86
87                         default:
88                                 usage( argv[0] );
89                                 break;
90                 }
91         }
92
93         if (( entry == NULL ) || ( port == -1 && uri == NULL ))
94                 usage( argv[0] );
95
96         if ( *entry == '\0' ) {
97
98                 fprintf( stderr, "%s: invalid EMPTY entry DN.\n",
99                                 argv[0] );
100                 exit( EXIT_FAILURE );
101
102         }
103
104         do_modrdn( uri, host, port, manager, passwd, entry, loops );
105         exit( EXIT_SUCCESS );
106 }
107
108
109 static void
110 do_modrdn( char *uri, char *host, int port, char *manager,
111         char *passwd, char *entry, int maxloop )
112 {
113         LDAP    *ld = NULL;
114         int     i;
115         pid_t   pid;
116         char *DNs[2];
117         char *rdns[2];
118
119         pid = getpid();
120         DNs[0] = entry;
121         DNs[1] = strdup( entry );
122
123         /* reverse the RDN, make new DN */
124         {
125                 char *p1, *p2;
126
127                 p1 = strchr( entry, '=' ) + 1;
128                 p2 = strchr( p1, ',' );
129
130                 *p2 = '\0';
131                 rdns[1] = strdup( entry );
132                 *p2-- = ',';
133
134                 for (i = p1 - entry;p2 >= p1;)
135                         DNs[1][i++] = *p2--;
136                 
137                 DNs[1][i] = '\0';
138                 rdns[0] = strdup( DNs[1] );
139                 DNs[1][i] = ',';
140         }
141                 
142         if ( uri ) {
143                 ldap_initialize( &ld, uri );
144         } else {
145                 ld = ldap_init( host, port );
146         }
147         if ( ld == NULL ) {
148                 perror( "ldap_init" );
149                 exit( EXIT_FAILURE );
150         }
151
152         {
153                 int version = LDAP_VERSION3;
154                 (void) ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION,
155                         &version ); 
156         }
157
158         if ( ldap_bind_s( ld, manager, passwd, LDAP_AUTH_SIMPLE ) != LDAP_SUCCESS ) {
159                 ldap_perror( ld, "ldap_bind" );
160                  exit( EXIT_FAILURE );
161         }
162
163
164         fprintf( stderr, "PID=%ld - Modrdn(%d): entry=\"%s\".\n",
165                  (long) pid, maxloop, entry );
166
167         for ( i = 0; i < maxloop; i++ ) {
168                 int         rc;
169
170                 if (( rc = ldap_modrdn2_s( ld, DNs[0], rdns[0], 0 ))
171                         != LDAP_SUCCESS ) {
172                         ldap_perror( ld, "ldap_modrdn" );
173                         if ( rc != LDAP_NO_SUCH_OBJECT ) break;
174                         continue;
175                 }
176                 if (( rc = ldap_modrdn2_s( ld, DNs[1], rdns[1], 1 ))
177                         != LDAP_SUCCESS ) {
178                         ldap_perror( ld, "ldap_modrdn" );
179                         if ( rc != LDAP_NO_SUCH_OBJECT ) break;
180                         continue;
181                 }
182         }
183
184         fprintf( stderr, " PID=%ld - Modrdn done.\n", (long) pid );
185
186         ldap_unbind( ld );
187 }
188
189