提交 8049357d 编写于 作者: D Daniel P. Berrange

Avoid initializing driver if pidfie is claimed. Always claim pidfile as root

上级 1290f502
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> Tue May 20 17:53:29 CEST 2008 Daniel Veillard <veillard@redhat.com>
* docs/remote.html docs/remote.html.in: patch from Kenneth Nagin * docs/remote.html docs/remote.html.in: patch from Kenneth Nagin
......
...@@ -2143,6 +2143,26 @@ int main(int argc, char **argv) { ...@@ -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 || if (pipe(sigpipe) < 0 ||
qemudSetNonBlock(sigpipe[0]) < 0 || qemudSetNonBlock(sigpipe[0]) < 0 ||
qemudSetNonBlock(sigpipe[1]) < 0 || qemudSetNonBlock(sigpipe[1]) < 0 ||
...@@ -2150,24 +2170,34 @@ int main(int argc, char **argv) { ...@@ -2150,24 +2170,34 @@ int main(int argc, char **argv) {
qemudSetCloseExec(sigpipe[1]) < 0) { qemudSetCloseExec(sigpipe[1]) < 0) {
qemudLog(QEMUD_ERR, _("Failed to create pipe: %s"), qemudLog(QEMUD_ERR, _("Failed to create pipe: %s"),
strerror(errno)); strerror(errno));
goto error1; goto error2;
} }
sigwrite = sigpipe[1]; 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]))) { if (!(server = qemudInitialize(sigpipe[0]))) {
ret = 2; ret = 2;
goto error1; goto error2;
} }
/* Read the config file (if it exists). */ /* Read the config file (if it exists). */
if (remoteReadConfigFile (server, remote_config_file) < 0) if (remoteReadConfigFile (server, remote_config_file) < 0)
goto error1; goto error2;
/* Change the group ownership of /var/run/libvirt to unix_sock_gid */ /* Change the group ownership of /var/run/libvirt to unix_sock_gid */
if (getuid() != 0) { if (getuid() == 0) {
qemudLog (QEMUD_WARN,
"%s", _("Cannot set group ownership when not running as root"));
} else {
const char *sockdirname = LOCAL_STATE_DIR "/run/libvirt"; const char *sockdirname = LOCAL_STATE_DIR "/run/libvirt";
if (chown(sockdirname, -1, unix_sock_gid) < 0) if (chown(sockdirname, -1, unix_sock_gid) < 0)
...@@ -2175,37 +2205,6 @@ int main(int argc, char **argv) { ...@@ -2175,37 +2205,6 @@ int main(int argc, char **argv) {
sockdirname); 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], if (virEventAddHandleImpl(sigpipe[0],
POLLIN, POLLIN,
qemudDispatchSignalEvent, qemudDispatchSignalEvent,
...@@ -2223,19 +2222,17 @@ int main(int argc, char **argv) { ...@@ -2223,19 +2222,17 @@ int main(int argc, char **argv) {
qemudRunLoop(server); qemudRunLoop(server);
close(sigwrite);
if (godaemon)
closelog();
ret = 0; ret = 0;
error2: error2:
if (godaemon && pid_file)
unlink (pid_file);
error1:
if (server) if (server)
qemudCleanup(server); qemudCleanup(server);
if (pid_file)
unlink (pid_file);
close(sigwrite);
error1:
if (godaemon)
closelog();
return ret; return ret;
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册