daemon: Factor out code into new function fork_and_wait_for_startup().
authorBen Pfaff <blp@nicira.com>
Mon, 21 May 2012 18:08:13 +0000 (11:08 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 18 Jul 2012 17:30:49 +0000 (10:30 -0700)
This function will be useful in an upcoming commit.

Signed-off-by: Ben Pfaff <blp@nicira.com>
lib/daemon.c
lib/daemon.h

index ecca606126f5028842b04e704020ad7f00a1adef..a2eff07c038c0c3c53ccbbce57de9d2086ae2a85 100644 (file)
@@ -245,6 +245,32 @@ daemonize(void)
     daemonize_complete();
 }
 
+/* Calls fork() and on success returns its return value.  On failure, logs an
+ * error and exits unsuccessfully.
+ *
+ * Post-fork, but before returning, this function calls a few other functions
+ * that are generally useful if the child isn't planning to exec a new
+ * process. */
+pid_t
+fork_and_clean_up(void)
+{
+    pid_t pid;
+
+    pid = fork();
+    if (pid > 0) {
+        /* Running in parent process. */
+        fatal_signal_fork();
+    } else if (!pid) {
+        /* Running in child process. */
+        time_postfork();
+        lockfile_postfork();
+    } else {
+        VLOG_FATAL("fork failed (%s)", strerror(errno));
+    }
+
+    return pid;
+}
+
 /* Forks, then:
  *
  *   - In the parent, waits for the child to signal that it has completed its
@@ -264,14 +290,13 @@ fork_and_wait_for_startup(int *fdp)
 
     xpipe(fds);
 
-    pid = fork();
+    pid = fork_and_clean_up();
     if (pid > 0) {
         /* Running in parent process. */
         size_t bytes_read;
         char c;
 
         close(fds[1]);
-        fatal_signal_fork();
         if (read_fully(fds[0], &c, 1, &bytes_read) != 0) {
             int retval;
             int status;
@@ -301,11 +326,7 @@ fork_and_wait_for_startup(int *fdp)
     } else if (!pid) {
         /* Running in child process. */
         close(fds[0]);
-        time_postfork();
-        lockfile_postfork();
         *fdp = fds[1];
-    } else {
-        VLOG_FATAL("fork failed (%s)", strerror(errno));
     }
 
     return pid;
index 8d5259433994db703d5a48ed4cc89413f3367596..63b64b99f0b8ee3714718e55a070a5e6fed8924e 100644 (file)
@@ -73,4 +73,6 @@ void daemon_usage(void);
 pid_t read_pidfile(const char *name);
 pid_t read_pidfile_if_exists(const char *name);
 
+pid_t fork_and_clean_up(void);
+
 #endif /* daemon.h */