Fix deadlock bug when daemonizing
authorMichael Spang <mspang@csclub.uwaterloo.ca>
Tue, 8 Sep 2009 22:50:33 +0000 (18:50 -0400)
committerMichael Spang <mspang@csclub.uwaterloo.ca>
Tue, 8 Sep 2009 22:50:34 +0000 (18:50 -0400)
Closing stdin et. al breaks the assuption in spawnvem() that a newly
opened pipe is not one of the standard file descriptors. This lead
to stdout being closed in the child and so we got no output.

src/dmaster.c
src/dslave.c

index 45331c8..2e99c57 100644 (file)
@@ -102,9 +102,9 @@ static void setup_daemon(void) {
 
         setup_pidfile();
 
-        close(STDIN_FILENO);
-        close(STDOUT_FILENO);
-        close(STDERR_FILENO);
+        freopen("/dev/null", "r", stdin);
+        freopen("/dev/null", "w", stdout);
+        freopen("/dev/null", "w", stderr);
     }
 }
 
index dd373cf..4ae7624 100644 (file)
@@ -100,6 +100,9 @@ static void handle_op_message(uint32_t in_type, struct strbuf *in, struct strbuf
     if (spawnvem(op->path, argv, envp, in, out, 0))
         fatal("child %s failed", op->path);
 
+    if (!out->len)
+        fatal("no response from op");
+
     free_env(envp);
 }