X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmain.c;h=38348533d4d698249e23701ab9672dbb75df384f;hb=a17df0e810578d593808c6afeb0cdea55a65633c;hp=f9dd88d893c71b4d5b41359565ee3d85e3d13a53;hpb=5b26601fd093d04f5eab7a527ec26928cd949cce;p=openldap diff --git a/servers/slapd/main.c b/servers/slapd/main.c index f9dd88d893..38348533d4 100644 --- a/servers/slapd/main.c +++ b/servers/slapd/main.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2005 The OpenLDAP Foundation. + * Copyright 1998-2006 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -98,37 +98,6 @@ const char Versionstr[] = OPENLDAP_PACKAGE " " OPENLDAP_VERSION " Standalone LDAP Server (slapd)"; #endif -#ifdef LOG_LOCAL4 -#define DEFAULT_SYSLOG_USER LOG_LOCAL4 - -typedef struct _str2intDispatch { - char *stringVal; - int abbr; - int intVal; -} STRDISP, *STRDISP_P; - -/* table to compute syslog-options to integer */ -static STRDISP syslog_types[] = { - { "LOCAL0", sizeof("LOCAL0"), LOG_LOCAL0 }, - { "LOCAL1", sizeof("LOCAL1"), LOG_LOCAL1 }, - { "LOCAL2", sizeof("LOCAL2"), LOG_LOCAL2 }, - { "LOCAL3", sizeof("LOCAL3"), LOG_LOCAL3 }, - { "LOCAL4", sizeof("LOCAL4"), LOG_LOCAL4 }, - { "LOCAL5", sizeof("LOCAL5"), LOG_LOCAL5 }, - { "LOCAL6", sizeof("LOCAL6"), LOG_LOCAL6 }, - { "LOCAL7", sizeof("LOCAL7"), LOG_LOCAL7 }, -#ifdef LOG_USER - { "USER", sizeof("USER"), LOG_USER }, -#endif -#ifdef LOG_DAEMON - { "DAEMON", sizeof("DAEMON"), LOG_DAEMON }, -#endif - { NULL, 0, 0 } -}; - -static int cnvt_str2int( char *, STRDISP_P, int ); -#endif /* LOG_LOCAL4 */ - #define CHECK_NONE 0x00 #define CHECK_CONFIG 0x01 static int check = CHECK_NONE; @@ -136,6 +105,10 @@ static int version = 0; void *slap_tls_ctx; +#ifdef LOG_LOCAL4 +#define DEFAULT_SYSLOG_USER LOG_LOCAL4 +#endif /* LOG_LOCAL4 */ + static int slapd_opt_slp( const char *val, void *arg ) { @@ -185,6 +158,121 @@ struct option_helper { { BER_BVNULL, 0, NULL, NULL } }; +#ifdef LOG_LOCAL4 +static int +parse_syslog_user( const char *arg, int *syslogUser ) +{ + static slap_verbmasks syslogUsers[] = { + { BER_BVC( "LOCAL0" ), LOG_LOCAL0 }, + { BER_BVC( "LOCAL1" ), LOG_LOCAL1 }, + { BER_BVC( "LOCAL2" ), LOG_LOCAL2 }, + { BER_BVC( "LOCAL3" ), LOG_LOCAL3 }, + { BER_BVC( "LOCAL4" ), LOG_LOCAL4 }, + { BER_BVC( "LOCAL5" ), LOG_LOCAL5 }, + { BER_BVC( "LOCAL6" ), LOG_LOCAL6 }, + { BER_BVC( "LOCAL7" ), LOG_LOCAL7 }, +#ifdef LOG_USER + { BER_BVC( "USER" ), LOG_USER }, +#endif /* LOG_USER */ +#ifdef LOG_DAEMON + { BER_BVC( "DAEMON" ), LOG_DAEMON }, +#endif /* LOG_DAEMON */ + { BER_BVNULL, 0 } + }; + int i = verb_to_mask( optarg, syslogUsers ); + + if ( BER_BVISNULL( &syslogUsers[ i ].word ) ) { + Debug( LDAP_DEBUG_ANY, + "unrecognized syslog user \"%s\".\n", + optarg, 0, 0 ); + return 1; + } + + *syslogUser = syslogUsers[ i ].mask; + + return 0; +} +#endif /* LOG_LOCAL4 */ + +static int +parse_syslog_level( const char *arg, int *levelp ) +{ + static slap_verbmasks str2syslog_level[] = { + { BER_BVC( "EMERG" ), LOG_EMERG }, + { BER_BVC( "ALERT" ), LOG_ALERT }, + { BER_BVC( "CRIT" ), LOG_CRIT }, + { BER_BVC( "ERR" ), LOG_ERR }, + { BER_BVC( "WARNING" ), LOG_WARNING }, + { BER_BVC( "NOTICE" ), LOG_NOTICE }, + { BER_BVC( "INFO" ), LOG_INFO }, + { BER_BVC( "DEBUG" ), LOG_DEBUG }, + { BER_BVNULL, 0 } + }; + int i = verb_to_mask( arg, str2syslog_level ); + if ( BER_BVISNULL( &str2syslog_level[ i ].word ) ) { + Debug( LDAP_DEBUG_ANY, + "unknown syslog level \"%s\".\n", + arg, 0, 0 ); + return 1; + } + + *levelp = str2syslog_level[ i ].mask; + + return 0; +} + +int +parse_debug_level( const char *arg, int *levelp ) +{ + int level; + + if ( arg != NULL && arg[ 0 ] != '-' && !isdigit( arg[ 0 ] ) ) + { + int i, goterr = 0; + char **levels; + + levels = ldap_str2charray( arg, "," ); + + for ( i = 0; levels[ i ] != NULL; i++ ) { + level = 0; + + if ( str2loglevel( levels[ i ], &level ) ) { + fprintf( stderr, + "unrecognized log level " + "\"%s\"\n", levels[ i ] ); + goterr = 1; + /* but keep parsing... */ + + } else { + *levelp |= level; + } + } + + ldap_charray_free( levels ); + + if ( goterr ) { + return 1; + } + + } else { + if ( lutil_atoix( &level, arg, 0 ) != 0 ) { + fprintf( stderr, + "unrecognized log level " + "\"%s\"\n", arg ); + return 1; + } + + if ( level == 0 ) { + *levelp = 0; + + } else { + *levelp |= level; + } + } + + return 0; +} + static void usage( char *name ) { @@ -341,11 +429,14 @@ int main( int argc, char **argv ) #ifdef HAVE_CHROOT "r:" #endif +#ifdef LDAP_SYSLOG + "S:" +#endif #ifdef LOG_LOCAL4 - "l:" + "l:" #endif #if defined(HAVE_SETUID) && defined(HAVE_SETGID) - "u:g:" + "u:g:" #endif )) != EOF ) { switch ( i ) { @@ -395,46 +486,13 @@ int main( int argc, char **argv ) int level = 0; no_detach = 1; -#ifdef LDAP_DEBUG - if ( optarg != NULL && optarg[ 0 ] != '-' && !isdigit( optarg[ 0 ] ) ) - { - int i, goterr = 0; - char **levels; - - levels = ldap_str2charray( optarg, "," ); - - for ( i = 0; levels[ i ] != NULL; i++ ) { - level = 0; - - if ( str2loglevel( levels[ i ], &level ) ) { - fprintf( stderr, - "unrecognized log level " - "\"%s\"\n", levels[ i ] ); - goterr = 1; - /* but keep parsing... */ - - } else { - slap_debug |= level; - } - } - - ldap_charray_free( levels ); - - if ( goterr ) { - goto destroy; - } - - } else { - if ( lutil_atoix( &level, optarg, 0 ) != 0 ) { - fprintf( stderr, - "unrecognized log level " - "\"%s\"\n", optarg ); - goto destroy; - } - slap_debug |= level; + if ( parse_debug_level( optarg, &level ) ) { + goto destroy; } +#ifdef LDAP_DEBUG + 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 @@ -483,16 +541,24 @@ int main( int argc, char **argv ) } case 's': /* set syslog level */ - if ( lutil_atoi( &ldap_syslog_level, optarg ) != 0 ) { - fprintf( stderr, "unable to parse syslog level \"%s\"", optarg ); + if ( parse_debug_level( optarg, &ldap_syslog ) ) { + goto destroy; + } + break; + +#if defined(LDAP_DEBUG) && defined(LDAP_SYSLOG) + case 'S': + if ( parse_syslog_level( optarg, &ldap_syslog_level ) ) { goto destroy; } break; +#endif /* LDAP_DEBUG && LDAP_SYSLOG */ #ifdef LOG_LOCAL4 case 'l': /* set syslog local user */ - syslogUser = cnvt_str2int( optarg, - syslog_types, DEFAULT_SYSLOG_USER ); + if ( parse_syslog_user( optarg, &syslogUser ) ) { + goto destroy; + } break; #endif @@ -833,6 +899,7 @@ destroy: extops_kill(); supported_feature_destroy(); + entry_info_destroy(); stop: #ifdef HAVE_NT_EVENT_LOG @@ -915,31 +982,3 @@ wait4child( int sig ) #endif /* LDAP_SIGCHLD */ - -#ifdef LOG_LOCAL4 - -/* - * Convert a string to an integer by means of a dispatcher table - * if the string is not in the table return the default - */ - -static int -cnvt_str2int( char *stringVal, STRDISP_P dispatcher, int defaultVal ) -{ - int retVal = defaultVal; - STRDISP_P disp; - - for (disp = dispatcher; disp->stringVal; disp++) { - - if (!strncasecmp (stringVal, disp->stringVal, disp->abbr)) { - - retVal = disp->intVal; - break; - - } - } - - return (retVal); -} - -#endif /* LOG_LOCAL4 */