diff options
author | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-09-15 15:51:35 +0000 |
---|---|---|
committer | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-09-15 15:51:35 +0000 |
commit | b76d08fe0504d2f8b5c8134313f320790369aed6 (patch) | |
tree | a910207407d9f3b1de0c0cd95299c7fe72065675 /nbd.c | |
parent | 8520140f6c328f50adcfa4e3177ca757d7ce22bd (diff) | |
download | qemu-b76d08fe0504d2f8b5c8134313f320790369aed6.tar.gz qemu-b76d08fe0504d2f8b5c8134313f320790369aed6.tar.bz2 qemu-b76d08fe0504d2f8b5c8134313f320790369aed6.zip |
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 <aliguori@us.ibm.com>
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5226 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'nbd.c')
-rw-r--r-- | nbd.c | 86 |
1 files changed, 55 insertions, 31 deletions
@@ -21,28 +21,27 @@ #include <errno.h> #include <string.h> +#ifndef _WIN32 #include <sys/ioctl.h> +#endif #ifdef __sun__ #include <sys/ioccom.h> #endif #include <ctype.h> #include <inttypes.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <netinet/in.h> -#include <netinet/tcp.h> -#include <arpa/inet.h> -#include <netdb.h> - -#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) { |