ITS#6848 Add -w option to wait for DB startup before parent exits

This commit is contained in:
Howard Chu 2011-03-01 01:19:37 +00:00
parent d89b0d7604
commit 93da727d86
3 changed files with 55 additions and 8 deletions

View File

@ -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));

View File

@ -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;
}

View File

@ -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 ?