X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fslapcommon.c;h=a5d4b4f5c954e5d5afc41385f90b6c041e7b2d63;hb=72e319bd02256465a0e8c8a2bc304ec11de97378;hp=1cf60a4260f78be7c6d676f16e8cf94ad2f22c26;hpb=5efa186908ff651ce2234a4ccfeb0dfd305ce674;p=openldap diff --git a/servers/slapd/slapcommon.c b/servers/slapd/slapcommon.c index 1cf60a4260..a5d4b4f5c9 100644 --- a/servers/slapd/slapcommon.c +++ b/servers/slapd/slapcommon.c @@ -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 ) { @@ -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; @@ -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; @@ -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" ); @@ -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: @@ -650,6 +682,7 @@ slap_tool_init( } ch_free( base.bv_val ); + BER_BVZERO( &base ); } else if ( dbnum == -1 ) { /* no suffix and no dbnum specified, just default to @@ -723,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 */ @@ -781,6 +816,7 @@ int slap_tool_destroy( void ) if ( !BER_BVISNULL( &authcDN ) ) { ch_free( authcDN.bv_val ); + BER_BVZERO( &authcDN ); } if ( ldiffp && ldiffp != &dummy ) {