{
BlockDriver *drv1;
char protocol[128];
- int len;
+ int len = qemu_strnlen(filename, 127) + 1;
const char *p;
#ifdef _WIN32
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))
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) {
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) {
/**
* If eject_flag is TRUE, eject the media. Otherwise, close the tray
*/
-void bdrv_eject(BlockDriverState *bs, int eject_flag)
+int bdrv_eject(BlockDriverState *bs, int eject_flag)
{
BlockDriver *drv = bs->drv;
int ret;
+ if (bs->locked) {
+ return -EBUSY;
+ }
+
if (!drv || !drv->bdrv_eject) {
ret = -ENOTSUP;
} else {
if (ret == -ENOTSUP) {
if (eject_flag)
bdrv_close(bs);
+ ret = 0;
}
+
+ return ret;
}
int bdrv_is_locked(BlockDriverState *bs)