On Fri, Oct 23, 2009 at 02:05:38PM +0100, Daniel P. Berrange wrote:
* daemon/libvirtd.c: Introduce a daemonSetupSignals() method
and put all signal handling code there
* daemon/libvirtd.h: Add sigread/sigwrite to qemud_server type
---
daemon/libvirtd.c | 128 +++++++++++++++++++++++++++++++---------------------
daemon/libvirtd.h | 1 +
2 files changed, 77 insertions(+), 52 deletions(-)
diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index ab0c88c..4e268a2 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
@@ -782,7 +782,7 @@ static void virshErrorHandler(void *opaque ATTRIBUTE_UNUSED,
virErrorPtr err ATT
* took care of reporting the error */
}
-static struct qemud_server *qemudInitialize(int sigread) {
+static struct qemud_server *qemudInitialize(void) {
struct qemud_server *server;
if (VIR_ALLOC(server) < 0) {
@@ -790,21 +790,26 @@ static struct qemud_server *qemudInitialize(int sigread) {
return NULL;
}
+ server->privileged = geteuid() == 0 ? 1 : 0;
+ server->sigread = server->sigwrite = -1;
+
if (virMutexInit(&server->lock) < 0) {
VIR_ERROR("%s", _("cannot initialize mutex"));
VIR_FREE(server);
+ return NULL;
}
if (virCondInit(&server->job) < 0) {
VIR_ERROR("%s", _("cannot initialize condition variable"));
virMutexDestroy(&server->lock);
VIR_FREE(server);
+ return NULL;
}
- server->privileged = geteuid() == 0 ? 1 : 0;
- server->sigread = sigread;
-
if (virEventInit() < 0) {
VIR_ERROR0(_("Failed to initialize event system"));
+ virMutexDestroy(&server->lock);
+ if (virCondDestroy(&server->job) < 0)
+ {}
Hum ... but is there really anything we can do there ?
VIR_FREE(server);
return NULL;
}
@@ -2292,7 +2297,10 @@ cleanup:
static void qemudCleanup(struct qemud_server *server) {
struct qemud_socket *sock;
- close(server->sigread);
+ if (server->sigread != -1)
+ close(server->sigread);
+ if (server->sigwrite != -1)
+ close(server->sigwrite);
sock = server->sockets;
while (sock) {
@@ -2787,6 +2795,58 @@ qemudSetupPrivs (void)
#define qemudSetupPrivs() 0
#endif
+static int
+daemonSetupSignals(struct qemud_server *server)
+{
+ struct sigaction sig_action;
+ int sigpipe[2];
+
+ if (pipe(sigpipe) < 0)
+ return -1;
+
+ if (virSetNonBlock(sigpipe[0]) < 0 ||
+ virSetNonBlock(sigpipe[1]) < 0 ||
+ virSetCloseExec(sigpipe[0]) < 0 ||
+ virSetCloseExec(sigpipe[1]) < 0) {
+ char ebuf[1024];
+ VIR_ERROR(_("Failed to create pipe: %s"),
+ virStrerror(errno, ebuf, sizeof ebuf));
+ goto error;
+ }
+
+ 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],
+ VIR_EVENT_HANDLE_READABLE,
+ qemudDispatchSignalEvent,
+ server, NULL) < 0) {
+ VIR_ERROR0(_("Failed to register callback for signal pipe"));
+ goto error;
+ }
+
+ server->sigread = sigpipe[0];
+ server->sigwrite = sigpipe[1];
+ sigwrite = sigpipe[1];
+
+ return 0;
+
+error:
+ close(sigpipe[0]);
+ close(sigpipe[1]);
+ return -1;
+}
+
ACK, this is something not trivial to understand isolating it is a good
idea, and with a comment it would be perfect :-)
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/