diff --git a/block.c b/block.c index e71a771e06..0aaec3bf35 100644 --- a/block.c +++ b/block.c @@ -288,24 +288,31 @@ BlockDriver *bdrv_find_protocol(const char *filename) char protocol[128]; int len; const char *p; - int is_drive; /* TODO Drivers without bdrv_file_open must be specified explicitly */ -#ifdef _WIN32 - is_drive = is_windows_drive(filename) || - is_windows_drive_prefix(filename); -#else - is_drive = 0; -#endif - p = strchr(filename, ':'); - if (!p || is_drive) { - drv1 = find_hdev_driver(filename); - if (!drv1) { - drv1 = bdrv_find_format("file"); - } + /* + * XXX(hch): we really should not let host device detection + * override an explicit protocol specification, but moving this + * later breaks access to device names with colons in them. + * Thanks to the brain-dead persistent naming schemes on udev- + * based Linux systems those actually are quite common. + */ + drv1 = find_hdev_driver(filename); + if (drv1) { return drv1; } + +#ifdef _WIN32 + if (is_windows_drive(filename) || + is_windows_drive_prefix(filename)) + return bdrv_find_format("file"); +#endif + + p = strchr(filename, ':'); + if (!p) { + return bdrv_find_format("file"); + } len = p - filename; if (len > sizeof(protocol) - 1) len = sizeof(protocol) - 1;