--- qemu-nbd.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) Index: qemu/qemu-nbd.c =================================================================== --- qemu.orig/qemu-nbd.c 2008-09-07 11:36:14.000000000 +0200 +++ qemu/qemu-nbd.c 2008-09-07 11:37:28.000000000 +0200 @@ -242,7 +242,7 @@ int main(int argc, char **argv) if (*end) { errx(EINVAL, "Invalid port `%s'", optarg); } - if (li < 1 || li > 65535) { + if (li < 0 || li > 65535) { errx(EINVAL, "Port out of range `%s'", optarg); } port = (uint16_t)li; @@ -326,6 +326,10 @@ int main(int argc, char **argv) return 0; } + if (port == 0 && shared != 1) { + errx(EINVAL, "You cannot set port to 0 and use shared"); + } + bdrv_init(); bs = bdrv_new("hda"); @@ -412,9 +416,24 @@ int main(int argc, char **argv) if (sharing_fds == NULL) errx(ENOMEM, "Cannot allocate sharing fds"); + data = qemu_memalign(512, NBD_BUFFER_SIZE); + if (data == NULL) + errx(ENOMEM, "Cannot allocate data buffer"); + if (socket) { sharing_fds[0] = unix_socket_incoming(socket); } else { + if (port == 0) { + /* read and write on stdin/stdout */ + ret = nbd_negotiate(STDIN_FILENO, fd_size); + while (ret != -1) { + ret = nbd_trip(bs, STDIN_FILENO, fd_size, dev_offset, + &offset, readonly, data, NBD_BUFFER_SIZE); + } + qemu_free(data); + bdrv_close(bs); + return 0; + } sharing_fds[0] = tcp_socket_incoming(bindto, port); } @@ -423,10 +442,6 @@ int main(int argc, char **argv) max_fd = sharing_fds[0]; nb_fds++; - data = qemu_memalign(512, NBD_BUFFER_SIZE); - if (data == NULL) - errx(ENOMEM, "Cannot allocate data buffer"); - do { FD_ZERO(&fds);