From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KeJb4-0002uq-U0 for qemu-devel@nongnu.org; Fri, 12 Sep 2008 21:06:46 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KeJb3-0002ue-4N for qemu-devel@nongnu.org; Fri, 12 Sep 2008 21:06:45 -0400 Received: from [199.232.76.173] (port=44663 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KeJb2-0002ub-W5 for qemu-devel@nongnu.org; Fri, 12 Sep 2008 21:06:45 -0400 Received: from py-out-1112.google.com ([64.233.166.180]:62629) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KeJb2-0002O9-B5 for qemu-devel@nongnu.org; Fri, 12 Sep 2008 21:06:44 -0400 Received: by py-out-1112.google.com with SMTP id p76so886666pyb.10 for ; Fri, 12 Sep 2008 18:06:43 -0700 (PDT) Message-ID: <48CB11EE.7040808@codemonkey.ws> Date: Fri, 12 Sep 2008 20:05:50 -0500 From: Anthony Liguori MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------030301030405040907010903" Subject: [Qemu-devel] [PATCH][RFC][RFT] Let qemu-nbd build on Windows and replace QEMU_IMG/QEMU_NBD with QEMU_TOOL Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "qemu-devel@nongnu.org" Cc: Laurent Vivier This is a multi-part message in MIME format. --------------030301030405040907010903 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit This patch attempts to clean up the mess with qemu-nbd in the Makefile in order to get it building and working on Windows. I checked block-nbd, qemu-img, and qemu-nbd on Windows and Linux and everything seems to work. However, there were some defined(QEMU_IMG) that didn't include defined(QEMU_NBD) that now are covered by QEMU_TOOL so I'd like Laurent to look them over and see if they were intentional. Basically, there are no longer qemu-nbd-*.o objects. qemu-img-*.o have -DQEMU_TOOL defined and qemu-img/qemu-nbd use identical copies of those objects. A special object is no longer build for nbd.c either. My longer goal would be to eliminate as many qemu-img-* objects as possible but let's take that one step at a time. Regards, Anthony Liguori --------------030301030405040907010903 Content-Type: text/x-patch; name="qemu-windows-nbd.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="qemu-windows-nbd.patch" Index: block-raw-win32.c =================================================================== --- block-raw-win32.c (revision 5200) +++ block-raw-win32.c (working copy) @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#ifndef QEMU_IMG +#ifndef QEMU_TOOL #include "qemu-timer.h" #include "exec-all.h" #endif @@ -100,7 +100,7 @@ } else { create_flags = OPEN_EXISTING; } -#ifdef QEMU_IMG +#ifdef QEMU_TOOL overlapped = FILE_ATTRIBUTE_NORMAL; #else overlapped = FILE_FLAG_OVERLAPPED; @@ -165,7 +165,7 @@ } #if 0 -#ifndef QEMU_IMG +#ifndef QEMU_TOOL static void raw_aio_cb(void *opaque) { RawAIOCB *acb = opaque; @@ -204,7 +204,7 @@ acb->ov.OffsetHigh = offset >> 32; acb->ov.hEvent = acb->hEvent; acb->count = nb_sectors * 512; -#ifndef QEMU_IMG +#ifndef QEMU_TOOL qemu_add_wait_object(acb->ov.hEvent, raw_aio_cb, acb); #endif return acb; @@ -226,7 +226,7 @@ qemu_aio_release(acb); return NULL; } -#ifdef QEMU_IMG +#ifdef QEMU_TOOL qemu_aio_release(acb); #endif return (BlockDriverAIOCB *)acb; @@ -248,7 +248,7 @@ qemu_aio_release(acb); return NULL; } -#ifdef QEMU_IMG +#ifdef QEMU_TOOL qemu_aio_release(acb); #endif return (BlockDriverAIOCB *)acb; @@ -256,7 +256,7 @@ static void raw_aio_cancel(BlockDriverAIOCB *blockacb) { -#ifndef QEMU_IMG +#ifndef QEMU_TOOL RawAIOCB *acb = (RawAIOCB *)blockacb; BlockDriverState *bs = acb->common.bs; BDRVRawState *s = bs->opaque; @@ -356,7 +356,7 @@ void qemu_aio_wait(void) { -#ifndef QEMU_IMG +#ifndef QEMU_TOOL qemu_bh_poll(); #endif } @@ -458,7 +458,7 @@ } create_flags = OPEN_EXISTING; -#ifdef QEMU_IMG +#ifdef QEMU_TOOL overlapped = FILE_ATTRIBUTE_NORMAL; #else overlapped = FILE_FLAG_OVERLAPPED; Index: nbd.c =================================================================== --- nbd.c (revision 5200) +++ nbd.c (working copy) @@ -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 @@ 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 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 @@ return s; error: - serrno = errno; - close(s); - errno = serrno; + closesocket(s); return -1; } @@ -147,7 +146,6 @@ 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 @@ 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 @@ return s; error: - serrno = errno; - close(s); - errno = serrno; + closesocket(s); return -1; } @@ -226,7 +220,6 @@ { int s; struct sockaddr_un addr; - int serrno; s = socket(PF_UNIX, SOCK_STREAM, 0); if (s == -1) { @@ -243,13 +236,24 @@ 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 Server Client @@ -337,6 +341,7 @@ 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,7 +415,26 @@ 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) { uint8_t buf[4 + 4 + 8 + 8 + 4]; Index: qemu_socket.h =================================================================== --- qemu_socket.h (revision 5200) +++ qemu_socket.h (working copy) @@ -14,11 +14,15 @@ #define EINTR WSAEINTR #define EINPROGRESS WSAEINPROGRESS +int inet_aton(const char *cp, struct in_addr *ia); + #else #include #include #include +#include +#include #include #define socket_error() errno Index: osdep.c =================================================================== --- osdep.c (revision 5200) +++ osdep.c (working copy) @@ -45,6 +45,8 @@ #include #endif +#include "qemu_socket.h" + #if defined(_WIN32) void *qemu_memalign(size_t alignment, size_t size) { @@ -283,3 +285,28 @@ return 0; } #endif /* _WIN32 */ + + +#ifdef _WIN32 +void socket_set_nonblock(int fd) +{ + unsigned long opt = 1; + ioctlsocket(fd, FIONBIO, &opt); +} + +int inet_aton(const char *cp, struct in_addr *ia) +{ + uint32_t addr = inet_addr(cp); + if (addr == 0xffffffff) + return 0; + ia->s_addr = addr; + return 1; +} +#else +void socket_set_nonblock(int fd) +{ + int f; + f = fcntl(fd, F_GETFL); + fcntl(fd, F_SETFL, f | O_NONBLOCK); +} +#endif Index: vl.c =================================================================== --- vl.c (revision 5200) +++ vl.c (working copy) @@ -100,11 +100,10 @@ #include #endif #endif -#else -#include -int inet_aton(const char *cp, struct in_addr *ia); #endif +#include "qemu_socket.h" + #if defined(CONFIG_SLIRP) #include "libslirp.h" #endif @@ -125,8 +124,6 @@ #define memalign(align, size) malloc(size) #endif -#include "qemu_socket.h" - #ifdef CONFIG_SDL #ifdef __APPLE__ #include @@ -2131,12 +2128,6 @@ return len1 - len; } -void socket_set_nonblock(int fd) -{ - unsigned long opt = 1; - ioctlsocket(fd, FIONBIO, &opt); -} - #else static int unix_write(int fd, const uint8_t *buf, int len1) @@ -2163,13 +2154,6 @@ { return unix_write(fd, buf, len1); } - -void socket_set_nonblock(int fd) -{ - int f; - f = fcntl(fd, F_GETFL); - fcntl(fd, F_SETFL, f | O_NONBLOCK); -} #endif /* !_WIN32 */ #ifndef _WIN32 Index: block-raw-posix.c =================================================================== --- block-raw-posix.c (revision 5200) +++ block-raw-posix.c (working copy) @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#if !defined(QEMU_IMG) && !defined(QEMU_NBD) +#if !defined(QEMU_TOOL) #include "qemu-timer.h" #include "exec-all.h" #include "qemu-char.h" @@ -70,7 +70,7 @@ //#define DEBUG_FLOPPY //#define DEBUG_BLOCK -#if defined(DEBUG_BLOCK) && !defined(QEMU_IMG) && !defined(QEMU_NBD) +#if defined(DEBUG_BLOCK) && !defined(QEMU_TOOL) #define DEBUG_BLOCK_PRINT(formatCstr, args...) do { if (loglevel != 0) \ { fprintf(logfile, formatCstr, ##args); fflush(logfile); } } while (0) #else @@ -99,7 +99,7 @@ int fd_got_error; int fd_media_changed; #endif -#if defined(O_DIRECT) && !defined(QEMU_IMG) +#if defined(O_DIRECT) && !defined(QEMU_TOOL) uint8_t* aligned_buf; #endif } BDRVRawState; @@ -137,7 +137,7 @@ return ret; } s->fd = fd; -#if defined(O_DIRECT) && !defined(QEMU_IMG) +#if defined(O_DIRECT) && !defined(QEMU_TOOL) s->aligned_buf = NULL; if (flags & BDRV_O_DIRECT) { s->aligned_buf = qemu_memalign(512, ALIGNED_BUFFER_SIZE); @@ -272,7 +272,7 @@ } -#if defined(O_DIRECT) && !defined(QEMU_IMG) +#if defined(O_DIRECT) && !defined(QEMU_TOOL) /* * offset and count are in bytes and possibly not aligned. For files opened * with O_DIRECT, necessary alignments are ensured before calling @@ -525,7 +525,7 @@ fcntl(aio_sig_fd, F_SETFL, O_NONBLOCK); -#if !defined(QEMU_IMG) && !defined(QEMU_NBD) +#if !defined(QEMU_TOOL) qemu_set_fd_handler2(aio_sig_fd, NULL, qemu_aio_poll, NULL, NULL); #endif @@ -556,7 +556,7 @@ { int ret; -#if !defined(QEMU_IMG) && !defined(QEMU_NBD) +#if !defined(QEMU_TOOL) if (qemu_bh_poll()) return; #endif @@ -605,7 +605,7 @@ return acb; } -#if !defined(QEMU_IMG) && !defined(QEMU_NBD) +#if !defined(QEMU_TOOL) static void raw_aio_em_cb(void* opaque) { RawAIOCB *acb = opaque; @@ -624,7 +624,7 @@ * If O_DIRECT is used and the buffer is not aligned fall back * to synchronous IO. */ -#if defined(O_DIRECT) && !defined(QEMU_IMG) && !defined(QEMU_NBD) +#if defined(O_DIRECT) && !defined(QEMU_TOOL) BDRVRawState *s = bs->opaque; if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) { @@ -657,7 +657,7 @@ * If O_DIRECT is used and the buffer is not aligned fall back * to synchronous IO. */ -#if defined(O_DIRECT) && !defined(QEMU_IMG) && !defined(QEMU_NBD) +#if defined(O_DIRECT) && !defined(QEMU_TOOL) BDRVRawState *s = bs->opaque; if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) { @@ -719,7 +719,7 @@ void qemu_aio_wait(void) { -#if !defined(QEMU_IMG) && !defined(QEMU_NBD) +#if !defined(QEMU_TOOL) qemu_bh_poll(); #endif } @@ -732,7 +732,7 @@ if (s->fd >= 0) { close(s->fd); s->fd = -1; -#if defined(O_DIRECT) && !defined(QEMU_IMG) +#if defined(O_DIRECT) && !defined(QEMU_TOOL) if (s->aligned_buf != NULL) qemu_free(s->aligned_buf); #endif @@ -1002,7 +1002,7 @@ return 0; } -#if defined(__linux__) && !defined(QEMU_IMG) && !defined(QEMU_NBD) +#if defined(__linux__) && !defined(QEMU_TOOL) /* Note: we do not have a reliable method to detect if the floppy is present. The current method is to try to open the floppy at every Index: Makefile =================================================================== --- Makefile (revision 5200) +++ Makefile (working copy) @@ -28,6 +28,10 @@ LIBS+=-lsocket -lnsl -lresolv endif +ifdef CONFIG_WIN32 +LIBS+=-lwinmm -lws2_32 -liphlpapi +endif + all: $(TOOLS) $(DOCS) recurse-all SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS)) @@ -46,9 +50,11 @@ BLOCK_OBJS=cutils.o qemu-malloc.o BLOCK_OBJS+=block-cow.o block-qcow.o aes.o block-vmdk.o block-cloop.o BLOCK_OBJS+=block-dmg.o block-bochs.o block-vpc.o block-vvfat.o -BLOCK_OBJS+=block-qcow2.o block-parallels.o -ifndef CONFIG_WIN32 -BLOCK_OBJS+=block-nbd.o +BLOCK_OBJS+=block-qcow2.o block-parallels.o block-nbd.o +BLOCK_OBJS+=nbd.o + +ifdef CONFIG_AIO +BLOCK_OBJS += compatfd.o endif ###################################################################### @@ -61,10 +67,6 @@ OBJS+=readline.o console.o OBJS+=block.o -ifndef CONFIG_WIN32 -OBJS+=nbd.o -endif - OBJS+=irq.o OBJS+=i2c.o smbus.o smbus_eeprom.o max7310.o max111x.o wm8750.o OBJS+=ssd0303.o ssd0323.o ads7846.o stellaris_input.o twl92230.o @@ -177,29 +179,21 @@ ifdef CONFIG_WIN32 QEMU_IMG_BLOCK_OBJS += qemu-img-block-raw-win32.o else -QEMU_IMG_BLOCK_OBJS += nbd.o qemu-img-block-raw-posix.o +QEMU_IMG_BLOCK_OBJS += qemu-img-block-raw-posix.o endif -ifdef CONFIG_AIO -QEMU_IMG_BLOCK_OBJS += compatfd.o -endif - ###################################################################### -qemu-img$(EXESUF): qemu-img.o qemu-img-block.o $(QEMU_IMG_BLOCK_OBJS) +qemu-img$(EXESUF): qemu-img.o qemu-img-block.o osdep.o $(QEMU_IMG_BLOCK_OBJS) $(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS) qemu-img-%.o: %.c - $(CC) $(CFLAGS) $(CPPFLAGS) -DQEMU_IMG -c -o $@ $< + $(CC) $(CFLAGS) $(CPPFLAGS) -DQEMU_TOOL -c -o $@ $< %.o: %.c $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< -qemu-nbd-%.o: %.c - $(CC) $(CFLAGS) $(CPPFLAGS) -DQEMU_NBD -c -o $@ $< - -qemu-nbd$(EXESUF): qemu-nbd.o qemu-nbd-nbd.o qemu-img-block.o \ - osdep.o qemu-nbd-block-raw-posix.o compatfd.o $(BLOCK_OBJS) +qemu-nbd$(EXESUF): qemu-nbd.o qemu-img-block.o osdep.o $(QEMU_IMG_BLOCK_OBJS) $(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS) # dyngen host tool Index: slirp/misc.c =================================================================== --- slirp/misc.c (revision 5200) +++ slirp/misc.c (working copy) @@ -66,20 +66,6 @@ } #endif -#ifndef HAVE_INET_ATON -int -inet_aton(cp, ia) - const char *cp; - struct in_addr *ia; -{ - u_int32_t addr = inet_addr(cp); - if (addr == 0xffffffff) - return 0; - ia->s_addr = addr; - return 1; -} -#endif - /* * Get our IP address and put it in our_addr */ Index: block.c =================================================================== --- block.c (revision 5200) +++ block.c (working copy) @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#ifndef QEMU_IMG +#ifndef QEMU_TOOL #include "console.h" #endif #include "block_int.h" @@ -922,7 +922,7 @@ return bs->drv->bdrv_is_allocated(bs, sector_num, nb_sectors, pnum); } -#ifndef QEMU_IMG +#ifndef QEMU_TOOL void bdrv_info(void) { BlockDriverState *bs; @@ -1203,7 +1203,7 @@ /**************************************************************/ /* async block device emulation */ -#ifdef QEMU_IMG +#ifdef QEMU_TOOL static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs, int64_t sector_num, uint8_t *buf, int nb_sectors, BlockDriverCompletionFunc *cb, void *opaque) @@ -1273,7 +1273,7 @@ qemu_bh_cancel(acb->bh); qemu_aio_release(acb); } -#endif /* !QEMU_IMG */ +#endif /* !QEMU_TOOL */ /**************************************************************/ /* sync block device emulation */ @@ -1337,9 +1337,7 @@ bdrv_register(&bdrv_vvfat); bdrv_register(&bdrv_qcow2); bdrv_register(&bdrv_parallels); -#ifndef _WIN32 bdrv_register(&bdrv_nbd); -#endif qemu_aio_init(); } Index: block.h =================================================================== --- block.h (revision 5200) +++ block.h (working copy) @@ -47,7 +47,7 @@ bdrv_file_open()) */ #define BDRV_O_DIRECT 0x0020 -#ifndef QEMU_IMG +#ifndef QEMU_TOOL void bdrv_info(void); void bdrv_info_stats(void); #endif --------------030301030405040907010903--