]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapcommon.c
ITS#6242
[openldap] / servers / slapd / slapcommon.c
index c29b121144fc1329ebeb5c69c66b2e44582025e4..a5d4b4f5c954e5d5afc41385f90b6c041e7b2d63 100644 (file)
@@ -80,7 +80,7 @@ usage( int tool, const char *progname )
 
        case SLAPCAT:
                options = " [-c]\n\t[-g] [-n databasenumber | -b suffix]"
-                       " [-l ldiffile] [-a filter]\n";
+                       " [-l ldiffile] [-a filter] [-s subtree]\n";
                break;
 
        case SLAPDN:
@@ -94,6 +94,11 @@ usage( int tool, const char *progname )
        case SLAPTEST:
                options = " [-u]\n";
                break;
+
+       case SLAPSCHEMA:
+               options = " [-c]\n\t[-g] [-n databasenumber | -b suffix]"
+                       " [-l errorfile] [-a filter] [-s subtree]\n";
+               break;
        }
 
        if ( options != NULL ) {
@@ -218,15 +223,17 @@ slap_tool_init(
        char *subtree = NULL;
        char *ldiffile  = NULL;
        char **debug_unknowns = NULL;
-       int rc, i, dbnum;
+       int rc, i;
        int mode = SLAP_TOOL_MODE;
        int truncatemode = 0;
        int use_glue = 1;
+       int writer;
 
 #ifdef LDAP_DEBUG
        /* tools default to "none", so that at least LDAP_DEBUG_ANY 
         * messages show up; use -d 0 to reset */
        slap_debug = LDAP_DEBUG_NONE;
+       ldif_debug = slap_debug;
 #endif
        ldap_syslog = 0;
 
@@ -237,6 +244,7 @@ slap_tool_init(
                leakfile = stderr;
        }
        free( leakfilename );
+       leakfilename = NULL;
 #endif
 
        switch( tool ) {
@@ -254,6 +262,11 @@ slap_tool_init(
                mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY;
                break;
 
+       case SLAPSCHEMA:
+               options = "a:b:cd:f:F:gl:n:o:s:v";
+               mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY;
+               break;
+
        case SLAPTEST:
                options = "d:f:F:o:Quv";
                mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY;
@@ -353,7 +366,7 @@ slap_tool_init(
                        break;
 
                case 'n':       /* which config file db to index */
-                       if ( lutil_atoi( &dbnum, optarg ) ) {
+                       if ( lutil_atoi( &dbnum, optarg ) || dbnum < 0 ) {
                                usage( tool, progname );
                        }
                        break;
@@ -395,7 +408,7 @@ slap_tool_init(
                case 's':       /* dump subtree */
                        if ( tool == SLAPADD )
                                mode |= SLAP_TOOL_NO_SCHEMA_CHECK;
-                       else if ( tool == SLAPCAT )
+                       else if ( tool == SLAPCAT || tool == SLAPSCHEMA )
                                subtree = ch_strdup( optarg );
                        break;
 
@@ -447,13 +460,26 @@ slap_tool_init(
 #endif
 #ifdef HAVE_EBCDIC
                free( logName );
+               logName = NULL;
 #endif
        }
 #endif /* LDAP_DEBUG && LDAP_SYSLOG */
 
+       switch ( tool ) {
+       case SLAPCAT:
+       case SLAPSCHEMA:
+               writer = 1;
+               break;
+
+       default:
+               writer = 0;
+               break;
+       }
+
        switch ( tool ) {
        case SLAPADD:
        case SLAPCAT:
+       case SLAPSCHEMA:
                if ( ( argc != optind ) || (dbnum >= 0 && base.bv_val != NULL ) ) {
                        usage( tool, progname );
                }
@@ -500,10 +526,10 @@ slap_tool_init(
        }
 
        if ( ldiffile == NULL ) {
-               dummy.fp = tool == SLAPCAT ? stdout : stdin;
+               dummy.fp = writer ? stdout : stdin;
                ldiffp = &dummy;
 
-       } else if ((ldiffp = ldif_open( ldiffile, tool == SLAPCAT ? "w" : "r" ))
+       } else if ((ldiffp = ldif_open( ldiffile, writer ? "w" : "r" ))
                == NULL )
        {
                perror( ldiffile );
@@ -552,6 +578,7 @@ slap_tool_init(
        case SLAPADD:
        case SLAPCAT:
        case SLAPINDEX:
+       case SLAPSCHEMA:
                if ( !nbackends ) {
                        fprintf( stderr, "No databases found "
                                        "in config file\n" );
@@ -564,7 +591,7 @@ slap_tool_init(
        }
 
        if ( use_glue ) {
-               rc = glue_sub_attach();
+               rc = glue_sub_attach( 0 );
 
                if ( rc != 0 ) {
                        fprintf( stderr,
@@ -598,6 +625,9 @@ slap_tool_init(
                        fprintf( stderr, "Invalid filter '%s'\n", filterstr );
                        exit( EXIT_FAILURE );
                }
+
+               ch_free( filterstr );
+               filterstr = NULL;
        }
 
        if( subtree ) {
@@ -613,6 +643,7 @@ slap_tool_init(
                        base = val;
                } else {
                        free( subtree );
+                       subtree = NULL;
                }
        }
 
@@ -628,6 +659,7 @@ slap_tool_init(
 
                be = select_backend( &nbase, 0 );
                ber_memfree( nbase.bv_val );
+               BER_BVZERO( &nbase );
 
                switch ( tool ) {
                case SLAPACL:
@@ -649,6 +681,9 @@ slap_tool_init(
                        nosubordinates = 1;
                }
 
+               ch_free( base.bv_val );
+               BER_BVZERO( &base );
+
        } else if ( dbnum == -1 ) {
                /* no suffix and no dbnum specified, just default to
                 * the first available database
@@ -689,12 +724,12 @@ slap_tool_init(
                                progname, dbnum, 0 );
                }
 
-       } else if ( dbnum < 0 || dbnum > (nbackends-1) ) {
+       } else if ( dbnum >= nbackends ) {
                fprintf( stderr,
                        "Database number selected via -n is out of range\n"
                        "Must be in the range 0 to %d"
-                       " (number of configured databases)\n",
-                       nbackends-1 );
+                       " (the number of configured databases)\n",
+                       nbackends - 1 );
                exit( EXIT_FAILURE );
 
        } else {
@@ -705,6 +740,15 @@ slap_tool_init(
        }
 
 startup:;
+       if ( be ) {
+               BackendDB *bdtmp;
+
+               dbnum = 0;
+               LDAP_STAILQ_FOREACH( bdtmp, &backendDB, be_next ) {
+                       if ( bdtmp == be ) break;
+                       dbnum++;
+               }
+       }
 
 #ifdef CSRIMALLOC
        mal_leaktrace(1);
@@ -712,10 +756,12 @@ startup:;
 
        if ( conffile != NULL ) {
                ch_free( conffile );
+               conffile = NULL;
        }
 
        if ( ldiffile != NULL ) {
                ch_free( ldiffile );
+               ldiffile = NULL;
        }
 
        /* slapdn doesn't specify a backend to startup */
@@ -770,6 +816,7 @@ int slap_tool_destroy( void )
 
        if ( !BER_BVISNULL( &authcDN ) ) {
                ch_free( authcDN.bv_val );
+               BER_BVZERO( &authcDN );
        }
 
        if ( ldiffp && ldiffp != &dummy ) {