mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-21 07:09:34 -05:00
ITS#6848 Add -w option to wait for DB startup before parent exits
This commit is contained in:
parent
d89b0d7604
commit
93da727d86
3 changed files with 55 additions and 8 deletions
|
|
@ -48,7 +48,7 @@ lutil_b64_pton LDAP_P((
|
||||||
size_t));
|
size_t));
|
||||||
|
|
||||||
/* detach.c */
|
/* detach.c */
|
||||||
LDAP_LUTIL_F( void )
|
LDAP_LUTIL_F( int )
|
||||||
lutil_detach LDAP_P((
|
lutil_detach LDAP_P((
|
||||||
int debug,
|
int debug,
|
||||||
int do_close));
|
int do_close));
|
||||||
|
|
|
||||||
|
|
@ -49,10 +49,10 @@
|
||||||
|
|
||||||
#include "lutil.h"
|
#include "lutil.h"
|
||||||
|
|
||||||
void
|
int
|
||||||
lutil_detach( int debug, int do_close )
|
lutil_detach( int debug, int do_close )
|
||||||
{
|
{
|
||||||
int i, sd, nbits;
|
int i, sd, nbits, pid;
|
||||||
|
|
||||||
#ifdef HAVE_SYSCONF
|
#ifdef HAVE_SYSCONF
|
||||||
nbits = sysconf( _SC_OPEN_MAX );
|
nbits = sysconf( _SC_OPEN_MAX );
|
||||||
|
|
@ -71,10 +71,11 @@ lutil_detach( int debug, int do_close )
|
||||||
if ( debug == 0 ) {
|
if ( debug == 0 ) {
|
||||||
for ( i = 0; i < 5; i++ ) {
|
for ( i = 0; i < 5; i++ ) {
|
||||||
#ifdef HAVE_THR
|
#ifdef HAVE_THR
|
||||||
switch ( fork1() )
|
pid = fork1();
|
||||||
#else
|
#else
|
||||||
switch ( fork() )
|
pid = fork();
|
||||||
#endif
|
#endif
|
||||||
|
switch ( pid )
|
||||||
{
|
{
|
||||||
case -1:
|
case -1:
|
||||||
sleep( 5 );
|
sleep( 5 );
|
||||||
|
|
@ -84,7 +85,7 @@ lutil_detach( int debug, int do_close )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
_exit( EXIT_SUCCESS );
|
return pid;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -139,4 +140,5 @@ lutil_detach( int debug, int do_close )
|
||||||
#ifdef SIGPIPE
|
#ifdef SIGPIPE
|
||||||
(void) SIGNAL( SIGPIPE, SIG_IGN );
|
(void) SIGNAL( SIGPIPE, SIG_IGN );
|
||||||
#endif
|
#endif
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -346,6 +346,9 @@ usage( char *name )
|
||||||
#endif
|
#endif
|
||||||
"\t-V\t\tprint version info (-VV exit afterwards, -VVV print\n"
|
"\t-V\t\tprint version info (-VV exit afterwards, -VVV print\n"
|
||||||
"\t\t\tinfo about static overlays and backends)\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;
|
int syslogUser = SLAP_DEFAULT_SYSLOG_USER;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_WINSOCK
|
||||||
|
int pid, wait_for_start = 0, waitfds[2];
|
||||||
|
#endif
|
||||||
int g_argc = argc;
|
int g_argc = argc;
|
||||||
char **g_argv = argv;
|
char **g_argv = argv;
|
||||||
|
|
||||||
|
|
@ -472,6 +478,9 @@ int main( int argc, char **argv )
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAVE_SETUID) && defined(HAVE_SETGID)
|
#if defined(HAVE_SETUID) && defined(HAVE_SETGID)
|
||||||
"u:g:"
|
"u:g:"
|
||||||
|
#endif
|
||||||
|
#ifndef HAVE_WINSOCK
|
||||||
|
"w"
|
||||||
#endif
|
#endif
|
||||||
)) != EOF ) {
|
)) != EOF ) {
|
||||||
switch ( i ) {
|
switch ( i ) {
|
||||||
|
|
@ -640,6 +649,12 @@ int main( int argc, char **argv )
|
||||||
version++;
|
version++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifndef HAVE_WINSOCK
|
||||||
|
case 'w':
|
||||||
|
wait_for_start = 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case 'T':
|
case 'T':
|
||||||
if ( firstopt == 0 ) {
|
if ( firstopt == 0 ) {
|
||||||
fprintf( stderr, "warning: \"-T %s\" "
|
fprintf( stderr, "warning: \"-T %s\" "
|
||||||
|
|
@ -849,7 +864,7 @@ unhandled_option:;
|
||||||
if( rc != 0) {
|
if( rc != 0) {
|
||||||
Debug( LDAP_DEBUG_ANY,
|
Debug( LDAP_DEBUG_ANY,
|
||||||
"main: TLS init failed: %d\n",
|
"main: TLS init failed: %d\n",
|
||||||
0, 0, 0 );
|
rc, 0, 0 );
|
||||||
rc = 1;
|
rc = 1;
|
||||||
SERVICE_EXIT( ERROR_SERVICE_SPECIFIC_ERROR, 20 );
|
SERVICE_EXIT( ERROR_SERVICE_SPECIFIC_ERROR, 20 );
|
||||||
goto destroy;
|
goto destroy;
|
||||||
|
|
@ -904,7 +919,30 @@ unhandled_option:;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_WINSOCK
|
#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 */
|
#endif /* HAVE_WINSOCK */
|
||||||
|
|
||||||
#ifdef CSRIMALLOC
|
#ifdef CSRIMALLOC
|
||||||
|
|
@ -975,6 +1013,13 @@ unhandled_option:;
|
||||||
|
|
||||||
Debug( LDAP_DEBUG_ANY, "slapd starting\n", 0, 0, 0 );
|
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
|
#ifdef HAVE_NT_EVENT_LOG
|
||||||
if (is_NT_Service)
|
if (is_NT_Service)
|
||||||
lutil_LogStartedEvent( serverName, slap_debug, configfile ?
|
lutil_LogStartedEvent( serverName, slap_debug, configfile ?
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue