10 #include <ac/string.h>
11 #include <ac/unistd.h>
14 #ifdef HAVE_SYS_PARAM_H
15 #include <sys/param.h>
18 #include "ldapconfig.h"
21 #define SEARCHCMD "slapd-search"
22 #define READCMD "slapd-read"
23 #define ADDCMD "slapd-addel"
28 #define TSEARCHFILE "do_search.0"
29 #define TREADFILE "do_read.0"
30 #define TADDFILE "do_add."
32 static char *get_file_name( char *dirname, char *filename );
33 static int get_search_filters( char *filename, char *filters[] );
34 static int get_read_entries( char *filename, char *entries[] );
35 static void fork_child( char *prog, char *args[] );
36 static void wait4kids( int nkidval );
38 static int maxkids = 20;
44 fprintf( stderr, "usage: %s [-h <host>] -p <port> -D <manager> -w <passwd> -d <datadir> -b <baseDN> [-j <maxchild>] [-l <loops>] -P <progdir>\n", name );
49 main( int argc, char **argv )
52 char *host = "localhost";
68 char *afiles[MAXREQS];
72 char scmd[MAXPATHLEN];
75 char rcmd[MAXPATHLEN];
78 char acmd[MAXPATHLEN];
80 while ( (i = getopt( argc, argv, "h:p:D:w:b:d:j:l:P:" )) != EOF ) {
82 case 'h': /* slapd host */
83 host = strdup( optarg );
86 case 'p': /* the servers port number */
87 port = strdup( optarg );
90 case 'D': /* slapd manager */
91 manager = strdup( optarg );
94 case 'w': /* the managers passwd */
95 passwd = strdup( optarg );
98 case 'b': /* the base DN */
99 sbase = strdup( optarg );
102 case 'd': /* data directory */
103 dirname = strdup( optarg );
106 case 'P': /* prog directory */
107 progdir = strdup( optarg );
110 case 'j': /* the number of parallel clients */
111 maxkids = atoi( optarg );
114 case 'l': /* the number of loops per client */
115 loops = strdup( optarg );
124 if (( dirname == NULL ) || ( sbase == NULL ) || ( port == NULL ) ||
125 ( manager == NULL ) || ( passwd == NULL ) || ( progdir == NULL ))
128 /* get the file list */
129 if ( ( datadir = opendir( dirname )) == NULL ) {
131 fprintf( stderr, "%s: couldn't open data directory \"%s\".\n",
137 /* look for search, read, and add/delete files */
138 for ( file = readdir( datadir ); file; file = readdir( datadir )) {
140 if ( !strcasecmp( file->d_name, TSEARCHFILE )) {
141 sfile = get_file_name( dirname, file->d_name );
143 } else if ( !strcasecmp( file->d_name, TREADFILE )) {
144 rfile = get_file_name( dirname, file->d_name );
146 } else if ( !strncasecmp( file->d_name, TADDFILE, strlen( TADDFILE ))
147 && ( anum < MAXREQS )) {
148 afiles[anum++] = get_file_name( dirname, file->d_name );
155 /* look for search requests */
157 snum = get_search_filters( sfile, sreqs );
160 /* look for read requests */
162 rnum = get_read_entries( rfile, rreqs );
166 * generate the search clients
170 sprintf( scmd, "%s%s%s", progdir, DIRSEP, SEARCHCMD );
171 sargs[sanum++] = scmd;
172 sargs[sanum++] = "-h";
173 sargs[sanum++] = host;
174 sargs[sanum++] = "-p";
175 sargs[sanum++] = port;
176 sargs[sanum++] = "-b";
177 sargs[sanum++] = sbase;
178 sargs[sanum++] = "-l";
179 sargs[sanum++] = loops;
180 sargs[sanum++] = "-f";
181 sargs[sanum++] = NULL; /* will hold the search request */
182 sargs[sanum++] = NULL;
185 * generate the read clients
189 sprintf( rcmd, "%s%s%s", progdir, DIRSEP, READCMD );
190 rargs[ranum++] = rcmd;
191 rargs[ranum++] = "-h";
192 rargs[ranum++] = host;
193 rargs[ranum++] = "-p";
194 rargs[ranum++] = port;
195 rargs[ranum++] = "-l";
196 rargs[ranum++] = loops;
197 rargs[ranum++] = "-e";
198 rargs[ranum++] = NULL; /* will hold the read entry */
199 rargs[ranum++] = NULL;
202 * generate the add/delete clients
206 sprintf( acmd, "%s%s%s", progdir, DIRSEP, ADDCMD );
207 aargs[aanum++] = acmd;
208 aargs[aanum++] = "-h";
209 aargs[aanum++] = host;
210 aargs[aanum++] = "-p";
211 aargs[aanum++] = port;
212 aargs[aanum++] = "-D";
213 aargs[aanum++] = manager;
214 aargs[aanum++] = "-w";
215 aargs[aanum++] = passwd;
216 aargs[aanum++] = "-l";
217 aargs[aanum++] = loops;
218 aargs[aanum++] = "-f";
219 aargs[aanum++] = NULL; /* will hold the add data file */
220 aargs[aanum++] = NULL;
222 for ( j = 0; j < MAXREQS; j++ ) {
226 sargs[sanum - 2] = sreqs[j];
227 fork_child( scmd, sargs );
233 rargs[ranum - 2] = rreqs[j];
234 fork_child( rcmd, rargs );
240 aargs[aanum - 2] = afiles[j];
241 fork_child( acmd, aargs );
253 get_file_name( char *dirname, char *filename )
255 char buf[MAXPATHLEN];
257 sprintf( buf, "%s%s%s", dirname, DIRSEP, filename );
258 return( strdup( buf ));
263 get_search_filters( char *filename, char *filters[] )
268 if ( (fp = fopen( filename, "r" )) != NULL ) {
271 while (( filter < MAXREQS ) && ( fgets( line, BUFSIZ, fp ))) {
274 if (( nl = strchr( line, '\r' )) || ( nl = strchr( line, '\n' )))
276 filters[filter++] = strdup( line );
287 get_read_entries( char *filename, char *entries[] )
292 if ( (fp = fopen( filename, "r" )) != NULL ) {
295 while (( entry < MAXREQS ) && ( fgets( line, BUFSIZ, fp ))) {
298 if (( nl = strchr( line, '\r' )) || ( nl = strchr( line, '\n' )))
300 entries[entry++] = strdup( line );
311 fork_child( char *prog, char *args[] )
315 wait4kids( maxkids );
317 switch ( pid = fork() ) {
319 execvp( prog, args );
320 fprintf( stderr, "%s: ", prog );
325 case -1: /* trouble */
326 fprintf( stderr, "Could not fork to run %s\n", prog );
330 default: /* parent */
337 wait4kids( int nkidval )
341 while ( nkids >= nkidval ) {
344 if ( WIFSTOPPED(status) ) {
346 "stopping: child stopped with signal %d\n",
347 (int) WSTOPSIG(status) );
349 } else if ( WIFSIGNALED(status) ) {
351 "stopping: child terminated with signal %d%s\n",
352 (int) WTERMSIG(status),
354 WCOREDUMP(status) ? ", core dumped" : ""
359 exit( WEXITSTATUS(status) );
361 } else if ( WEXITSTATUS(status) != 0 ) {
363 "stopping: child exited with status %d\n",
364 (int) WEXITSTATUS(status) );
365 exit( WEXITSTATUS(status) );