From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> Move the monitor FDs into the virLXCControllerPtr object removing the need for the 'struct lxcMonitor' object Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- src/lxc/lxc_controller.c | 115 ++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 60 deletions(-) diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index 1ae53de..fc350ea 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -125,6 +125,11 @@ struct _virLXCController { int *loopDevFds; virSecurityManagerPtr securityManager; + + int monitorServerFd; + int monitorServerWatch; + int monitorClientFd; + int monitorClientWatch; }; static void virLXCControllerFree(virLXCControllerPtr ctrl); @@ -138,6 +143,11 @@ static virLXCControllerPtr virLXCControllerNew(const char *name) if (VIR_ALLOC(ctrl) < 0) goto no_memory; + ctrl->monitorServerFd = -1; + ctrl->monitorServerWatch = -1; + ctrl->monitorClientFd = -1; + ctrl->monitorClientWatch = -1; + if (!(ctrl->name = strdup(name))) goto no_memory; @@ -242,6 +252,13 @@ static void virLXCControllerFree(virLXCControllerPtr ctrl) virDomainDefFree(ctrl->def); VIR_FREE(ctrl->name); + if (ctrl->monitorServerWatch != -1) + virEventRemoveHandle(ctrl->monitorServerWatch); + VIR_FORCE_CLOSE(ctrl->monitorServerFd); + if (ctrl->monitorClientWatch != -1) + virEventRemoveHandle(ctrl->monitorClientWatch); + VIR_FORCE_CLOSE(ctrl->monitorClientFd); + VIR_FREE(ctrl); } @@ -970,24 +987,16 @@ static void virLXCControllerSignalChildIO(int watch ATTRIBUTE_UNUSED, } -struct lxcMonitor { - int serverWatch; - int serverFd; /* Server listen socket */ - int clientWatch; - int clientFd; /* Current client FD (if any) */ -}; - - -static void lxcClientIO(int watch ATTRIBUTE_UNUSED, int fd, int events, void *opaque) +static void virLXCControllerClientIO(int watch ATTRIBUTE_UNUSED, int fd, int events, void *opaque) { - struct lxcMonitor *monitor = opaque; + virLXCControllerPtr ctrl = opaque; char buf[1024]; ssize_t ret; if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR)) { - virEventRemoveHandle(monitor->clientWatch); - monitor->clientWatch = -1; + virEventRemoveHandle(ctrl->monitorClientWatch); + ctrl->monitorClientWatch = -1; return; } @@ -1007,16 +1016,16 @@ reread: } if (ret == 0) { VIR_DEBUG("Client %d gone", fd); - VIR_FORCE_CLOSE(monitor->clientFd); - virEventRemoveHandle(monitor->clientWatch); - monitor->clientWatch = -1; + VIR_FORCE_CLOSE(ctrl->monitorClientFd); + virEventRemoveHandle(ctrl->monitorClientWatch); + ctrl->monitorClientWatch = -1; } } -static void lxcServerAccept(int watch ATTRIBUTE_UNUSED, int fd, int events ATTRIBUTE_UNUSED, void *opaque) +static void virLXCControllerServerAccept(int watch ATTRIBUTE_UNUSED, int fd, int events ATTRIBUTE_UNUSED, void *opaque) { - struct lxcMonitor *monitor = opaque; + virLXCControllerPtr ctrl = opaque; int client; if ((client = accept(fd, NULL, NULL)) < 0) { @@ -1034,16 +1043,16 @@ static void lxcServerAccept(int watch ATTRIBUTE_UNUSED, int fd, int events ATTRI virMutexUnlock(&lock); return; } - VIR_DEBUG("New client %d (old %d)\n", client, monitor->clientFd); - VIR_FORCE_CLOSE(monitor->clientFd); - virEventRemoveHandle(monitor->clientWatch); + VIR_DEBUG("New client %d (old %d)\n", client, ctrl->monitorClientFd); + VIR_FORCE_CLOSE(ctrl->monitorClientFd); + virEventRemoveHandle(ctrl->monitorClientWatch); - monitor->clientFd = client; - if ((monitor->clientWatch = virEventAddHandle(monitor->clientFd, - VIR_EVENT_HANDLE_READABLE, - lxcClientIO, - monitor, - NULL)) < 0) { + ctrl->monitorClientFd = client; + if ((ctrl->monitorClientWatch = virEventAddHandle(ctrl->monitorClientFd, + VIR_EVENT_HANDLE_READABLE, + virLXCControllerClientIO, + ctrl, + NULL)) < 0) { lxcError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to watch client socket")); virMutexLock(&lock); @@ -1305,14 +1314,8 @@ error: * * Returns 0 on success or -1 in case of error */ -static int virLXCControllerMain(virLXCControllerPtr ctrl, - int serverFd, - int clientFd) +static int virLXCControllerMain(virLXCControllerPtr ctrl) { - struct lxcMonitor monitor = { - .serverFd = serverFd, - .clientFd = clientFd, - }; virErrorPtr err; int rc = -1; size_t i; @@ -1343,25 +1346,25 @@ static int virLXCControllerMain(virLXCControllerPtr ctrl, } VIR_DEBUG("serverFd=%d clientFd=%d", - serverFd, clientFd); + ctrl->monitorServerFd, ctrl->monitorClientFd); virResetLastError(); - if ((monitor.serverWatch = virEventAddHandle(monitor.serverFd, - VIR_EVENT_HANDLE_READABLE, - lxcServerAccept, - &monitor, - NULL)) < 0) { + if ((ctrl->monitorServerWatch = virEventAddHandle(ctrl->monitorServerFd, + VIR_EVENT_HANDLE_READABLE, + virLXCControllerServerAccept, + ctrl, + NULL)) < 0) { lxcError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to watch monitor socket")); goto cleanup; } - if (monitor.clientFd != -1 && - (monitor.clientWatch = virEventAddHandle(monitor.clientFd, - VIR_EVENT_HANDLE_READABLE, - lxcClientIO, - &monitor, - NULL)) < 0) { + if (ctrl->monitorClientFd != -1 && + (ctrl->monitorClientWatch = virEventAddHandle(ctrl->monitorClientFd, + VIR_EVENT_HANDLE_READABLE, + virLXCControllerClientIO, + ctrl, + NULL)) < 0) { lxcError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to watch client socket")); goto cleanup; @@ -1422,8 +1425,6 @@ cleanup: virMutexDestroy(&lock); signal(SIGCHLD, SIG_DFL); cleanup2: - VIR_FORCE_CLOSE(monitor.serverFd); - VIR_FORCE_CLOSE(monitor.clientFd); for (i = 0 ; i < ctrl->nconsoles ; i++) virLXCControllerConsoleClose(&(ctrl->consoles[i])); @@ -1687,9 +1688,7 @@ virLXCControllerSetupConsoles(virLXCControllerPtr ctrl, static int -virLXCControllerRun(virLXCControllerPtr ctrl, - int monitor, - int client) +virLXCControllerRun(virLXCControllerPtr ctrl) { int rc = -1; int control[2] = { -1, -1}; @@ -1769,8 +1768,8 @@ virLXCControllerRun(virLXCControllerPtr ctrl, if (virLXCControllerDaemonHandshake(ctrl) < 0) goto cleanup; - if (virSetBlocking(monitor, false) < 0 || - virSetBlocking(client, false) < 0) { + if (virSetBlocking(ctrl->monitorServerFd, false) < 0 || + virSetBlocking(ctrl->monitorClientFd, false) < 0) { virReportSystemError(errno, "%s", _("Unable to set file descriptor non-blocking")); goto cleanup; @@ -1779,8 +1778,7 @@ virLXCControllerRun(virLXCControllerPtr ctrl, if (virLXCControllerConsoleSetNonblocking(&(ctrl->consoles[i])) < 0) goto cleanup; - rc = virLXCControllerMain(ctrl, monitor, client); - monitor = client = -1; + rc = virLXCControllerMain(ctrl); cleanup: VIR_FORCE_CLOSE(control[0]); @@ -1804,11 +1802,9 @@ int main(int argc, char *argv[]) { pid_t pid; int rc = 1; - int client; char *name = NULL; size_t nveths = 0; char **veths = NULL; - int monitor = -1; int handshakeFd = -1; int bg = 0; char *sockpath = NULL; @@ -1965,7 +1961,7 @@ int main(int argc, char *argv[]) if ((sockpath = lxcMonitorPath(ctrl)) == NULL) goto cleanup; - if ((monitor = lxcMonitorServer(sockpath)) < 0) + if ((ctrl->monitorServerFd = lxcMonitorServer(sockpath)) < 0) goto cleanup; if (bg) { @@ -2001,14 +1997,13 @@ int main(int argc, char *argv[]) } /* Accept initial client which is the libvirtd daemon */ - if ((client = accept(monitor, NULL, 0)) < 0) { + if ((ctrl->monitorClientFd = accept(ctrl->monitorServerFd, NULL, 0)) < 0) { virReportSystemError(errno, "%s", _("Failed to accept a connection from driver")); goto cleanup; } - rc = virLXCControllerRun(ctrl, - monitor, client); + rc = virLXCControllerRun(ctrl); cleanup: virPidFileDelete(LXC_STATE_DIR, name); -- 1.7.10.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list