From 03ff3ca30f29f422ebfd10d2bee1393efb4d4f7a Mon Sep 17 00:00:00 2001 From: aliguori Date: Mon, 15 Sep 2008 15:51:35 +0000 Subject: Use common objects for qemu-img and qemu-nbd Right now, we sprinkle #if defined(QEMU_IMG) && defined(QEMU_NBD) all over the code. It's ugly and causes us to have to build multiple object files for linking against qemu and the tools. This patch introduces a new file, qemu-tool.c which contains enough for qemu-img, qemu-nbd, and QEMU to all share the same objects. This also required getting qemu-nbd to be a bit more Windows friendly. I also changed the Windows block-raw to use normal IO instead of overlapping IO since we don't actually do AIO yet on Windows. I changed the various #if 0's to #if WIN32_AIO to make it easier for someone to eventually fix AIO on Windows. After this patch, there are no longer any #ifdef's related to qemu-img and qemu-nbd. Signed-off-by: Anthony Liguori git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5226 c046a42c-6fe2-441c-8c8c-71466251a162 --- nbd.c | 86 +++++++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 31 deletions(-) (limited to 'nbd.c') diff --git a/nbd.c b/nbd.c index ee5427cab4..bb4f5d4272 100644 --- a/nbd.c +++ b/nbd.c @@ -21,28 +21,27 @@ #include #include +#ifndef _WIN32 #include +#endif #ifdef __sun__ #include #endif #include #include -#include -#include -#include -#include -#include -#include - -#if defined(QEMU_NBD) -extern int verbose; -#else -static int verbose = 0; -#endif +#include "qemu_socket.h" + +//#define DEBUG_NBD + +#ifdef DEBUG_NBD #define TRACE(msg, ...) do { \ - if (verbose) LOG(msg, ## __VA_ARGS__); \ + LOG(msg, ## __VA_ARGS__); \ } while(0) +#else +#define TRACE(msg, ...) \ + do { } while (0) +#endif #define LOG(msg, ...) do { \ fprintf(stderr, "%s:%s():L%d: " msg "\n", \ @@ -77,11 +76,14 @@ size_t nbd_wr_sync(int fd, void *buffer, size_t size, bool do_read) ssize_t len; if (do_read) { - len = read(fd, buffer + offset, size - offset); + len = recv(fd, buffer + offset, size - offset, 0); } else { - len = write(fd, buffer + offset, size - offset); + len = send(fd, buffer + offset, size - offset, 0); } + if (len == -1) + errno = socket_error(); + /* recoverable error */ if (len == -1 && (errno == EAGAIN || errno == EINTR)) { continue; @@ -108,7 +110,6 @@ int tcp_socket_outgoing(const char *address, uint16_t port) int s; struct in_addr in; struct sockaddr_in addr; - int serrno; s = socket(PF_INET, SOCK_STREAM, 0); if (s == -1) { @@ -136,9 +137,7 @@ int tcp_socket_outgoing(const char *address, uint16_t port) return s; error: - serrno = errno; - close(s); - errno = serrno; + closesocket(s); return -1; } @@ -147,7 +146,6 @@ int tcp_socket_incoming(const char *address, uint16_t port) int s; struct in_addr in; struct sockaddr_in addr; - int serrno; int opt; s = socket(PF_INET, SOCK_STREAM, 0); @@ -185,17 +183,15 @@ int tcp_socket_incoming(const char *address, uint16_t port) return s; error: - serrno = errno; - close(s); - errno = serrno; + closesocket(s); return -1; } +#ifndef _WIN32 int unix_socket_incoming(const char *path) { int s; struct sockaddr_un addr; - int serrno; s = socket(PF_UNIX, SOCK_STREAM, 0); if (s == -1) { @@ -216,9 +212,7 @@ int unix_socket_incoming(const char *path) return s; error: - serrno = errno; - close(s); - errno = serrno; + closesocket(s); return -1; } @@ -226,7 +220,6 @@ int unix_socket_outgoing(const char *path) { int s; struct sockaddr_un addr; - int serrno; s = socket(PF_UNIX, SOCK_STREAM, 0); if (s == -1) { @@ -243,12 +236,23 @@ int unix_socket_outgoing(const char *path) return s; error: - serrno = errno; - close(s); - errno = serrno; + closesocket(s); + return -1; +} +#else +int unix_socket_incoming(const char *path) +{ + errno = ENOTSUP; return -1; } +int unix_socket_outgoing(const char *path) +{ + errno = ENOTSUP; + return -1; +} +#endif + /* Basic flow @@ -337,6 +341,7 @@ int nbd_receive_negotiate(int csock, off_t *size, size_t *blocksize) return 0; } +#ifndef _WIN32 int nbd_init(int fd, int csock, off_t size, size_t blocksize) { TRACE("Setting block size to %lu", (unsigned long)blocksize); @@ -410,6 +415,25 @@ int nbd_client(int fd, int csock) errno = serrno; return ret; } +#else +int nbd_init(int fd, int csock, off_t size, size_t blocksize) +{ + errno = ENOTSUP; + return -1; +} + +int nbd_disconnect(int fd) +{ + errno = ENOTSUP; + return -1; +} + +int nbd_client(int fd, int csock) +{ + errno = ENOTSUP; + return -1; +} +#endif int nbd_send_request(int csock, struct nbd_request *request) { -- cgit v1.2.1