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@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list