Beispiel #1
0
int virNetClientDupFD(virNetClientPtr client, bool cloexec)
{
    int fd;
    virNetClientLock(client);
    fd = virNetSocketDupFD(client->sock, cloexec);
    virNetClientUnlock(client);
    return fd;
}
Beispiel #2
0
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);
}