void nbd_client_new(NBDExport *exp, int csock, void (*close_fn)(NBDClient *))

{

    NBDClient *client;

    client = g_malloc0(sizeof(NBDClient));

    client->refcount = 1;

    client->exp = exp;

    client->sock = csock;

    client->can_read = true;

    if (nbd_send_negotiate(client)) {

        shutdown(client->sock, 2);

        close_fn(client);

        return;

    }

    client->close = close_fn;

    qemu_co_mutex_init(&client->send_lock);

    nbd_set_handlers(client);



    if (exp) {

        QTAILQ_INSERT_TAIL(&exp->clients, client, next);

        nbd_export_get(exp);

    }

}

void nbd_client_new(NBDExport *exp, int csock, void (*close_fn)(NBDClient *))

{

    NBDClient *client;

    client = g_malloc0(sizeof(NBDClient));

    client->refcount = 1;

    client->exp = exp;

    client->sock = csock;

    client->can_read = true;

    if (nbd_send_negotiate(client)) {

        shutdown(client->sock, 2);

        close_fn(client);

        return;

    }

    client->close = close_fn;

    qemu_co_mutex_init(&client->send_lock);

    nbd_set_handlers(client);



    if (exp) {

        QTAILQ_INSERT_TAIL(&exp->clients, client, next);

        nbd_export_get(exp);

    }

}

VAR_3voidVAR_3 VAR_3nbd_client_newVAR_3(VAR_3NBDExportVAR_3 *VAR_3VAR_0VAR_3, VAR_3intVAR_3 VAR_3VAR_1VAR_3, VAR_3voidVAR_3 (*VAR_3VAR_2VAR_3)(VAR_3NBDClientVAR_3 *))

{

    VAR_3NBDClientVAR_3 *VAR_3clientVAR_3;

    VAR_3clientVAR_3 = VAR_3g_malloc0VAR_3(VAR_3sizeofVAR_3(VAR_3NBDClientVAR_3));

    VAR_3clientVAR_3->VAR_3refcountVAR_3 = VAR_31VAR_3;

    VAR_3clientVAR_3->VAR_3VAR_0VAR_3 = VAR_3VAR_0VAR_3;

    VAR_3clientVAR_3->VAR_3sockVAR_3 = VAR_3VAR_1VAR_3;

    VAR_3clientVAR_3->VAR_3can_readVAR_3 = VAR_3trueVAR_3;

    VAR_3ifVAR_3 (VAR_3nbd_send_negotiateVAR_3(VAR_3clientVAR_3)) {

        VAR_3shutdownVAR_3(VAR_3clientVAR_3->VAR_3sockVAR_3, VAR_32VAR_3);

        VAR_3VAR_2VAR_3(VAR_3clientVAR_3);

        VAR_3returnVAR_3;

    }

    VAR_3clientVAR_3->VAR_3closeVAR_3 = VAR_3VAR_2VAR_3;

    VAR_3qemu_co_mutex_initVAR_3(&VAR_3clientVAR_3->VAR_3send_lockVAR_3);

    VAR_3nbd_set_handlersVAR_3(VAR_3clientVAR_3);



    VAR_3ifVAR_3 (VAR_3VAR_0VAR_3) {

        VAR_3QTAILQ_INSERT_TAILVAR_3(&VAR_3VAR_0VAR_3->VAR_3clientsVAR_3, VAR_3clientVAR_3, VAR_3nextVAR_3);

        VAR_3nbd_export_getVAR_3(VAR_3VAR_0VAR_3);

    }

}

VAR_3voidVAR_3 VAR_3nbd_client_newVAR_3(VAR_3NBDExportVAR_3 *VAR_3VAR_0VAR_3, VAR_3intVAR_3 VAR_3VAR_1VAR_3, VAR_3voidVAR_3 (*VAR_3VAR_2VAR_3)(VAR_3NBDClientVAR_3 *))
{ VAR_3NBDClientVAR_3 *VAR_3clientVAR_3; VAR_3clientVAR_3 = VAR_3g_malloc0VAR_3(VAR_3sizeofVAR_3(VAR_3NBDClientVAR_3)); VAR_3clientVAR_3->VAR_3refcountVAR_3 = VAR_31VAR_3; VAR_3clientVAR_3->VAR_3VAR_0VAR_3 = VAR_3VAR_0VAR_3; VAR_3clientVAR_3->VAR_3sockVAR_3 = VAR_3VAR_1VAR_3; VAR_3clientVAR_3->VAR_3can_readVAR_3 = VAR_3trueVAR_3; VAR_3ifVAR_3 (VAR_3nbd_send_negotiateVAR_3(VAR_3clientVAR_3)) { VAR_3shutdownVAR_3(VAR_3clientVAR_3->VAR_3sockVAR_3, VAR_32VAR_3); VAR_3VAR_2VAR_3(VAR_3clientVAR_3); VAR_3returnVAR_3; } VAR_3clientVAR_3->VAR_3closeVAR_3 = VAR_3VAR_2VAR_3; VAR_3qemu_co_mutex_initVAR_3(&VAR_3clientVAR_3->VAR_3send_lockVAR_3); VAR_3nbd_set_handlersVAR_3(VAR_3clientVAR_3); VAR_3ifVAR_3 (VAR_3VAR_0VAR_3) { VAR_3QTAILQ_INSERT_TAILVAR_3(&VAR_3VAR_0VAR_3->VAR_3clientsVAR_3, VAR_3clientVAR_3, VAR_3nextVAR_3); VAR_3nbd_export_getVAR_3(VAR_3VAR_0VAR_3); } }