daemon/Win32: Win32 can't fork message moved to separate function (Jim Meyering)
[libguestfs.git] / daemon / guestfsd.c
index e6384d2..eef7c6d 100644 (file)
 
 #define _BSD_SOURCE            /* for daemon(3) */
 
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -56,6 +60,10 @@ static char *read_cmdline (void);
 #define AI_ADDRCONFIG 0
 #endif
 
+#ifndef MAX
+#define MAX(a,b) ((a)>(b)?(a):(b))
+#endif
+
 int verbose = 0;
 
 static int print_shell_quote (FILE *stream, const struct printf_info *info, const void *const *args);
@@ -70,6 +78,17 @@ static int print_arginfo (const struct printf_info *info, size_t n, int *argtype
 #endif
 #endif
 
+#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 */
+
 /* Location to mount root device. */
 const char *sysroot = "/sysroot"; /* No trailing slash. */
 int sysroot_len = 8;
@@ -157,6 +176,7 @@ main (int argc, char *argv[])
       printf ("could not read linux command line\n");
   }
 
+#ifndef WIN32
   /* Make sure SIGPIPE doesn't kill us. */
   struct sigaction sa;
   memset (&sa, 0, sizeof sa);
@@ -164,7 +184,11 @@ main (int argc, char *argv[])
   sa.sa_flags = 0;
   if (sigaction (SIGPIPE, &sa, NULL) == -1)
     perror ("sigaction SIGPIPE"); /* but try to continue anyway ... */
+#endif
 
+#ifdef WIN32
+#define setenv(n,v,f) _putenv(n "=" v)
+#endif
   /* Set up a basic environment.  After we are called by /init the
    * environment is essentially empty.
    * https://bugzilla.redhat.com/show_bug.cgi?id=502074#c5
@@ -173,8 +197,16 @@ main (int argc, char *argv[])
   setenv ("SHELL", "/bin/sh", 1);
   setenv ("LC_ALL", "C", 1);
 
+#ifndef WIN32
   /* We document that umask defaults to 022 (it should be this anyway). */
   umask (022);
+#else
+  /* This is the default for Windows anyway.  It's not even clear if
+   * Windows ever uses this -- the MSDN documentation for the function
+   * contains obvious errors.
+   */
+  _umask (0);
+#endif
 
   /* Get the vmchannel string.
    *
@@ -309,7 +341,7 @@ main (int argc, char *argv[])
   XDR xdr;
   uint32_t len = GUESTFS_LAUNCH_FLAG;
   xdrmem_create (&xdr, lenbuf, sizeof lenbuf, XDR_ENCODE);
-  xdr_uint32_t (&xdr, &len);
+  xdr_u_int (&xdr, &len);
 
   if (xwrite (sock, lenbuf, sizeof lenbuf) == -1)
     exit (EXIT_FAILURE);