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))
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 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
######################################################################
OBJS=$(BLOCK_OBJS)
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
rm -f $@
$(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)
-qemu-img-%.o: %.c
- $(CC) $(CFLAGS) $(CPPFLAGS) -DQEMU_IMG -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-tool.o osdep.o $(BLOCK_OBJS)
$(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS)
# dyngen host tool
* THE SOFTWARE.
*/
#include "qemu-common.h"
-#if !defined(QEMU_IMG) && !defined(QEMU_NBD)
#include "qemu-timer.h"
-#include "exec-all.h"
#include "qemu-char.h"
-#endif
#include "block_int.h"
#include "compatfd.h"
#include <assert.h>
//#define DEBUG_FLOPPY
//#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) \
{ fprintf(logfile, formatCstr, ##args); fflush(logfile); } } while (0)
#else
int fd_got_error;
int fd_media_changed;
#endif
-#if defined(O_DIRECT) && !defined(QEMU_IMG)
+#if defined(O_DIRECT)
uint8_t* aligned_buf;
#endif
} BDRVRawState;
return ret;
}
s->fd = fd;
-#if defined(O_DIRECT) && !defined(QEMU_IMG)
+#if defined(O_DIRECT)
s->aligned_buf = NULL;
if (flags & BDRV_O_DIRECT) {
s->aligned_buf = qemu_memalign(512, ALIGNED_BUFFER_SIZE);
}
-#if defined(O_DIRECT) && !defined(QEMU_IMG)
+#if defined(O_DIRECT)
/*
* offset and count are in bytes and possibly not aligned. For files opened
* with O_DIRECT, necessary alignments are ensured before calling
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);
-#endif
#if defined(__GLIBC__) && defined(__linux__)
{
{
int ret;
-#if !defined(QEMU_IMG) && !defined(QEMU_NBD)
if (qemu_bh_poll())
return;
-#endif
if (!first_aio)
return;
return acb;
}
-#if !defined(QEMU_IMG) && !defined(QEMU_NBD)
static void raw_aio_em_cb(void* opaque)
{
RawAIOCB *acb = opaque;
acb->common.cb(acb->common.opaque, acb->ret);
qemu_aio_release(acb);
}
-#endif
static BlockDriverAIOCB *raw_aio_read(BlockDriverState *bs,
int64_t sector_num, uint8_t *buf, int nb_sectors,
* 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)
BDRVRawState *s = bs->opaque;
if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) {
* 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)
BDRVRawState *s = bs->opaque;
if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) {
void qemu_aio_wait(void)
{
-#if !defined(QEMU_IMG) && !defined(QEMU_NBD)
qemu_bh_poll();
-#endif
}
#endif /* CONFIG_AIO */
if (s->fd >= 0) {
close(s->fd);
s->fd = -1;
-#if defined(O_DIRECT) && !defined(QEMU_IMG)
+#if defined(O_DIRECT)
if (s->aligned_buf != NULL)
qemu_free(s->aligned_buf);
#endif
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
present. The current method is to try to open the floppy at every
s->fd_got_error = 0;
return 0;
}
-#else
-static int fd_open(BlockDriverState *bs)
-{
- return 0;
-}
-#endif
-
-#if defined(__linux__)
static int raw_is_inserted(BlockDriverState *bs)
{
* THE SOFTWARE.
*/
#include "qemu-common.h"
-#ifndef QEMU_IMG
#include "qemu-timer.h"
-#include "exec-all.h"
-#endif
#include "block_int.h"
#include <assert.h>
#include <winioctl.h>
+//#define WIN32_AIO
+
#define FTYPE_FILE 0
#define FTYPE_CD 1
#define FTYPE_HARDDISK 2
} else {
create_flags = OPEN_EXISTING;
}
-#ifdef QEMU_IMG
- overlapped = FILE_ATTRIBUTE_NORMAL;
-#else
+#ifdef WIN32_AIO
overlapped = FILE_FLAG_OVERLAPPED;
+#else
+ overlapped = FILE_ATTRIBUTE_NORMAL;
#endif
if (flags & BDRV_O_DIRECT)
overlapped |= FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH;
ov.OffsetHigh = offset >> 32;
ret = ReadFile(s->hfile, buf, count, &ret_count, &ov);
if (!ret) {
+#ifdef WIN32_AIO
ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE);
if (!ret)
return -EIO;
else
+#endif
return ret_count;
}
return ret_count;
ov.OffsetHigh = offset >> 32;
ret = WriteFile(s->hfile, buf, count, &ret_count, &ov);
if (!ret) {
+#ifdef WIN32_AIO
ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE);
if (!ret)
return -EIO;
else
+#endif
return ret_count;
}
return ret_count;
}
-#if 0
-#ifndef QEMU_IMG
+#ifdef WIN32_AIO
static void raw_aio_cb(void *opaque)
{
RawAIOCB *acb = opaque;
acb->common.cb(acb->common.opaque, 0);
}
}
-#endif
static RawAIOCB *raw_aio_setup(BlockDriverState *bs,
int64_t sector_num, uint8_t *buf, int nb_sectors,
acb->ov.OffsetHigh = offset >> 32;
acb->ov.hEvent = acb->hEvent;
acb->count = nb_sectors * 512;
-#ifndef QEMU_IMG
qemu_add_wait_object(acb->ov.hEvent, raw_aio_cb, acb);
-#endif
return acb;
}
qemu_aio_release(acb);
return NULL;
}
-#ifdef QEMU_IMG
qemu_aio_release(acb);
-#endif
return (BlockDriverAIOCB *)acb;
}
qemu_aio_release(acb);
return NULL;
}
-#ifdef QEMU_IMG
qemu_aio_release(acb);
-#endif
return (BlockDriverAIOCB *)acb;
}
static void raw_aio_cancel(BlockDriverAIOCB *blockacb)
{
-#ifndef QEMU_IMG
RawAIOCB *acb = (RawAIOCB *)blockacb;
BlockDriverState *bs = acb->common.bs;
BDRVRawState *s = bs->opaque;
/* XXX: if more than one async I/O it is not correct */
CancelIo(s->hfile);
qemu_aio_release(acb);
-#endif
}
-#endif /* #if 0 */
+#endif /* #if WIN32_AIO */
static void raw_flush(BlockDriverState *bs)
{
void qemu_aio_wait(void)
{
-#ifndef QEMU_IMG
qemu_bh_poll();
-#endif
}
BlockDriver bdrv_raw = {
raw_create,
raw_flush,
-#if 0
+#ifdef WIN32_AIO
.bdrv_aio_read = raw_aio_read,
.bdrv_aio_write = raw_aio_write,
.bdrv_aio_cancel = raw_aio_cancel,
}
create_flags = OPEN_EXISTING;
-#ifdef QEMU_IMG
- overlapped = FILE_ATTRIBUTE_NORMAL;
-#else
+#ifdef WIN32_AIO
overlapped = FILE_FLAG_OVERLAPPED;
+#else
+ overlapped = FILE_ATTRIBUTE_NORMAL;
#endif
if (flags & BDRV_O_DIRECT)
overlapped |= FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH;
NULL,
raw_flush,
-#if 0
+#ifdef WIN32_AIO
.bdrv_aio_read = raw_aio_read,
.bdrv_aio_write = raw_aio_write,
.bdrv_aio_cancel = raw_aio_cancel,
* THE SOFTWARE.
*/
#include "qemu-common.h"
-#ifndef QEMU_IMG
#include "console.h"
-#endif
#include "block_int.h"
#ifdef _BSD
return bs->drv->bdrv_is_allocated(bs, sector_num, nb_sectors, pnum);
}
-#ifndef QEMU_IMG
void bdrv_info(void)
{
BlockDriverState *bs;
bs->rd_ops, bs->wr_ops);
}
}
-#endif
void bdrv_get_backing_filename(BlockDriverState *bs,
char *filename, int filename_size)
/**************************************************************/
/* 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)
{
BlockDriverAIOCBSync *acb = opaque;
qemu_bh_cancel(acb->bh);
qemu_aio_release(acb);
}
-#endif /* !QEMU_IMG */
/**************************************************************/
/* sync block device emulation */
bdrv_register(&bdrv_vvfat);
bdrv_register(&bdrv_qcow2);
bdrv_register(&bdrv_parallels);
-#ifndef _WIN32
bdrv_register(&bdrv_nbd);
-#endif
qemu_aio_init();
}
bdrv_file_open()) */
#define BDRV_O_DIRECT 0x0020
-#ifndef QEMU_IMG
void bdrv_info(void);
void bdrv_info_stats(void);
-#endif
void bdrv_init(void);
BlockDriver *bdrv_find_format(const char *format_name);
#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", \
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;
int s;
struct in_addr in;
struct sockaddr_in addr;
- int serrno;
s = socket(PF_INET, SOCK_STREAM, 0);
if (s == -1) {
return s;
error:
- serrno = errno;
- close(s);
- errno = serrno;
+ closesocket(s);
return -1;
}
int s;
struct in_addr in;
struct sockaddr_in addr;
- int serrno;
int opt;
s = socket(PF_INET, SOCK_STREAM, 0);
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) {
return s;
error:
- serrno = errno;
- close(s);
- errno = serrno;
+ closesocket(s);
return -1;
}
{
int s;
struct sockaddr_un addr;
- int serrno;
s = socket(PF_UNIX, SOCK_STREAM, 0);
if (s == -1) {
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
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);
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)
{
#include <malloc.h>
#endif
+#include "qemu_socket.h"
+
#if defined(_WIN32)
void *qemu_memalign(size_t alignment, size_t size)
{
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
--- /dev/null
+/*
+ * 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;
+}
#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
}
#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
*/
#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
#define memalign(align, size) malloc(size)
#endif
-#include "qemu_socket.h"
-
#ifdef CONFIG_SDL
#ifdef __APPLE__
#include <SDL/SDL.h>
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)
{
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