/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1999-2006 The OpenLDAP Foundation.
+ * Copyright 1999-2009 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#include <stdio.h>
-#include <ac/stdlib.h>
+#include "ac/stdlib.h"
-#include <ac/ctype.h>
-#include <ac/dirent.h>
-#include <ac/param.h>
-#include <ac/socket.h>
-#include <ac/string.h>
-#include <ac/unistd.h>
-#include <ac/wait.h>
+#include "ac/ctype.h"
+#include "ac/dirent.h"
+#include "ac/param.h"
+#include "ac/socket.h"
+#include "ac/string.h"
+#include "ac/unistd.h"
+#include "ac/wait.h"
#include "ldap_defaults.h"
#define TBINDFILE "do_bind.0"
static char *get_file_name( char *dirname, char *filename );
-static int get_search_filters( char *filename, char *filters[], char *attrs[], char *bases[] );
+static int get_search_filters( char *filename, char *filters[], char *attrs[], char *bases[], LDAPURLDesc *luds[] );
static int get_read_entries( char *filename, char *entries[], char *filters[] );
static void fork_child( char *prog, char **args );
static void wait4kids( int nkidval );
"[-t <delay>] "
"[-C] "
"[-F] "
+ "[-I] "
"[-N]\n",
name );
exit( EXIT_FAILURE );
char *sreqs[MAXREQS];
char *sattrs[MAXREQS];
char *sbase[MAXREQS];
+ LDAPURLDesc *slud[MAXREQS];
int snum = 0;
char *sargs[MAXARGS];
int sanum;
+ int sextra_args = 0;
char scmd[MAXPATHLEN];
- char sloops[] = "18446744073709551615UL";
+ /* static so that its address can be used in initializer below. */
+ static char sloops[LDAP_PVT_INTTYPE_CHARS(unsigned long)];
/* read */
char *rfile = NULL;
char *rreqs[MAXREQS];
char *rargs[MAXARGS];
char *rflts[MAXREQS];
int ranum;
+ int rextra_args = 0;
char rcmd[MAXPATHLEN];
- char rloops[] = "18446744073709551615UL";
+ static char rloops[LDAP_PVT_INTTYPE_CHARS(unsigned long)];
/* addel */
char *afiles[MAXREQS];
int anum = 0;
char *aargs[MAXARGS];
int aanum;
char acmd[MAXPATHLEN];
- char aloops[] = "18446744073709551615UL";
+ static char aloops[LDAP_PVT_INTTYPE_CHARS(unsigned long)];
/* modrdn */
char *nfile = NULL;
char *nreqs[MAXREQS];
char *nargs[MAXARGS];
int nanum;
char ncmd[MAXPATHLEN];
- char nloops[] = "18446744073709551615UL";
+ static char nloops[LDAP_PVT_INTTYPE_CHARS(unsigned long)];
/* modify */
char *mfile = NULL;
char *mreqs[MAXREQS];
char *margs[MAXARGS];
int manum;
char mcmd[MAXPATHLEN];
- char mloops[] = "18446744073709551615UL";
+ static char mloops[LDAP_PVT_INTTYPE_CHARS(unsigned long)];
/* bind */
char *bfile = NULL;
char *breqs[MAXREQS];
char *bargs[MAXARGS];
int banum;
char bcmd[MAXPATHLEN];
- char bloops[] = "18446744073709551615UL";
+ static char bloops[LDAP_PVT_INTTYPE_CHARS(unsigned long)];
char **bargs_extra = NULL;
char *friendlyOpt = NULL;
mloops[0] = '\0';
bloops[0] = '\0';
- while ( (i = getopt( argc, argv, "AB:CD:d:FH:h:Ii:j:l:L:NP:p:r:t:Ww:y:" )) != EOF ) {
- switch( i ) {
+ while ( ( i = getopt( argc, argv, "AB:CD:d:FH:h:Ii:j:L:l:NP:p:r:t:Ww:y:" ) ) != EOF )
+ {
+ switch ( i ) {
case 'A':
noattrs++;
break;
- case 'B':
- {
+ case 'B': {
char **p,
**b = ldap_str2charray( optarg, "," );
extra_t **epp;
break;
case 'l': /* the number of loops per client */
- if ( !isdigit( optarg[0] ) ) {
+ if ( !isdigit( (unsigned char) optarg[0] ) ) {
char **p,
**l = ldap_str2charray( optarg, "," );
if (( dirname == NULL ) || ( port == NULL && uri == NULL ) ||
( manager == NULL ) || ( passwd == NULL ) || ( progdir == NULL ))
+ {
usage( argv[0], '\0' );
+ }
#ifdef HAVE_WINSOCK
children = malloc( maxkids * sizeof(HANDLE) );
passwd = pw.bv_val;
}
+ if ( !sfile && !rfile && !nfile && !mfile && !bfile && !anum ) {
+ fprintf( stderr, "no data files found.\n" );
+ exit( EXIT_FAILURE );
+ }
+
/* look for search requests */
if ( sfile ) {
- snum = get_search_filters( sfile, sreqs, sattrs, sbase );
+ snum = get_search_filters( sfile, sreqs, sattrs, sbase, slud );
+ if ( snum < 0 ) {
+ fprintf( stderr,
+ "unable to parse file \"%s\" line %d\n",
+ sfile, -2*(snum + 1));
+ exit( EXIT_FAILURE );
+ }
}
/* look for read requests */
if ( rfile ) {
rnum = get_read_entries( rfile, rreqs, rflts );
+ if ( rnum < 0 ) {
+ fprintf( stderr,
+ "unable to parse file \"%s\" line %d\n",
+ rfile, -2*(rnum + 1) );
+ exit( EXIT_FAILURE );
+ }
}
/* look for modrdn requests */
if ( nfile ) {
nnum = get_read_entries( nfile, nreqs, NULL );
+ if ( nnum < 0 ) {
+ fprintf( stderr,
+ "unable to parse file \"%s\" line %d\n",
+ nfile, -2*(nnum + 1) );
+ exit( EXIT_FAILURE );
+ }
}
/* look for modify requests */
if ( mfile ) {
- mnum = get_search_filters( mfile, mreqs, NULL, mdn );
+ mnum = get_search_filters( mfile, mreqs, NULL, mdn, NULL );
+ if ( mnum < 0 ) {
+ fprintf( stderr,
+ "unable to parse file \"%s\" line %d\n",
+ mfile, -2*(mnum + 1) );
+ exit( EXIT_FAILURE );
+ }
}
/* look for bind requests */
if ( bfile ) {
- bnum = get_search_filters( bfile, bcreds, battrs, breqs );
+ bnum = get_search_filters( bfile, bcreds, battrs, breqs, NULL );
+ if ( bnum < 0 ) {
+ fprintf( stderr,
+ "unable to parse file \"%s\" line %d\n",
+ bfile, -2*(bnum + 1) );
+ exit( EXIT_FAILURE );
+ }
}
/* setup friendly option */
}
sargs[sanum++] = "-b";
sargs[sanum++] = NULL; /* will hold the search base */
+ sargs[sanum++] = "-s";
+ sargs[sanum++] = NULL; /* will hold the search scope */
sargs[sanum++] = "-f";
sargs[sanum++] = NULL; /* will hold the search request */
sargs[sanum++] = NULL;
- sargs[sanum] = NULL; /* might hold the "attr" request */
+ sargs[sanum++] = NULL; /* might hold the "attr" request */
+ sextra_args += 2;
- sargs[sanum + 1] = NULL;
+ sargs[sanum] = NULL;
/*
* generate the read clients
rargs[ranum++] = NULL; /* will hold the read entry */
rargs[ranum++] = NULL;
- rargs[ranum] = NULL; /* might hold the filter arg */
+ rargs[ranum++] = NULL; /* might hold the filter arg */
+ rextra_args += 2;
- rargs[ranum + 1] = NULL;
+ rargs[ranum] = NULL;
/*
* generate the modrdn clients
}
nargs[nanum++] = "-e";
nargs[nanum++] = NULL; /* will hold the modrdn entry */
- nargs[nanum++] = NULL;
+ nargs[nanum] = NULL;
/*
* generate the modify clients
margs[manum++] = NULL; /* will hold the modify entry */
margs[manum++] = "-a";;
margs[manum++] = NULL; /* will hold the ava */
- margs[manum++] = NULL;
+ margs[manum] = NULL;
/*
* generate the add/delete clients
}
aargs[aanum++] = "-f";
aargs[aanum++] = NULL; /* will hold the add data file */
- aargs[aanum++] = NULL;
+ aargs[aanum] = NULL;
/*
* generate the bind clients
bargs[banum++] = NULL;
bargs[banum++] = "-w";
bargs[banum++] = NULL;
- bargs[banum++] = NULL;
+ bargs[banum] = NULL;
#define DOREQ(n,j) ((n) && ((maxkids > (n)) ? ((j) < maxkids ) : ((j) < (n))))
for ( j = 0; j < MAXREQS; j++ ) {
+ /* search */
if ( DOREQ( snum, j ) ) {
int jj = j % snum;
+ int x = sanum - sextra_args;
- sargs[sanum - 2] = sreqs[jj];
- sargs[sanum - 4] = sbase[jj];
- if ( sattrs[jj] != NULL ) {
- sargs[sanum - 1] = "-a";
- sargs[sanum] = sattrs[jj];
+ /* base */
+ if ( sbase[jj] != NULL ) {
+ sargs[sanum - 7] = sbase[jj];
+
+ } else {
+ sargs[sanum - 7] = slud[jj]->lud_dn;
+ }
+
+ /* scope */
+ if ( slud[jj] != NULL ) {
+ sargs[sanum - 5] = (char *)ldap_pvt_scope2str( slud[jj]->lud_scope );
+
+ } else {
+ sargs[sanum - 5] = "sub";
+ }
+
+ /* filter */
+ if ( sreqs[jj] != NULL ) {
+ sargs[sanum - 3] = sreqs[jj];
+
+ } else if ( slud[jj]->lud_filter != NULL ) {
+ sargs[sanum - 3] = slud[jj]->lud_filter;
} else {
- sargs[sanum - 1] = NULL;
+ sargs[sanum - 3] = "(objectClass=*)";
}
+
+ /* extras */
+ sargs[x] = NULL;
+
+ /* attr */
+ if ( sattrs[jj] != NULL ) {
+ sargs[x++] = "-a";
+ sargs[x++] = sattrs[jj];
+ }
+
+ /* attrs */
+ if ( slud[jj] != NULL && slud[jj]->lud_attrs != NULL ) {
+ int i;
+
+ for ( i = 0; slud[jj]->lud_attrs[ i ] != NULL && x + i < MAXARGS - 1; i++ ) {
+ sargs[x + i] = slud[jj]->lud_attrs[ i ];
+ }
+ sargs[x + i] = NULL;
+ }
+
fork_child( scmd, sargs );
}
+ /* read */
if ( DOREQ( rnum, j ) ) {
int jj = j % rnum;
+ int x = ranum - rextra_args;
- rargs[ranum - 2] = rreqs[jj];
+ rargs[ranum - 3] = rreqs[jj];
if ( rflts[jj] != NULL ) {
- rargs[ranum - 1] = "-f";
- rargs[ranum] = rflts[jj];
-
- } else {
- rargs[ranum - 1] = NULL;
+ rargs[x++] = "-f";
+ rargs[x++] = rflts[jj];
}
+ rargs[x] = NULL;
fork_child( rcmd, rargs );
}
+ /* rename */
if ( j < nnum ) {
- nargs[nanum - 2] = nreqs[j];
+ nargs[nanum - 1] = nreqs[j];
fork_child( ncmd, nargs );
}
+ /* modify */
if ( j < mnum ) {
- margs[manum - 4] = mdn[j];
- margs[manum - 2] = mreqs[j];
+ margs[manum - 3] = mdn[j];
+ margs[manum - 1] = mreqs[j];
fork_child( mcmd, margs );
}
+ /* add/delete */
if ( j < anum ) {
- aargs[aanum - 2] = afiles[j];
+ aargs[aanum - 1] = afiles[j];
fork_child( acmd, aargs );
}
+ /* bind */
if ( DOREQ( bnum, j ) ) {
int jj = j % bnum;
}
if ( battrs[jj] != NULL ) {
- bargs[banum - 4] = manager ? manager : "";
- bargs[banum - 2] = passwd ? passwd : "";
-
- bargs[banum - 1] = "-b";
- bargs[banum] = breqs[jj];
- bargs[banum + 1] = "-f";
- bargs[banum + 2] = bcreds[jj];
- bargs[banum + 3] = "-a";
- bargs[banum + 4] = battrs[jj];
+ bargs[banum - 3] = manager ? manager : "";
+ bargs[banum - 1] = passwd ? passwd : "";
+
+ bargs[banum + 0] = "-b";
+ bargs[banum + 1] = breqs[jj];
+ bargs[banum + 2] = "-f";
+ bargs[banum + 3] = bcreds[jj];
+ bargs[banum + 4] = "-a";
+ bargs[banum + 5] = battrs[jj];
+ bargs[banum + 6] = NULL;
+
} else {
- bargs[banum - 4] = breqs[jj];
- bargs[banum - 2] = bcreds[jj];
- bargs[banum - 1] = NULL;
+ bargs[banum - 3] = breqs[jj];
+ bargs[banum - 1] = bcreds[jj];
+ bargs[banum] = NULL;
}
fork_child( bcmd, bargs );
- bargs[banum - 1] = NULL;
+ bargs[banum] = NULL;
}
}
static int
-get_search_filters( char *filename, char *filters[], char *attrs[], char *bases[] )
+get_search_filters( char *filename, char *filters[], char *attrs[], char *bases[], LDAPURLDesc *luds[] )
{
FILE *fp;
int filter = 0;
char line[BUFSIZ];
while (( filter < MAXREQS ) && ( fgets( line, BUFSIZ, fp ))) {
- char *nl;
+ char *nl;
+ int got_URL = 0;
if (( nl = strchr( line, '\r' )) || ( nl = strchr( line, '\n' )))
*nl = '\0';
- bases[filter] = ArgDup( line );
+
+ if ( luds ) luds[filter] = NULL;
+
+ if ( luds && strncmp( line, "ldap:///", STRLENOF( "ldap:///" ) ) == 0 ) {
+ LDAPURLDesc *lud;
+
+ got_URL = 1;
+ bases[filter] = NULL;
+ if ( ldap_url_parse( line, &lud ) != LDAP_URL_SUCCESS ) {
+ filter = -filter - 1;
+ break;
+ }
+
+ if ( lud->lud_dn == NULL || lud->lud_exts != NULL ) {
+ filter = -filter - 1;
+ ldap_free_urldesc( lud );
+ break;
+ }
+
+ luds[filter] = lud;
+
+ } else {
+ bases[filter] = ArgDup( line );
+ }
fgets( line, BUFSIZ, fp );
if (( nl = strchr( line, '\r' )) || ( nl = strchr( line, '\n' )))
*nl = '\0';
if ( filters[filter][0] == '+') {
char *sep = strchr( filters[filter], ':' );
+ attrs[ filter ] = &filters[ filter ][ 1 ];
if ( sep != NULL ) {
- attrs[ filter ] = &filters[ filter ][ 1 ];
sep[ 0 ] = '\0';
/* NOTE: don't free this! */
filters[ filter ] = &sep[ 1 ];
}
} else {
- attrs[ filter] = NULL;
+ attrs[ filter ] = NULL;
}
}
filter++;
fclose( fp );
}
- return( filter );
+ return filter;
}
LDAPURLDesc *lud;
if ( ldap_url_parse( &line[1], &lud ) != LDAP_URL_SUCCESS ) {
- entry = -1;
+ entry = -entry - 1;
break;
}
if ( lud->lud_dn == NULL || lud->lud_dn[ 0 ] == '\0' ) {
ldap_free_urldesc( lud );
- entry = -1;
+ entry = -entry - 1;
break;
}
#endif
execvp( prog, args );
tester_perror( "execvp", NULL );
+ { int i;
+ for (i=0; args[i]; i++);
+ fprintf(stderr,"%d args\n", i);
+ for (i=0; args[i]; i++)
+ fprintf(stderr,"%d %s\n", i, args[i]);
+ }
+
exit( EXIT_FAILURE );
break;