]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapcommon.c
Use sl_mfunc instead of direct reference to slap_sl_free
[openldap] / servers / slapd / slapcommon.c
index 8d4527c9fc2a6bce2dba95f7571042ddf6cef363..7c948a809d9cc42fc332982d13869259a5ff4c3f 100644 (file)
@@ -92,7 +92,12 @@ usage( int tool, const char *progname )
                break;
 
        case SLAPTEST:
-               options = " [-u]\n";
+               options = " [-n databasenumber] [-u]\n";
+               break;
+
+       case SLAPSCHEMA:
+               options = " [-c]\n\t[-g] [-n databasenumber | -b suffix]"
+                       " [-l errorfile] [-a filter] [-s subtree]\n";
                break;
        }
 
@@ -222,11 +227,13 @@ slap_tool_init(
        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;
 
@@ -255,8 +262,13 @@ 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";
+               options = "d:f:F:n:o:Quv";
                mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY;
                break;
 
@@ -396,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;
 
@@ -453,9 +465,21 @@ slap_tool_init(
        }
 #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 );
                }
@@ -502,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 );
@@ -554,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" );
@@ -583,8 +608,11 @@ slap_tool_init(
        }
 
        switch ( tool ) {
-       case SLAPDN:
        case SLAPTEST:
+               if ( dbnum >= 0 )
+                       goto get_db;
+               /* FALLTHRU */
+       case SLAPDN:
        case SLAPAUTH:
                be = NULL;
                goto startup;
@@ -708,6 +736,7 @@ slap_tool_init(
                exit( EXIT_FAILURE );
 
        } else {
+get_db:
                LDAP_STAILQ_FOREACH( be, &backendDB, be_next ) {
                        if ( dbnum == 0 ) break;
                        dbnum--;