$NetBSD: patch-qemu-phy-devices,v 1.1 2011/05/20 17:09:21 bouyer Exp $ This does 2 things: - use the correct way to get the size of a disk device or partition (from haad@NetBSD.org) - if given a block device, use the character device instead. --- ioemu-qemu-xen/block-raw-posix.c.orig 2011-05-20 16:47:37.000000000 +0200 +++ ioemu-qemu-xen/block-raw-posix.c 2011-05-20 18:06:44.000000000 +0200 @@ -66,6 +66,13 @@ #include #include #endif +#if defined(__NetBSD__) +#include +#include +#include +#define SLIST_ENTRY(x) int /*XXXX !*/ +#include +#endif //#define DEBUG_FLOPPY @@ -120,6 +127,33 @@ { BDRVRawState *s = bs->opaque; int fd, open_flags, ret; +#ifdef __NetBSD__ + struct stat sb; + static char namebuf[MAXPATHLEN]; + const char *dp; + + if (lstat(filename, &sb) < 0) { + fprintf(stderr, "%s: stat failed: %s\n", filename, strerror(errno)); + return -errno; + } + if (S_ISLNK(sb.st_mode)) { + fprintf(stderr, "%s: symolink links not supported by qemu-dm\n", + filename); + return -EINVAL; + } + if (S_ISBLK(sb.st_mode)) { + dp = strrchr(filename, '/'); + if (dp == NULL) { + snprintf(namebuf, MAXPATHLEN, "r%s", filename); + } else { + snprintf(namebuf, MAXPATHLEN, "%.*s/r%s", + (int)(dp - filename), filename, dp + 1); + } + fprintf(stderr, "%s is a block device", filename); + filename = namebuf; + fprintf(stderr, ", using %s\n", filename); + } +#endif posix_aio_init(); @@ -749,7 +783,7 @@ return 0; } -#ifdef __OpenBSD__ +#if defined(__OpenBSD__) || defined(__NetBSD__) static int64_t raw_getlength(BlockDriverState *bs) { BDRVRawState *s = bs->opaque; @@ -759,16 +793,29 @@ if (fstat(fd, &st)) return -1; if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) { +#if defined(__OpenBSD__) struct disklabel dl; if (ioctl(fd, DIOCGDINFO, &dl)) return -1; return (uint64_t)dl.d_secsize * dl.d_partitions[DISKPART(st.st_rdev)].p_size; +#else + struct dkwedge_info dkw; + if (ioctl(fd, DIOCGWEDGEINFO, &dkw) != -1) { + return dkw.dkw_size * 512; + } else { + struct disklabel dl; + if(ioctl(fd, DIOCGDINFO, &dl)) + return -1; + return (uint64_t)dl.d_secsize * + dl.d_partitions[DISKPART(st.st_rdev)].p_size; + } +#endif } else return st.st_size; } -#else /* !__OpenBSD__ */ +#else /* !__OpenBSD__ && ! __NetBSD__ */ static int64_t raw_getlength(BlockDriverState *bs) { BDRVRawState *s = bs->opaque;