diff options
-rw-r--r-- | fcgiwrap.c | 37 |
1 files changed, 33 insertions, 4 deletions
@@ -605,14 +605,29 @@ err_pipein: FCGI_puts("System error"); } +static volatile sig_atomic_t sigint_received ; +static void sigint_handler(int __attribute__((__unused__))dummy) +{ + sigint_received = 1; + FCGX_ShutdownPending(); // Or we could send SIGUSR1 +} + static void fcgiwrap_main(void) { + struct sigaction a; signal(SIGCHLD, SIG_IGN); signal(SIGPIPE, SIG_IGN); + // Use sigaction for SIGINT so we can avoid SA_RESTART and actually react + a.sa_handler = sigint_handler; + a.sa_flags = 0; + sigemptyset( &a.sa_mask ); + sigaction( SIGINT, &a, NULL ); + sigaction( SIGTERM, &a, NULL ); + inherited_environ = environ; - while (FCGI_Accept() >= 0) { + while (FCGI_Accept() >= 0 && !sigint_received) { handle_fcgi_request(); } } @@ -689,7 +704,7 @@ static int listen_on_fd(int fd) { return 0; } -static int setup_socket(char *url) { +static int setup_socket(char *url, int *fd_out) { char *p = url; char *q; int fd; @@ -769,6 +784,7 @@ invalid_url: return -1; } + *fd_out = fd; return listen_on_fd(fd); } @@ -776,6 +792,7 @@ int main(int argc, char **argv) { int nchildren = 1; char *socket_url = NULL; + int fd = 0; int c; while ((c = getopt(argc, argv, "c:hfs:p:")) != -1) { @@ -833,13 +850,25 @@ int main(int argc, char **argv) } else #endif if (socket_url) { - if (setup_socket(socket_url) < 0) { + if (setup_socket(socket_url, &fd) < 0) { return 1; } - free(socket_url); } prefork(nchildren); fcgiwrap_main(); + + if(fd) { + const char *p = socket_url; + close(fd); + + if(socket_url) { + if (!strncmp(p, "unix:", sizeof("unix:") - 1)) { + p += sizeof("unix:") - 1; + unlink(p); + } + free(socket_url); + } + } return 0; } |