sim-card
/
qemu
Archived
10
0
Fork 0

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
This commit is contained in:
aliguori 2008-09-15 15:51:35 +00:00
parent d9cf15784f
commit 03ff3ca30f
11 changed files with 211 additions and 176 deletions

View File

@ -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 BLOCK_OBJS+=block-qcow2.o block-parallels.o block-nbd.o
ifndef CONFIG_WIN32 BLOCK_OBJS+=nbd.o block.o
BLOCK_OBJS+=block-nbd.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 qemu-nbd$(EXESUF): qemu-nbd.o qemu-tool.o osdep.o $(BLOCK_OBJS)
$(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)
$(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS) $(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS)
# dyngen host tool # dyngen host tool

View File

@ -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)
{ {

View File

@ -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 #ifdef WIN32_AIO
overlapped = FILE_ATTRIBUTE_NORMAL;
#else
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 #ifdef WIN32_AIO
#ifndef QEMU_IMG
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 #ifdef WIN32_AIO
overlapped = FILE_ATTRIBUTE_NORMAL;
#else
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,

32
block.c
View File

@ -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();
} }

View File

@ -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);

84
nbd.c
View File

@ -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) #include "qemu_socket.h"
extern int verbose;
#else
static int verbose = 0;
#endif
//#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; closesocket(s);
close(s);
errno = serrno;
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; closesocket(s);
close(s);
errno = serrno;
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; closesocket(s);
close(s);
errno = serrno;
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,11 +236,22 @@ int unix_socket_outgoing(const char *path)
return s; return s;
error: error:
serrno = errno; closesocket(s);
close(s);
errno = serrno;
return -1; 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 /* 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
osdep.c
View File

@ -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
qemu-tool.c Normal file
View File

@ -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;
}

View File

@ -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

View File

@ -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
*/ */

20
vl.c
View File

@ -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