Revision 1743b515 nbd.c

b/nbd.c
600 600
    QSIMPLEQ_HEAD(, NBDRequest) requests;
601 601
};
602 602

  
603
struct NBDClient {
604
    int refcount;
605
    void (*close)(NBDClient *client);
606

  
607
    NBDExport *exp;
608
    int sock;
609
};
610

  
611
static void nbd_client_get(NBDClient *client)
612
{
613
    client->refcount++;
614
}
615

  
616
static void nbd_client_put(NBDClient *client)
617
{
618
    if (--client->refcount == 0) {
619
        g_free(client);
620
    }
621
}
622

  
623
static void nbd_client_close(NBDClient *client)
624
{
625
    qemu_set_fd_handler2(client->sock, NULL, NULL, NULL, NULL);
626
    close(client->sock);
627
    client->sock = -1;
628
    if (client->close) {
629
        client->close(client);
630
    }
631
    nbd_client_put(client);
632
}
633

  
603 634
static NBDRequest *nbd_request_get(NBDExport *exp)
604 635
{
605 636
    NBDRequest *req;
......
712 743
    return rc;
713 744
}
714 745

  
715
int nbd_trip(NBDExport *exp, int csock)
746
static int nbd_trip(NBDClient *client)
716 747
{
748
    NBDExport *exp = client->exp;
717 749
    NBDRequest *req = nbd_request_get(exp);
750
    int csock = client->sock;
718 751
    struct nbd_request request;
719 752
    struct nbd_reply reply;
720 753
    int rc = -1;
......
836 869
    return rc;
837 870
}
838 871

  
839
int nbd_negotiate(NBDExport *exp, int csock)
872
static void nbd_read(void *opaque)
873
{
874
    NBDClient *client = opaque;
875

  
876
    nbd_client_get(client);
877
    if (nbd_trip(client) != 0) {
878
        nbd_client_close(client);
879
    }
880

  
881
    nbd_client_put(client);
882
}
883

  
884
NBDClient *nbd_client_new(NBDExport *exp, int csock,
885
                          void (*close)(NBDClient *))
840 886
{
841
    return nbd_send_negotiate(csock, exp->size, exp->nbdflags);
887
    NBDClient *client;
888
    if (nbd_send_negotiate(csock, exp->size, exp->nbdflags) == -1) {
889
        return NULL;
890
    }
891
    client = g_malloc0(sizeof(NBDClient));
892
    client->refcount = 1;
893
    client->exp = exp;
894
    client->sock = csock;
895
    client->close = close;
896
    qemu_set_fd_handler2(csock, NULL, nbd_read, NULL, client);
897
    return client;
842 898
}

Also available in: Unified diff