static void lxcClientIO(int watch ATTRIBUTE_UNUSED, int fd, int events, void *opaque) { struct lxcMonitor *monitor = opaque; char buf[1024]; ssize_t ret; if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR)) { virEventRemoveHandle(monitor->clientWatch); monitor->clientWatch = -1; return; } reread: ret = read(fd, buf, sizeof(buf)); if (ret == -1 && errno == EINTR) goto reread; if (ret == -1 && errno == EAGAIN) return; if (ret == -1) { lxcError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to read from monitor client")); virMutexLock(&lock); quit = true; virMutexUnlock(&lock); return; } if (ret == 0) { VIR_DEBUG("Client %d gone", fd); VIR_FORCE_CLOSE(monitor->clientFd); virEventRemoveHandle(monitor->clientWatch); monitor->clientWatch = -1; } }
static void virConsoleShutdown(virConsolePtr con) { virErrorPtr err = virGetLastError(); if (con->error.code == VIR_ERR_OK && err) virCopyLastError(&con->error); if (con->st) { virStreamEventRemoveCallback(con->st); virStreamAbort(con->st); virStreamFree(con->st); con->st = NULL; } VIR_FREE(con->streamToTerminal.data); VIR_FREE(con->terminalToStream.data); if (con->stdinWatch != -1) virEventRemoveHandle(con->stdinWatch); if (con->stdoutWatch != -1) virEventRemoveHandle(con->stdoutWatch); con->stdinWatch = -1; con->stdoutWatch = -1; if (!con->quit) { con->quit = true; virCondSignal(&con->cond); } }
static void virLXCControllerConsoleClose(virLXCControllerConsolePtr console) { if (console->hostWatch != -1) virEventRemoveHandle(console->hostWatch); VIR_FORCE_CLOSE(console->hostFd); if (console->contWatch != -1) virEventRemoveHandle(console->contWatch); VIR_FORCE_CLOSE(console->contFd); if (console->epollWatch != -1) virEventRemoveHandle(console->epollWatch); VIR_FORCE_CLOSE(console->epollFd); }
static int virFDStreamRemoveCallback(virStreamPtr stream) { struct virFDStreamData *fdst = stream->privateData; int ret = -1; if (!fdst) { streamsReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("stream is not open")); return -1; } virMutexLock(&fdst->lock); if (fdst->watch == 0) { streamsReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("stream does not have a callback registered")); goto cleanup; } virEventRemoveHandle(fdst->watch); if (fdst->dispatching) fdst->cbRemoved = 1; else if (fdst->ff) (fdst->ff)(fdst->opaque); fdst->watch = 0; fdst->ff = NULL; fdst->cb = NULL; fdst->opaque = NULL; ret = 0; cleanup: virMutexUnlock(&fdst->lock); return ret; }
/** * xenStoreClose: * @conn: pointer to the connection block * * Close the connection to the Xen hypervisor. * * Returns 0 in case of success or -1 in case of error. */ int xenStoreClose(virConnectPtr conn) { xenUnifiedPrivatePtr priv = conn->privateData; if (xenStoreRemoveWatch(conn, "@introduceDomain", "introduceDomain") < 0) { VIR_DEBUG("Warning, could not remove @introduceDomain watch"); /* not fatal */ } if (xenStoreRemoveWatch(conn, "@releaseDomain", "releaseDomain") < 0) { VIR_DEBUG("Warning, could not remove @releaseDomain watch"); /* not fatal */ } xenStoreWatchListFree(priv->xsWatchList); priv->xsWatchList = NULL; xenUnifiedDomainInfoListFree(priv->activeDomainList); priv->activeDomainList = NULL; if (priv->xshandle == NULL) return -1; if (priv->xsWatch != -1) virEventRemoveHandle(priv->xsWatch); xs_daemon_close(priv->xshandle); priv->xshandle = NULL; return 0; }
/** * virNetlinkEventServiceStopAll: * * Stop all the monitors to receive netlink messages for libvirtd. * * Returns -1 if any monitor cannot be unregistered, 0 upon success */ int virNetlinkEventServiceStopAll(void) { size_t i, j; virNetlinkEventSrvPrivatePtr srv = NULL; VIR_INFO("stopping all netlink event services"); for (i = 0; i < MAX_LINKS; i++) { srv = server[i]; if (!srv) continue; virNetlinkEventServerLock(srv); nl_close(srv->netlinknh); virNetlinkFree(srv->netlinknh); virEventRemoveHandle(srv->eventwatch); for (j = 0; j < srv->handlesCount; j++) { if (srv->handles[j].deleted == VIR_NETLINK_HANDLE_VALID) virNetlinkEventRemoveClientPrimitive(j, i); } server[i] = NULL; virNetlinkEventServerUnlock(srv); virMutexDestroy(&srv->lock); VIR_FREE(srv); } return 0; }
/** * virNetlinkEventServiceStop: * * stop the monitor to receive netlink messages for libvirtd. * This removes the netlink socket fd from the event handler. * * Returns -1 if the monitor cannot be unregistered, 0 upon success */ int virNetlinkEventServiceStop(void) { virNetlinkEventSrvPrivatePtr srv = server; int i; VIR_INFO("stopping netlink event service"); if (!server) return 0; virNetlinkEventServerLock(srv); nl_close(srv->netlinknh); virNetlinkFree(srv->netlinknh); virEventRemoveHandle(srv->eventwatch); /* free any remaining clients on the list */ for (i = 0; i < srv->handlesCount; i++) { if (srv->handles[i].deleted == VIR_NETLINK_HANDLE_VALID) virNetlinkEventRemoveClientPrimitive(i); } server = 0; virNetlinkEventServerUnlock(srv); virMutexDestroy(&srv->lock); VIR_FREE(srv); return 0; }
void qemuAgentClose(qemuAgentPtr mon) { if (!mon) return; VIR_DEBUG("mon=%p", mon); qemuAgentLock(mon); if (mon->fd >= 0) { if (mon->watch) virEventRemoveHandle(mon->watch); VIR_FORCE_CLOSE(mon->fd); } /* If there is somebody waiting for a message * wake him up. No message will arrive anyway. */ if (mon->msg && !mon->msg->finished) { mon->msg->finished = 1; virCondSignal(&mon->notify); } qemuAgentUnlock(mon); virObjectUnref(mon); }
/** * virNetlinkEventServiceStop: * * stop the monitor to receive netlink messages for libvirtd. * This removes the netlink socket fd from the event handler. * * @protocol: netlink protocol * * Returns -1 if the monitor cannot be unregistered, 0 upon success */ int virNetlinkEventServiceStop(unsigned int protocol) { if (protocol >= MAX_LINKS) return -EINVAL; virNetlinkEventSrvPrivatePtr srv = server[protocol]; size_t i; VIR_INFO("stopping netlink event service"); if (!server[protocol]) return 0; virNetlinkEventServerLock(srv); nl_close(srv->netlinknh); virNetlinkFree(srv->netlinknh); virEventRemoveHandle(srv->eventwatch); /* free any remaining clients on the list */ for (i = 0; i < srv->handlesCount; i++) { if (srv->handles[i].deleted == VIR_NETLINK_HANDLE_VALID) virNetlinkEventRemoveClientPrimitive(i, protocol); } server[protocol] = NULL; virNetlinkEventServerUnlock(srv); virMutexDestroy(&srv->lock); VIR_FREE(srv); return 0; }
static void virConsoleShutdown(virConsolePtr con) { if (con->st) { virStreamEventRemoveCallback(con->st); virStreamAbort(con->st); virStreamFree(con->st); } VIR_FREE(con->streamToTerminal.data); VIR_FREE(con->terminalToStream.data); if (con->stdinWatch != -1) virEventRemoveHandle(con->stdinWatch); if (con->stdoutWatch != -1) virEventRemoveHandle(con->stdoutWatch); con->stdinWatch = -1; con->stdoutWatch = -1; con->quit = true; virCondSignal(&con->cond); }
void bhyveMonitorClose(bhyveMonitorPtr mon) { if (mon == NULL) return; if (mon->watch > 0) virEventRemoveHandle(mon->watch); else bhyveMonitorRelease(mon); }
static void virLogHandlerLogFileFree(virLogHandlerLogFilePtr file) { if (!file) return; VIR_FORCE_CLOSE(file->pipefd); virRotatingFileWriterFree(file->file); if (file->watch != -1) virEventRemoveHandle(file->watch); VIR_FREE(file); }
/** * xenInotifyClose: * @conn: pointer to the connection block * * Close and stop listening for inotify events * * Returns 0 in case of success or -1 in case of error. */ int xenInotifyClose(virConnectPtr conn) { xenUnifiedPrivatePtr priv = conn->privateData; if (priv->configInfoList) xenUnifiedDomainInfoListFree(priv->configInfoList); if (priv->inotifyWatch != -1) virEventRemoveHandle(priv->inotifyWatch); VIR_FORCE_CLOSE(priv->inotifyFD); return 0; }
void qemuAgentClose(qemuAgentPtr mon) { if (!mon) return; VIR_DEBUG("mon=%p", mon); qemuAgentLock(mon); if (mon->fd >= 0) { if (mon->watch) virEventRemoveHandle(mon->watch); VIR_FORCE_CLOSE(mon->fd); } if (qemuAgentUnref(mon) > 0) qemuAgentUnlock(mon); }
static void virLogHandlerDomainLogFileEvent(int watch, int fd, int events, void *opaque) { virLogHandlerPtr handler = opaque; virLogHandlerLogFilePtr logfile; char buf[1024]; ssize_t len; virObjectLock(handler); logfile = virLogHandlerGetLogFileFromWatch(handler, watch); if (!logfile || logfile->pipefd != fd) { virEventRemoveHandle(watch); virObjectUnlock(handler); return; } reread: len = read(fd, buf, sizeof(buf)); if (len < 0) { if (errno == EINTR) goto reread; virReportSystemError(errno, "%s", _("Unable to read from log pipe")); goto error; } if (virRotatingFileWriterAppend(logfile->file, buf, len) != len) goto error; if (events & VIR_EVENT_HANDLE_HANGUP) goto error; virObjectUnlock(handler); return; error: handler->inhibitor(false, handler->opaque); virLogHandlerLogFileClose(handler, logfile); virObjectUnlock(handler); }
static void lxcServerAccept(int watch ATTRIBUTE_UNUSED, int fd, int events ATTRIBUTE_UNUSED, void *opaque) { struct lxcMonitor *monitor = opaque; int client; if ((client = accept(fd, NULL, NULL)) < 0) { /* First reflex may be simply to declare accept failure to be a fatal error. However, accept may fail when a client quits between the above poll and here. That case is not fatal, but rather to be expected, if not common, so ignore it. */ if (ignorable_accept_errno(errno)) return; virReportSystemError(errno, "%s", _("Unable to accept monitor client")); virMutexLock(&lock); quit = true; virMutexUnlock(&lock); return; } VIR_DEBUG("New client %d (old %d)\n", client, monitor->clientFd); VIR_FORCE_CLOSE(monitor->clientFd); virEventRemoveHandle(monitor->clientWatch); monitor->clientFd = client; if ((monitor->clientWatch = virEventAddHandle(monitor->clientFd, VIR_EVENT_HANDLE_READABLE, lxcClientIO, monitor, NULL)) < 0) { lxcError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to watch client socket")); virMutexLock(&lock); quit = true; virMutexUnlock(&lock); return; } }
static void virNetDaemonDispose(void *obj) { virNetDaemonPtr dmn = obj; size_t i; VIR_FORCE_CLOSE(dmn->autoShutdownInhibitFd); for (i = 0; i < dmn->nsignals; i++) { sigaction(dmn->signals[i]->signum, &dmn->signals[i]->oldaction, NULL); VIR_FREE(dmn->signals[i]); } VIR_FREE(dmn->signals); VIR_FORCE_CLOSE(dmn->sigread); VIR_FORCE_CLOSE(dmn->sigwrite); if (dmn->sigwatch > 0) virEventRemoveHandle(dmn->sigwatch); for (i = 0; i < dmn->nservers; i++) virObjectUnref(dmn->servers[i]); VIR_FREE(dmn->servers); virJSONValueFree(dmn->srvObject); }
static void lxcConsoleIO(int watch, int fd, int events, void *opaque) { struct lxcConsole *console = opaque; virMutexLock(&lock); if (events & VIR_EVENT_HANDLE_READABLE) { char *buf; size_t *len; size_t avail; ssize_t done; if (watch == console->hostWatch) { buf = console->fromHostBuf; len = &console->fromHostLen; avail = sizeof(console->fromHostBuf) - *len; } else { buf = console->fromContBuf; len = &console->fromContLen; avail = sizeof(console->fromContBuf) - *len; } reread: done = read(fd, buf + *len, avail); if (done == -1 && errno == EINTR) goto reread; if (done == -1 && errno != EAGAIN) { virReportSystemError(errno, "%s", _("Unable to read container pty")); goto error; } if (done > 0) { *len += done; } else { VIR_DEBUG("Read fd %d done %d errno %d", fd, (int)done, errno); } } if (events & VIR_EVENT_HANDLE_WRITABLE) { char *buf; size_t *len; ssize_t done; if (watch == console->hostWatch) { buf = console->fromContBuf; len = &console->fromContLen; } else { buf = console->fromHostBuf; len = &console->fromHostLen; } rewrite: done = write(fd, buf, *len); if (done == -1 && errno == EINTR) goto rewrite; if (done == -1 && errno != EAGAIN) { virReportSystemError(errno, "%s", _("Unable to write to container pty")); goto error; } if (done > 0) { memmove(buf, buf + done, (*len - done)); *len -= done; } else { VIR_DEBUG("Write fd %d done %d errno %d", fd, (int)done, errno); } } if (events & VIR_EVENT_HANDLE_HANGUP) { if (watch == console->hostWatch) { console->hostClosed = true; } else { console->contClosed = true; } VIR_DEBUG("Got EOF on %d %d", watch, fd); if (lxcCheckEOF(console, fd) < 0) goto error; } lxcConsoleUpdateWatch(console); virMutexUnlock(&lock); return; error: virEventRemoveHandle(console->contWatch); virEventRemoveHandle(console->hostWatch); console->contWatch = console->hostWatch = -1; quit = true; virMutexUnlock(&lock); }