X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fslapcommon.c;h=a5d4b4f5c954e5d5afc41385f90b6c041e7b2d63;hb=72e319bd02256465a0e8c8a2bc304ec11de97378;hp=188d4c73e5c6e1064a6ef200937443a21febe6a1;hpb=88cbe052e079d3a4ee0848e2442fd92821744a30;p=openldap diff --git a/servers/slapd/slapcommon.c b/servers/slapd/slapcommon.c index 188d4c73e5..a5d4b4f5c9 100644 --- a/servers/slapd/slapcommon.c +++ b/servers/slapd/slapcommon.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2007 The OpenLDAP Foundation. + * Copyright 1998-2009 The OpenLDAP Foundation. * Portions Copyright 1998-2003 Kurt D. Zeilenga. * Portions Copyright 2003 IBM Corporation. * All rights reserved. @@ -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: @@ -88,12 +88,17 @@ usage( int tool, const char *progname ) break; case SLAPINDEX: - options = " [-c]\n\t[-g] [-n databasenumber | -b suffix] [attr ...] [-q]\n"; + options = " [-c]\n\t[-g] [-n databasenumber | -b suffix] [attr ...] [-q] [-t]\n"; break; 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,11 +244,12 @@ slap_tool_init( leakfile = stderr; } free( leakfilename ); + leakfilename = NULL; #endif switch( tool ) { case SLAPADD: - options = "b:cd:f:F:gj:l:n:o:qstuvw"; + options = "b:cd:f:F:gj:l:n:o:qsS:uvw"; break; case SLAPCAT: @@ -254,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:uv"; + options = "d:f:F:o:Quv"; mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY; break; @@ -265,7 +278,7 @@ slap_tool_init( break; case SLAPINDEX: - options = "b:cd:f:F:gn:o:qv"; + options = "b:cd:f:F:gn:o:qtv"; mode |= SLAP_TOOL_READMAIN; break; @@ -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; @@ -371,6 +384,11 @@ slap_tool_init( dn_mode = SLAP_TOOL_LDAPDN_PRETTY; break; + case 'Q': + quiet++; + slap_debug = 0; + break; + case 'q': /* turn on quick */ mode |= SLAP_TOOL_QUICK; break; @@ -379,10 +397,18 @@ slap_tool_init( realm = optarg; break; + case 'S': + if ( lutil_atou( &csnsid, optarg ) + || csnsid > SLAP_SYNC_SID_MAX ) + { + usage( tool, progname ); + } + break; + 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; @@ -434,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 ); } @@ -487,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 ); @@ -539,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" ); @@ -551,7 +591,7 @@ slap_tool_init( } if ( use_glue ) { - rc = glue_sub_attach(); + rc = glue_sub_attach( 0 ); if ( rc != 0 ) { fprintf( stderr, @@ -585,6 +625,9 @@ slap_tool_init( fprintf( stderr, "Invalid filter '%s'\n", filterstr ); exit( EXIT_FAILURE ); } + + ch_free( filterstr ); + filterstr = NULL; } if( subtree ) { @@ -600,6 +643,7 @@ slap_tool_init( base = val; } else { free( subtree ); + subtree = NULL; } } @@ -615,6 +659,7 @@ slap_tool_init( be = select_backend( &nbase, 0 ); ber_memfree( nbase.bv_val ); + BER_BVZERO( &nbase ); switch ( tool ) { case SLAPACL: @@ -636,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 @@ -676,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 { @@ -692,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); @@ -699,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 */ @@ -727,13 +786,16 @@ startup:; } } -void slap_tool_destroy( void ) +int slap_tool_destroy( void ) { + int rc = 0; if ( !dryrun ) { if ( need_shutdown ) { - slap_shutdown( be ); + if ( slap_shutdown( be )) + rc = EXIT_FAILURE; } - slap_destroy(); + if ( slap_destroy()) + rc = EXIT_FAILURE; } #ifdef SLAPD_MODULES if ( slapMode == SLAP_SERVER_MODE ) { @@ -754,5 +816,11 @@ void slap_tool_destroy( void ) if ( !BER_BVISNULL( &authcDN ) ) { ch_free( authcDN.bv_val ); + BER_BVZERO( &authcDN ); + } + + if ( ldiffp && ldiffp != &dummy ) { + ldif_close( ldiffp ); } + return rc; }