Version 1.11.3.
[libguestfs.git] / daemon / guestfsd.c
index 8e77cba..ac8750c 100644 (file)
@@ -1,5 +1,5 @@
 /* libguestfs - the guestfsd daemon
- * Copyright (C) 2009-2010 Red Hat Inc.
+ * Copyright (C) 2009-2011 Red Hat Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,8 +18,6 @@
 
 #include <config.h>
 
-#define _BSD_SOURCE            /* for daemon(3) */
-
 #ifdef HAVE_WINDOWS_H
 # include <windows.h>
 #endif
@@ -87,17 +85,6 @@ static int print_arginfo (const struct printf_info *info, size_t n, int *argtype
 
 #ifdef WIN32
 static int
-daemon (int nochdir, int noclose)
-{
-  fprintf (stderr,
-           "On Windows the daemon does not support forking into the "
-           "background.\nYou *must* run the daemon with the -f option.\n");
-  exit (EXIT_FAILURE);
-}
-#endif /* WIN32 */
-
-#ifdef WIN32
-static int
 winsock_init (void)
 {
   int r;
@@ -128,24 +115,22 @@ static void
 usage (void)
 {
   fprintf (stderr,
-    "guestfsd [-f|--foreground] [-v|--verbose] [-r]\n");
+    "guestfsd [-r] [-v|--verbose]\n");
 }
 
 int
 main (int argc, char *argv[])
 {
-  static const char *options = "frv?";
+  static const char *options = "rv?";
   static const struct option long_options[] = {
-    { "foreground", 0, 0, 'f' },
     { "help", 0, 0, '?' },
     { "verbose", 0, 0, 'v' },
     { 0, 0, 0, 0 }
   };
   int c;
-  int dont_fork = 0;
   char *cmdline;
 
-  chdir ("/");
+  ignore_value (chdir ("/"));
 
   if (winsock_init () == -1)
     error (EXIT_FAILURE, 0, "winsock initialization failed");
@@ -172,10 +157,6 @@ main (int argc, char *argv[])
     if (c == -1) break;
 
     switch (c) {
-    case 'f':
-      dont_fork = 1;
-      break;
-
       /* The -r flag is used when running standalone.  It changes
        * several aspects of the daemon.
        */
@@ -292,14 +273,6 @@ main (int argc, char *argv[])
 
   xdr_destroy (&xdr);
 
-  /* Fork into the background. */
-  if (!dont_fork) {
-    if (daemon (0, 1) == -1) {
-      perror ("daemon");
-      exit (EXIT_FAILURE);
-    }
-  }
-
   /* Enter the main loop, reading and performing actions. */
   main_loop (sock);
 
@@ -706,6 +679,8 @@ commandrvf (char **stdoutput, char **stderror, int flags,
   }
 
   if (pid == 0) {              /* Child process running the command. */
+    signal (SIGALRM, SIG_DFL);
+    signal (SIGPIPE, SIG_DFL);
     close (0);
     if (flag_copy_stdin) {
       dup2 (stdin_fd[0], 0);
@@ -794,9 +769,13 @@ commandrvf (char **stdoutput, char **stderror, int flags,
 
   quit = 0;
   while (quit < 2) {
+  again:
     rset2 = rset;
     r = select (MAX (so_fd[0], se_fd[0]) + 1, &rset2, NULL, NULL, NULL);
     if (r == -1) {
+      if (errno == EINTR)
+        goto again;
+
       perror ("select");
     quit:
       if (stdoutput) free (*stdoutput);