chiark / gitweb /
prefork-interp: fix exit status and signal handling
[chiark-utils.git] / cprogs / prefork-interp.c
index 61dcca93bf370a578bcd5a72cc5c4ad7b12c3360..3a999ef4c629d0339f6a7ffab5cf7fe021fbfb79 100644 (file)
@@ -426,21 +426,19 @@ static void ident_add_stat(const char *path) {
   int r = stat(path, &stab);
   if (r) diee("failed to stat %s", path);
 
-  IDENT_ADD_OBJ(stab.st_dev);
-  IDENT_ADD_OBJ(stab.st_ino);
+  IDENT_ADD_OBJ(path[0], stab.st_dev);
+  IDENT_ADD_OBJ('i',     stab.st_ino);
 }
 
 void ident_addinit(void) {
-  char magic = 1;
-
-  IDENT_ADD_OBJ(magic);
+  ident_add_key_byte(1);
 
   struct utsname uts = { };
   size_t utslen = sizeof(uts);
   int r = uname(&uts);
   if (r) diee("uname failed!");
-  IDENT_ADD_OBJ(utslen);
-  IDENT_ADD_OBJ(uts);
+  IDENT_ADD_OBJ('u', utslen);
+  IDENT_ADD_OBJ('u', uts);
 
   ident_add_stat(".");
   ident_add_stat("/");
@@ -450,7 +448,7 @@ static void propagate_exit_status(int status, const char *what) {
   int r;
 
   if (WIFEXITED(status)) {
-    _exit(status);
+    _exit(WEXITSTATUS(status));
   }
 
   if (WIFSIGNALED(status)) {
@@ -460,22 +458,25 @@ static void propagate_exit_status(int status, const char *what) {
 
     if (! WCOREDUMP(status) &&
        (sig == SIGINT ||
+        sig == SIGTERM ||
         sig == SIGHUP ||
         sig == SIGPIPE ||
         sig == SIGKILL)) {
       struct sigaction sa;
       FILLZERO(sa);
       sa.sa_handler = SIG_DFL;
-      r = sigaction(sig, &sa, 0);
-      if (r) diee("failed to reset signal handler while propagating %s",
-                 signame);
-
-      sigset_t sset;
-      sigemptyset(&sset);
-      sigaddset(&sset, sig);
-      r = sigprocmask(SIG_UNBLOCK, &sset, 0);
-      if (r) diee("failed to reset signal block while propagating %s",
-                 signame);
+      if (sig != SIGKILL) {
+        r = sigaction(sig, &sa, 0);
+        if (r) diee("failed to reset signal handler while propagating %s",
+                    signame);
+
+        sigset_t sset;
+        sigemptyset(&sset);
+        sigaddset(&sset, sig);
+        r = sigprocmask(SIG_UNBLOCK, &sset, 0);
+        if (r) diee("failed to reset signal block while propagating %s",
+                    signame);
+      }
 
       raise(sig);
       die("unexpectedly kept running after raising (to propagate) %s",
@@ -745,7 +746,8 @@ static const char *read_greeting(void) {
   char got_magic[sizeof(header_magic)];
 
   if (protocol_read_maybe(&got_magic, sizeof(got_magic)) < 0)
-    return "initial monitor process quit";
+    return "initial monitor process quit"
+      " (maybe script didn't call preform_initialisation_complete?)";
 
   if (memcmp(got_magic, header_magic, sizeof(header_magic)))
     die("got unexpected protocol magic 0x%02x%02x%02x%02x",