]> xenbits.xensource.com Git - libvirt.git/commitdiff
Avoid initializing driver if pidfie is claimed. Always claim pidfile as root
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 20 May 2008 16:17:36 +0000 (16:17 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 20 May 2008 16:17:36 +0000 (16:17 +0000)
ChangeLog
qemud/qemud.c

index 7ad49b5a3158854eadc2ca7d28ac6a17b75eabda..94a694f0602646167a8c0d838ac59dc19e83b254 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Tue May 20 12:15:29 EST 2008 Daniel P. Berrange <berrange@redhat.com>
+
+       * qemud/qemud.c: Re-factor daemon startup code to avoid
+       initializing the drivers if the pidfile is already claimed
+       by another daemon instance. Always claim pidfile when running
+       as root, even in non-daemon mode
+
 Tue May 20 17:53:29 CEST 2008 Daniel Veillard <veillard@redhat.com>
 
        * docs/remote.html docs/remote.html.in: patch from Kenneth Nagin
index b1342ad1025692d808ecd8de6a8be9e5587c4d9d..7504a0b162e0dae75aee0ab74ac86224e623ad21 100644 (file)
@@ -2143,6 +2143,26 @@ int main(int argc, char **argv) {
         }
     }
 
+    if (godaemon) {
+        openlog("libvirtd", 0, 0);
+        if (qemudGoDaemon() < 0) {
+            qemudLog(QEMUD_ERR, _("Failed to fork as daemon: %s"),
+                     strerror(errno));
+            goto error1;
+        }
+    }
+
+    /* If running as root and no PID file is set, use the default */
+    if (pid_file == NULL &&
+        getuid() == 0 &&
+        REMOTE_PID_FILE[0] != '\0')
+        pid_file = REMOTE_PID_FILE;
+
+    /* If we have a pidfile set, claim it now, exiting if already taken */
+    if (pid_file != NULL &&
+        qemudWritePidFile (pid_file) < 0)
+        goto error1;
+
     if (pipe(sigpipe) < 0 ||
         qemudSetNonBlock(sigpipe[0]) < 0 ||
         qemudSetNonBlock(sigpipe[1]) < 0 ||
@@ -2150,24 +2170,34 @@ int main(int argc, char **argv) {
         qemudSetCloseExec(sigpipe[1]) < 0) {
         qemudLog(QEMUD_ERR, _("Failed to create pipe: %s"),
                  strerror(errno));
-        goto error1;
+        goto error2;
     }
     sigwrite = sigpipe[1];
 
+    sig_action.sa_sigaction = sig_handler;
+    sig_action.sa_flags = SA_SIGINFO;
+    sigemptyset(&sig_action.sa_mask);
+
+    sigaction(SIGHUP, &sig_action, NULL);
+    sigaction(SIGINT, &sig_action, NULL);
+    sigaction(SIGQUIT, &sig_action, NULL);
+    sigaction(SIGTERM, &sig_action, NULL);
+    sigaction(SIGCHLD, &sig_action, NULL);
+
+    sig_action.sa_handler = SIG_IGN;
+    sigaction(SIGPIPE, &sig_action, NULL);
+
     if (!(server = qemudInitialize(sigpipe[0]))) {
         ret = 2;
-        goto error1;
+        goto error2;
     }
 
     /* Read the config file (if it exists). */
     if (remoteReadConfigFile (server, remote_config_file) < 0)
-        goto error1;
+        goto error2;
 
     /* Change the group ownership of /var/run/libvirt to unix_sock_gid */
-    if (getuid() != 0) {
-        qemudLog (QEMUD_WARN,
-                  "%s", _("Cannot set group ownership when not running as root"));
-    } else {
+    if (getuid() == 0) {
         const char *sockdirname = LOCAL_STATE_DIR "/run/libvirt";
 
         if (chown(sockdirname, -1, unix_sock_gid) < 0)
@@ -2175,37 +2205,6 @@ int main(int argc, char **argv) {
                      sockdirname);
     }
 
-    if (godaemon) {
-        openlog("libvirtd", 0, 0);
-        if (qemudGoDaemon() < 0) {
-            qemudLog(QEMUD_ERR, _("Failed to fork as daemon: %s"),
-                     strerror(errno));
-            goto error1;
-        }
-
-        /* Choose the name of the PID file. */
-        if (!pid_file) {
-            if (REMOTE_PID_FILE[0] != '\0')
-                pid_file = REMOTE_PID_FILE;
-        }
-
-        if (pid_file && qemudWritePidFile (pid_file) < 0)
-            goto error1;
-    }
-
-    sig_action.sa_sigaction = sig_handler;
-    sig_action.sa_flags = SA_SIGINFO;
-    sigemptyset(&sig_action.sa_mask);
-
-    sigaction(SIGHUP, &sig_action, NULL);
-    sigaction(SIGINT, &sig_action, NULL);
-    sigaction(SIGQUIT, &sig_action, NULL);
-    sigaction(SIGTERM, &sig_action, NULL);
-    sigaction(SIGCHLD, &sig_action, NULL);
-
-    sig_action.sa_handler = SIG_IGN;
-    sigaction(SIGPIPE, &sig_action, NULL);
-
     if (virEventAddHandleImpl(sigpipe[0],
                               POLLIN,
                               qemudDispatchSignalEvent,
@@ -2223,19 +2222,17 @@ int main(int argc, char **argv) {
 
     qemudRunLoop(server);
 
-    close(sigwrite);
-
-    if (godaemon)
-        closelog();
-
     ret = 0;
 
- error2:
-    if (godaemon && pid_file)
-        unlink (pid_file);
-
- error1:
+error2:
     if (server)
         qemudCleanup(server);
+    if (pid_file)
+        unlink (pid_file);
+    close(sigwrite);
+
+error1:
+    if (godaemon)
+        closelog();
     return ret;
 }