From 9836d6d22ac22fe7be584da2006ae8d9479096cc Mon Sep 17 00:00:00 2001 From: Dave Reisner Date: Sun, 19 Aug 2012 15:40:11 -0400 Subject: Add support for socket activation via systemd This prevents the need for starting fcgiwrap explicitly, or using a tool such as spawn-fcgi. The type of socket does not matter, we merely accept a single FD passed from pid 1 and listen on it. --- Makefile.in | 2 +- configure.ac | 17 +++++++++++++++++ fcgiwrap.c | 12 ++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 1f0956d..8d538b4 100644 --- a/Makefile.in +++ b/Makefile.in @@ -11,7 +11,7 @@ install: all install -m 644 fcgiwrap.8 $(man8dir) fcgiwrap: fcgiwrap.c - @CC@ @AM_CFLAGS@ fcgiwrap.c -o fcgiwrap -lfcgi @LDFLAGS@ + @CC@ @AM_CFLAGS@ fcgiwrap.c -o fcgiwrap -lfcgi @systemd_LIBS@ @LDFLAGS@ #>+ 21 clean: diff --git a/configure.ac b/configure.ac index 899c219..4388cd4 100644 --- a/configure.ac +++ b/configure.ac @@ -14,6 +14,7 @@ AC_SUBST([AM_CFLAGS]) # Checks for programs. AC_PROG_CC +PKG_PROG_PKG_CONFIG # Create the config.h. AC_CONFIG_HEADERS([config.h]) @@ -21,6 +22,22 @@ AC_CONFIG_HEADERS([config.h]) # Checks for libraries. AC_CHECK_LIB([fcgi], [FCGX_Init],, [AC_MSG_ERROR([FastCGI library is missing])]) +# systemd support. +AC_ARG_WITH([systemd], + AS_HELP_STRING([--with-systemd], [support systemd socket activation]), + [], [with_systemd=check]) +have_systemd=no +if test "x$with_systemd" != "xno"; then + PKG_CHECK_MODULES(systemd, [libsystemd-daemon], + [AC_DEFINE(HAVE_SYSTEMD, 1, [Define if systemd is available]) + have_systemd=yes], + have_systemd=no) + if test "x$have_systemd" = xno -a "x$with_systemd" = xyes; then + AC_MSG_ERROR([systemd support requested but libraries not found]) + fi +fi +AM_CONDITIONAL(HAVE_LIBSSL, [test "x$have_systemd" = "xyes"]) + # Checks for header files. AC_CHECK_HEADERS([fcntl.h],, [AC_MSG_ERROR([fcntl.h header missing])]) AC_CHECK_HEADERS([limits.h stdlib.h string.h unistd.h],, [AC_MSG_ERROR([at least one important system header file is missing])]) diff --git a/fcgiwrap.c b/fcgiwrap.c index 9d87034..2ff33f3 100644 --- a/fcgiwrap.c +++ b/fcgiwrap.c @@ -47,6 +47,10 @@ #include #include +#ifdef HAVE_SYSTEMD +#include +#endif + /* glibc doesn't seem to export it */ #ifndef UNIX_PATH_MAX #define UNIX_PATH_MAX 108 @@ -788,6 +792,14 @@ int main(int argc, char **argv) } } +#ifdef HAVE_SYSTEMD + if (sd_listen_fds(true) > 0) { + /* systemd woke us up. we should never see more than one FD passed to us. */ + if (listen_on_fd(SD_LISTEN_FDS_START) < 0) { + return 1; + } + } else +#endif if (socket_url) { if (setup_socket(socket_url) < 0) { return 1; -- cgit v1.2.3