Re: [Qemu-block] ping Re: [PATCH v12] block/raw-posix.c: Make physical devices usable in QEMU under Mac OS X host
On Jan 4, 2016, at 11:35 AM, Max Reitz wrote: > On 29.12.2015 01:27, Programmingkid wrote: >> I do realize you are busy Kevin, but I would >> appreciate knowing my patch is in line >> for review. > > Primarily, he's been on holiday since before christmas until next week. > > (I'm telling you so you don't wonder why nothing happens.) > > Max > Thank you very much. I guess I have been a little frustrated with this patch. I have been trying to have it submitted into QEMU since August 2015!
Re: [Qemu-block] ping Re: [PATCH v12] block/raw-posix.c: Make physical devices usable in QEMU under Mac OS X host
On 29.12.2015 01:27, Programmingkid wrote: > I do realize you are busy Kevin, but I would > appreciate knowing my patch is in line > for review. Primarily, he's been on holiday since before christmas until next week. (I'm telling you so you don't wonder why nothing happens.) Max signature.asc Description: OpenPGP digital signature
[Qemu-block] ping Re: [PATCH v12] block/raw-posix.c: Make physical devices usable in QEMU under Mac OS X host
I do realize you are busy Kevin, but I would appreciate knowing my patch is in line for review. https://patchwork.ozlabs.org/patch/555945/ On Dec 11, 2015, at 10:27 PM, Programmingkid wrote: > Mac OS X can be picky when it comes to allowing the user > to use physical devices in QEMU. Most mounted volumes > appear to be off limits to QEMU. If an issue is detected, > a message is displayed showing the user how to unmount a > volume. Now QEMU uses both CD and DVD media. > > Signed-off-by: John Arbuckle > > --- > Removed mediaType parameter from FindEjectableOpticalMedia(). > Added goto statements to hdev_open. > Replaced snprintf() with g_strdup() in FindEjectableOpticalMedia(). > Put back return statement in hdev_open for Linux compatibility. > > block/raw-posix.c | 163 - > 1 files changed, 124 insertions(+), 39 deletions(-) > > diff --git a/block/raw-posix.c b/block/raw-posix.c > index d9162fd..82e8e62 100644 > --- a/block/raw-posix.c > +++ b/block/raw-posix.c > @@ -43,6 +43,7 @@ > #include > #include > //#include > +#include > #include > #endif > > @@ -1975,33 +1976,46 @@ BlockDriver bdrv_file = { > /* host device */ > > #if defined(__APPLE__) && defined(__MACH__) > -static kern_return_t FindEjectableCDMedia( io_iterator_t *mediaIterator ); > static kern_return_t GetBSDPath(io_iterator_t mediaIterator, char *bsdPath, >CFIndex maxPathSize, int flags); > -kern_return_t FindEjectableCDMedia( io_iterator_t *mediaIterator ) > +static char *FindEjectableOpticalMedia(io_iterator_t *mediaIterator) > { > -kern_return_t kernResult; > +kern_return_t kernResult = KERN_FAILURE; >mach_port_t masterPort; >CFMutableDictionaryRef classesToMatch; > +const char *matching_array[] = {kIODVDMediaClass, kIOCDMediaClass}; > +char *mediaType = NULL; > >kernResult = IOMasterPort( MACH_PORT_NULL, &masterPort ); >if ( KERN_SUCCESS != kernResult ) { >printf( "IOMasterPort returned %d\n", kernResult ); >} > > -classesToMatch = IOServiceMatching( kIOCDMediaClass ); > -if ( classesToMatch == NULL ) { > -printf( "IOServiceMatching returned a NULL dictionary.\n" ); > -} else { > -CFDictionarySetValue( classesToMatch, CFSTR( kIOMediaEjectableKey ), > kCFBooleanTrue ); > -} > -kernResult = IOServiceGetMatchingServices( masterPort, classesToMatch, > mediaIterator ); > -if ( KERN_SUCCESS != kernResult ) > -{ > -printf( "IOServiceGetMatchingServices returned %d\n", kernResult ); > -} > +int index; > +for (index = 0; index < ARRAY_SIZE(matching_array); index++) { > +classesToMatch = IOServiceMatching(matching_array[index]); > +if (classesToMatch == NULL) { > +error_report("IOServiceMatching returned NULL for %s", > + matching_array[index]); > +continue; > +} > +CFDictionarySetValue(classesToMatch, CFSTR(kIOMediaEjectableKey), > + kCFBooleanTrue); > +kernResult = IOServiceGetMatchingServices(masterPort, classesToMatch, > + mediaIterator); > +if (kernResult != KERN_SUCCESS) { > +error_report("Note: IOServiceGetMatchingServices returned %d", > + kernResult); > +} > > -return kernResult; > +/* If a match was found, leave the loop */ > +if (*mediaIterator != 0) { > +DPRINTF("Matching using %s\n", matching_array[index]); > +mediaType = g_strdup(matching_array[index]); > +break; > +} > +} > +return mediaType; > } > > kern_return_t GetBSDPath(io_iterator_t mediaIterator, char *bsdPath, > @@ -2033,7 +2047,35 @@ kern_return_t GetBSDPath(io_iterator_t mediaIterator, > char *bsdPath, >return kernResult; > } > > -#endif > +/* Sets up a real cdrom for use in QEMU */ > +static bool setup_cdrom(char *bsd_path, Error **errp) > +{ > +int index, num_of_test_partitions = 2, fd; > +char test_partition[MAXPATHLEN]; > +bool partition_found = false; > + > +/* look for a working partition */ > +for (index = 0; index < num_of_test_partitions; index++) { > +snprintf(test_partition, sizeof(test_partition), "%ss%d", bsd_path, > + index); > +fd = qemu_open(test_partition, O_RDONLY | O_BINARY | O_LARGEFILE); > +if (fd >= 0) { > +partition_found = true; > +qemu_close(fd); > +break; > +} > +} > + > +/* if a working partition on the device was not found */ > +if (partition_found == false) { > +error_setg(errp, "Failed to find a working partition on disc"); > +} else { > +DPRINTF("Using %s as optical disc\n", test_partition); > +pstrcpy(bsd_path, MAXPATHLEN, test_partition); > +} > +return partition_found; > +} > +#endif /*
[Qemu-block] ping Re: [PATCH v12] block/raw-posix.c: Make physical devices usable in QEMU under Mac OS X host
https://patchwork.ozlabs.org/patch/555945/ On Dec 11, 2015, at 10:27 PM, Programmingkid wrote: > Mac OS X can be picky when it comes to allowing the user > to use physical devices in QEMU. Most mounted volumes > appear to be off limits to QEMU. If an issue is detected, > a message is displayed showing the user how to unmount a > volume. Now QEMU uses both CD and DVD media. > > Signed-off-by: John Arbuckle > > --- > Removed mediaType parameter from FindEjectableOpticalMedia(). > Added goto statements to hdev_open. > Replaced snprintf() with g_strdup() in FindEjectableOpticalMedia(). > Put back return statement in hdev_open for Linux compatibility. > > block/raw-posix.c | 163 - > 1 files changed, 124 insertions(+), 39 deletions(-) > > diff --git a/block/raw-posix.c b/block/raw-posix.c > index d9162fd..82e8e62 100644 > --- a/block/raw-posix.c > +++ b/block/raw-posix.c > @@ -43,6 +43,7 @@ > #include > #include > //#include > +#include > #include > #endif > > @@ -1975,33 +1976,46 @@ BlockDriver bdrv_file = { > /* host device */ > > #if defined(__APPLE__) && defined(__MACH__) > -static kern_return_t FindEjectableCDMedia( io_iterator_t *mediaIterator ); > static kern_return_t GetBSDPath(io_iterator_t mediaIterator, char *bsdPath, > CFIndex maxPathSize, int flags); > -kern_return_t FindEjectableCDMedia( io_iterator_t *mediaIterator ) > +static char *FindEjectableOpticalMedia(io_iterator_t *mediaIterator) > { > -kern_return_t kernResult; > +kern_return_t kernResult = KERN_FAILURE; > mach_port_t masterPort; > CFMutableDictionaryRef classesToMatch; > +const char *matching_array[] = {kIODVDMediaClass, kIOCDMediaClass}; > +char *mediaType = NULL; > > kernResult = IOMasterPort( MACH_PORT_NULL, &masterPort ); > if ( KERN_SUCCESS != kernResult ) { > printf( "IOMasterPort returned %d\n", kernResult ); > } > > -classesToMatch = IOServiceMatching( kIOCDMediaClass ); > -if ( classesToMatch == NULL ) { > -printf( "IOServiceMatching returned a NULL dictionary.\n" ); > -} else { > -CFDictionarySetValue( classesToMatch, CFSTR( kIOMediaEjectableKey ), > kCFBooleanTrue ); > -} > -kernResult = IOServiceGetMatchingServices( masterPort, classesToMatch, > mediaIterator ); > -if ( KERN_SUCCESS != kernResult ) > -{ > -printf( "IOServiceGetMatchingServices returned %d\n", kernResult ); > -} > +int index; > +for (index = 0; index < ARRAY_SIZE(matching_array); index++) { > +classesToMatch = IOServiceMatching(matching_array[index]); > +if (classesToMatch == NULL) { > +error_report("IOServiceMatching returned NULL for %s", > + matching_array[index]); > +continue; > +} > +CFDictionarySetValue(classesToMatch, CFSTR(kIOMediaEjectableKey), > + kCFBooleanTrue); > +kernResult = IOServiceGetMatchingServices(masterPort, classesToMatch, > + mediaIterator); > +if (kernResult != KERN_SUCCESS) { > +error_report("Note: IOServiceGetMatchingServices returned %d", > + kernResult); > +} > > -return kernResult; > +/* If a match was found, leave the loop */ > +if (*mediaIterator != 0) { > +DPRINTF("Matching using %s\n", matching_array[index]); > +mediaType = g_strdup(matching_array[index]); > +break; > +} > +} > +return mediaType; > } > > kern_return_t GetBSDPath(io_iterator_t mediaIterator, char *bsdPath, > @@ -2033,7 +2047,35 @@ kern_return_t GetBSDPath(io_iterator_t mediaIterator, > char *bsdPath, > return kernResult; > } > > -#endif > +/* Sets up a real cdrom for use in QEMU */ > +static bool setup_cdrom(char *bsd_path, Error **errp) > +{ > +int index, num_of_test_partitions = 2, fd; > +char test_partition[MAXPATHLEN]; > +bool partition_found = false; > + > +/* look for a working partition */ > +for (index = 0; index < num_of_test_partitions; index++) { > +snprintf(test_partition, sizeof(test_partition), "%ss%d", bsd_path, > + index); > +fd = qemu_open(test_partition, O_RDONLY | O_BINARY | O_LARGEFILE); > +if (fd >= 0) { > +partition_found = true; > +qemu_close(fd); > +break; > +} > +} > + > +/* if a working partition on the device was not found */ > +if (partition_found == false) { > +error_setg(errp, "Failed to find a working partition on disc"); > +} else { > +DPRINTF("Using %s as optical disc\n", test_partition); > +pstrcpy(bsd_path, MAXPATHLEN, test_partition); > +} > +return partition_found; > +} > +#endif /* defined(__APPLE__) && defined(__MACH__) */ > > static int hdev_probe_device(const char *