On 13 January 2015 at 20:07, Programmingkid <programmingk...@gmail.com> wrote: > 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
This fixes the "make check" problem, but you're not catching the possibility of lseek failing. (Also the if() statements are all missing braces our coding style requires.) You can avoid that bool flag like this: { uint64_t sectors = 0; uint32_t sector_size = 0; if (ioctl(fd, DKIOCGETBLOCKCOUNT, §ors) == 0 && ioctl(fd, DKIOCGETBLOCKSIZE, §or_size) == 0) { size = sectors * sector_size; } else { size = lseek(fd, 0LL, SEEK_END); if (size < 0) { return -errno; } } } thanks -- PMM