X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fslapcommon.c;h=bad640605a6485b68b45b4d3e26b2aae5653a0f0;hb=5747896ba081ff998fd97863de26d2f4af59bbd2;hp=ec36850cc6ad14227e02507989141ecc50f5d0c8;hpb=d34fffcaf9edc00262209fbe6e04bb15805dbd37;p=openldap diff --git a/servers/slapd/slapcommon.c b/servers/slapd/slapcommon.c index ec36850cc6..bad640605a 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-2005 The OpenLDAP Foundation. + * Copyright 1998-2006 The OpenLDAP Foundation. * Portions Copyright 1998-2003 Kurt D. Zeilenga. * Portions Copyright 2003 IBM Corporation. * All rights reserved. @@ -47,23 +47,31 @@ static FILE *leakfile; static LDIFFP dummy; +#ifdef LDAP_SYSLOG +int start_syslog; +static char **syslog_unknowns; +#ifdef LOG_LOCAL4 +static int syslogUser = SLAP_DEFAULT_SYSLOG_USER; +#endif /* LOG_LOCAL4 */ +#endif /* LDAP_SYSLOG */ + static void usage( int tool, const char *progname ) { char *options = NULL; fprintf( stderr, - "usage: %s [-v] [-d debuglevel] [-f configfile] [-F configdir]", + "usage: %s [-v] [-d debuglevel] [-f configfile] [-F configdir] [-o [=]]", progname ); switch( tool ) { case SLAPACL: options = "\n\t[-U authcID | -D authcDN] [-X authzID | -o authzDN=]" - "\n\t-b DN -o [=] [-u] [attr[/access][:value]] [...]\n"; + "\n\t-b DN [-u] [attr[/access][:value]] [...]\n"; break; case SLAPADD: options = " [-c]\n\t[-g] [-n databasenumber | -b suffix]\n" - "\t[-l ldiffile] [-q] [-u] [-w]\n"; + "\t[-l ldiffile] [-j linenumber] [-q] [-u] [-s] [-w]\n"; break; case SLAPAUTH: @@ -95,19 +103,17 @@ usage( int tool, const char *progname ) } static int -parse_slapacl( void ) +parse_slapopt( void ) { - size_t len; + size_t len = 0; char *p; p = strchr( optarg, '=' ); - if ( p == NULL ) { - return -1; + if ( p != NULL ) { + len = p - optarg; + p++; } - len = p - optarg; - p++; - if ( strncasecmp( optarg, "sockurl", len ) == 0 ) { if ( !BER_BVISNULL( &listener_url ) ) { ber_memfree( listener_url.bv_val ); @@ -159,6 +165,28 @@ parse_slapacl( void ) } else if ( strncasecmp( optarg, "authzDN", len ) == 0 ) { ber_str2bv( p, 0, 1, &authzDN ); +#ifdef LDAP_SYSLOG + } else if ( strncasecmp( optarg, "syslog", len ) == 0 ) { + if ( parse_debug_level( p, &ldap_syslog, &syslog_unknowns ) ) { + return -1; + } + start_syslog = 1; + + } else if ( strncasecmp( optarg, "syslog-level", len ) == 0 ) { + if ( parse_syslog_level( p, &ldap_syslog_level ) ) { + return -1; + } + start_syslog = 1; + +#ifdef LOG_LOCAL4 + } else if ( strncasecmp( optarg, "syslog-user", len ) == 0 ) { + if ( parse_syslog_user( p, &syslogUser ) ) { + return -1; + } + start_syslog = 1; +#endif /* LOG_LOCAL4 */ +#endif /* LDAP_SYSLOG */ + } else { return -1; } @@ -174,6 +202,8 @@ parse_slapacl( void ) * argc, argv command line arguments */ +static int need_shutdown; + void slap_tool_init( const char* progname, @@ -187,6 +217,7 @@ slap_tool_init( char *filterstr = NULL; char *subtree = NULL; char *ldiffile = NULL; + char **debug_unknowns = NULL; int rc, i, dbnum; int mode = SLAP_TOOL_MODE; int truncatemode = 0; @@ -195,8 +226,9 @@ slap_tool_init( #ifdef LDAP_DEBUG /* tools default to "none", so that at least LDAP_DEBUG_ANY * messages show up; use -d 0 to reset */ - ldap_debug = LDAP_DEBUG_NONE; + slap_debug = LDAP_DEBUG_NONE; #endif + ldap_syslog = 0; #ifdef CSRIMALLOC leakfilename = malloc( strlen( progname ) + STRLENOF( ".leak" ) + 1 ); @@ -209,31 +241,31 @@ slap_tool_init( switch( tool ) { case SLAPADD: - options = "b:cd:f:F:gl:n:qtuvw"; + options = "b:cd:f:F:gj:l:n:o:qstuvw"; break; case SLAPCAT: - options = "a:b:cd:f:F:gl:n:s:v"; + options = "a:b:cd:f:F:gl:n:o:s:v"; mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY; break; case SLAPDN: - options = "d:f:F:NPv"; + options = "d:f:F:No:Pv"; mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY; break; case SLAPTEST: - options = "d:f:F:uv"; + options = "d:f:F:o:uv"; mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY; break; case SLAPAUTH: - options = "d:f:F:M:R:U:vX:"; + options = "d:f:F:M:o:R:U:vX:"; mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY; break; case SLAPINDEX: - options = "b:cd:f:F:gn:qv"; + options = "b:cd:f:F:gn:o:qv"; mode |= SLAP_TOOL_READMAIN; break; @@ -251,7 +283,7 @@ slap_tool_init( while ( (i = getopt( argc, argv, options )) != EOF ) { switch ( i ) { case 'a': - filterstr = strdup( optarg ); + filterstr = ch_strdup( optarg ); break; case 'b': @@ -262,35 +294,22 @@ slap_tool_init( continuemode++; break; - case 'd': /* turn on debugging */ - { -#ifdef LDAP_DEBUG - int level; - - if ( optarg != NULL && optarg[ 0 ] != '-' && !isdigit( optarg[ 0 ] ) ) - { - if ( str2loglevel( optarg, &level ) ) { - fprintf( stderr, - "unrecognized log level " - "\"%s\"\n", optarg ); - exit( EXIT_FAILURE ); - } - - } else if ( lutil_atoi( &level, optarg ) != 0 ) { - fprintf( stderr, - "unrecognized log level " - "\"%s\"\n", optarg ); - exit( EXIT_FAILURE ); + case 'd': { /* turn on debugging */ + int level = 0; + + if ( parse_debug_level( optarg, &level, &debug_unknowns ) ) { + usage( tool, progname ); } +#ifdef LDAP_DEBUG + if ( level == 0 ) { + /* allow to reset log level */ + slap_debug = 0; - if ( level ) { - ldap_debug |= level; } else { - /* allow to reset log level */ - ldap_debug = 0; + slap_debug |= level; } #else - if ( lutil_atoi( &level, optarg ) != 0 || level != 0 ) + if ( level != 0 ) fputs( "must compile with LDAP_DEBUG for debugging\n", stderr ); #endif @@ -301,19 +320,25 @@ slap_tool_init( break; case 'f': /* specify a conf file */ - conffile = strdup( optarg ); + conffile = ch_strdup( optarg ); break; case 'F': /* specify a conf dir */ - confdir = strdup( optarg ); + confdir = ch_strdup( optarg ); break; case 'g': /* disable subordinate glue */ use_glue = 0; break; + case 'j': /* jump to linenumber */ + if ( lutil_atoi( &jumpline, optarg ) ) { + usage( tool, progname ); + } + break; + case 'l': /* LDIF file */ - ldiffile = strdup( optarg ); + ldiffile = ch_strdup( optarg ); break; case 'M': @@ -334,7 +359,7 @@ slap_tool_init( break; case 'o': - if ( parse_slapacl() ) { + if ( parse_slapopt() ) { usage( tool, progname ); } break; @@ -355,7 +380,10 @@ slap_tool_init( break; case 's': /* dump subtree */ - subtree = strdup( optarg ); + if ( tool == SLAPADD ) + mode |= SLAP_TOOL_NO_SCHEMA_CHECK; + else if ( tool == SLAPCAT ) + subtree = ch_strdup( optarg ); break; case 't': /* turn on truncate */ @@ -389,6 +417,27 @@ slap_tool_init( } } +#ifdef LDAP_SYSLOG + if ( start_syslog ) { + char *logName; +#ifdef HAVE_EBCDIC + logName = ch_strdup( progname ); + __atoe( logName ); +#else + logName = (char *)progname; +#endif + +#ifdef LOG_LOCAL4 + openlog( logName, OPENLOG_OPTIONS, syslogUser ); +#elif LOG_DEBUG + openlog( logName, OPENLOG_OPTIONS ); +#endif +#ifdef HAVE_EBCDIC + free( logName ); +#endif + } +#endif /* LDAP_SYSLOG */ + switch ( tool ) { case SLAPADD: case SLAPCAT: @@ -431,8 +480,6 @@ slap_tool_init( break; } - ldap_syslog = 0; - if ( ldiffile == NULL ) { dummy.fp = tool == SLAPCAT ? stdout : stdin; ldiffp = &dummy; @@ -462,6 +509,24 @@ slap_tool_init( exit( EXIT_FAILURE ); } + if ( debug_unknowns ) { + rc = parse_debug_unknowns( debug_unknowns, &slap_debug ); + ldap_charray_free( debug_unknowns ); + debug_unknowns = NULL; + if ( rc ) + exit( EXIT_FAILURE ); + } + +#ifdef LDAP_SYSLOG + if ( syslog_unknowns ) { + rc = parse_debug_unknowns( syslog_unknowns, &ldap_syslog ); + ldap_charray_free( syslog_unknowns ); + syslog_unknowns = NULL; + if ( rc ) + exit( EXIT_FAILURE ); + } +#endif + at_oc_cache = 1; switch ( tool ) { @@ -635,27 +700,33 @@ startup:; } /* slapdn doesn't specify a backend to startup */ - if ( !dryrun && tool != SLAPDN && slap_startup( be ) ) { - switch ( tool ) { - case SLAPTEST: - fprintf( stderr, "slap_startup failed " - "(test would succeed using " - "the -u switch)\n" ); - break; + if ( !dryrun && tool != SLAPDN ) { + need_shutdown = 1; + + if ( slap_startup( be ) ) { + switch ( tool ) { + case SLAPTEST: + fprintf( stderr, "slap_startup failed " + "(test would succeed using " + "the -u switch)\n" ); + break; + + default: + fprintf( stderr, "slap_startup failed\n" ); + break; + } - default: - fprintf( stderr, "slap_startup failed\n" ); - break; + exit( EXIT_FAILURE ); } - - exit( EXIT_FAILURE ); } } void slap_tool_destroy( void ) { if ( !dryrun ) { - slap_shutdown( be ); + if ( need_shutdown ) { + slap_shutdown( be ); + } slap_destroy(); } #ifdef SLAPD_MODULES