From 93da727d86c72b8f21e24e90dd010dafcb35a9d7 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Tue, 1 Mar 2011 01:19:37 +0000 Subject: [PATCH] ITS#6848 Add -w option to wait for DB startup before parent exits --- include/lutil.h | 2 +- libraries/liblutil/detach.c | 12 +++++---- servers/slapd/main.c | 49 +++++++++++++++++++++++++++++++++++-- 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/include/lutil.h b/include/lutil.h index d244e77a76..d90a629dbe 100644 --- a/include/lutil.h +++ b/include/lutil.h @@ -48,7 +48,7 @@ lutil_b64_pton LDAP_P(( size_t)); /* detach.c */ -LDAP_LUTIL_F( void ) +LDAP_LUTIL_F( int ) lutil_detach LDAP_P(( int debug, int do_close)); diff --git a/libraries/liblutil/detach.c b/libraries/liblutil/detach.c index dd89119ea8..459709bf53 100644 --- a/libraries/liblutil/detach.c +++ b/libraries/liblutil/detach.c @@ -49,10 +49,10 @@ #include "lutil.h" -void +int lutil_detach( int debug, int do_close ) { - int i, sd, nbits; + int i, sd, nbits, pid; #ifdef HAVE_SYSCONF nbits = sysconf( _SC_OPEN_MAX ); @@ -71,10 +71,11 @@ lutil_detach( int debug, int do_close ) if ( debug == 0 ) { for ( i = 0; i < 5; i++ ) { #ifdef HAVE_THR - switch ( fork1() ) + pid = fork1(); #else - switch ( fork() ) + pid = fork(); #endif + switch ( pid ) { case -1: sleep( 5 ); @@ -84,7 +85,7 @@ lutil_detach( int debug, int do_close ) break; default: - _exit( EXIT_SUCCESS ); + return pid; } break; } @@ -139,4 +140,5 @@ lutil_detach( int debug, int do_close ) #ifdef SIGPIPE (void) SIGNAL( SIGPIPE, SIG_IGN ); #endif + return 0; } diff --git a/servers/slapd/main.c b/servers/slapd/main.c index 41d66907d9..1cf5419269 100644 --- a/servers/slapd/main.c +++ b/servers/slapd/main.c @@ -346,6 +346,9 @@ usage( char *name ) #endif "\t-V\t\tprint version info (-VV exit afterwards, -VVV print\n" "\t\t\tinfo about static overlays and backends)\n" +#ifndef HAVE_WINSOCK + "\t-w Wait for database startup before exiting\n" +#endif ); } @@ -369,6 +372,9 @@ int main( int argc, char **argv ) int syslogUser = SLAP_DEFAULT_SYSLOG_USER; #endif +#ifndef HAVE_WINSOCK + int pid, wait_for_start = 0, waitfds[2]; +#endif int g_argc = argc; char **g_argv = argv; @@ -472,6 +478,9 @@ int main( int argc, char **argv ) #endif #if defined(HAVE_SETUID) && defined(HAVE_SETGID) "u:g:" +#endif +#ifndef HAVE_WINSOCK + "w" #endif )) != EOF ) { switch ( i ) { @@ -640,6 +649,12 @@ int main( int argc, char **argv ) version++; break; +#ifndef HAVE_WINSOCK + case 'w': + wait_for_start = 1; + break; +#endif + case 'T': if ( firstopt == 0 ) { fprintf( stderr, "warning: \"-T %s\" " @@ -849,7 +864,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; @@ -904,7 +919,30 @@ unhandled_option:; #endif #ifndef HAVE_WINSOCK - lutil_detach( no_detach, 0 ); + if ( wait_for_start ) { + 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 ) { + rc = EXIT_SUCCESS; + if ( wait_for_start ) { + char buf[4]; + close( waitfds[1] ); + if ( read( waitfds[0], buf, 1 ) != 1 ) + rc = EXIT_FAILURE; + } + _exit( rc ); + } else { + if ( wait_for_start ) { + close( waitfds[0] ); + } + } #endif /* HAVE_WINSOCK */ #ifdef CSRIMALLOC @@ -975,6 +1013,13 @@ unhandled_option:; Debug( LDAP_DEBUG_ANY, "slapd starting\n", 0, 0, 0 ); +#ifndef HAVE_WINSOCK + if ( wait_for_start ) { + write( waitfds[1], "1", 1 ); + close( waitfds[1] ); + } +#endif + #ifdef HAVE_NT_EVENT_LOG if (is_NT_Service) lutil_LogStartedEvent( serverName, slap_debug, configfile ? -- 2.39.5