diff options
Diffstat (limited to 'block.c')
-rw-r--r-- | block.c | 27 |
1 files changed, 17 insertions, 10 deletions
@@ -225,7 +225,7 @@ static BlockDriver *find_protocol(const char *filename) { BlockDriver *drv1; char protocol[128]; - int len; + int len = strnlen(filename, 127)+1; const char *p; #ifdef _WIN32 @@ -233,14 +233,9 @@ static BlockDriver *find_protocol(const char *filename) is_windows_drive_prefix(filename)) return bdrv_find_format("raw"); #endif - p = strchr(filename, ':'); - if (!p) + p = fill_token(protocol, len, filename, ':'); + if (*p != ':') return bdrv_find_format("raw"); - len = p - filename; - if (len > sizeof(protocol) - 1) - len = sizeof(protocol) - 1; - memcpy(protocol, filename, len); - protocol[len] = '\0'; for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) { if (drv1->protocol_name && !strcmp(drv1->protocol_name, protocol)) @@ -414,9 +409,9 @@ 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); + ret = bdrv_open3(bs, filename, open_flags, drv); if ((ret == -EACCES || ret == -EPERM) && !(flags & BDRV_O_FILE)) { - ret = drv->bdrv_open(bs, filename, open_flags & ~BDRV_O_RDWR); + ret = bdrv_open3(bs, filename, open_flags & ~BDRV_O_RDWR, drv); bs->read_only = 1; } if (ret < 0) { @@ -461,6 +456,18 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, return 0; } +int bdrv_open3(BlockDriverState *bs, const char *filename, int flags, BlockDriver *drv) +{ + char myfile[PATH_MAX]; + const char *f; + + if (!strstart(filename, "file:", &f)) { + fill_token(myfile, PATH_MAX, filename, '\0'); + return drv->bdrv_open(bs,myfile,flags); + } + return drv->bdrv_open(bs,f,flags); +} + void bdrv_close(BlockDriverState *bs) { if (bs->drv) { |