summaryrefslogtreecommitdiffstats
path: root/qemu-nbd.c
diff options
context:
space:
mode:
authorPaolo Bonzini2011-09-19 14:33:23 +0200
committerPaolo Bonzini2011-12-22 11:53:59 +0100
commit1743b515860ef645b285908ee367c5e343e0020c (patch)
treee3e4b075df3892869bce293affd2d6dbb5dca40b /qemu-nbd.c
parentqemu-nbd: use common main loop (diff)
downloadqemu-1743b515860ef645b285908ee367c5e343e0020c.tar.gz
qemu-1743b515860ef645b285908ee367c5e343e0020c.tar.xz
qemu-1743b515860ef645b285908ee367c5e343e0020c.zip
qemu-nbd: move client handling to nbd.c
This patch sets up the fd handler in nbd.c instead of qemu-nbd.c. It introduces NBDClient, which wraps the arguments to nbd_trip in a single structure, so that we can add a notifier to it. This way, qemu-nbd can know about disconnections. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'qemu-nbd.c')
-rw-r--r--qemu-nbd.c14
1 files changed, 4 insertions, 10 deletions
diff --git a/qemu-nbd.c b/qemu-nbd.c
index 347c776ab9..155b05840b 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -249,15 +249,10 @@ static int nbd_can_accept(void *opaque)
return nb_fds < shared;
}
-static void nbd_read(void *opaque)
+static void nbd_client_closed(NBDClient *client)
{
- int fd = (uintptr_t) opaque;
-
- if (nbd_trip(exp, fd) != 0) {
- qemu_set_fd_handler2(fd, NULL, NULL, NULL, NULL);
- close(fd);
- nb_fds--;
- }
+ nb_fds--;
+ qemu_notify_event();
}
static void nbd_accept(void *opaque)
@@ -268,8 +263,7 @@ static void nbd_accept(void *opaque)
int fd = accept(server_fd, (struct sockaddr *)&addr, &addr_len);
nbd_started = true;
- if (fd != -1 && nbd_negotiate(exp, fd) != -1) {
- qemu_set_fd_handler2(fd, NULL, nbd_read, NULL, (void *) (intptr_t) fd);
+ if (fd != -1 && nbd_client_new(exp, fd, nbd_client_closed)) {
nb_fds++;
}
}