3 * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
4 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
10 #include <ac/stdlib.h>
13 #include <ac/dirent.h>
14 #include <ac/socket.h>
15 #include <ac/string.h>
16 #include <ac/unistd.h>
19 #ifdef HAVE_SYS_PARAM_H
20 #include <sys/param.h>
23 #include "ldap_defaults.h"
26 #define SEARCHCMD "slapd-search"
27 #define READCMD "slapd-read"
28 #define ADDCMD "slapd-addel"
33 #define TSEARCHFILE "do_search.0"
34 #define TREADFILE "do_read.0"
35 #define TADDFILE "do_add."
37 static char *get_file_name( char *dirname, char *filename );
38 static int get_search_filters( char *filename, char *filters[] );
39 static int get_read_entries( char *filename, char *entries[] );
40 static void fork_child( char *prog, char *args[] );
41 static void wait4kids( int nkidval );
43 static int maxkids = 20;
49 fprintf( stderr, "usage: %s [-h <host>] -p <port> -D <manager> -w <passwd> -d <datadir> -b <baseDN> [-j <maxchild>] [-l <loops>] -P <progdir>\n", name );
54 main( int argc, char **argv )
57 char *host = "localhost";
73 char *afiles[MAXREQS];
77 char scmd[MAXPATHLEN];
80 char rcmd[MAXPATHLEN];
83 char acmd[MAXPATHLEN];
85 while ( (i = getopt( argc, argv, "h:p:D:w:b:d:j:l:P:" )) != EOF ) {
87 case 'h': /* slapd host */
88 host = strdup( optarg );
91 case 'p': /* the servers port number */
92 port = strdup( optarg );
95 case 'D': /* slapd manager */
96 manager = strdup( optarg );
99 case 'w': /* the managers passwd */
100 passwd = strdup( optarg );
103 case 'b': /* the base DN */
104 sbase = strdup( optarg );
107 case 'd': /* data directory */
108 dirname = strdup( optarg );
111 case 'P': /* prog directory */
112 progdir = strdup( optarg );
115 case 'j': /* the number of parallel clients */
116 maxkids = atoi( optarg );
119 case 'l': /* the number of loops per client */
120 loops = strdup( optarg );
129 if (( dirname == NULL ) || ( sbase == NULL ) || ( port == NULL ) ||
130 ( manager == NULL ) || ( passwd == NULL ) || ( progdir == NULL ))
133 /* get the file list */
134 if ( ( datadir = opendir( dirname )) == NULL ) {
136 fprintf( stderr, "%s: couldn't open data directory \"%s\".\n",
138 exit( EXIT_FAILURE );
142 /* look for search, read, and add/delete files */
143 for ( file = readdir( datadir ); file; file = readdir( datadir )) {
145 if ( !strcasecmp( file->d_name, TSEARCHFILE )) {
146 sfile = get_file_name( dirname, file->d_name );
148 } else if ( !strcasecmp( file->d_name, TREADFILE )) {
149 rfile = get_file_name( dirname, file->d_name );
151 } else if ( !strncasecmp( file->d_name, TADDFILE, strlen( TADDFILE ))
152 && ( anum < MAXREQS )) {
153 afiles[anum++] = get_file_name( dirname, file->d_name );
160 /* look for search requests */
162 snum = get_search_filters( sfile, sreqs );
165 /* look for read requests */
167 rnum = get_read_entries( rfile, rreqs );
171 * generate the search clients
175 sprintf( scmd, "%s%s%s", progdir, LDAP_DIRSEP, SEARCHCMD );
176 sargs[sanum++] = scmd;
177 sargs[sanum++] = "-h";
178 sargs[sanum++] = host;
179 sargs[sanum++] = "-p";
180 sargs[sanum++] = port;
181 sargs[sanum++] = "-b";
182 sargs[sanum++] = sbase;
183 sargs[sanum++] = "-l";
184 sargs[sanum++] = loops;
185 sargs[sanum++] = "-f";
186 sargs[sanum++] = NULL; /* will hold the search request */
187 sargs[sanum++] = NULL;
190 * generate the read clients
194 sprintf( rcmd, "%s%s%s", progdir, LDAP_DIRSEP, READCMD );
195 rargs[ranum++] = rcmd;
196 rargs[ranum++] = "-h";
197 rargs[ranum++] = host;
198 rargs[ranum++] = "-p";
199 rargs[ranum++] = port;
200 rargs[ranum++] = "-l";
201 rargs[ranum++] = loops;
202 rargs[ranum++] = "-e";
203 rargs[ranum++] = NULL; /* will hold the read entry */
204 rargs[ranum++] = NULL;
207 * generate the add/delete clients
211 sprintf( acmd, "%s%s%s", progdir, LDAP_DIRSEP, ADDCMD );
212 aargs[aanum++] = acmd;
213 aargs[aanum++] = "-h";
214 aargs[aanum++] = host;
215 aargs[aanum++] = "-p";
216 aargs[aanum++] = port;
217 aargs[aanum++] = "-D";
218 aargs[aanum++] = manager;
219 aargs[aanum++] = "-w";
220 aargs[aanum++] = passwd;
221 aargs[aanum++] = "-l";
222 aargs[aanum++] = loops;
223 aargs[aanum++] = "-f";
224 aargs[aanum++] = NULL; /* will hold the add data file */
225 aargs[aanum++] = NULL;
227 for ( j = 0; j < MAXREQS; j++ ) {
231 sargs[sanum - 2] = sreqs[j];
232 fork_child( scmd, sargs );
238 rargs[ranum - 2] = rreqs[j];
239 fork_child( rcmd, rargs );
245 aargs[aanum - 2] = afiles[j];
246 fork_child( acmd, aargs );
254 exit( EXIT_SUCCESS );
258 get_file_name( char *dirname, char *filename )
260 char buf[MAXPATHLEN];
262 sprintf( buf, "%s%s%s", dirname, LDAP_DIRSEP, filename );
263 return( strdup( buf ));
268 get_search_filters( char *filename, char *filters[] )
273 if ( (fp = fopen( filename, "r" )) != NULL ) {
276 while (( filter < MAXREQS ) && ( fgets( line, BUFSIZ, fp ))) {
279 if (( nl = strchr( line, '\r' )) || ( nl = strchr( line, '\n' )))
281 filters[filter++] = strdup( line );
292 get_read_entries( char *filename, char *entries[] )
297 if ( (fp = fopen( filename, "r" )) != NULL ) {
300 while (( entry < MAXREQS ) && ( fgets( line, BUFSIZ, fp ))) {
303 if (( nl = strchr( line, '\r' )) || ( nl = strchr( line, '\n' )))
305 entries[entry++] = strdup( line );
316 fork_child( char *prog, char *args[] )
320 wait4kids( maxkids );
322 switch ( pid = fork() ) {
324 execvp( prog, args );
325 fprintf( stderr, "%s: ", prog );
327 exit( EXIT_FAILURE );
330 case -1: /* trouble */
331 fprintf( stderr, "Could not fork to run %s\n", prog );
335 default: /* parent */
342 wait4kids( int nkidval )
346 while ( nkids >= nkidval ) {
349 if ( WIFSTOPPED(status) ) {
351 "stopping: child stopped with signal %d\n",
352 (int) WSTOPSIG(status) );
354 } else if ( WIFSIGNALED(status) ) {
356 "stopping: child terminated with signal %d%s\n",
357 (int) WTERMSIG(status),
359 WCOREDUMP(status) ? ", core dumped" : ""
364 exit( WEXITSTATUS(status) );
366 } else if ( WEXITSTATUS(status) != 0 ) {
368 "stopping: child exited with status %d\n",
369 (int) WEXITSTATUS(status) );
370 exit( WEXITSTATUS(status) );