qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Jes.Sorensen@redhat.com
To: anthony@codemonkey.ws
Cc: Jes Sorensen <Jes.Sorensen@redhat.com>, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 13/16] Move daemonize handling to OS specific files
Date: Thu,  3 Jun 2010 18:48:09 +0200	[thread overview]
Message-ID: <1275583692-11678-14-git-send-email-Jes.Sorensen@redhat.com> (raw)
In-Reply-To: <1275583692-11678-1-git-send-email-Jes.Sorensen@redhat.com>

From: Jes Sorensen <Jes.Sorensen@redhat.com>

Move daemonize handling from vl.c to OS specific files. Provide dummy
stubs for Win32.

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
---
 os-posix.c      |  102 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 os-win32.c      |    5 +++
 qemu-os-posix.h |    2 +
 qemu-os-win32.h |    2 +
 sysemu.h        |    1 +
 vl.c            |  106 ++-----------------------------------------------------
 6 files changed, 115 insertions(+), 103 deletions(-)

diff --git a/os-posix.c b/os-posix.c
index a91e1f6..8a9d102 100644
--- a/os-posix.c
+++ b/os-posix.c
@@ -38,6 +38,8 @@
 
 static struct passwd *user_pwd;
 static const char *chroot_dir;
+static int daemonize;
+static int fds[2];
 
 void os_setup_early_signal_handling(void)
 {
@@ -173,6 +175,9 @@ int os_parse_cmd_args(const QEMUOption *popt, const char *optarg)
     case QEMU_OPTION_chroot:
         chroot_dir = optarg;
         break;
+    case QEMU_OPTION_daemonize:
+        daemonize = 1;
+        break;
     default:
         ret = -1;
     }
@@ -211,3 +216,100 @@ void os_change_root(void)
     }
 
 }
+
+void os_daemonize(void)
+{
+    if (daemonize) {
+	pid_t pid;
+
+	if (pipe(fds) == -1)
+	    exit(1);
+
+	pid = fork();
+	if (pid > 0) {
+	    uint8_t status;
+	    ssize_t len;
+
+	    close(fds[1]);
+
+	again:
+            len = read(fds[0], &status, 1);
+            if (len == -1 && (errno == EINTR))
+                goto again;
+
+            if (len != 1)
+                exit(1);
+            else if (status == 1) {
+                fprintf(stderr, "Could not acquire pidfile: %s\n", strerror(errno));
+                exit(1);
+            } else
+                exit(0);
+	} else if (pid < 0)
+            exit(1);
+
+	close(fds[0]);
+	qemu_set_cloexec(fds[1]);
+
+	setsid();
+
+	pid = fork();
+	if (pid > 0)
+	    exit(0);
+	else if (pid < 0)
+	    exit(1);
+
+	umask(027);
+
+        signal(SIGTSTP, SIG_IGN);
+        signal(SIGTTOU, SIG_IGN);
+        signal(SIGTTIN, SIG_IGN);
+    }
+}
+
+void os_setup_post(void)
+{
+    int fd = 0;
+
+    if (daemonize) {
+	uint8_t status = 0;
+	ssize_t len;
+
+    again1:
+	len = write(fds[1], &status, 1);
+	if (len == -1 && (errno == EINTR))
+	    goto again1;
+
+	if (len != 1)
+	    exit(1);
+
+        if (chdir("/")) {
+            perror("not able to chdir to /");
+            exit(1);
+        }
+	TFR(fd = qemu_open("/dev/null", O_RDWR));
+	if (fd == -1)
+	    exit(1);
+    }
+
+    os_change_root();
+    os_change_process_uid();
+
+    if (daemonize) {
+        dup2(fd, 0);
+        dup2(fd, 1);
+        dup2(fd, 2);
+
+        close(fd);
+    }
+}
+
+void os_pidfile_error(void)
+{
+    if (daemonize) {
+        uint8_t status = 1;
+        if (write(fds[1], &status, 1) != 1) {
+            perror("daemonize. Writing to pipe\n");
+        }
+    } else
+        fprintf(stderr, "Could not acquire pid file: %s\n", strerror(errno));
+}
diff --git a/os-win32.c b/os-win32.c
index a311a90..86ff327 100644
--- a/os-win32.c
+++ b/os-win32.c
@@ -226,3 +226,8 @@ int os_parse_cmd_args(const QEMUOption *popt, const char *optarg)
 {
     return -1;
 }
+
+void os_pidfile_error(void)
+{
+    fprintf(stderr, "Could not acquire pid file: %s\n", strerror(errno));
+}
diff --git a/qemu-os-posix.h b/qemu-os-posix.h
index 91c7b68..9b07660 100644
--- a/qemu-os-posix.h
+++ b/qemu-os-posix.h
@@ -33,5 +33,7 @@ static inline void os_host_main_loop_wait(int *timeout)
 void os_setup_signal_handling(void);
 void os_change_process_uid(void);
 void os_change_root(void);
+void os_daemonize(void);
+void os_setup_post(void);
 
 #endif
diff --git a/qemu-os-win32.h b/qemu-os-win32.h
index 245b188..ccb9691 100644
--- a/qemu-os-win32.h
+++ b/qemu-os-win32.h
@@ -45,5 +45,7 @@ void os_host_main_loop_wait(int *timeout);
 static inline void os_setup_signal_handling(void) {};
 static inline void os_change_process_uid(void) {};
 static inline void os_change_root(void) {};
+static inline void os_daemonize(void) {};
+static inline void os_setup_post(void) {};
 
 #endif
diff --git a/sysemu.h b/sysemu.h
index 08ec323..aa44a20 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -91,6 +91,7 @@ typedef struct QEMUOption {
 void os_setup_early_signal_handling(void);
 char *os_find_datadir(const char *argv0);
 int os_parse_cmd_args(const QEMUOption *popt, const char *optarg);
+void os_pidfile_error(void);
 
 typedef enum DisplayType
 {
diff --git a/vl.c b/vl.c
index 7173684..bb8abbf 100644
--- a/vl.c
+++ b/vl.c
@@ -215,9 +215,6 @@ int no_shutdown = 0;
 int cursor_hide = 1;
 int graphic_rotate = 0;
 uint8_t irq0override = 1;
-#ifndef _WIN32
-int daemonize = 0;
-#endif
 const char *watchdog;
 const char *option_rom[MAX_OPTION_ROMS];
 int nb_option_roms;
@@ -2303,15 +2300,9 @@ int main(int argc, char **argv, char **envp)
     const char *loadvm = NULL;
     QEMUMachine *machine;
     const char *cpu_model;
-#ifndef _WIN32
-    int fds[2];
-#endif
     int tb_size;
     const char *pid_file = NULL;
     const char *incoming = NULL;
-#ifndef _WIN32
-    int fd = 0;
-#endif
     int show_vnc_port = 0;
     int defconfig = 1;
 
@@ -2977,11 +2968,6 @@ int main(int argc, char **argv, char **envp)
                     exit(1);
                 }
                 break;
-#ifndef _WIN32
-	    case QEMU_OPTION_daemonize:
-		daemonize = 1;
-		break;
-#endif
 	    case QEMU_OPTION_option_rom:
 		if (nb_option_roms >= MAX_OPTION_ROMS) {
 		    fprintf(stderr, "Too many option ROMs\n");
@@ -3195,64 +3181,10 @@ int main(int argc, char **argv, char **envp)
     }
 #endif
 
-#ifndef _WIN32
-    if (daemonize) {
-	pid_t pid;
-
-	if (pipe(fds) == -1)
-	    exit(1);
-
-	pid = fork();
-	if (pid > 0) {
-	    uint8_t status;
-	    ssize_t len;
-
-	    close(fds[1]);
-
-	again:
-            len = read(fds[0], &status, 1);
-            if (len == -1 && (errno == EINTR))
-                goto again;
-
-            if (len != 1)
-                exit(1);
-            else if (status == 1) {
-                fprintf(stderr, "Could not acquire pidfile: %s\n", strerror(errno));
-                exit(1);
-            } else
-                exit(0);
-	} else if (pid < 0)
-            exit(1);
-
-	close(fds[0]);
-	qemu_set_cloexec(fds[1]);
-
-	setsid();
-
-	pid = fork();
-	if (pid > 0)
-	    exit(0);
-	else if (pid < 0)
-	    exit(1);
-
-	umask(027);
-
-        signal(SIGTSTP, SIG_IGN);
-        signal(SIGTTOU, SIG_IGN);
-        signal(SIGTTIN, SIG_IGN);
-    }
-#endif
+    os_daemonize();
 
     if (pid_file && qemu_create_pidfile(pid_file) != 0) {
-#ifndef _WIN32
-        if (daemonize) {
-            uint8_t status = 1;
-            if (write(fds[1], &status, 1) != 1) {
-                perror("daemonize. Writing to pipe\n");
-            }
-        } else
-#endif
-            fprintf(stderr, "Could not acquire pid file: %s\n", strerror(errno));
+        os_pidfile_error();
         exit(1);
     }
 
@@ -3520,39 +3452,7 @@ int main(int argc, char **argv, char **envp)
         vm_start();
     }
 
-#ifndef _WIN32
-    if (daemonize) {
-	uint8_t status = 0;
-	ssize_t len;
-
-    again1:
-	len = write(fds[1], &status, 1);
-	if (len == -1 && (errno == EINTR))
-	    goto again1;
-
-	if (len != 1)
-	    exit(1);
-
-        if (chdir("/")) {
-            perror("not able to chdir to /");
-            exit(1);
-        }
-	TFR(fd = qemu_open("/dev/null", O_RDWR));
-	if (fd == -1)
-	    exit(1);
-    }
-
-    os_change_root();
-    os_change_process_uid();
-
-    if (daemonize) {
-        dup2(fd, 0);
-        dup2(fd, 1);
-        dup2(fd, 2);
-
-        close(fd);
-    }
-#endif
+    os_setup_post();
 
     main_loop();
     quit_timers();
-- 
1.6.5.2

  parent reply	other threads:[~2010-06-03 16:48 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-03 16:47 [Qemu-devel] [PATCH 00/16] clean up vl.c code Jes.Sorensen
2010-06-03 16:47 ` [Qemu-devel] [PATCH 01/16] vl.c: Remove double include of netinet/in.h for Solaris Jes.Sorensen
2010-06-03 16:47 ` [Qemu-devel] [PATCH 02/16] Create qemu-os-win32.h and move WIN32 specific declarations there Jes.Sorensen
2010-06-03 16:47 ` [Qemu-devel] [PATCH 03/16] Introduce os-win32.c and move polling functions from vl.c Jes.Sorensen
2010-06-03 16:48 ` [Qemu-devel] [PATCH 04/16] vl.c: Move host_main_loop_wait() to OS specific files Jes.Sorensen
2010-06-03 16:48 ` [Qemu-devel] [PATCH 05/16] Introduce os-posix.c and create os_setup_signal_handling() Jes.Sorensen
2010-06-03 20:50   ` Richard Henderson
2010-06-04  6:45     ` Jes Sorensen
2010-06-03 16:48 ` [Qemu-devel] [PATCH 06/16] Move win32 early signal handling setup to os_setup_signal_handling() Jes.Sorensen
2010-06-03 16:48 ` [Qemu-devel] [PATCH 07/16] Rename os_setup_signal_handling() to os_setup_early_signal_handling() Jes.Sorensen
2010-06-03 16:48 ` [Qemu-devel] [PATCH 08/16] Move main signal handler setup to os specificfiles Jes.Sorensen
2010-06-03 20:52   ` Richard Henderson
2010-06-04  6:45     ` Jes Sorensen
2010-06-04  7:45       ` Markus Armbruster
2010-06-03 16:48 ` [Qemu-devel] [PATCH 09/16] Move find_datadir to OS specific files Jes.Sorensen
2010-06-03 16:48 ` [Qemu-devel] [PATCH 10/16] Introduce OS specific cmdline argument handling and move SMB arg to os-posix.c Jes.Sorensen
2010-06-03 20:58   ` Richard Henderson
2010-06-04  6:47     ` Jes Sorensen
2010-06-04 14:49       ` Richard Henderson
2010-06-04 14:51         ` Jes Sorensen
2010-06-04  8:15   ` Markus Armbruster
2010-06-04  8:21     ` Jes Sorensen
2010-06-04 10:39       ` [Qemu-devel] " Paolo Bonzini
2010-06-04 11:59         ` Jes Sorensen
2010-06-04 12:04       ` [Qemu-devel] " Markus Armbruster
2010-06-04 12:11         ` Jes Sorensen
2010-06-03 16:48 ` [Qemu-devel] [PATCH 11/16] Move runas handling from vl.c to OS specific files Jes.Sorensen
2010-06-03 21:00   ` Richard Henderson
2010-06-03 16:48 ` [Qemu-devel] [PATCH 12/16] Move chroot handling " Jes.Sorensen
2010-06-03 21:02   ` Richard Henderson
2010-06-04  6:48     ` Jes Sorensen
2010-06-03 16:48 ` Jes.Sorensen [this message]
2010-06-03 16:48 ` [Qemu-devel] [PATCH 14/16] Make os_change_process_uid and os_change_root os-posix.c local Jes.Sorensen
2010-06-03 16:48 ` [Qemu-devel] [PATCH 15/16] Move line-buffering setup to OS specific files Jes.Sorensen
2010-06-03 16:48 ` [Qemu-devel] [PATCH 16/16] Move set_proc_name() " Jes.Sorensen
2010-06-04  8:21 ` [Qemu-devel] [PATCH 00/16] clean up vl.c code Markus Armbruster
2010-06-04  8:23   ` Jes Sorensen
2010-06-04 11:54     ` Markus Armbruster
2010-06-04 11:57       ` Jes Sorensen
2010-06-09  7:07         ` Markus Armbruster
2010-06-09  8:14           ` Jes Sorensen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1275583692-11678-14-git-send-email-Jes.Sorensen@redhat.com \
    --to=jes.sorensen@redhat.com \
    --cc=anthony@codemonkey.ws \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).