mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-04-06 15:00:40 +08:00
ITS#6848 Add -w option to wait for DB startup before parent exits
This commit is contained in:
parent
d89b0d7604
commit
93da727d86
@ -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));
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 ?
|
||||
|
Loading…
x
Reference in New Issue
Block a user