X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=daemon%2Fguestfsd.c;h=ac8750c1e96b984843cfc6d81bd5d0420e21bda7;hb=cbc6b720a4e58d32b6089db05288f4a468742b47;hp=8e77cba622f7b310eb5d4bf9b2455ebedb6fa6d8;hpb=338ecaac0546fe0308df3ae5d0927a171b15edd7;p=libguestfs.git diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c index 8e77cba..ac8750c 100644 --- a/daemon/guestfsd.c +++ b/daemon/guestfsd.c @@ -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 -#define _BSD_SOURCE /* for daemon(3) */ - #ifdef HAVE_WINDOWS_H # include #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);