]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/main.c
ITS#4310 seems to affect also back-ldbm
[openldap] / servers / slapd / main.c
index f9dd88d893c71b4d5b41359565ee3d85e3d13a53..38348533d4d698249e23701ab9672dbb75df384f 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * 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 */