All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: "qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Cc: Laurent Vivier <Laurent.Vivier@bull.net>
Subject: [Qemu-devel] [PATCH][RFC][RFT] Let qemu-nbd build on Windows and replace QEMU_IMG/QEMU_NBD with QEMU_TOOL
Date: Fri, 12 Sep 2008 20:05:50 -0500	[thread overview]
Message-ID: <48CB11EE.7040808@codemonkey.ws> (raw)

[-- Attachment #1: Type: text/plain, Size: 768 bytes --]

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

[-- Attachment #2: qemu-windows-nbd.patch --]
[-- Type: text/x-patch, Size: 15333 bytes --]

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 <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 @@
         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 <sys/socket.h>
 #include <netinet/in.h>
 #include <netinet/tcp.h>
+#include <arpa/inet.h>
+#include <netdb.h>
 #include <sys/un.h>
 
 #define socket_error() errno
Index: osdep.c
===================================================================
--- osdep.c	(revision 5200)
+++ osdep.c	(working copy)
@@ -45,6 +45,8 @@
 #include <malloc.h>
 #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 <stropts.h>
 #endif
 #endif
-#else
-#include <winsock2.h>
-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 <SDL/SDL.h>
@@ -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

             reply	other threads:[~2008-09-13  1:06 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-09-13  1:05 Anthony Liguori [this message]
2008-09-13 15:30 ` [Qemu-devel] Re: [PATCH][RFC][RFT] Let qemu-nbd build on Windows and replace QEMU_IMG/QEMU_NBD with QEMU_TOOL Laurent Vivier
2008-09-13 16:23   ` Anthony Liguori
2008-09-13 16:48     ` Anthony Liguori
2008-09-13 17:25   ` Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48CB11EE.7040808@codemonkey.ws \
    --to=anthony@codemonkey.ws \
    --cc=Laurent.Vivier@bull.net \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.