int virNetClientDupFD(virNetClientPtr client, bool cloexec) { int fd; virNetClientLock(client); fd = virNetSocketDupFD(client->sock, cloexec); virNetClientUnlock(client); return fd; }
static void libxlDoMigrateReceive(virNetSocketPtr sock, int events ATTRIBUTE_UNUSED, void *opaque) { libxlMigrationDstArgs *args = opaque; virConnectPtr conn = args->conn; virDomainObjPtr vm = args->vm; virNetSocketPtr *socks = args->socks; size_t nsocks = args->nsocks; bool paused = args->flags & VIR_MIGRATE_PAUSED; libxlDriverPrivatePtr driver = conn->privateData; virNetSocketPtr client_sock; int recvfd = -1; size_t i; int ret; if (virNetSocketAccept(sock, &client_sock) < 0) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("Fail to accept migration connection")); goto cleanup; } VIR_DEBUG("Accepted migration connection\n"); recvfd = virNetSocketDupFD(client_sock, true); virObjectUnref(client_sock); virObjectLock(vm); ret = libxlDomainStart(driver, vm, paused, recvfd); virObjectUnlock(vm); if (ret < 0 && !vm->persistent) virDomainObjListRemove(driver->domains, vm); cleanup: /* Remove all listen socks from event handler, and close them. */ for (i = 0; i < nsocks; i++) { virNetSocketUpdateIOCallback(socks[i], 0); virNetSocketRemoveIOCallback(socks[i]); virNetSocketClose(socks[i]); virObjectUnref(socks[i]); socks[i] = NULL; } args->nsocks = 0; VIR_FORCE_CLOSE(recvfd); }