diff -up ypserv-2.28/configure.in.sdnotify ypserv-2.28/configure.in --- ypserv-2.28/configure.in.sdnotify 2012-07-12 14:29:03.491853939 +0200 +++ ypserv-2.28/configure.in 2012-07-12 14:29:03.505854057 +0200 @@ -269,6 +269,19 @@ if test "$ac_cv_func_getrpcport" = no; t [ac_cv_func_getrpcport=yes; LIBS="-lrpcsvc $LIBS"]) fi +USE_SD_NOTIFY=0 +AC_SUBST(USE_SD_NOTIFY) +AC_CHECK_LIB(systemd-daemon,sd_notify,LIBSYSTEMD_DAEMON="-lsystemd-daemon", + LIBSYSTEMD_DAEMON="") +if test -n "$LIBSYSTEMD_DAEMON" ; then + AC_CHECK_HEADERS(systemd/sd-daemon.h) + if test "$ac_cv_header_systemd_sd_notify_h" = yes; then + USE_SD_NOTIFY=1 + fi +fi +AC_SUBST(USE_SD_NOTIFY) +AC_SUBST(LIBSYSTEMD_DAEMON) + AC_CHECK_LIB(nsl,gethostbyname) AC_CHECK_LIB(socket,socket) AC_CHECK_LIB(resolv, res_gethostbyname, RESOLV="-lresolv", RESOLV="") @@ -357,7 +370,7 @@ Configuration: Compiler flags: ${CFLAGS} Preprocessor: ${CPP} Preprocessor flags: ${CPPFLAGS} - Libraries: ${LIBS} ${LIBDBM} ${LIBCRYPT} + Libraries: ${LIBS} ${LIBDBM} ${LIBCRYPT} ${LIBSYSTEMD_DAEMON} Awk: ${AWK} Shell: ${BASH} NIS map dir: ${YPMAPDIR} diff -up ypserv-2.28/lib/access.c.sdnotify ypserv-2.28/lib/access.c --- ypserv-2.28/lib/access.c.sdnotify 2011-08-31 13:40:11.000000000 +0200 +++ ypserv-2.28/lib/access.c 2012-07-12 14:29:03.505854057 +0200 @@ -30,6 +30,9 @@ #include #include #include +#if defined(HAVE_SYSTEMD_SD_DAEMON_H) +#include +#endif #include "log_msg.h" #include "ypserv_conf.h" @@ -215,3 +218,25 @@ is_valid (struct svc_req *rqstp, const c return status; } + +/* Send a messages to systemd daemon, that inicialization of daemon + is finished and daemon is ready to accept connections. + It is a nop if we don't use systemd. */ +void +announce_ready() +{ +#ifdef USE_SD_NOTIFY + int result; + + result = sd_notifyf(0, "READY=1\n" + "STATUS=Processing requests...\n" + "MAINPID=%lu", (unsigned long) getpid()); + + /* Return code from sd_notifyf can be ignored, as per sd_notifyf(3). + However, if we use systemd's native unit file, we need to send + this message to let systemd know that daemon is ready. + Thus, we want to know that the call had some issues. */ + if (result < 0) + log_msg ("sd_notifyf failed: %s\n", strerror(-result)); +#endif +} diff -up ypserv-2.28/lib/Makefile.am.sdnotify ypserv-2.28/lib/Makefile.am --- ypserv-2.28/lib/Makefile.am.sdnotify 2010-02-23 14:44:55.000000000 +0100 +++ ypserv-2.28/lib/Makefile.am 2012-07-12 14:29:03.506854065 +0200 @@ -13,7 +13,8 @@ noinst_HEADERS = log_msg.h yp.h ypserv_c rpcsvc_HEADERS = ypxfrd.x -DEFS = @DEFS@ -D_REENTRANT=1 -DCONFDIR=\"$(sysconfdir)\" -DUSE_SLP=@USE_SLP@ +DEFS = @DEFS@ -D_REENTRANT=1 -DCONFDIR=\"$(sysconfdir)\" -DUSE_SLP=@USE_SLP@ \ + -DUSE_SD_NOTIFY=@USE_SD_NOTIFY@ INCLUDES = -I$(top_srcdir) -I$(top_builddir) -I$(srcdir) AM_CFLAGS = @PIE_CFLAGS@ diff -up ypserv-2.28/rpc.yppasswdd/Makefile.am.sdnotify ypserv-2.28/rpc.yppasswdd/Makefile.am --- ypserv-2.28/rpc.yppasswdd/Makefile.am.sdnotify 2006-08-02 15:05:04.000000000 +0200 +++ ypserv-2.28/rpc.yppasswdd/Makefile.am 2012-07-12 14:29:03.506854065 +0200 @@ -24,7 +24,7 @@ sbin_PROGRAMS = rpc.yppasswdd rpc_yppasswdd_SOURCES = update.c yppasswd_xdr.c yppasswdd.c -rpc_yppasswdd_LDADD = @PIE_LDFLAGS@ $(LIBDBM) $(LIBCRYPT) $(top_builddir)/lib/libyp.a +rpc_yppasswdd_LDADD = @PIE_LDFLAGS@ $(LIBDBM) $(LIBCRYPT) $(LIBSYSTEMD_DAEMON) $(top_builddir)/lib/libyp.a rpc_yppasswdd_CFLAGS = @PIE_CFLAGS@ if ENABLE_REGENERATE_MAN diff -up ypserv-2.28/rpc.yppasswdd/yppasswdd.c.sdnotify ypserv-2.28/rpc.yppasswdd/yppasswdd.c --- ypserv-2.28/rpc.yppasswdd/yppasswdd.c.sdnotify 2012-07-12 14:29:03.494853964 +0200 +++ ypserv-2.28/rpc.yppasswdd/yppasswdd.c 2012-07-12 14:29:03.507854073 +0200 @@ -457,6 +457,13 @@ main (int argc, char **argv) exit (1); } + /* If we use systemd as an init system, we may want to give it + a message, that this daemon is ready to accept connections. + At this time, sockets for receiving connections are already + created, so we can say we're ready now. It is a nop if we + don't use systemd. */ + announce_ready(); + /* Run the server */ svc_run (); log_msg ("svc_run returned\n"); diff -up ypserv-2.28/rpc.ypxfrd/Makefile.am.sdnotify ypserv-2.28/rpc.ypxfrd/Makefile.am --- ypserv-2.28/rpc.ypxfrd/Makefile.am.sdnotify 2012-07-12 14:29:42.795191749 +0200 +++ ypserv-2.28/rpc.ypxfrd/Makefile.am 2012-07-12 14:30:04.450388983 +0200 @@ -22,7 +22,7 @@ sbin_PROGRAMS = rpc.ypxfrd rpc_ypxfrd_SOURCES = ypxfrd.c ypxfrd_server.c ypxfrd_svc.c -rpc_ypxfrd_LDADD = @PIE_LDFLAGS@ $(top_builddir)/lib/libyp.a @LIBDBM@ +rpc_ypxfrd_LDADD = @PIE_LDFLAGS@ $(top_builddir)/lib/libyp.a @LIBDBM@ $(LIBSYSTEMD_DAEMON) rpc_ypxfrd_CFLAGS = @PIE_CFLAGS@ if ENABLE_REGENERATE_MAN diff -up ypserv-2.28/rpc.ypxfrd/ypxfrd.c.sdnotify ypserv-2.28/rpc.ypxfrd/ypxfrd.c --- ypserv-2.28/rpc.ypxfrd/ypxfrd.c.sdnotify 2012-07-12 14:29:03.496853980 +0200 +++ ypserv-2.28/rpc.ypxfrd/ypxfrd.c 2012-07-12 14:29:03.508854082 +0200 @@ -458,6 +458,13 @@ main (int argc, char **argv) alarm (_RPCSVC_CLOSEDOWN); } + /* If we use systemd as an init system, we may want to give it + a message, that this daemon is ready to accept connections. + At this time, sockets for receiving connections are already + created, so we can say we're ready now. It is a nop if we + don't use systemd. */ + announce_ready(); + svc_run(); log_msg("svc_run returned"); unlink (_YPXFRD_PIDFILE); diff -up ypserv-2.28/ypserv/Makefile.am.sdnotify ypserv-2.28/ypserv/Makefile.am --- ypserv-2.28/ypserv/Makefile.am.sdnotify 2009-04-02 15:10:19.000000000 +0200 +++ ypserv-2.28/ypserv/Makefile.am 2012-07-12 14:30:15.628494608 +0200 @@ -22,7 +22,7 @@ sbin_PROGRAMS = ypserv ypserv_SOURCES = ypserv.c server.c ypserv_xdr.c reg_slp.c -ypserv_LDADD = @PIE_LDFLAGS@ $(top_builddir)/lib/libyp.a @LIBDBM@ @LIBSLP@ +ypserv_LDADD = @PIE_LDFLAGS@ $(top_builddir)/lib/libyp.a @LIBDBM@ @LIBSLP@ $(LIBSYSTEMD_DAEMON) ypserv_CFLAGS = @PIE_CFLAGS@ if ENABLE_REGENERATE_MAN diff -up ypserv-2.28/ypserv/ypserv.c.sdnotify ypserv-2.28/ypserv/ypserv.c --- ypserv-2.28/ypserv/ypserv.c.sdnotify 2012-07-12 14:29:03.498853997 +0200 +++ ypserv-2.28/ypserv/ypserv.c 2012-07-12 14:29:03.509854091 +0200 @@ -586,6 +586,13 @@ main (int argc, char **argv) register_slp (); #endif + /* If we use systemd as an init system, we may want to give it + a message, that this daemon is ready to accept connections. + At this time, sockets for receiving connections are already + created, so we can say we're ready now. It is a nop if we + don't use systemd. */ + announce_ready(); + #if 0 mysvc_run (); #else