int main( int argc, char *argv[]) { LDAPURLDesc lud = { 0 }; char *uri = NULL; int gotlud = 0; int nexts = 0; lud.lud_port = -1; lud.lud_scope = -1; while ( 1 ) { int opt = getopt( argc, argv, "S:h:p:b:a:s:f:E:H:" ); if ( opt == EOF ) { break; } if ( opt == 'H' ) { if ( gotlud ) { fprintf( stderr, "option -H incompatible with previous options\n" ); usage(); } if ( uri != NULL ) { fprintf( stderr, "URI already provided\n" ); usage(); } uri = optarg; continue; } switch ( opt ) { case 'S': case 'h': case 'p': case 'b': case 'a': case 's': case 'f': case 'E': if ( uri != NULL ) { fprintf( stderr, "option -%c incompatible with -H\n", opt ); usage(); } gotlud++; } switch ( opt ) { case 'S': if ( lud.lud_scheme != NULL ) { fprintf( stderr, "scheme already provided\n" ); usage(); } lud.lud_scheme = optarg; break; case 'h': if ( lud.lud_host != NULL ) { fprintf( stderr, "host already provided\n" ); usage(); } lud.lud_host = optarg; break; case 'p': if ( lud.lud_port != -1 ) { fprintf( stderr, "port already provided\n" ); usage(); } if ( lutil_atoi( &lud.lud_port, optarg ) ) { fprintf( stderr, "unable to parse port \"%s\"\n", optarg ); usage(); } break; case 'b': if ( lud.lud_dn != NULL ) { fprintf( stderr, "base already provided\n" ); usage(); } lud.lud_dn = optarg; break; case 'a': if ( lud.lud_attrs != NULL ) { fprintf( stderr, "attrs already provided\n" ); usage(); } lud.lud_attrs = ldap_str2charray( optarg, "," ); if ( lud.lud_attrs == NULL ) { fprintf( stderr, "unable to parse attrs list \"%s\"\n", optarg ); usage(); } break; case 's': if ( lud.lud_scope != -1 ) { fprintf( stderr, "scope already provided\n" ); usage(); } lud.lud_scope = ldap_pvt_str2scope( optarg ); if ( lud.lud_scope == -1 ) { fprintf( stderr, "unable to parse scope \"%s\"\n", optarg ); usage(); } break; case 'f': if ( lud.lud_filter != NULL ) { fprintf( stderr, "filter already provided\n" ); usage(); } lud.lud_filter = optarg; break; case 'E': lud.lud_exts = (char **)realloc( lud.lud_exts, sizeof( char * ) * ( nexts + 2 ) ); lud.lud_exts[ nexts++ ] = optarg; lud.lud_exts[ nexts ] = NULL; break; default: assert( opt != 'H' ); usage(); } } if ( uri != NULL ) { return do_uri_explode( uri ); } return do_uri_create( &lud ); }
int main( int argc, char **argv ) { int i; char *uri = NULL; char *host = "localhost"; int port = -1; char *manager = NULL; struct berval passwd = { 0, NULL }; char *sbase = NULL; int scope = LDAP_SCOPE_SUBTREE; char *filter = NULL; char *attr = NULL; char *srchattrs[] = { "cn", "sn", NULL }; char **attrs = srchattrs; int loops = LOOPS; int outerloops = 1; int retries = RETRIES; int delay = 0; int force = 0; int chaserefs = 0; int noattrs = 0; int nobind = 0; tester_init( "slapd-search", TESTER_SEARCH ); /* by default, tolerate referrals and no such object */ tester_ignore_str2errlist( "REFERRAL,NO_SUCH_OBJECT" ); while ( ( i = getopt( argc, argv, "Aa:b:CD:f:FH:h:i:l:L:Np:r:Ss:t:T:w:" ) ) != EOF ) { switch ( i ) { case 'A': noattrs++; break; case 'C': chaserefs++; break; case 'H': /* the server uri */ uri = strdup( optarg ); break; case 'h': /* the servers host */ host = strdup( optarg ); break; case 'i': tester_ignore_str2errlist( optarg ); break; case 'N': nobind++; break; case 'p': /* the servers port */ if ( lutil_atoi( &port, optarg ) != 0 ) { usage( argv[0], i ); } break; case 'D': /* the servers manager */ manager = strdup( optarg ); break; case 'w': /* the server managers password */ passwd.bv_val = strdup( optarg ); passwd.bv_len = strlen( optarg ); memset( optarg, '*', passwd.bv_len ); break; case 'a': attr = strdup( optarg ); break; case 'b': /* file with search base */ sbase = strdup( optarg ); break; case 'f': /* the search request */ filter = strdup( optarg ); break; case 'F': force++; break; case 'l': /* number of loops */ if ( lutil_atoi( &loops, optarg ) != 0 ) { usage( argv[0], i ); } break; case 'L': /* number of loops */ if ( lutil_atoi( &outerloops, optarg ) != 0 ) { usage( argv[0], i ); } break; case 'r': /* number of retries */ if ( lutil_atoi( &retries, optarg ) != 0 ) { usage( argv[0], i ); } break; case 't': /* delay in seconds */ if ( lutil_atoi( &delay, optarg ) != 0 ) { usage( argv[0], i ); } break; case 'T': attrs = ldap_str2charray( optarg, "," ); if ( attrs == NULL ) { usage( argv[0], i ); } break; case 'S': swamp++; break; case 's': scope = ldap_pvt_str2scope( optarg ); if ( scope == -1 ) { usage( argv[0], i ); } break; default: usage( argv[0], i ); break; } } if (( sbase == NULL ) || ( filter == NULL ) || ( port == -1 && uri == NULL )) usage( argv[0], '\0' ); if ( *filter == '\0' ) { fprintf( stderr, "%s: invalid EMPTY search filter.\n", argv[0] ); exit( EXIT_FAILURE ); } if ( argv[optind] != NULL ) { attrs = &argv[optind]; } uri = tester_uri( uri, host, port ); for ( i = 0; i < outerloops; i++ ) { if ( attr != NULL ) { do_random( uri, manager, &passwd, sbase, scope, filter, attr, attrs, noattrs, nobind, loops, retries, delay, force, chaserefs ); } else { do_search( uri, manager, &passwd, sbase, scope, filter, NULL, attrs, noattrs, nobind, loops, retries, delay, force, chaserefs ); } } exit( EXIT_SUCCESS ); }