diff options
author | Ram Pai <linuxram@us.ibm.com> | 2009-06-26 17:41:50 -0700 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-06-29 13:50:05 -0500 |
commit | 17661f5aa740b9e1a4c5f26ac2cb285c5a22e834 (patch) | |
tree | b577fac92b2f94e300f1ce73804febecb615fdc8 /block.c | |
parent | 3f6d6c5ca44f770c831cde228ea8ca2cf7294f79 (diff) | |
download | qemu-17661f5aa740b9e1a4c5f26ac2cb285c5a22e834.tar.gz qemu-17661f5aa740b9e1a4c5f26ac2cb285c5a22e834.tar.bz2 qemu-17661f5aa740b9e1a4c5f26ac2cb285c5a22e834.zip |
support colon in filenames
Problem: It is impossible to feed filenames with the character colon because
qemu interprets such names as a protocol. For example filename scsi:0, is
interpreted as a protocol by name "scsi".
This patch allows user to espace colon characters. For example the above
filename can now be expressed either as 'scsi\:0' or as file:scsi:0
anything following the "file:" tag is interpreted verbatin. However if "file:"
tag is omitted then any colon characters in the string must be escaped using
backslash.
Here are couple of examples:
scsi\:0\:abc is a local file scsi:0:abc
http\://myweb is a local file by name http://myweb
file:scsi:0:abc is a local file scsi:0:abc
file:http://myweb is a local file by name http://myweb
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
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) { |