X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Fguestfsd.c;h=8d0154a3a09fb04436f3704cd1c67ee148ab84ac;hp=e6384d21ed952b328de10433ee1829d7ea551c72;hb=15ebf328911fb6376376889c99029bcf2dbe0033;hpb=b20a0916d8711fd3fb448dc5d4febee9d7a6331c diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c index e6384d2..8d0154a 100644 --- a/daemon/guestfsd.c +++ b/daemon/guestfsd.c @@ -20,6 +20,10 @@ #define _BSD_SOURCE /* for daemon(3) */ +#ifdef HAVE_WINDOWS_H +# include +#endif + #include #include #include @@ -35,13 +39,17 @@ #include #include #include +#include +#include #ifdef HAVE_PRINTF_H -#include +# include #endif +#include "sockets.h" #include "c-ctype.h" #include "ignore-value.h" +#include "error.h" #include "daemon.h" @@ -53,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; @@ -70,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; @@ -97,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); @@ -157,6 +201,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 +209,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 +222,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 +366,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);