From: Daniel P. Berrange Date: Tue, 20 May 2008 16:17:36 +0000 (+0000) Subject: Avoid initializing driver if pidfie is claimed. Always claim pidfile as root X-Git-Tag: LIBVIRT_0_4_4~78 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8049357dede345cfbcad923235a5947f9dd89748;p=thirdparty%2Flibvirt.git Avoid initializing driver if pidfie is claimed. Always claim pidfile as root --- diff --git a/ChangeLog b/ChangeLog index 7ad49b5a31..94a694f060 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Tue May 20 12:15:29 EST 2008 Daniel P. Berrange + + * 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 * docs/remote.html docs/remote.html.in: patch from Kenneth Nagin diff --git a/qemud/qemud.c b/qemud/qemud.c index b1342ad102..7504a0b162 100644 --- a/qemud/qemud.c +++ b/qemud/qemud.c @@ -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; }