diff --git a/block.c b/block.c index 28d63d7..cbf9968 100644 --- a/block.c +++ b/block.c @@ -226,6 +226,17 @@ static int is_windows_drive(const char *filename) } #endif +static const char *raw_filename(const char *filename) +{ + char *_filename; + + _filename = strchr(filename, ':'); + if (_filename) + return _filename + 1; + else + return filename; +} + static BlockDriver *find_protocol(const char *filename) { BlockDriver *drv1; @@ -267,25 +278,28 @@ static BlockDriver *find_image_format(const char *filename) recognized as a host CDROM */ if (strstart(filename, "/dev/cdrom", NULL)) return &bdrv_host_device; + drv = find_protocol(filename); + + if (drv == &bdrv_raw) { #ifdef _WIN32 - if (is_windows_drive(filename)) - return &bdrv_host_device; + if (is_windows_drive(filename)) + return &bdrv_host_device; #else - { - struct stat st; - if (stat(filename, &st) >= 0 && - (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode))) { - return &bdrv_host_device; - } - } + { + struct stat st; + if (stat(filename, &st) >= 0 && + (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode))) { + return &bdrv_host_device; + } + } #endif + } - drv = find_protocol(filename); /* no need to test disk image formats for vvfat */ if (drv == &bdrv_vvfat) return drv; - ret = bdrv_file_open(&bs, filename, BDRV_O_RDONLY); + ret = bdrv_file_open(&bs, raw_filename(filename), BDRV_O_RDONLY); if (ret < 0) return NULL; ret = bdrv_pread(bs, 0, buf, sizeof(buf)); @@ -335,6 +349,7 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, int ret, open_flags; char tmp_filename[PATH_MAX]; char backing_filename[PATH_MAX]; + char const *_filename; bs->read_only = 0; bs->is_temporary = 0; @@ -403,9 +418,12 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, open_flags = BDRV_O_RDWR | (flags & BDRV_O_CACHE_MASK); else open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT); - ret = drv->bdrv_open(bs, filename, open_flags); + + _filename = raw_filename(filename); + + ret = drv->bdrv_open(bs, _filename, open_flags); if ((ret == -EACCES || ret == -EPERM) && !(flags & BDRV_O_FILE)) { - ret = drv->bdrv_open(bs, filename, open_flags & ~BDRV_O_RDWR); + ret = drv->bdrv_open(bs, _filename, open_flags & ~BDRV_O_RDWR); bs->read_only = 1; } if (ret < 0) { diff --git a/qemu-img.c b/qemu-img.c