Skip to content

Commit

Permalink
Merge pull request #6 from falconindy/systemd
Browse files Browse the repository at this point in the history
systemd socket activation support
  • Loading branch information
gnosek committed Aug 21, 2012
2 parents 1328862 + 3468d79 commit 7f583a0
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 24 deletions.
2 changes: 1 addition & 1 deletion Makefile.in
Expand Up @@ -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:
Expand Down
17 changes: 17 additions & 0 deletions configure.ac
Expand Up @@ -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])])
Expand Down
64 changes: 41 additions & 23 deletions fcgiwrap.c
Expand Up @@ -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
Expand Down Expand Up @@ -344,7 +348,7 @@ static void fcgi_pass(struct fcgi_context *fc)
fcgi_finish(fc, "reading CGI reply (no response received)");
}

int check_file_perms(const char *path)
static int check_file_perms(const char *path)
{
struct stat ls;
struct stat fs;
Expand Down Expand Up @@ -374,7 +378,7 @@ int check_file_perms(const char *path)
}
}

char *get_cgi_filename() /* and fixup environment */
static char *get_cgi_filename(void) /* and fixup environment */
{
int buflen = 1, docrootlen;
char *buf = NULL;
Expand Down Expand Up @@ -457,7 +461,7 @@ static int blacklisted_env(const char *var_name, const char *var_name_end)
return 0;
}

static void inherit_environment()
static void inherit_environment(void)
{
char * const * p;
char *q;
Expand Down Expand Up @@ -491,7 +495,7 @@ static void error_403(const char *reason, const char *filename)
exit(99);
}

static void handle_fcgi_request()
static void handle_fcgi_request(void)
{
int pipe_in[2];
int pipe_out[2];
Expand Down Expand Up @@ -638,13 +642,35 @@ static void prefork(int nchildren)
}
}

int setup_socket(char *url) {
static int listen_on_fd(int fd) {
int one = 1;

if (listen(fd, 511) < 0) {
perror("Failed to listen");
return -1;
}
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one) < 0) {
perror("Failed to enable SO_REUSEADDR");
return -1;
}
if (dup2(fd, 0) < 0) {
perror("Failed to move socket to fd 0");
return -1;
}
if (close(fd) < 0) {
perror("Failed to close original socket");
return -1;
}

return 0;
}

static int setup_socket(char *url) {
char *p = url;
char *q;
int fd;
int port;
size_t sockaddr_size;
int one = 1;

union {
struct sockaddr sa;
Expand Down Expand Up @@ -718,24 +744,8 @@ int setup_socket(char *url) {
perror("Failed to bind");
return -1;
}
if (listen(fd, 511) < 0) {
perror("Failed to listen");
return -1;
}
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one) < 0) {
perror("Failed to enable SO_REUSEADDR");
return -1;
}
if (dup2(fd, 0) < 0) {
perror("Failed to move socket to fd 0");
return -1;
}
if (close(fd) < 0) {
perror("Failed to close original socket");
return -1;
}

return 0;
return listen_on_fd(fd);
}

int main(int argc, char **argv)
Expand Down Expand Up @@ -782,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;
Expand Down

0 comments on commit 7f583a0

Please sign in to comment.