#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
);
}
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;
#endif
#if defined(HAVE_SETUID) && defined(HAVE_SETGID)
"u:g:"
+#endif
+#ifndef HAVE_WINSOCK
+ "w"
#endif
)) != EOF ) {
switch ( i ) {
version++;
break;
+#ifndef HAVE_WINSOCK
+ case 'w':
+ wait_for_start = 1;
+ break;
+#endif
+
case 'T':
if ( firstopt == 0 ) {
fprintf( stderr, "warning: \"-T %s\" "
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;
#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
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 ?