AUTH_LIBS = @AUTH_LIBS@
ARGON2_LIBS = @ARGON2_LIBS@
SECURITY_LIBS = $(SASL_LIBS) $(TLS_LIBS) $(AUTH_LIBS)
+SYSTEMD_LIBS = @SYSTEMD_LIBS@
MODULES_CPPFLAGS = @SLAPD_MODULES_CPPFLAGS@
MODULES_LDFLAGS = @SLAPD_MODULES_LDFLAGS@
SLAPD_SQL_INCLUDES = @SLAPD_SQL_INCLUDES@
SLAPD_SQL_LIBS = @SLAPD_SQL_LIBS@
-SLAPD_LIBS = @SLAPD_LIBS@ @SLAPD_PERL_LDFLAGS@ @SLAPD_SQL_LDFLAGS@ @SLAPD_SQL_LIBS@ @SLAPD_SLP_LIBS@ @SLAPD_GMP_LIBS@
+SLAPD_LIBS = @SLAPD_LIBS@ @SLAPD_PERL_LDFLAGS@ @SLAPD_SQL_LDFLAGS@ @SLAPD_SQL_LIBS@ @SLAPD_SLP_LIBS@ @SLAPD_GMP_LIBS@ $(SYSTEMD_LIBS)
LLOADD_LIBS = @BALANCER_LIBS@ $(LEVENT_LIBS)
# Our Defaults
dnl General "with" options
OL_ARG_WITH(cyrus_sasl, [AS_HELP_STRING([--with-cyrus-sasl], [with Cyrus SASL support])],
auto, [auto yes no] )
+OL_ARG_WITH(systemd, [AS_HELP_STRING([--with-systemd], [with systemd service notification support])],
+ auto, [auto yes no] )
OL_ARG_WITH(fetch, [AS_HELP_STRING([--with-fetch], [with fetch(3) URL support])],
auto, [auto yes no] )
OL_ARG_WITH(threads,
SLAPI_LIBS=
LIBSLAPI=
AUTH_LIBS=
+SYSTEMD_LIBS=
SLAPD_SLP_LIBS=
SLAPD_GMP_LIBS=
fi
fi
+dnl ----------------------------------------------------------------
+dnl
+dnl Check for systemd (only if we have a server)
+dnl
+WITH_SYSTEMD=no
+ol_link_systemd=no
+if test $ol_enable_slapd == no && test $ol_enable_balancer != yes ; then
+ if test $ol_with_systemd != no ; then
+ AC_MSG_WARN([servers disabled, ignoring --with-systemd=$ol_with_systemd argument])
+ ol_with_systemd=no
+ fi
+fi
+if test $ol_with_systemd != no ; then
+ AC_CHECK_HEADERS(systemd/sd-daemon.h)
+
+ if test $ac_cv_header_systemd_sd_daemon_h = yes; then
+ AC_CHECK_LIB(systemd, sd_notify,
+ [ol_link_systemd="-lsystemd"])
+ fi
+
+ if test $ol_link_systemd = no ; then
+ if test $ol_with_systemd != auto ; then
+ AC_MSG_ERROR([Could not locate systemd])
+ else
+ AC_MSG_WARN([Could not locate systemd])
+ AC_MSG_WARN([systemd service notification not supported!])
+ fi
+ else
+ AC_DEFINE(HAVE_SYSTEMD,1,[define if you have systemd])
+ SYSTEMD_LIBS="$ol_link_systemd"
+ WITH_SYSTEMD=yes
+ fi
+fi
+
dnl ----------------------------------------------------------------
dnl Check for entropy sources
if test $cross_compiling != yes && test "$ac_cv_mingw32" != yes ; then
AC_SUBST(WITH_TLS)
AC_SUBST(WITH_MODULES_ENABLED)
AC_SUBST(WITH_ACI_ENABLED)
+AC_SUBST(WITH_SYSTEMD)
AC_SUBST(BUILD_THREAD)
AC_SUBST(BUILD_LIBS_DYNAMIC)
AC_SUBST(OL_VERSIONED_SYMBOLS)
AC_SUBST(LIBSLAPI)
AC_SUBST(AUTH_LIBS)
AC_SUBST(ARGON2_LIBS)
+AC_SUBST(SYSTEMD_LIBS)
AC_SUBST(SLAPD_SLP_LIBS)
AC_SUBST(SLAPD_GMP_LIBS)
#include "ldap_rq.h"
+#ifdef HAVE_SYSTEMD_SD_DAEMON_H
+#include <systemd/sd-daemon.h>
+#endif
+
#ifdef HAVE_POLL
#include <poll.h>
#endif
} \
} while (0)
+ldap_pvt_thread_mutex_t slapd_init_mutex;
+ldap_pvt_thread_cond_t slapd_init_cond;
+int slapd_ready = 0;
+
volatile sig_atomic_t slapd_shutdown = 0;
volatile sig_atomic_t slapd_gentle_shutdown = 0;
volatile sig_atomic_t slapd_abrupt_shutdown = 0;
"daemon: listen(%s, 5) failed errno=%d (%s)\n",
slap_listeners[l]->sl_url.bv_val, err,
sock_errstr(err, ebuf, sizeof(ebuf)) );
+ ldap_pvt_thread_mutex_lock( &slapd_init_mutex );
+ slapd_shutdown = 2;
+ ldap_pvt_thread_cond_signal( &slapd_init_cond );
+ ldap_pvt_thread_mutex_unlock( &slapd_init_mutex );
return (void*)-1;
}
if ( ber_pvt_socket_set_nonblock( SLAP_FD2SOCK( slap_listeners[l]->sl_sd ), 1 ) < 0 ) {
Debug( LDAP_DEBUG_ANY, "slapd_daemon_task: "
"set nonblocking on a listening socket failed\n" );
+ ldap_pvt_thread_mutex_lock( &slapd_init_mutex );
slapd_shutdown = 2;
+ ldap_pvt_thread_cond_signal( &slapd_init_cond );
+ ldap_pvt_thread_mutex_unlock( &slapd_init_mutex );
return (void*)-1;
}
slapd_add( slap_listeners[l]->sl_sd, 0, slap_listeners[l], -1 );
}
+ ldap_pvt_thread_mutex_lock( &slapd_init_mutex );
+ slapd_ready = 1;
+ ldap_pvt_thread_cond_signal( &slapd_init_cond );
+ ldap_pvt_thread_mutex_unlock( &slapd_init_mutex );
+
#ifdef HAVE_NT_SERVICE_MANAGER
if ( started_event != NULL ) {
ldap_pvt_thread_cond_signal( &started_event );
}
}
+ ldap_pvt_thread_mutex_lock( &slapd_init_mutex );
+ while ( !slapd_ready && !slapd_shutdown ) {
+ ldap_pvt_thread_cond_wait( &slapd_init_cond, &slapd_init_mutex );
+ }
+ ldap_pvt_thread_mutex_unlock( &slapd_init_mutex );
+
+ if ( slapd_shutdown ) {
+ Debug( LDAP_DEBUG_ANY,
+ "listener initialization failed\n" );
+ return 1;
+ }
+
+#ifdef HAVE_SYSTEMD
+ rc = sd_notify( 1, "READY=1" );
+ if ( rc < 0 ) {
+ Debug( LDAP_DEBUG_ANY,
+ "systemd sd_notify failed (%d)\n", rc );
+ }
+#endif /* HAVE_SYSTEMD */
+
/* wait for the listener threads to complete */
for ( i=0; i<slapd_daemon_threads; i++ )
ldap_pvt_thread_join( slap_daemon[i].sd_tid, (void *)NULL );
slap_op_init();
+ ldap_pvt_thread_mutex_init( &slapd_init_cond );
+ ldap_pvt_thread_cond_init( &slapd_init_cond );
+
#ifdef SLAPD_MODULES
if ( module_init() != 0 ) {
slap_debug |= LDAP_DEBUG_NONE;
}
+ ldap_pvt_thread_mutex_destroy( &slapd_init_cond );
+ ldap_pvt_thread_cond_destroy( &slapd_init_cond );
+
slap_op_destroy();
ldap_pvt_thread_destroy();
#define SLAP_SOCKNEW(s) s
#endif
+LDAP_SLAPD_V (ldap_pvt_thread_mutex_t) slapd_init_mutex;
+LDAP_SLAPD_V (ldap_pvt_thread_cond_t) slapd_init_cond;
+
/*
* dn.c
*/