Allows QEMU on Mac OS X to use a real cdrom again. Signed-off-by: John Arbuckle <programmingk...@gmail.com>
--- Added fallback code - uses lseek() if ioctl() fails. block/raw-posix.c | 25 ++++++++++++++++++++++++- 1 files changed, 24 insertions(+), 1 deletions(-) diff --git a/block/raw-posix.c b/block/raw-posix.c index e51293a..5815707 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -1312,7 +1312,30 @@ again: if (size == 0) #endif #if defined(__APPLE__) && defined(__MACH__) - size = LLONG_MAX; + { + uint64_t sectors = 0; + uint32_t sector_size = 0; + bool ioctl_problem = false; + ret = 0; + + /* Query the number of sectors on the disk */ + ret = ioctl(fd, DKIOCGETBLOCKCOUNT, §ors); + if (ret != 0) + ioctl_problem = true; + + /* Query the size of each sector */ + ret = ioctl(fd, DKIOCGETBLOCKSIZE, §or_size); + if (ret != 0) + ioctl_problem = true; + + /* If everything is ok */ + if (ioctl_problem == false) + size = sectors * sector_size; + + /* If a problem occurred with ioctl(), fallback to lseek() */ + else + size = lseek(fd, 0LL, SEEK_END); + } #else size = lseek(fd, 0LL, SEEK_END); if (size < 0) { -- 1.7.5.4