daemon/Win32: use gnulib modules connect, socket and symlinkat (for readlinkat).
[libguestfs.git] / daemon / guestfsd.c
index d3b754d..8d0154a 100644 (file)
@@ -21,7 +21,7 @@
 #define _BSD_SOURCE            /* for daemon(3) */
 
 #ifdef HAVE_WINDOWS_H
-#include <windows.h>
+# include <windows.h>
 #endif
 
 #include <stdio.h>
 #include <netdb.h>
 #include <sys/select.h>
 #include <sys/wait.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
 
 #ifdef HAVE_PRINTF_H
-#include <printf.h>
+# include <printf.h>
 #endif
 
+#include "sockets.h"
 #include "c-ctype.h"
 #include "ignore-value.h"
+#include "error.h"
 
 #include "daemon.h"
 
@@ -57,7 +61,11 @@ static char *read_cmdline (void);
 
 /* This is only a hint.  If not defined, ignore it. */
 #ifndef AI_ADDRCONFIG
-#define AI_ADDRCONFIG 0
+# define AI_ADDRCONFIG 0
+#endif
+
+#ifndef MAX
+# define MAX(a,b) ((a)>(b)?(a):(b))
 #endif
 
 int verbose = 0;
@@ -74,6 +82,35 @@ 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 */
+
+#ifdef WIN32
+static int
+winsock_init (void)
+{
+  int r;
+
+  /* http://msdn2.microsoft.com/en-us/library/ms742213.aspx */
+  r = gl_sockets_startup (SOCKETS_2_2);
+  return r == 0 ? 0 : -1;
+}
+#else /* !WIN32 */
+static int
+winsock_init (void)
+{
+  return 0;
+}
+#endif /* !WIN32 */
+
 /* Location to mount root device. */
 const char *sysroot = "/sysroot"; /* No trailing slash. */
 int sysroot_len = 8;
@@ -101,6 +138,9 @@ main (int argc, char *argv[])
   char *cmdline;
   char *vmchannel = NULL;
 
+  if (winsock_init () == -1)
+    error (EXIT_FAILURE, 0, "winsock initialization failed");
+
 #ifdef HAVE_REGISTER_PRINTF_SPECIFIER
   /* http://udrepper.livejournal.com/20948.html */
   register_printf_specifier ('Q', print_shell_quote, print_arginfo);
@@ -172,7 +212,7 @@ main (int argc, char *argv[])
 #endif
 
 #ifdef WIN32
-#define setenv(n,v,f) _putenv(n "=" v)
+# 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.
@@ -335,15 +375,10 @@ main (int argc, char *argv[])
 
   /* Fork into the background. */
   if (!dont_fork) {
-#ifndef WIN32
     if (daemon (0, 1) == -1) {
       perror ("daemon");
       exit (EXIT_FAILURE);
     }
-#else /* WIN32 */
-    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 */
   }
 
   /* Enter the main loop, reading and performing actions. */