daemon: Tolerate EINTR in fork_and_wait_for_startup().
[sliver-openvswitch.git] / lib / daemon.c
index cb440d1..173dabe 100644 (file)
@@ -239,18 +239,17 @@ fork_and_wait_for_startup(int *fdp)
     int fds[2];
     pid_t pid;
 
-    if (pipe(fds) < 0) {
-        ovs_fatal(errno, "pipe failed");
-    }
+    xpipe(fds);
 
     pid = fork();
     if (pid > 0) {
         /* Running in parent process. */
+        size_t bytes_read;
         char c;
 
         close(fds[1]);
         fatal_signal_fork();
-        if (read(fds[0], &c, 1) != 1) {
+        if (read_fully(fds[0], &c, 1, &bytes_read) != 0) {
             int retval;
             int status;
 
@@ -266,7 +265,8 @@ fork_and_wait_for_startup(int *fdp)
                 exit(WEXITSTATUS(status));
             }
 
-            ovs_fatal(errno, "fork child failed to signal startup");
+            VLOG_FATAL("fork child failed to signal startup (%s)",
+                       strerror(errno));
         }
         close(fds[0]);
         *fdp = -1;
@@ -277,7 +277,7 @@ fork_and_wait_for_startup(int *fdp)
         lockfile_postfork();
         *fdp = fds[1];
     } else {
-        ovs_fatal(errno, "could not fork");
+        VLOG_FATAL("fork failed (%s)", strerror(errno));
     }
 
     return pid;
@@ -292,7 +292,7 @@ fork_notify_startup(int fd)
 
         error = write_fully(fd, "", 1, &bytes_written);
         if (error) {
-            ovs_fatal(error, "could not write to pipe");
+            VLOG_FATAL("pipe write failed (%s)", strerror(error));
         }
 
         close(fd);
@@ -346,7 +346,7 @@ monitor_daemon(pid_t daemon_pid)
         } while (retval == -1 && errno == EINTR);
 
         if (retval == -1) {
-            ovs_fatal(errno, "waitpid failed");
+            VLOG_FATAL("waitpid failed (%s)", strerror(errno));
         } else if (retval == daemon_pid) {
             char *s = process_status_msg(status);
             if (should_restart(status)) {