chiark / gitweb /
cgi-fcgi-interp: new garbage collection approach, compiles
[chiark-utils.git] / cprogs / cgi-fcgi-interp.c
index 35ce536a57e90e49fa836c0698b6a8c45624f925..f59640f4305eb86342d135462f7aa02e3a44e2c5 100644 (file)
 #include <err.h>
 #include <time.h>
 #include <signal.h>
 #include <err.h>
 #include <time.h>
 #include <signal.h>
+#include <sys/wait.h>
        
 #include <nettle/sha.h>
 
        
 #include <nettle/sha.h>
 
@@ -581,6 +582,31 @@ static void alarm_handler(int dummy) {
   queue_alarm();
 }
 
   queue_alarm();
 }
 
+static void child_handler(int dummy) {
+  for (;;) {
+    int status;
+    pid_t got = waitpid(-1, &status, WNOHANG);
+    if (got == (pid_t)-1) err(127,"(stage2) waitpid");
+    if (got != script_child) {
+      warn("(stage2) waitpid got status %d for unknown child [%lu]",
+          status, (unsigned long)got);
+      continue;
+    }
+    if (WIFEXITED(status)) {
+      int v = WEXITSTATUS(status);
+      if (v) warn("program failed with error exit status %d", v);
+      exit(status);
+    } else if (WIFSIGNALED(status)) {
+      int s = WTERMSIG(status);
+      err(status & 0xff, "program died due to fatal signal %s%s",
+         strsignal(s), WCOREDUMP(status) ? " (core dumped" : "");
+    } else {
+      err(127, "program failed with crazy wait status %#x", status);
+    }
+  }
+  exit(127);
+}
+
 static void setup_handlers(void) {
   struct sigaction sa;
   int r;
 static void setup_handlers(void) {
   struct sigaction sa;
   int r;