Jelajahi Sumber

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
aliguori 17 tahun lalu
induk
melakukan
03ff3ca30f
11 mengubah file dengan 212 tambahan dan 177 penghapusan
  1. 17 28
      Makefile
  2. 8 27
      block-raw-posix.c
  3. 16 25
      block-raw-win32.c
  4. 0 32
      block.c
  5. 0 2
      block.h
  6. 55 31
      nbd.c
  7. 27 0
      osdep.c
  8. 83 0
      qemu-tool.c
  9. 4 0
      qemu_socket.h
  10. 0 14
      slirp/misc.c
  11. 2 18
      vl.c

+ 17 - 28
Makefile

@@ -28,6 +28,10 @@ ifdef CONFIG_SOLARIS
 LIBS+=-lsocket -lnsl -lresolv
 LIBS+=-lsocket -lnsl -lresolv
 endif
 endif
 
 
+ifdef CONFIG_WIN32
+LIBS+=-lwinmm -lws2_32 -liphlpapi
+endif
+
 all: $(TOOLS) $(DOCS) recurse-all 
 all: $(TOOLS) $(DOCS) recurse-all 
 
 
 SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS))
 SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS))
@@ -46,9 +50,17 @@ recurse-all: $(SUBDIR_RULES)
 BLOCK_OBJS=cutils.o qemu-malloc.o
 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-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-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 block.o
+
+ifdef CONFIG_WIN32
+BLOCK_OBJS += block-raw-win32.o
+else
+BLOCK_OBJS += block-raw-posix.o
+endif
+
+ifdef CONFIG_AIO
+BLOCK_OBJS += compatfd.o
 endif
 endif
 
 
 ######################################################################
 ######################################################################
@@ -59,11 +71,6 @@ endif
 
 
 OBJS=$(BLOCK_OBJS)
 OBJS=$(BLOCK_OBJS)
 OBJS+=readline.o console.o
 OBJS+=readline.o console.o
-OBJS+=block.o
-
-ifndef CONFIG_WIN32
-OBJS+=nbd.o
-endif
 
 
 OBJS+=irq.o
 OBJS+=irq.o
 OBJS+=i2c.o smbus.o smbus_eeprom.o max7310.o max111x.o wm8750.o
 OBJS+=i2c.o smbus.o smbus_eeprom.o max7310.o max111x.o wm8750.o
@@ -173,33 +180,15 @@ libqemu_user.a: $(USER_OBJS)
 	rm -f $@ 
 	rm -f $@ 
 	$(AR) rcs $@ $(USER_OBJS)
 	$(AR) rcs $@ $(USER_OBJS)
 
 
-QEMU_IMG_BLOCK_OBJS = $(BLOCK_OBJS)
-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
-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-tool.o osdep.o $(BLOCK_OBJS)
 	$(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS)
 	$(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS)
 
 
-qemu-img-%.o: %.c
-	$(CC) $(CFLAGS) $(CPPFLAGS) -DQEMU_IMG -c -o $@ $<
-
 %.o: %.c
 %.o: %.c
 	$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
 	$(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-tool.o osdep.o $(BLOCK_OBJS)
 	$(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS)
 	$(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS)
 
 
 # dyngen host tool
 # dyngen host tool

+ 8 - 27
block-raw-posix.c

@@ -22,11 +22,8 @@
  * THE SOFTWARE.
  * THE SOFTWARE.
  */
  */
 #include "qemu-common.h"
 #include "qemu-common.h"
-#if !defined(QEMU_IMG) && !defined(QEMU_NBD)
 #include "qemu-timer.h"
 #include "qemu-timer.h"
-#include "exec-all.h"
 #include "qemu-char.h"
 #include "qemu-char.h"
-#endif
 #include "block_int.h"
 #include "block_int.h"
 #include "compatfd.h"
 #include "compatfd.h"
 #include <assert.h>
 #include <assert.h>
@@ -70,7 +67,7 @@
 //#define DEBUG_FLOPPY
 //#define DEBUG_FLOPPY
 
 
 //#define DEBUG_BLOCK
 //#define DEBUG_BLOCK
-#if defined(DEBUG_BLOCK) && !defined(QEMU_IMG) && !defined(QEMU_NBD)
+#if defined(DEBUG_BLOCK)
 #define DEBUG_BLOCK_PRINT(formatCstr, args...) do { if (loglevel != 0)	\
 #define DEBUG_BLOCK_PRINT(formatCstr, args...) do { if (loglevel != 0)	\
     { fprintf(logfile, formatCstr, ##args); fflush(logfile); } } while (0)
     { fprintf(logfile, formatCstr, ##args); fflush(logfile); } } while (0)
 #else
 #else
@@ -99,7 +96,7 @@ typedef struct BDRVRawState {
     int fd_got_error;
     int fd_got_error;
     int fd_media_changed;
     int fd_media_changed;
 #endif
 #endif
-#if defined(O_DIRECT) && !defined(QEMU_IMG)
+#if defined(O_DIRECT)
     uint8_t* aligned_buf;
     uint8_t* aligned_buf;
 #endif
 #endif
 } BDRVRawState;
 } BDRVRawState;
@@ -137,7 +134,7 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags)
         return ret;
         return ret;
     }
     }
     s->fd = fd;
     s->fd = fd;
-#if defined(O_DIRECT) && !defined(QEMU_IMG)
+#if defined(O_DIRECT)
     s->aligned_buf = NULL;
     s->aligned_buf = NULL;
     if (flags & BDRV_O_DIRECT) {
     if (flags & BDRV_O_DIRECT) {
         s->aligned_buf = qemu_memalign(512, ALIGNED_BUFFER_SIZE);
         s->aligned_buf = qemu_memalign(512, ALIGNED_BUFFER_SIZE);
@@ -272,7 +269,7 @@ label__raw_write__success:
 }
 }
 
 
 
 
-#if defined(O_DIRECT) && !defined(QEMU_IMG)
+#if defined(O_DIRECT)
 /*
 /*
  * offset and count are in bytes and possibly not aligned. For files opened
  * offset and count are in bytes and possibly not aligned. For files opened
  * with O_DIRECT, necessary alignments are ensured before calling
  * with O_DIRECT, necessary alignments are ensured before calling
@@ -525,9 +522,7 @@ void qemu_aio_init(void)
 
 
     fcntl(aio_sig_fd, F_SETFL, O_NONBLOCK);
     fcntl(aio_sig_fd, F_SETFL, O_NONBLOCK);
 
 
-#if !defined(QEMU_IMG) && !defined(QEMU_NBD)
     qemu_set_fd_handler2(aio_sig_fd, NULL, qemu_aio_poll, NULL, NULL);
     qemu_set_fd_handler2(aio_sig_fd, NULL, qemu_aio_poll, NULL, NULL);
-#endif
 
 
 #if defined(__GLIBC__) && defined(__linux__)
 #if defined(__GLIBC__) && defined(__linux__)
     {
     {
@@ -556,10 +551,8 @@ void qemu_aio_wait(void)
 {
 {
     int ret;
     int ret;
 
 
-#if !defined(QEMU_IMG) && !defined(QEMU_NBD)
     if (qemu_bh_poll())
     if (qemu_bh_poll())
         return;
         return;
-#endif
 
 
     if (!first_aio)
     if (!first_aio)
         return;
         return;
@@ -605,14 +598,12 @@ static RawAIOCB *raw_aio_setup(BlockDriverState *bs,
     return acb;
     return acb;
 }
 }
 
 
-#if !defined(QEMU_IMG) && !defined(QEMU_NBD)
 static void raw_aio_em_cb(void* opaque)
 static void raw_aio_em_cb(void* opaque)
 {
 {
     RawAIOCB *acb = opaque;
     RawAIOCB *acb = opaque;
     acb->common.cb(acb->common.opaque, acb->ret);
     acb->common.cb(acb->common.opaque, acb->ret);
     qemu_aio_release(acb);
     qemu_aio_release(acb);
 }
 }
-#endif
 
 
 static BlockDriverAIOCB *raw_aio_read(BlockDriverState *bs,
 static BlockDriverAIOCB *raw_aio_read(BlockDriverState *bs,
         int64_t sector_num, uint8_t *buf, int nb_sectors,
         int64_t sector_num, uint8_t *buf, int nb_sectors,
@@ -624,7 +615,7 @@ static BlockDriverAIOCB *raw_aio_read(BlockDriverState *bs,
      * If O_DIRECT is used and the buffer is not aligned fall back
      * If O_DIRECT is used and the buffer is not aligned fall back
      * to synchronous IO.
      * to synchronous IO.
      */
      */
-#if defined(O_DIRECT) && !defined(QEMU_IMG) && !defined(QEMU_NBD)
+#if defined(O_DIRECT)
     BDRVRawState *s = bs->opaque;
     BDRVRawState *s = bs->opaque;
 
 
     if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) {
     if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) {
@@ -657,7 +648,7 @@ static BlockDriverAIOCB *raw_aio_write(BlockDriverState *bs,
      * If O_DIRECT is used and the buffer is not aligned fall back
      * If O_DIRECT is used and the buffer is not aligned fall back
      * to synchronous IO.
      * to synchronous IO.
      */
      */
-#if defined(O_DIRECT) && !defined(QEMU_IMG) && !defined(QEMU_NBD)
+#if defined(O_DIRECT)
     BDRVRawState *s = bs->opaque;
     BDRVRawState *s = bs->opaque;
 
 
     if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) {
     if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) {
@@ -719,9 +710,7 @@ void qemu_aio_flush(void)
 
 
 void qemu_aio_wait(void)
 void qemu_aio_wait(void)
 {
 {
-#if !defined(QEMU_IMG) && !defined(QEMU_NBD)
     qemu_bh_poll();
     qemu_bh_poll();
-#endif
 }
 }
 
 
 #endif /* CONFIG_AIO */
 #endif /* CONFIG_AIO */
@@ -732,7 +721,7 @@ static void raw_close(BlockDriverState *bs)
     if (s->fd >= 0) {
     if (s->fd >= 0) {
         close(s->fd);
         close(s->fd);
         s->fd = -1;
         s->fd = -1;
-#if defined(O_DIRECT) && !defined(QEMU_IMG)
+#if defined(O_DIRECT)
         if (s->aligned_buf != NULL)
         if (s->aligned_buf != NULL)
             qemu_free(s->aligned_buf);
             qemu_free(s->aligned_buf);
 #endif
 #endif
@@ -1002,7 +991,7 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags)
     return 0;
     return 0;
 }
 }
 
 
-#if defined(__linux__) && !defined(QEMU_IMG) && !defined(QEMU_NBD)
+#if defined(__linux__)
 
 
 /* Note: we do not have a reliable method to detect if the floppy is
 /* 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
    present. The current method is to try to open the floppy at every
@@ -1052,14 +1041,6 @@ static int fd_open(BlockDriverState *bs)
     s->fd_got_error = 0;
     s->fd_got_error = 0;
     return 0;
     return 0;
 }
 }
-#else
-static int fd_open(BlockDriverState *bs)
-{
-    return 0;
-}
-#endif
-
-#if defined(__linux__)
 
 
 static int raw_is_inserted(BlockDriverState *bs)
 static int raw_is_inserted(BlockDriverState *bs)
 {
 {

+ 16 - 25
block-raw-win32.c

@@ -22,14 +22,13 @@
  * THE SOFTWARE.
  * THE SOFTWARE.
  */
  */
 #include "qemu-common.h"
 #include "qemu-common.h"
-#ifndef QEMU_IMG
 #include "qemu-timer.h"
 #include "qemu-timer.h"
-#include "exec-all.h"
-#endif
 #include "block_int.h"
 #include "block_int.h"
 #include <assert.h>
 #include <assert.h>
 #include <winioctl.h>
 #include <winioctl.h>
 
 
+//#define WIN32_AIO
+
 #define FTYPE_FILE 0
 #define FTYPE_FILE 0
 #define FTYPE_CD     1
 #define FTYPE_CD     1
 #define FTYPE_HARDDISK 2
 #define FTYPE_HARDDISK 2
@@ -100,10 +99,10 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags)
     } else {
     } else {
         create_flags = OPEN_EXISTING;
         create_flags = OPEN_EXISTING;
     }
     }
-#ifdef QEMU_IMG
-    overlapped = FILE_ATTRIBUTE_NORMAL;
-#else
+#ifdef WIN32_AIO
     overlapped = FILE_FLAG_OVERLAPPED;
     overlapped = FILE_FLAG_OVERLAPPED;
+#else
+    overlapped = FILE_ATTRIBUTE_NORMAL;
 #endif
 #endif
     if (flags & BDRV_O_DIRECT)
     if (flags & BDRV_O_DIRECT)
         overlapped |= FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH;
         overlapped |= FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH;
@@ -133,10 +132,12 @@ static int raw_pread(BlockDriverState *bs, int64_t offset,
     ov.OffsetHigh = offset >> 32;
     ov.OffsetHigh = offset >> 32;
     ret = ReadFile(s->hfile, buf, count, &ret_count, &ov);
     ret = ReadFile(s->hfile, buf, count, &ret_count, &ov);
     if (!ret) {
     if (!ret) {
+#ifdef WIN32_AIO
         ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE);
         ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE);
         if (!ret)
         if (!ret)
             return -EIO;
             return -EIO;
         else
         else
+#endif
             return ret_count;
             return ret_count;
     }
     }
     return ret_count;
     return ret_count;
@@ -155,17 +156,18 @@ static int raw_pwrite(BlockDriverState *bs, int64_t offset,
     ov.OffsetHigh = offset >> 32;
     ov.OffsetHigh = offset >> 32;
     ret = WriteFile(s->hfile, buf, count, &ret_count, &ov);
     ret = WriteFile(s->hfile, buf, count, &ret_count, &ov);
     if (!ret) {
     if (!ret) {
+#ifdef WIN32_AIO
         ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE);
         ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE);
         if (!ret)
         if (!ret)
             return -EIO;
             return -EIO;
         else
         else
+#endif
             return ret_count;
             return ret_count;
     }
     }
     return ret_count;
     return ret_count;
 }
 }
 
 
-#if 0
-#ifndef QEMU_IMG
+#ifdef WIN32_AIO
 static void raw_aio_cb(void *opaque)
 static void raw_aio_cb(void *opaque)
 {
 {
     RawAIOCB *acb = opaque;
     RawAIOCB *acb = opaque;
@@ -181,7 +183,6 @@ static void raw_aio_cb(void *opaque)
         acb->common.cb(acb->common.opaque, 0);
         acb->common.cb(acb->common.opaque, 0);
     }
     }
 }
 }
-#endif
 
 
 static RawAIOCB *raw_aio_setup(BlockDriverState *bs,
 static RawAIOCB *raw_aio_setup(BlockDriverState *bs,
         int64_t sector_num, uint8_t *buf, int nb_sectors,
         int64_t sector_num, uint8_t *buf, int nb_sectors,
@@ -204,9 +205,7 @@ static RawAIOCB *raw_aio_setup(BlockDriverState *bs,
     acb->ov.OffsetHigh = offset >> 32;
     acb->ov.OffsetHigh = offset >> 32;
     acb->ov.hEvent = acb->hEvent;
     acb->ov.hEvent = acb->hEvent;
     acb->count = nb_sectors * 512;
     acb->count = nb_sectors * 512;
-#ifndef QEMU_IMG
     qemu_add_wait_object(acb->ov.hEvent, raw_aio_cb, acb);
     qemu_add_wait_object(acb->ov.hEvent, raw_aio_cb, acb);
-#endif
     return acb;
     return acb;
 }
 }
 
 
@@ -226,9 +225,7 @@ static BlockDriverAIOCB *raw_aio_read(BlockDriverState *bs,
         qemu_aio_release(acb);
         qemu_aio_release(acb);
         return NULL;
         return NULL;
     }
     }
-#ifdef QEMU_IMG
     qemu_aio_release(acb);
     qemu_aio_release(acb);
-#endif
     return (BlockDriverAIOCB *)acb;
     return (BlockDriverAIOCB *)acb;
 }
 }
 
 
@@ -248,15 +245,12 @@ static BlockDriverAIOCB *raw_aio_write(BlockDriverState *bs,
         qemu_aio_release(acb);
         qemu_aio_release(acb);
         return NULL;
         return NULL;
     }
     }
-#ifdef QEMU_IMG
     qemu_aio_release(acb);
     qemu_aio_release(acb);
-#endif
     return (BlockDriverAIOCB *)acb;
     return (BlockDriverAIOCB *)acb;
 }
 }
 
 
 static void raw_aio_cancel(BlockDriverAIOCB *blockacb)
 static void raw_aio_cancel(BlockDriverAIOCB *blockacb)
 {
 {
-#ifndef QEMU_IMG
     RawAIOCB *acb = (RawAIOCB *)blockacb;
     RawAIOCB *acb = (RawAIOCB *)blockacb;
     BlockDriverState *bs = acb->common.bs;
     BlockDriverState *bs = acb->common.bs;
     BDRVRawState *s = bs->opaque;
     BDRVRawState *s = bs->opaque;
@@ -265,9 +259,8 @@ static void raw_aio_cancel(BlockDriverAIOCB *blockacb)
     /* XXX: if more than one async I/O it is not correct */
     /* XXX: if more than one async I/O it is not correct */
     CancelIo(s->hfile);
     CancelIo(s->hfile);
     qemu_aio_release(acb);
     qemu_aio_release(acb);
-#endif
 }
 }
-#endif /* #if 0 */
+#endif /* #if WIN32_AIO */
 
 
 static void raw_flush(BlockDriverState *bs)
 static void raw_flush(BlockDriverState *bs)
 {
 {
@@ -356,9 +349,7 @@ void qemu_aio_flush(void)
 
 
 void qemu_aio_wait(void)
 void qemu_aio_wait(void)
 {
 {
-#ifndef QEMU_IMG
     qemu_bh_poll();
     qemu_bh_poll();
-#endif
 }
 }
 
 
 BlockDriver bdrv_raw = {
 BlockDriver bdrv_raw = {
@@ -372,7 +363,7 @@ BlockDriver bdrv_raw = {
     raw_create,
     raw_create,
     raw_flush,
     raw_flush,
 
 
-#if 0
+#ifdef WIN32_AIO
     .bdrv_aio_read = raw_aio_read,
     .bdrv_aio_read = raw_aio_read,
     .bdrv_aio_write = raw_aio_write,
     .bdrv_aio_write = raw_aio_write,
     .bdrv_aio_cancel = raw_aio_cancel,
     .bdrv_aio_cancel = raw_aio_cancel,
@@ -458,10 +449,10 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags)
     }
     }
     create_flags = OPEN_EXISTING;
     create_flags = OPEN_EXISTING;
 
 
-#ifdef QEMU_IMG
-    overlapped = FILE_ATTRIBUTE_NORMAL;
-#else
+#ifdef WIN32_AIO
     overlapped = FILE_FLAG_OVERLAPPED;
     overlapped = FILE_FLAG_OVERLAPPED;
+#else
+    overlapped = FILE_ATTRIBUTE_NORMAL;
 #endif
 #endif
     if (flags & BDRV_O_DIRECT)
     if (flags & BDRV_O_DIRECT)
         overlapped |= FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH;
         overlapped |= FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH;
@@ -524,7 +515,7 @@ BlockDriver bdrv_host_device = {
     NULL,
     NULL,
     raw_flush,
     raw_flush,
 
 
-#if 0
+#ifdef WIN32_AIO
     .bdrv_aio_read = raw_aio_read,
     .bdrv_aio_read = raw_aio_read,
     .bdrv_aio_write = raw_aio_write,
     .bdrv_aio_write = raw_aio_write,
     .bdrv_aio_cancel = raw_aio_cancel,
     .bdrv_aio_cancel = raw_aio_cancel,

+ 0 - 32
block.c

@@ -22,9 +22,7 @@
  * THE SOFTWARE.
  * THE SOFTWARE.
  */
  */
 #include "qemu-common.h"
 #include "qemu-common.h"
-#ifndef QEMU_IMG
 #include "console.h"
 #include "console.h"
-#endif
 #include "block_int.h"
 #include "block_int.h"
 
 
 #ifdef _BSD
 #ifdef _BSD
@@ -922,7 +920,6 @@ int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
     return bs->drv->bdrv_is_allocated(bs, sector_num, nb_sectors, pnum);
     return bs->drv->bdrv_is_allocated(bs, sector_num, nb_sectors, pnum);
 }
 }
 
 
-#ifndef QEMU_IMG
 void bdrv_info(void)
 void bdrv_info(void)
 {
 {
     BlockDriverState *bs;
     BlockDriverState *bs;
@@ -980,7 +977,6 @@ void bdrv_info_stats (void)
 		     bs->rd_ops, bs->wr_ops);
 		     bs->rd_ops, bs->wr_ops);
     }
     }
 }
 }
-#endif
 
 
 void bdrv_get_backing_filename(BlockDriverState *bs,
 void bdrv_get_backing_filename(BlockDriverState *bs,
                                char *filename, int filename_size)
                                char *filename, int filename_size)
@@ -1203,31 +1199,6 @@ void bdrv_aio_cancel(BlockDriverAIOCB *acb)
 /**************************************************************/
 /**************************************************************/
 /* async block device emulation */
 /* async block device emulation */
 
 
-#ifdef QEMU_IMG
-static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs,
-        int64_t sector_num, uint8_t *buf, int nb_sectors,
-        BlockDriverCompletionFunc *cb, void *opaque)
-{
-    int ret;
-    ret = bdrv_read(bs, sector_num, buf, nb_sectors);
-    cb(opaque, ret);
-    return NULL;
-}
-
-static BlockDriverAIOCB *bdrv_aio_write_em(BlockDriverState *bs,
-        int64_t sector_num, const uint8_t *buf, int nb_sectors,
-        BlockDriverCompletionFunc *cb, void *opaque)
-{
-    int ret;
-    ret = bdrv_write(bs, sector_num, buf, nb_sectors);
-    cb(opaque, ret);
-    return NULL;
-}
-
-static void bdrv_aio_cancel_em(BlockDriverAIOCB *acb)
-{
-}
-#else
 static void bdrv_aio_bh_cb(void *opaque)
 static void bdrv_aio_bh_cb(void *opaque)
 {
 {
     BlockDriverAIOCBSync *acb = opaque;
     BlockDriverAIOCBSync *acb = opaque;
@@ -1273,7 +1244,6 @@ static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
     qemu_bh_cancel(acb->bh);
     qemu_bh_cancel(acb->bh);
     qemu_aio_release(acb);
     qemu_aio_release(acb);
 }
 }
-#endif /* !QEMU_IMG */
 
 
 /**************************************************************/
 /**************************************************************/
 /* sync block device emulation */
 /* sync block device emulation */
@@ -1337,9 +1307,7 @@ void bdrv_init(void)
     bdrv_register(&bdrv_vvfat);
     bdrv_register(&bdrv_vvfat);
     bdrv_register(&bdrv_qcow2);
     bdrv_register(&bdrv_qcow2);
     bdrv_register(&bdrv_parallels);
     bdrv_register(&bdrv_parallels);
-#ifndef _WIN32
     bdrv_register(&bdrv_nbd);
     bdrv_register(&bdrv_nbd);
-#endif
 
 
     qemu_aio_init();
     qemu_aio_init();
 }
 }

+ 0 - 2
block.h

@@ -47,10 +47,8 @@ typedef struct QEMUSnapshotInfo {
                                      bdrv_file_open()) */
                                      bdrv_file_open()) */
 #define BDRV_O_DIRECT      0x0020
 #define BDRV_O_DIRECT      0x0020
 
 
-#ifndef QEMU_IMG
 void bdrv_info(void);
 void bdrv_info(void);
 void bdrv_info_stats(void);
 void bdrv_info_stats(void);
-#endif
 
 
 void bdrv_init(void);
 void bdrv_init(void);
 BlockDriver *bdrv_find_format(const char *format_name);
 BlockDriver *bdrv_find_format(const char *format_name);

+ 55 - 31
nbd.c

@@ -21,28 +21,27 @@
 
 
 #include <errno.h>
 #include <errno.h>
 #include <string.h>
 #include <string.h>
+#ifndef _WIN32
 #include <sys/ioctl.h>
 #include <sys/ioctl.h>
+#endif
 #ifdef __sun__
 #ifdef __sun__
 #include <sys/ioccom.h>
 #include <sys/ioccom.h>
 #endif
 #endif
 #include <ctype.h>
 #include <ctype.h>
 #include <inttypes.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 { \
 #define TRACE(msg, ...) do { \
-    if (verbose) LOG(msg, ## __VA_ARGS__); \
+    LOG(msg, ## __VA_ARGS__); \
 } while(0)
 } while(0)
+#else
+#define TRACE(msg, ...) \
+    do { } while (0)
+#endif
 
 
 #define LOG(msg, ...) do { \
 #define LOG(msg, ...) do { \
     fprintf(stderr, "%s:%s():L%d: " msg "\n", \
     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;
         ssize_t len;
 
 
         if (do_read) {
         if (do_read) {
-            len = read(fd, buffer + offset, size - offset);
+            len = recv(fd, buffer + offset, size - offset, 0);
         } else {
         } else {
-            len = write(fd, buffer + offset, size - offset);
+            len = send(fd, buffer + offset, size - offset, 0);
         }
         }
 
 
+        if (len == -1)
+            errno = socket_error();
+
         /* recoverable error */
         /* recoverable error */
         if (len == -1 && (errno == EAGAIN || errno == EINTR)) {
         if (len == -1 && (errno == EAGAIN || errno == EINTR)) {
             continue;
             continue;
@@ -108,7 +110,6 @@ int tcp_socket_outgoing(const char *address, uint16_t port)
     int s;
     int s;
     struct in_addr in;
     struct in_addr in;
     struct sockaddr_in addr;
     struct sockaddr_in addr;
-    int serrno;
 
 
     s = socket(PF_INET, SOCK_STREAM, 0);
     s = socket(PF_INET, SOCK_STREAM, 0);
     if (s == -1) {
     if (s == -1) {
@@ -136,9 +137,7 @@ int tcp_socket_outgoing(const char *address, uint16_t port)
 
 
     return s;
     return s;
 error:
 error:
-    serrno = errno;
-    close(s);
-    errno = serrno;
+    closesocket(s);
     return -1;
     return -1;
 }
 }
 
 
@@ -147,7 +146,6 @@ int tcp_socket_incoming(const char *address, uint16_t port)
     int s;
     int s;
     struct in_addr in;
     struct in_addr in;
     struct sockaddr_in addr;
     struct sockaddr_in addr;
-    int serrno;
     int opt;
     int opt;
 
 
     s = socket(PF_INET, SOCK_STREAM, 0);
     s = socket(PF_INET, SOCK_STREAM, 0);
@@ -185,17 +183,15 @@ int tcp_socket_incoming(const char *address, uint16_t port)
 
 
     return s;
     return s;
 error:
 error:
-    serrno = errno;
-    close(s);
-    errno = serrno;
+    closesocket(s);
     return -1;
     return -1;
 }
 }
 
 
+#ifndef _WIN32
 int unix_socket_incoming(const char *path)
 int unix_socket_incoming(const char *path)
 {
 {
     int s;
     int s;
     struct sockaddr_un addr;
     struct sockaddr_un addr;
-    int serrno;
 
 
     s = socket(PF_UNIX, SOCK_STREAM, 0);
     s = socket(PF_UNIX, SOCK_STREAM, 0);
     if (s == -1) {
     if (s == -1) {
@@ -216,9 +212,7 @@ int unix_socket_incoming(const char *path)
 
 
     return s;
     return s;
 error:
 error:
-    serrno = errno;
-    close(s);
-    errno = serrno;
+    closesocket(s);
     return -1;
     return -1;
 }
 }
 
 
@@ -226,7 +220,6 @@ int unix_socket_outgoing(const char *path)
 {
 {
     int s;
     int s;
     struct sockaddr_un addr;
     struct sockaddr_un addr;
-    int serrno;
 
 
     s = socket(PF_UNIX, SOCK_STREAM, 0);
     s = socket(PF_UNIX, SOCK_STREAM, 0);
     if (s == -1) {
     if (s == -1) {
@@ -243,12 +236,23 @@ int unix_socket_outgoing(const char *path)
 
 
     return s;
     return s;
 error:
 error:
-    serrno = errno;
-    close(s);
-    errno = serrno;
+    closesocket(s);
+    return -1;
+}
+#else
+int unix_socket_incoming(const char *path)
+{
+    errno = ENOTSUP;
     return -1;
     return -1;
 }
 }
 
 
+int unix_socket_outgoing(const char *path)
+{
+    errno = ENOTSUP;
+    return -1;
+}
+#endif
+
 
 
 /* Basic flow
 /* Basic flow
 
 
@@ -337,6 +341,7 @@ int nbd_receive_negotiate(int csock, off_t *size, size_t *blocksize)
         return 0;
         return 0;
 }
 }
 
 
+#ifndef _WIN32
 int nbd_init(int fd, int csock, off_t size, size_t blocksize)
 int nbd_init(int fd, int csock, off_t size, size_t blocksize)
 {
 {
 	TRACE("Setting block size to %lu", (unsigned long)blocksize);
 	TRACE("Setting block size to %lu", (unsigned long)blocksize);
@@ -410,6 +415,25 @@ int nbd_client(int fd, int csock)
 	errno = serrno;
 	errno = serrno;
 	return ret;
 	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)
 int nbd_send_request(int csock, struct nbd_request *request)
 {
 {

+ 27 - 0
osdep.c

@@ -45,6 +45,8 @@
 #include <malloc.h>
 #include <malloc.h>
 #endif
 #endif
 
 
+#include "qemu_socket.h"
+
 #if defined(_WIN32)
 #if defined(_WIN32)
 void *qemu_memalign(size_t alignment, size_t size)
 void *qemu_memalign(size_t alignment, size_t size)
 {
 {
@@ -283,3 +285,28 @@ int qemu_gettimeofday(qemu_timeval *tp)
   return 0;
   return 0;
 }
 }
 #endif /* _WIN32 */
 #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

+ 83 - 0
qemu-tool.c

@@ -0,0 +1,83 @@
+/*
+ * Compatibility for qemu-img/qemu-nbd
+ *
+ * Copyright IBM, Corp. 2008
+ *
+ * Authors:
+ *  Anthony Liguori   <aliguori@us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu-common.h"
+#include "console.h"
+#include "sysemu.h"
+#include "qemu-timer.h"
+
+#include <sys/time.h>
+
+QEMUClock *rt_clock;
+
+struct QEMUBH
+{
+    QEMUBHFunc *cb;
+    void *opaque;
+};
+
+void term_printf(const char *fmt, ...)
+{
+}
+
+void term_print_filename(const char *filename)
+{
+}
+
+QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
+{
+    QEMUBH *bh;
+
+    bh = qemu_malloc(sizeof(*bh));
+    if (bh) {
+        bh->cb = cb;
+        bh->opaque = opaque;
+    }
+
+    return bh;
+}
+
+int qemu_bh_poll(void)
+{
+    return 0;
+}
+
+void qemu_bh_schedule(QEMUBH *bh)
+{
+    bh->cb(bh->opaque);
+}
+
+void qemu_bh_cancel(QEMUBH *bh)
+{
+}
+
+void qemu_bh_delete(QEMUBH *bh)
+{
+    qemu_free(bh);
+}
+
+int qemu_set_fd_handler2(int fd,
+                         IOCanRWHandler *fd_read_poll,
+                         IOHandler *fd_read,
+                         IOHandler *fd_write,
+                         void *opaque)
+{
+    return 0;
+}
+
+int64_t qemu_get_clock(QEMUClock *clock)
+{
+    struct timeval tv;
+    gettimeofday(&tv, NULL);
+    return (tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000)) / 1000000;
+}

+ 4 - 0
qemu_socket.h

@@ -14,11 +14,15 @@
 #define EINTR       WSAEINTR
 #define EINTR       WSAEINTR
 #define EINPROGRESS WSAEINPROGRESS
 #define EINPROGRESS WSAEINPROGRESS
 
 
+int inet_aton(const char *cp, struct in_addr *ia);
+
 #else
 #else
 
 
 #include <sys/socket.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <netinet/in.h>
 #include <netinet/tcp.h>
 #include <netinet/tcp.h>
+#include <arpa/inet.h>
+#include <netdb.h>
 #include <sys/un.h>
 #include <sys/un.h>
 
 
 #define socket_error() errno
 #define socket_error() errno

+ 0 - 14
slirp/misc.c

@@ -66,20 +66,6 @@ redir_x(inaddr, start_port, display, screen)
 }
 }
 #endif
 #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
  * Get our IP address and put it in our_addr
  */
  */

+ 2 - 18
vl.c

@@ -100,11 +100,10 @@
 #include <stropts.h>
 #include <stropts.h>
 #endif
 #endif
 #endif
 #endif
-#else
-#include <winsock2.h>
-int inet_aton(const char *cp, struct in_addr *ia);
 #endif
 #endif
 
 
+#include "qemu_socket.h"
+
 #if defined(CONFIG_SLIRP)
 #if defined(CONFIG_SLIRP)
 #include "libslirp.h"
 #include "libslirp.h"
 #endif
 #endif
@@ -125,8 +124,6 @@ int inet_aton(const char *cp, struct in_addr *ia);
 #define memalign(align, size) malloc(size)
 #define memalign(align, size) malloc(size)
 #endif
 #endif
 
 
-#include "qemu_socket.h"
-
 #ifdef CONFIG_SDL
 #ifdef CONFIG_SDL
 #ifdef __APPLE__
 #ifdef __APPLE__
 #include <SDL/SDL.h>
 #include <SDL/SDL.h>
@@ -2133,12 +2130,6 @@ static int send_all(int fd, const uint8_t *buf, int len1)
     return len1 - len;
     return len1 - len;
 }
 }
 
 
-void socket_set_nonblock(int fd)
-{
-    unsigned long opt = 1;
-    ioctlsocket(fd, FIONBIO, &opt);
-}
-
 #else
 #else
 
 
 static int unix_write(int fd, const uint8_t *buf, int len1)
 static int unix_write(int fd, const uint8_t *buf, int len1)
@@ -2165,13 +2156,6 @@ static inline int send_all(int fd, const uint8_t *buf, int len1)
 {
 {
     return unix_write(fd, buf, len1);
     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 */
 #endif /* !_WIN32 */
 
 
 #ifndef _WIN32
 #ifndef _WIN32