Revision 508c7cb3
b/block.c | ||
---|---|---|
209 | 209 |
filename[1] == ':'); |
210 | 210 |
} |
211 | 211 |
|
212 |
static int is_windows_drive(const char *filename)
|
|
212 |
int is_windows_drive(const char *filename) |
|
213 | 213 |
{ |
214 | 214 |
if (is_windows_drive_prefix(filename) && |
215 | 215 |
filename[2] == '\0') |
... | ... | |
253 | 253 |
* Detect host devices. By convention, /dev/cdrom[N] is always |
254 | 254 |
* recognized as a host CDROM. |
255 | 255 |
*/ |
256 |
#ifdef _WIN32 |
|
257 |
static BlockDriver *find_hdev_driver(const char *filename) |
|
258 |
{ |
|
259 |
if (strstart(filename, "/dev/cdrom", NULL)) |
|
260 |
return bdrv_find_format("host_device"); |
|
261 |
if (is_windows_drive(filename)) |
|
262 |
return bdrv_find_format("host_device"); |
|
263 |
return NULL; |
|
264 |
} |
|
265 |
#else |
|
266 | 256 |
static BlockDriver *find_hdev_driver(const char *filename) |
267 | 257 |
{ |
268 |
struct stat st; |
|
269 |
|
|
270 |
#ifdef __linux__ |
|
271 |
if (strstart(filename, "/dev/fd", NULL)) |
|
272 |
return bdrv_find_format("host_floppy"); |
|
273 |
if (strstart(filename, "/dev/cd", NULL)) |
|
274 |
return bdrv_find_format("host_cdrom"); |
|
275 |
#elif defined(__FreeBSD__) |
|
276 |
if (strstart(filename, "/dev/cd", NULL) || |
|
277 |
strstart(filename, "/dev/acd", NULL)) { |
|
278 |
return bdrv_find_format("host_cdrom"); |
|
279 |
} |
|
280 |
#else |
|
281 |
if (strstart(filename, "/dev/cdrom", NULL)) |
|
282 |
return bdrv_find_format("host_device"); |
|
283 |
#endif |
|
258 |
int score_max = 0, score; |
|
259 |
BlockDriver *drv = NULL, *d; |
|
284 | 260 |
|
285 |
if (stat(filename, &st) >= 0 && |
|
286 |
(S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode))) { |
|
287 |
return bdrv_find_format("host_device"); |
|
261 |
for (d = first_drv; d; d = d->next) { |
|
262 |
if (d->bdrv_probe_device) { |
|
263 |
score = d->bdrv_probe_device(filename); |
|
264 |
if (score > score_max) { |
|
265 |
score_max = score; |
|
266 |
drv = d; |
|
267 |
} |
|
268 |
} |
|
288 | 269 |
} |
289 | 270 |
|
290 |
return NULL;
|
|
271 |
return drv;
|
|
291 | 272 |
} |
292 |
#endif |
|
293 | 273 |
|
294 | 274 |
static BlockDriver *find_image_format(const char *filename) |
295 | 275 |
{ |
b/block/raw-posix.c | ||
---|---|---|
953 | 953 |
|
954 | 954 |
#endif |
955 | 955 |
|
956 |
static int hdev_probe_device(const char *filename) |
|
957 |
{ |
|
958 |
struct stat st; |
|
959 |
|
|
960 |
/* allow a dedicated CD-ROM driver to match with a higher priority */ |
|
961 |
if (strstart(filename, "/dev/cdrom", NULL)) |
|
962 |
return 50; |
|
963 |
|
|
964 |
if (stat(filename, &st) >= 0 && |
|
965 |
(S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode))) { |
|
966 |
return 100; |
|
967 |
} |
|
968 |
|
|
969 |
return 0; |
|
970 |
} |
|
971 |
|
|
956 | 972 |
static int hdev_open(BlockDriverState *bs, const char *filename, int flags) |
957 | 973 |
{ |
958 | 974 |
BDRVRawState *s = bs->opaque; |
... | ... | |
1152 | 1168 |
static BlockDriver bdrv_host_device = { |
1153 | 1169 |
.format_name = "host_device", |
1154 | 1170 |
.instance_size = sizeof(BDRVRawState), |
1171 |
.bdrv_probe_device = hdev_probe_device, |
|
1155 | 1172 |
.bdrv_open = hdev_open, |
1156 | 1173 |
.bdrv_close = raw_close, |
1157 | 1174 |
.bdrv_create = hdev_create, |
... | ... | |
1197 | 1214 |
return 0; |
1198 | 1215 |
} |
1199 | 1216 |
|
1217 |
static int floppy_probe_device(const char *filename) |
|
1218 |
{ |
|
1219 |
if (strstart(filename, "/dev/fd", NULL)) |
|
1220 |
return 100; |
|
1221 |
return 0; |
|
1222 |
} |
|
1223 |
|
|
1224 |
|
|
1200 | 1225 |
static int floppy_is_inserted(BlockDriverState *bs) |
1201 | 1226 |
{ |
1202 | 1227 |
return fd_open(bs) >= 0; |
... | ... | |
1242 | 1267 |
static BlockDriver bdrv_host_floppy = { |
1243 | 1268 |
.format_name = "host_floppy", |
1244 | 1269 |
.instance_size = sizeof(BDRVRawState), |
1270 |
.bdrv_probe_device = floppy_probe_device, |
|
1245 | 1271 |
.bdrv_open = floppy_open, |
1246 | 1272 |
.bdrv_close = raw_close, |
1247 | 1273 |
.bdrv_create = hdev_create, |
... | ... | |
1279 | 1305 |
return raw_open_common(bs, filename, flags); |
1280 | 1306 |
} |
1281 | 1307 |
|
1308 |
static int cdrom_probe_device(const char *filename) |
|
1309 |
{ |
|
1310 |
if (strstart(filename, "/dev/cd", NULL)) |
|
1311 |
return 100; |
|
1312 |
return 0; |
|
1313 |
} |
|
1314 |
|
|
1282 | 1315 |
static int cdrom_is_inserted(BlockDriverState *bs) |
1283 | 1316 |
{ |
1284 | 1317 |
BDRVRawState *s = bs->opaque; |
... | ... | |
1323 | 1356 |
static BlockDriver bdrv_host_cdrom = { |
1324 | 1357 |
.format_name = "host_cdrom", |
1325 | 1358 |
.instance_size = sizeof(BDRVRawState), |
1359 |
.bdrv_probe_device = cdrom_probe_device, |
|
1326 | 1360 |
.bdrv_open = cdrom_open, |
1327 | 1361 |
.bdrv_close = raw_close, |
1328 | 1362 |
.bdrv_create = hdev_create, |
... | ... | |
1367 | 1401 |
return 0; |
1368 | 1402 |
} |
1369 | 1403 |
|
1404 |
static int cdrom_probe_device(const char *filename) |
|
1405 |
{ |
|
1406 |
if (strstart(filename, "/dev/cd", NULL) || |
|
1407 |
strstart(filename, "/dev/acd", NULL)) |
|
1408 |
return 100; |
|
1409 |
return 0; |
|
1410 |
} |
|
1411 |
|
|
1370 | 1412 |
static int cdrom_reopen(BlockDriverState *bs) |
1371 | 1413 |
{ |
1372 | 1414 |
BDRVRawState *s = bs->opaque; |
... | ... | |
1437 | 1479 |
static BlockDriver bdrv_host_cdrom = { |
1438 | 1480 |
.format_name = "host_cdrom", |
1439 | 1481 |
.instance_size = sizeof(BDRVRawState), |
1482 |
.bdrv_probe_device = cdrom_probe_device, |
|
1440 | 1483 |
.bdrv_open = cdrom_open, |
1441 | 1484 |
.bdrv_close = raw_close, |
1442 | 1485 |
.bdrv_create = hdev_create, |
... | ... | |
1466 | 1509 |
|
1467 | 1510 |
static void bdrv_raw_init(void) |
1468 | 1511 |
{ |
1512 |
/* |
|
1513 |
* Register all the drivers. Note that order is important, the driver |
|
1514 |
* registered last will get probed first. |
|
1515 |
*/ |
|
1469 | 1516 |
bdrv_register(&bdrv_raw); |
1470 | 1517 |
bdrv_register(&bdrv_host_device); |
1471 | 1518 |
#ifdef __linux__ |
b/block/raw-win32.c | ||
---|---|---|
306 | 306 |
} |
307 | 307 |
} |
308 | 308 |
|
309 |
static int hdev_probe_device(const char *filename) |
|
310 |
{ |
|
311 |
if (strstart(filename, "/dev/cdrom", NULL)) |
|
312 |
return 100; |
|
313 |
if (is_windows_drive(filename)) |
|
314 |
return 100; |
|
315 |
return 0; |
|
316 |
} |
|
317 |
|
|
309 | 318 |
static int hdev_open(BlockDriverState *bs, const char *filename, int flags) |
310 | 319 |
{ |
311 | 320 |
BDRVRawState *s = bs->opaque; |
... | ... | |
391 | 400 |
static BlockDriver bdrv_host_device = { |
392 | 401 |
.format_name = "host_device", |
393 | 402 |
.instance_size = sizeof(BDRVRawState), |
403 |
.bdrv_probe_device = hdev_probe_device, |
|
394 | 404 |
.bdrv_open = hdev_open, |
395 | 405 |
.bdrv_close = raw_close, |
396 | 406 |
.bdrv_flush = raw_flush, |
b/block_int.h | ||
---|---|---|
48 | 48 |
const char *format_name; |
49 | 49 |
int instance_size; |
50 | 50 |
int (*bdrv_probe)(const uint8_t *buf, int buf_size, const char *filename); |
51 |
int (*bdrv_probe_device)(const char *filename); |
|
51 | 52 |
int (*bdrv_open)(BlockDriverState *bs, const char *filename, int flags); |
52 | 53 |
int (*bdrv_read)(BlockDriverState *bs, int64_t sector_num, |
53 | 54 |
uint8_t *buf, int nb_sectors); |
... | ... | |
177 | 178 |
|
178 | 179 |
extern BlockDriverState *bdrv_first; |
179 | 180 |
|
181 |
#ifdef _WIN32 |
|
182 |
int is_windows_drive(const char *filename); |
|
183 |
#endif |
|
184 |
|
|
180 | 185 |
#endif /* BLOCK_INT_H */ |
Also available in: Unified diff