From: Ondřej Kuzník Date: Wed, 7 Apr 2021 14:54:24 +0000 (+0100) Subject: ITS#8707 Add systemd service notification support X-Git-Tag: OPENLDAP_REL_ENG_2_5_4~7^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=629cafc98d4cd2ec1eec83979d69008c01b4d238;p=thirdparty%2Fopenldap.git ITS#8707 Add systemd service notification support --- diff --git a/build/top.mk b/build/top.mk index 99f3e623b3..4b8efb2b96 100644 --- a/build/top.mk +++ b/build/top.mk @@ -196,6 +196,7 @@ TLS_LIBS = @TLS_LIBS@ 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@ @@ -206,7 +207,7 @@ SLAPD_SQL_LDFLAGS = @SLAPD_SQL_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 diff --git a/configure.ac b/configure.ac index ffd4888062..9d13f3aa73 100644 --- a/configure.ac +++ b/configure.ac @@ -237,6 +237,8 @@ dnl ---------------------------------------------------------------- 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, @@ -638,6 +640,7 @@ MODULES_LIBS= SLAPI_LIBS= LIBSLAPI= AUTH_LIBS= +SYSTEMD_LIBS= SLAPD_SLP_LIBS= SLAPD_GMP_LIBS= @@ -2083,6 +2086,40 @@ else 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 @@ -3126,6 +3163,7 @@ AC_SUBST(WITH_SASL) 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) @@ -3213,6 +3251,7 @@ AC_SUBST(SLAPI_LIBS) 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) diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c index ab60d35be3..129ace499c 100644 --- a/servers/slapd/daemon.c +++ b/servers/slapd/daemon.c @@ -41,6 +41,10 @@ #include "ldap_rq.h" +#ifdef HAVE_SYSTEMD_SD_DAEMON_H +#include +#endif + #ifdef HAVE_POLL #include #endif @@ -111,6 +115,10 @@ static volatile int waking; } \ } 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; @@ -2589,6 +2597,10 @@ slapd_daemon_task( "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; } @@ -2596,13 +2608,21 @@ slapd_daemon_task( 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 ); @@ -3313,6 +3333,26 @@ slapd_daemon( void ) } } + 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