122 lines
3.5 KiB
Diff
122 lines
3.5 KiB
Diff
|
Index: cgi-fcgi/cgi-fcgi.c
|
|||
|
===================================================================
|
|||
|
--- cgi-fcgi/cgi-fcgi.c.orig
|
|||
|
+++ cgi-fcgi/cgi-fcgi.c
|
|||
|
@@ -22,6 +22,8 @@
|
|||
|
#include <stdlib.h>
|
|||
|
#include <string.h>
|
|||
|
#include <sys/types.h>
|
|||
|
+#include <sys/wait.h>
|
|||
|
+#include <signal.h>
|
|||
|
|
|||
|
#include "fcgi_config.h"
|
|||
|
|
|||
|
@@ -583,7 +585,7 @@
|
|||
|
#define MAXARGS 16
|
|||
|
static int ParseArgs(int argc, char *argv[],
|
|||
|
int *doBindPtr, int *doStartPtr,
|
|||
|
- char *connectPathPtr, char *appPathPtr, int *nServersPtr) {
|
|||
|
+ char *connectPathPtr, char *appPathPtr, int *nServersPtr, int *doDaemonPtr) {
|
|||
|
int i,
|
|||
|
x,
|
|||
|
err = 0,
|
|||
|
@@ -599,6 +601,7 @@
|
|||
|
*connectPathPtr = '\0';
|
|||
|
*appPathPtr = '\0';
|
|||
|
*nServersPtr = 0;
|
|||
|
+ *doDaemonPtr = TRUE;
|
|||
|
|
|||
|
for(i = 0; i < MAXARGS; i++)
|
|||
|
av[i] = NULL;
|
|||
|
@@ -649,7 +652,7 @@
|
|||
|
}
|
|||
|
}
|
|||
|
err = ParseArgs(ac, av, doBindPtr, doStartPtr,
|
|||
|
- connectPathPtr, appPathPtr, nServersPtr);
|
|||
|
+ connectPathPtr, appPathPtr, nServersPtr, doDaemonPtr);
|
|||
|
for(x = 1; x < ac; x++) {
|
|||
|
ASSERT(av[x] != NULL);
|
|||
|
free(av[x]);
|
|||
|
@@ -673,7 +676,9 @@
|
|||
|
} else {
|
|||
|
strcpy(connectPathPtr, argv[i]);
|
|||
|
}
|
|||
|
- } else {
|
|||
|
+ } else if(!strcmp(argv[i], "-supervise")) {
|
|||
|
+ *doDaemonPtr = FALSE;
|
|||
|
+ } else {
|
|||
|
fprintf(stderr, "Unknown option %s\n", argv[i]);
|
|||
|
err++;
|
|||
|
}
|
|||
|
@@ -718,6 +723,15 @@
|
|||
|
return err;
|
|||
|
}
|
|||
|
|
|||
|
+void handle_shutdown(int s)
|
|||
|
+{
|
|||
|
+ /* Kill our children processes */
|
|||
|
+ signal(s, SIG_IGN);
|
|||
|
+ kill(0, s);
|
|||
|
+
|
|||
|
+ exit(0);
|
|||
|
+}
|
|||
|
+
|
|||
|
int main(int argc, char **argv)
|
|||
|
{
|
|||
|
char **envp = environ;
|
|||
|
@@ -728,20 +742,22 @@
|
|||
|
int headerLen, valueLen;
|
|||
|
char *equalPtr;
|
|||
|
FCGI_BeginRequestRecord beginRecord;
|
|||
|
- int doBind, doStart, nServers;
|
|||
|
+ int doBind, doStart, nServers, doDaemon;
|
|||
|
char appPath[MAXPATHLEN], bindPath[MAXPATHLEN];
|
|||
|
+ int pid;
|
|||
|
|
|||
|
if(ParseArgs(argc, argv, &doBind, &doStart,
|
|||
|
- (char *) &bindPath, (char *) &appPath, &nServers)) {
|
|||
|
+ (char *) &bindPath, (char *) &appPath, &nServers, &doDaemon)) {
|
|||
|
fprintf(stderr,
|
|||
|
"Usage:\n"
|
|||
|
" cgi-fcgi -f <cmdPath> , or\n"
|
|||
|
" cgi-fcgi -connect <connName> <appPath> [<nServers>] , or\n"
|
|||
|
-" cgi-fcgi -start -connect <connName> <appPath> [<nServers>] , or\n"
|
|||
|
+" cgi-fcgi -start -connect [-supervise] <connName> <appPath> [<nServers>] , or\n"
|
|||
|
" cgi-fcgi -bind -connect <connName> ,\n"
|
|||
|
"where <connName> is either the pathname of a UNIX domain socket\n"
|
|||
|
"or (if -bind is given) a hostName:portNumber specification\n"
|
|||
|
-"or (if -start is given) a :portNumber specification (uses local host).\n");
|
|||
|
+"or (if -start is given) a :portNumber specification (uses local host).\n"
|
|||
|
+"-supervise is for running with runit or daemontools.\n");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
@@ -757,12 +773,27 @@
|
|||
|
bytesToRead = 0;
|
|||
|
}
|
|||
|
|
|||
|
+ /* Become a process group leader */
|
|||
|
+ setsid();
|
|||
|
+
|
|||
|
+ /* Register our signal handler */
|
|||
|
+ signal(SIGHUP, handle_shutdown);
|
|||
|
+ signal(SIGINT, handle_shutdown);
|
|||
|
+ signal(SIGTERM, handle_shutdown);
|
|||
|
+
|
|||
|
if(doBind) {
|
|||
|
appServerSock = OS_FcgiConnect(bindPath);
|
|||
|
}
|
|||
|
if(doStart && (!doBind || appServerSock < 0)) {
|
|||
|
FCGI_Start(bindPath, appPath, nServers);
|
|||
|
if(!doBind) {
|
|||
|
+ if(!doDaemon) {
|
|||
|
+ for(pid=nServers; pid != 0; pid--) {
|
|||
|
+ wait(0);
|
|||
|
+ }
|
|||
|
+ }
|
|||
|
+ signal(SIGTERM, SIG_IGN);
|
|||
|
+ kill(0, SIGTERM);
|
|||
|
exit(0);
|
|||
|
} else {
|
|||
|
appServerSock = OS_FcgiConnect(bindPath);
|