Permalink
Browse files

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.
  • Loading branch information...
1 parent 0c93fa9 commit 9836d6d22ac22fe7be584da2006ae8d9479096cc @falconindy committed Aug 19, 2012
Showing with 30 additions and 1 deletion.
  1. +1 −1 Makefile.in
  2. +17 −0 configure.ac
  3. +12 −0 fcgiwrap.c
View
@@ -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:
View
@@ -14,13 +14,30 @@ AC_SUBST([AM_CFLAGS])
# Checks for programs.
AC_PROG_CC
+PKG_PROG_PKG_CONFIG
# Create the config.h.
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])])
View
@@ -47,6 +47,10 @@
#include <sys/un.h>
#include <netinet/in.h>
+#ifdef HAVE_SYSTEMD
+#include <systemd/sd-daemon.h>
+#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;

0 comments on commit 9836d6d

Please sign in to comment.