]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapcommon.c
ITS#4780 plug leak
[openldap] / servers / slapd / slapcommon.c
index 9f99363dc8aa0d39a4f98717d1a1ea83504106dd..bad640605a6485b68b45b4d3e26b2aae5653a0f0 100644 (file)
@@ -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 <name>[=<value>]]",
                progname );
 
        switch( tool ) {
        case SLAPACL:
                options = "\n\t[-U authcID | -D authcDN] [-X authzID | -o authzDN=<DN>]"
-                       "\n\t-b DN -o <var>[=<val>] [-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] [-s] [-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;
        }
@@ -189,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;
@@ -199,6 +228,7 @@ slap_tool_init(
         * messages show up; use -d 0 to reset */
        slap_debug = LDAP_DEBUG_NONE;
 #endif
+       ldap_syslog = 0;
 
 #ifdef CSRIMALLOC
        leakfilename = malloc( strlen( progname ) + STRLENOF( ".leak" ) + 1 );
@@ -211,31 +241,31 @@ slap_tool_init(
 
        switch( tool ) {
        case SLAPADD:
-               options = "b:cd:f:F:gl:n:qstuvw";
+               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;
 
@@ -253,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':
@@ -267,7 +297,7 @@ slap_tool_init(
                case 'd': {     /* turn on debugging */
                        int     level = 0;
 
-                       if ( parse_debug_level( optarg, &level ) ) {
+                       if ( parse_debug_level( optarg, &level, &debug_unknowns ) ) {
                                usage( tool, progname );
                        }
 #ifdef LDAP_DEBUG
@@ -290,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':
@@ -323,7 +359,7 @@ slap_tool_init(
                        break;
 
                case 'o':
-                       if ( parse_slapacl() ) {
+                       if ( parse_slapopt() ) {
                                usage( tool, progname );
                        }
                        break;
@@ -347,7 +383,7 @@ slap_tool_init(
                        if ( tool == SLAPADD )
                                mode |= SLAP_TOOL_NO_SCHEMA_CHECK;
                        else if ( tool == SLAPCAT )
-                               subtree = strdup( optarg );
+                               subtree = ch_strdup( optarg );
                        break;
 
                case 't':       /* turn on truncate */
@@ -381,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:
@@ -423,8 +480,6 @@ slap_tool_init(
                break;
        }
 
-       ldap_syslog = 0;
-
        if ( ldiffile == NULL ) {
                dummy.fp = tool == SLAPCAT ? stdout : stdin;
                ldiffp = &dummy;
@@ -454,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 ) {