]> git.sur5r.net Git - openldap/blobdiff - tests/progs/slapd-tester.c
ITS#6003, #5916 fix ldap_back_entry_get_rw, no deref here
[openldap] / tests / progs / slapd-tester.c
index ebdddc6f36e1c56942065f671e21e47d97a40464..5534228c6b736b9352305c6da5c29db874cdc9f4 100644 (file)
@@ -1,7 +1,7 @@
 /* $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"
@@ -60,7 +60,7 @@
 #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 );
@@ -133,11 +133,14 @@ main( int argc, char **argv )
        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];
@@ -145,15 +148,16 @@ main( int argc, char **argv )
        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];
@@ -161,7 +165,7 @@ main( int argc, char **argv )
        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];
@@ -170,7 +174,7 @@ main( int argc, char **argv )
        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];
@@ -180,7 +184,7 @@ main( int argc, char **argv )
        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;
@@ -269,7 +273,7 @@ main( int argc, char **argv )
                        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, "," );
 
@@ -411,29 +415,64 @@ main( int argc, char **argv )
                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 */
@@ -507,13 +546,16 @@ main( int argc, char **argv )
        }
        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
@@ -561,9 +603,10 @@ main( int argc, char **argv )
        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
@@ -606,7 +649,7 @@ main( int argc, char **argv )
        }
        nargs[nanum++] = "-e";
        nargs[nanum++] = NULL;          /* will hold the modrdn entry */
-       nargs[nanum++] = NULL;
+       nargs[nanum] = NULL;
        
        /*
         * generate the modify clients
@@ -651,7 +694,7 @@ main( int argc, char **argv )
        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
@@ -694,7 +737,7 @@ main( int argc, char **argv )
        }
        aargs[aanum++] = "-f";
        aargs[aanum++] = NULL;          /* will hold the add data file */
-       aargs[aanum++] = NULL;
+       aargs[aanum] = NULL;
 
        /*
         * generate the bind clients
@@ -744,56 +787,99 @@ main( int argc, char **argv )
        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 - 1] = NULL;
+                               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 - 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;
 
@@ -807,23 +893,25 @@ main( int argc, char **argv )
                        }
 
                        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;
                }
        }
 
@@ -844,7 +932,7 @@ get_file_name( char *dirname, char *filename )
 
 
 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;
@@ -853,11 +941,35 @@ get_search_filters( char *filename, char *filters[], char *attrs[], char *bases[
                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';
@@ -867,15 +979,15 @@ get_search_filters( char *filename, char *filters[], char *attrs[], char *bases[
                                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++;
@@ -884,7 +996,7 @@ get_search_filters( char *filename, char *filters[], char *attrs[], char *bases[
                fclose( fp );
        }
 
-       return( filter );
+       return filter;
 }
 
 
@@ -906,13 +1018,13 @@ get_read_entries( char *filename, char *entries[], char *filters[] )
                                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;
                                }
 
@@ -966,6 +1078,13 @@ fork_child( char *prog, char **args )
 #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;