X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmain.c;h=a70698f2f449dee3663350ad2dc8a321858e4074;hb=c4f99a5ddcd06ea4daaaa41ef3bcd5919c1e0549;hp=a172b5009cbf71c2d0e899977a7e2dca07166f26;hpb=2189d8d4cbb9f0dd6791789a633e5c909b7efd2c;p=openldap diff --git a/servers/slapd/main.c b/servers/slapd/main.c index a172b5009c..a70698f2f4 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-2010 The OpenLDAP Foundation. + * Copyright 1998-2011 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -100,6 +100,9 @@ const char Versionstr[] = OPENLDAP_PACKAGE " " OPENLDAP_VERSION " Standalone LDAP Server (slapd)"; #endif +extern OverlayInit slap_oinfo[]; +extern BackendInfo slap_binfo[]; + #define CHECK_NONE 0x00 #define CHECK_CONFIG 0x01 #define CHECK_LOGLEVEL 0x02 @@ -341,7 +344,8 @@ usage( char *name ) #if defined(HAVE_SETUID) && defined(HAVE_SETGID) "\t-u user\t\tUser (id or name) to run as\n" #endif - "\t-V\t\tprint version info (-VV only)\n" + "\t-V\t\tprint version info (-VV exit afterwards, -VVV print\n" + "\t\t\tinfo about static overlays and backends)\n" ); } @@ -365,6 +369,9 @@ int main( int argc, char **argv ) int syslogUser = SLAP_DEFAULT_SYSLOG_USER; #endif +#ifndef HAVE_WINSOCK + int pid, waitfds[2]; +#endif int g_argc = argc; char **g_argv = argv; @@ -440,13 +447,13 @@ int main( int argc, char **argv ) newConfigFile = (char*)lutil_getRegParam( regService, "ConfigFile" ); if ( newConfigFile != NULL ) { - configfile = newConfigFile; + configfile = ch_strdup(newConfigFile); Debug ( LDAP_DEBUG_ANY, "new config file from registry is: %s\n", configfile, 0, 0 ); } newConfigDir = (char*)lutil_getRegParam( regService, "ConfigDir" ); if ( newConfigDir != NULL ) { - configdir = newConfigDir; + configdir = ch_strdup(newConfigDir); Debug ( LDAP_DEBUG_ANY, "new config dir from registry is: %s\n", configdir, 0, 0 ); } } @@ -679,12 +686,30 @@ unhandled_option:; } } + if ( optind != argc ) + goto unhandled_option; + ber_set_option(NULL, LBER_OPT_DEBUG_LEVEL, &slap_debug); ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, &slap_debug); ldif_debug = slap_debug; if ( version ) { fprintf( stderr, "%s\n", Versionstr ); + if ( version > 2 ) { + if ( slap_oinfo[0].ov_type ) { + fprintf( stderr, "Included static overlays:\n"); + for ( i= 0 ; slap_oinfo[i].ov_type; i++ ) { + fprintf( stderr, " %s\n", slap_oinfo[i].ov_type ); + } + } + if ( slap_binfo[0].bi_type ) { + fprintf( stderr, "Included static backends:\n"); + for ( i= 0 ; slap_binfo[i].bi_type; i++ ) { + fprintf( stderr, " %s\n", slap_binfo[i].bi_type ); + } + } + } + if ( version > 1 ) goto stop; } @@ -827,7 +852,7 @@ unhandled_option:; if( rc != 0) { Debug( LDAP_DEBUG_ANY, "main: TLS init failed: %d\n", - 0, 0, 0 ); + rc, 0, 0 ); rc = 1; SERVICE_EXIT( ERROR_SERVICE_SPECIFIC_ERROR, 20 ); goto destroy; @@ -882,7 +907,26 @@ unhandled_option:; #endif #ifndef HAVE_WINSOCK - lutil_detach( no_detach, 0 ); + if ( !no_detach ) { + if ( lutil_pair( waitfds ) < 0 ) { + Debug( LDAP_DEBUG_ANY, + "main: lutil_pair failed: %d\n", + 0, 0, 0 ); + rc = 1; + goto destroy; + } + pid = lutil_detach( no_detach, 0 ); + if ( pid ) { + char buf[4]; + rc = EXIT_SUCCESS; + close( waitfds[1] ); + if ( read( waitfds[0], buf, 1 ) != 1 ) + rc = EXIT_FAILURE; + _exit( rc ); + } else { + close( waitfds[0] ); + } + } #endif /* HAVE_WINSOCK */ #ifdef CSRIMALLOC @@ -953,6 +997,13 @@ unhandled_option:; Debug( LDAP_DEBUG_ANY, "slapd starting\n", 0, 0, 0 ); +#ifndef HAVE_WINSOCK + if ( !no_detach ) { + write( waitfds[1], "1", 1 ); + close( waitfds[1] ); + } +#endif + #ifdef HAVE_NT_EVENT_LOG if (is_NT_Service) lutil_LogStartedEvent( serverName, slap_debug, configfile ?