]> git.sur5r.net Git - openldap/blob - tests/progs/slapd-addel.c
081cd9e2a53d16a37689d48b44eec92310857345
[openldap] / tests / progs / slapd-addel.c
1 #include "portable.h"
2
3 #include <stdio.h>
4 #include <stdlib.h>
5
6 #include <ac/ctype.h>
7 #include <ac/socket.h>
8 #include <ac/string.h>
9 #include <ac/unistd.h>
10 #include <ac/wait.h>
11
12 #ifdef HAVE_SYS_PARAM_H
13 #include <sys/param.h>
14 #endif
15
16 #include "lber.h"
17 #include "ldap.h"
18
19 #define LOOPS   100
20
21 static char *
22 get_add_entry( char *filename, LDAPMod ***mods );
23
24 static void
25 do_addel( char *host, int port, char *manager, char *passwd,
26         char *dn, LDAPMod **attrs, int maxloop );
27
28 static void
29 usage( char *name )
30 {
31         fprintf( stderr, "usage: %s [-h <host>] -p port -D <managerDN> -w <passwd> -f <addfile> [-l <loops>]\n",
32                         name );
33         exit( 1 );
34 }
35
36 int
37 main( int argc, char **argv )
38 {
39         int             i;
40         char        *host = "localhost";
41         int                     port = -1;
42         char            *manager = NULL;
43         char            *passwd = NULL;
44         char            *filename = NULL;
45         char            *entry = NULL;
46         int                     loops = LOOPS;
47         LDAPMod     **attrs = NULL;
48
49         while ( (i = getopt( argc, argv, "h:p:D:w:f:l:" )) != EOF ) {
50                 switch( i ) {
51                         case 'h':               /* the servers host */
52                                 host = strdup( optarg );
53                         break;
54
55                         case 'p':               /* the servers port */
56                                 port = atoi( optarg );
57                                 break;
58
59                         case 'D':               /* the servers manager */
60                                 manager = strdup( optarg );
61                         break;
62
63                         case 'w':               /* the server managers password */
64                                 passwd = strdup( optarg );
65                         break;
66
67                         case 'f':               /* file with entry search request */
68                                 filename = strdup( optarg );
69                                 break;
70
71                         case 'l':               /* the number of loops */
72                                 loops = atoi( optarg );
73                                 break;
74
75                         default:
76                                 usage( argv[0] );
77                                 break;
78                 }
79         }
80
81         if (( filename == NULL ) || ( port == -1 ) ||
82                                 ( manager == NULL ) || ( passwd == NULL ))
83                 usage( argv[0] );
84
85         entry = get_add_entry( filename, &attrs );
86         if (( entry == NULL ) || ( *entry == '\0' )) {
87
88                 fprintf( stderr, "%s: invalid entry DN in file \"%s\".\n",
89                                 argv[0], filename );
90                 exit( 1 );
91
92         }
93
94         if (( attrs == NULL ) || ( *attrs == '\0' )) {
95
96                 fprintf( stderr, "%s: invalid attrs in file \"%s\".\n",
97                                 argv[0], filename );
98                 exit( 1 );
99
100         }
101
102         do_addel( host, port, manager, passwd, entry, attrs, loops );
103
104         exit( 0 );
105 }
106
107
108 #define safe_realloc( ptr, size )   ( (ptr) == NULL ? malloc( size ) : \
109                                 realloc( ptr, size ))
110
111
112 static void
113 addmodifyop( LDAPMod ***pmodsp, int modop, char *attr, char *value, int vlen )
114 {
115     LDAPMod             **pmods;
116     int                 i, j;
117     struct berval       *bvp;
118
119     pmods = *pmodsp;
120     modop |= LDAP_MOD_BVALUES;
121
122     i = 0;
123     if ( pmods != NULL ) {
124                 for ( ; pmods[ i ] != NULL; ++i ) {
125                 if ( strcasecmp( pmods[ i ]->mod_type, attr ) == 0 &&
126                         pmods[ i ]->mod_op == modop ) {
127                                 break;
128                 }
129                 }
130     }
131
132     if ( pmods == NULL || pmods[ i ] == NULL ) {
133                 if (( pmods = (LDAPMod **)safe_realloc( pmods, (i + 2) *
134                         sizeof( LDAPMod * ))) == NULL ) {
135                         perror( "safe_realloc" );
136                         exit( 1 );
137                 }
138                 *pmodsp = pmods;
139                 pmods[ i + 1 ] = NULL;
140                 if (( pmods[ i ] = (LDAPMod *)calloc( 1, sizeof( LDAPMod )))
141                         == NULL ) {
142                         perror( "calloc" );
143                         exit( 1 );
144                 }
145                 pmods[ i ]->mod_op = modop;
146                 if (( pmods[ i ]->mod_type = strdup( attr )) == NULL ) {
147                 perror( "strdup" );
148                 exit( 1 );
149                 }
150     }
151
152     if ( value != NULL ) {
153                 j = 0;
154                 if ( pmods[ i ]->mod_bvalues != NULL ) {
155                 for ( ; pmods[ i ]->mod_bvalues[ j ] != NULL; ++j ) {
156                                 ;
157                 }
158                 }
159                 if (( pmods[ i ]->mod_bvalues =
160                         (struct berval **)safe_realloc( pmods[ i ]->mod_bvalues,
161                         (j + 2) * sizeof( struct berval * ))) == NULL ) {
162                         perror( "safe_realloc" );
163                         exit( 1 );
164                 }
165                 pmods[ i ]->mod_bvalues[ j + 1 ] = NULL;
166                 if (( bvp = (struct berval *)malloc( sizeof( struct berval )))
167                         == NULL ) {
168                         perror( "malloc" );
169                         exit( 1 );
170                 }
171                 pmods[ i ]->mod_bvalues[ j ] = bvp;
172
173             bvp->bv_len = vlen;
174             if (( bvp->bv_val = (char *)malloc( vlen + 1 )) == NULL ) {
175                         perror( "malloc" );
176                         exit( 1 );
177             }
178             SAFEMEMCPY( bvp->bv_val, value, vlen );
179             bvp->bv_val[ vlen ] = '\0';
180     }
181 }
182
183
184 static char *
185 get_add_entry( char *filename, LDAPMod ***mods )
186 {
187         FILE    *fp;
188         char    *entry = NULL;
189
190         if ( (fp = fopen( filename, "r" )) != NULL ) {
191                 char  line[BUFSIZ];
192
193                 if ( fgets( line, BUFSIZ, fp )) {
194                         char *nl;
195
196                         if (( nl = strchr( line, '\r' )) || ( nl = strchr( line, '\n' )))
197                                 *nl = '\0';
198                         entry = strdup( line );
199
200                 }
201
202                 while ( fgets( line, BUFSIZ, fp )) {
203                         char    *nl;
204                         char    *value;
205
206                         if (( nl = strchr( line, '\r' )) || ( nl = strchr( line, '\n' )))
207                                 *nl = '\0';
208
209                         if ( *line == '\0' ) break;
210                         if ( !( value = strchr( line, ':' ))) break;
211
212                         *value++ = '\0'; 
213                         while ( *value && isspace( (unsigned char) *value ))
214                                 value++;
215
216                         addmodifyop( mods, LDAP_MOD_ADD, line, value, strlen( value ));
217
218                 }
219                 fclose( fp );
220         }
221
222         return( entry );
223 }
224
225
226 static void
227 do_addel(
228         char *host,
229         int port,
230         char *manager,
231         char *passwd,
232         char *entry,
233         LDAPMod **attrs,
234         int maxloop
235 )
236 {
237         LDAP    *ld;
238         int     i;
239         pid_t   pid = getpid();
240
241         if (( ld = ldap_init( host, port )) == NULL ) {
242                 perror( "ldap_init" );
243                 exit( 1 );
244         }
245
246         if ( ldap_bind_s( ld, manager, passwd, LDAP_AUTH_SIMPLE )
247                                 != LDAP_SUCCESS ) {
248                 ldap_perror( ld, "ldap_bind" );
249                  exit( 1 );
250         }
251
252
253         fprintf( stderr, "PID=%ld - Add/Delete(%d): entry=\"%s\".\n",
254                                         (long) pid, maxloop, entry );
255
256         for ( i = 0; i < maxloop; i++ ) {
257
258                 /* add the entry */
259                 if ( ldap_add_s( ld, entry, attrs ) != LDAP_SUCCESS ) {
260
261                         ldap_perror( ld, "ldap_add" );
262                         break;
263
264                 }
265
266                 /* wait a second for the add to really complete */
267                 sleep( 1 );
268
269                 /* now delete the entry again */
270                 if ( ldap_delete_s( ld, entry ) != LDAP_SUCCESS ) {
271
272                         ldap_perror( ld, "ldap_delete" );
273                         break;
274
275                 }
276
277         }
278
279         fprintf( stderr, " PID=%ld - Add/Delete done.\n", (long) pid );
280
281         ldap_unbind( ld );
282 }
283
284