patch #6548: fix osx handling. See that for more information

This commit is contained in:
rocky
2008-10-17 11:58:52 +00:00
parent f3d2efe51b
commit 6ab1f8e448

View File

@@ -1,5 +1,5 @@
/* /*
$Id: osx.c,v 1.13 2008/08/30 06:55:50 rocky Exp $ $Id: osx.c,v 1.14 2008/10/17 11:58:52 rocky Exp $
Copyright (C) 2003, 2004, 2005, 2006, 2008 Rocky Bernstein <rocky@gnu.org> Copyright (C) 2003, 2004, 2005, 2006, 2008 Rocky Bernstein <rocky@gnu.org>
from vcdimager code: from vcdimager code:
@@ -33,7 +33,7 @@
#include "config.h" #include "config.h"
#endif #endif
static const char _rcsid[] = "$Id: osx.c,v 1.13 2008/08/30 06:55:50 rocky Exp $"; static const char _rcsid[] = "$Id: osx.c,v 1.14 2008/10/17 11:58:52 rocky Exp $";
#include <cdio/logging.h> #include <cdio/logging.h>
#include <cdio/sector.h> #include <cdio/sector.h>
@@ -246,43 +246,38 @@ get_scsi(_img_private_t *p_env)
static bool static bool
init_osx(_img_private_t *p_env) { init_osx(_img_private_t *p_env) {
mach_port_t port;
char *psz_devname; char *psz_devname;
kern_return_t ret; kern_return_t ret;
io_iterator_t iterator; io_iterator_t iterator;
p_env->gen.fd = open( p_env->gen.source_name, O_RDONLY | O_NONBLOCK ); /* Only open if not already opened. Otherwise, too many descriptors
are holding the device busy. */
if (-1 == p_env->gen.fd)
p_env->gen.fd = open( p_env->gen.source_name, O_RDONLY | O_NONBLOCK );
if (-1 == p_env->gen.fd) { if (-1 == p_env->gen.fd) {
cdio_warn("Failed to open %s: %s", p_env->gen.source_name, cdio_warn("Failed to open %s: %s", p_env->gen.source_name,
strerror(errno)); strerror(errno));
return false; return false;
} }
/* get the device name */ /* Get the device name. */
psz_devname = strrchr( p_env->gen.source_name, '/'); psz_devname = strrchr( p_env->gen.source_name, '/');
if( NULL != psz_devname ) if( NULL != psz_devname )
++psz_devname; ++psz_devname;
else else
psz_devname = p_env->gen.source_name; psz_devname = p_env->gen.source_name;
/* unraw the device name */ /* Unraw the device name. */
if( *psz_devname == 'r' ) if( *psz_devname == 'r' )
++psz_devname; ++psz_devname;
/* get port for IOKit communication */ ret = IOServiceGetMatchingServices( kIOMasterPortDefault,
ret = IOMasterPort( MACH_PORT_NULL, &port ); IOBSDNameMatching(kIOMasterPortDefault,
0, psz_devname),
if( ret != KERN_SUCCESS )
{
cdio_warn( "IOMasterPort: 0x%08x", ret );
return false;
}
ret = IOServiceGetMatchingServices( port,
IOBSDNameMatching(port, 0, psz_devname),
&iterator ); &iterator );
/* get service iterator for the device */ /* Get service iterator for the device. */
if( ret != KERN_SUCCESS ) if( ret != KERN_SUCCESS )
{ {
cdio_warn( "IOServiceGetMatchingServices: 0x%08x", ret ); cdio_warn( "IOServiceGetMatchingServices: 0x%08x", ret );
@@ -874,10 +869,13 @@ static void
_free_osx (void *p_user_data) { _free_osx (void *p_user_data) {
_img_private_t *p_env = p_user_data; _img_private_t *p_env = p_user_data;
if (NULL == p_env) return; if (NULL == p_env) return;
if (p_env->gen.fd != -1)
close(p_env->gen.fd);
if (p_env->MediaClass_service)
IOObjectRelease( p_env->MediaClass_service );
cdio_generic_free(p_env); cdio_generic_free(p_env);
if (NULL != p_env->pp_lba) free((void *) p_env->pp_lba); if (NULL != p_env->pp_lba) free((void *) p_env->pp_lba);
if (NULL != p_env->pTOC) free((void *) p_env->pTOC); if (NULL != p_env->pTOC) free((void *) p_env->pTOC);
IOObjectRelease( p_env->MediaClass_service );
if (p_env->scsi_task) if (p_env->scsi_task)
(*p_env->scsi_task)->Release(p_env->scsi_task); (*p_env->scsi_task)->Release(p_env->scsi_task);
@@ -895,8 +893,6 @@ _free_osx (void *p_user_data) {
if (p_env->plugin) if (p_env->plugin)
IODestroyPlugInInterface(p_env->plugin); IODestroyPlugInInterface(p_env->plugin);
IOObjectRelease(p_env->MediaClass_service);
} }
/*! /*!
@@ -1173,10 +1169,12 @@ read_toc_osx (void *p_user_data)
CFDataGetBytes( data, range, (u_char *) p_env->pTOC ); CFDataGetBytes( data, range, (u_char *) p_env->pTOC );
} else { } else {
cdio_warn( "Trouble allocating CDROM TOC" ); cdio_warn( "Trouble allocating CDROM TOC" );
CFRelease( propertiesDict );
return false; return false;
} }
} else { } else {
cdio_warn( "Trouble reading TOC" ); cdio_warn( "Trouble reading TOC" );
CFRelease( propertiesDict );
return false; return false;
} }
@@ -1391,16 +1389,19 @@ static void media_eject_callback(DADiskRef disk, DADissenterRef dissenter, void
if ( dissenter ) if ( dissenter )
{ {
CFStringRef status = DADissenterGetStatusString(dissenter); CFStringRef status = DADissenterGetStatusString(dissenter);
size_t cstr_size = CFStringGetLength(status); if (status)
char *cstr = malloc(cstr_size); {
if ( CFStringGetCString( status, size_t cstr_size = CFStringGetLength(status);
char *cstr = malloc(cstr_size);
if ( CFStringGetCString( status,
cstr, cstr_size, cstr, cstr_size,
kCFStringEncodingASCII ) ) kCFStringEncodingASCII ) )
CFRelease( status ); CFRelease( status );
cdio_warn("%s", cstr); cdio_warn("%s", cstr);
free(cstr); free(cstr);
}
} }
dacontext->result = (dissenter ? DRIVER_OP_ERROR : DRIVER_OP_SUCCESS); dacontext->result = (dissenter ? DRIVER_OP_ERROR : DRIVER_OP_SUCCESS);
@@ -1441,6 +1442,10 @@ _eject_media_osx (void *user_data) {
return DRIVER_OP_ERROR; return DRIVER_OP_ERROR;
} }
if (p_env->gen.fd != -1)
close(p_env->gen.fd);
p_env->gen.fd = -1;
dacontext.result = DRIVER_OP_UNINIT; dacontext.result = DRIVER_OP_UNINIT;
dacontext.completed = FALSE; dacontext.completed = FALSE;
dacontext.runloop = CFRunLoopGetCurrent(); dacontext.runloop = CFRunLoopGetCurrent();
@@ -1715,7 +1720,7 @@ cdio_get_devices_osx(void)
return( NULL ); return( NULL );
} }
classes_to_match = IOServiceMatching( kIOCDMediaClass ); classes_to_match = IOServiceMatching( kIOMediaClass );
if( classes_to_match == NULL ) if( classes_to_match == NULL )
{ {
return( NULL ); return( NULL );
@@ -1786,18 +1791,11 @@ cdio_get_default_device_osx(void)
return NULL; return NULL;
#else #else
io_object_t next_media; io_object_t next_media;
mach_port_t master_port;
kern_return_t kern_result; kern_return_t kern_result;
io_iterator_t media_iterator; io_iterator_t media_iterator;
CFMutableDictionaryRef classes_to_match; CFMutableDictionaryRef classes_to_match;
kern_result = IOMasterPort( MACH_PORT_NULL, &master_port ); classes_to_match = IOServiceMatching( kIOMediaClass );
if( kern_result != KERN_SUCCESS )
{
return( NULL );
}
classes_to_match = IOServiceMatching( kIOCDMediaClass );
if( classes_to_match == NULL ) if( classes_to_match == NULL )
{ {
return( NULL ); return( NULL );
@@ -1806,7 +1804,7 @@ cdio_get_default_device_osx(void)
CFDictionarySetValue( classes_to_match, CFSTR(kIOMediaEjectableKey), CFDictionarySetValue( classes_to_match, CFSTR(kIOMediaEjectableKey),
kCFBooleanTrue ); kCFBooleanTrue );
kern_result = IOServiceGetMatchingServices( master_port, kern_result = IOServiceGetMatchingServices( kIOMasterPortDefault,
classes_to_match, classes_to_match,
&media_iterator ); &media_iterator );
if( kern_result != KERN_SUCCESS ) if( kern_result != KERN_SUCCESS )
@@ -1881,7 +1879,6 @@ cdio_open_am_osx (const char *psz_source_name, const char *psz_access_mode)
CdIo_t * CdIo_t *
cdio_open_osx (const char *psz_orig_source) cdio_open_osx (const char *psz_orig_source)
{ {
#ifdef HAVE_DARWIN_CDROM #ifdef HAVE_DARWIN_CDROM
CdIo_t *ret; CdIo_t *ret;
_img_private_t *_data; _img_private_t *_data;
@@ -1958,8 +1955,7 @@ cdio_open_osx (const char *psz_orig_source)
return NULL; return NULL;
} }
ret->driver_id = DRIVER_OSX; ret->driver_id = DRIVER_OSX;
if (cdio_generic_init(_data, O_RDONLY | O_NONBLOCK) && init_osx(_data))
if (cdio_generic_init(_data, O_RDONLY) && init_osx(_data))
return ret; return ret;
else { else {
cdio_generic_free (_data); cdio_generic_free (_data);