]> git.sur5r.net Git - openldap/commitdiff
ITS#6848 Add -w option to wait for DB startup before parent exits
authorHoward Chu <hyc@openldap.org>
Tue, 1 Mar 2011 01:19:37 +0000 (01:19 +0000)
committerHoward Chu <hyc@openldap.org>
Tue, 1 Mar 2011 01:19:37 +0000 (01:19 +0000)
include/lutil.h
libraries/liblutil/detach.c
servers/slapd/main.c

index d244e77a76c203581528c35c54ecf4322e73a209..d90a629dbec2186475d3606904c9f3ae0409fbc1 100644 (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));
index dd89119ea84afa14077be0dadafd52952a8b7ab6..459709bf53736dcff63479743046ed00308768dd 100644 (file)
 
 #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;
 }
index 41d66907d9108d8f66d91b5a13a7b1c71e1fde50..1cf5419269911a11a606088ae14b326f2708e2bc 100644 (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 ?