diff --git a/include/cdio/logging.h b/include/cdio/logging.h index c606738b..13f44f6f 100644 --- a/include/cdio/logging.h +++ b/include/cdio/logging.h @@ -1,5 +1,5 @@ /* - $Id: logging.h,v 1.2 2003/04/21 14:13:54 hvr Exp $ + $Id: logging.h,v 1.3 2003/10/05 14:48:07 rocky Exp $ Copyright (C) 2000 Herbert Valerio Riedel @@ -31,6 +31,8 @@ typedef enum { CDIO_LOG_ASSERT } cdio_log_level_t; +extern int cdio_loglevel_default; + void cdio_log (cdio_log_level_t level, const char format[], ...) GNUC_PRINTF(2, 3); diff --git a/lib/_cdio_osx.c b/lib/_cdio_osx.c index 455f619f..82fcca90 100644 --- a/lib/_cdio_osx.c +++ b/lib/_cdio_osx.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_osx.c,v 1.9 2003/10/04 20:11:27 rocky Exp $ + $Id: _cdio_osx.c,v 1.10 2003/10/05 14:47:45 rocky Exp $ Copyright (C) 2003 Rocky Bernstein from vcdimager code Copyright (C) 2001 Herbert Valerio Riedel @@ -31,7 +31,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_osx.c,v 1.9 2003/10/04 20:11:27 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_osx.c,v 1.10 2003/10/05 14:47:45 rocky Exp $"; #include #include @@ -603,7 +603,7 @@ _cdio_get_track_green(void *env, track_t track_num) return ((_obj->tocent[track_num-1].cdte_ctrl & 2) != 0); #else /* FIXME! Figure out how to do. */ - return false; + return true; #endif } @@ -612,10 +612,166 @@ _cdio_get_track_green(void *env, track_t track_num) /*! Return a string containing the default CD device if none is specified. */ -char * -cdio_get_default_device_osx() +char ** +cdio_get_devices_osx(void) { - return strdup(DEFAULT_CDIO_DEVICE); +#ifndef HAVE_DARWIN_CDROM + return NULL; +#else + io_object_t next_media; + mach_port_t master_port; + kern_return_t kern_result; + io_iterator_t media_iterator; + CFMutableDictionaryRef classes_to_match; + char **drives = NULL; + unsigned int num_drives=0; + + kern_result = IOMasterPort( MACH_PORT_NULL, &master_port ); + if( kern_result != KERN_SUCCESS ) + { + return( nil ); + } + + classes_to_match = IOServiceMatching( kIOCDMediaClass ); + if( classes_to_match == NULL ) + { + return( nil ); + } + + CFDictionarySetValue( classes_to_match, CFSTR(kIOMediaEjectable), + kCFBooleanTrue ); + + kern_result = IOServiceGetMatchingServices( master_port, + classes_to_match, + &media_iterator ); + if( kern_result != KERN_SUCCESS ) + { + return( nil ); + } + + next_media = IOIteratorNext( media_iterator ); + if( next_media != 0 ) + { + char psz_buf[0x32]; + size_t dev_path_length; + CFTypeRef str_bsd_path; + + do + { + str_bsd_path = IORegistryEntryCreateCFProperty( next_media, + CFSTR( kIOBSDName ), + kCFAllocatorDefault, + 0 ); + if( str_bsd_path == NULL ) + { + IOObjectRelease( next_media ); + continue; + } + + snprintf( psz_buf, sizeof(psz_buf), "%s%c", _PATH_DEV, 'r' ); + dev_path_length = strlen( psz_buf ); + + if( CFStringGetCString( str_bsd_path, + (char*)&psz_buf + dev_path_length, + sizeof(psz_buf) - dev_path_length, + kCFStringEncodingASCII ) ) + { + CFRelease( str_bsd_path ); + IOObjectRelease( next_media ); + IOObjectRelease( media_iterator ); + cdio_add_device_list(&drives, psz_buf, &num_drives); + } + + CFRelease( str_bsd_path ); + IOObjectRelease( next_media ); + + } while( ( next_media = IOIteratorNext( media_iterator ) ) != 0 ); + } + IOObjectRelease( media_iterator ); + cdio_add_device_list(&drives, NULL, &num_drives); + return drives; +#endif /* HAVE_DARWIN_CDROM */ +} + +/*! + Return a string containing the default CD device if none is specified. + */ +char * +cdio_get_default_device_osx(void) +{ +#ifndef HAVE_DARWIN_CDROM + return NULL; +#else + io_object_t next_media; + mach_port_t master_port; + kern_return_t kern_result; + io_iterator_t media_iterator; + CFMutableDictionaryRef classes_to_match; + + kern_result = IOMasterPort( MACH_PORT_NULL, &master_port ); + if( kern_result != KERN_SUCCESS ) + { + return( nil ); + } + + classes_to_match = IOServiceMatching( kIOCDMediaClass ); + if( classes_to_match == NULL ) + { + return( nil ); + } + + CFDictionarySetValue( classes_to_match, CFSTR(kIOMediaEjectable), + kCFBooleanTrue ); + + kern_result = IOServiceGetMatchingServices( master_port, + classes_to_match, + &media_iterator ); + if( kern_result != KERN_SUCCESS ) + { + return( nil ); + } + + next_media = IOIteratorNext( media_iterator ); + if( next_media != 0 ) + { + char psz_buf[0x32]; + size_t dev_path_length; + CFTypeRef str_bsd_path; + + do + { + str_bsd_path = IORegistryEntryCreateCFProperty( next_media, + CFSTR( kIOBSDName ), + kCFAllocatorDefault, + 0 ); + if( str_bsd_path == NULL ) + { + IOObjectRelease( next_media ); + continue; + } + + snprintf( psz_buf, sizeof(psz_buf), "%s%c", _PATH_DEV, 'r' ); + dev_path_length = strlen( psz_buf ); + + if( CFStringGetCString( str_bsd_path, + (char*)&psz_buf + dev_path_length, + sizeof(psz_buf) - dev_path_length, + kCFStringEncodingASCII ) ) + { + CFRelease( str_bsd_path ); + IOObjectRelease( next_media ); + IOObjectRelease( media_iterator ); + return strdup( psz_buf ); + } + + CFRelease( str_bsd_path ); + IOObjectRelease( next_media ); + + } while( ( next_media = IOIteratorNext( media_iterator ) ) != 0 ); + } + IOObjectRelease( media_iterator ); + return NULL; +#endif /* HAVE_DARWIN_CDROM */ } /*! @@ -636,6 +792,7 @@ cdio_open_osx (const char *source_name) .free = _cdio_osx_free, .get_arg = _cdio_get_arg, .get_default_device = cdio_get_default_device_osx, + .get_devices = cdio_get_devices_osx, .get_first_track_num= _cdio_get_first_track_num, .get_mcn = NULL, /*there is a readMCN, but how to use? */ .get_num_tracks = _cdio_get_num_tracks, diff --git a/lib/logging.c b/lib/logging.c index 642eb34d..385b4839 100644 --- a/lib/logging.c +++ b/lib/logging.c @@ -1,5 +1,5 @@ /* - $Id: logging.c,v 1.2 2003/04/22 12:09:09 rocky Exp $ + $Id: logging.c,v 1.3 2003/10/05 14:47:45 rocky Exp $ Copyright (C) 2000 Herbert Valerio Riedel @@ -30,7 +30,9 @@ #include "cdio_assert.h" -static const char _rcsid[] = "$Id: logging.c,v 1.2 2003/04/22 12:09:09 rocky Exp $"; +static const char _rcsid[] = "$Id: logging.c,v 1.3 2003/10/05 14:47:45 rocky Exp $"; + +int cdio_loglevel_default = CDIO_LOG_WARN; static void default_cdio_log_handler (cdio_log_level_t level, const char message[]) @@ -38,22 +40,32 @@ default_cdio_log_handler (cdio_log_level_t level, const char message[]) switch (level) { case CDIO_LOG_ERROR: - fprintf (stderr, "**ERROR: %s\n", message); - fflush (stderr); + if (level >= cdio_loglevel_default) { + fprintf (stderr, "**ERROR: %s\n", message); + fflush (stderr); + } exit (EXIT_FAILURE); break; case CDIO_LOG_DEBUG: - fprintf (stdout, "--DEBUG: %s\n", message); + if (level >= cdio_loglevel_default) { + fprintf (stdout, "--DEBUG: %s\n", message); + } break; case CDIO_LOG_WARN: - fprintf (stdout, "++ WARN: %s\n", message); + if (level >= cdio_loglevel_default) { + fprintf (stdout, "++ WARN: %s\n", message); + } break; case CDIO_LOG_INFO: - fprintf (stdout, " INFO: %s\n", message); + if (level >= cdio_loglevel_default) { + fprintf (stdout, " INFO: %s\n", message); + } break; case CDIO_LOG_ASSERT: - fprintf (stderr, "!ASSERT: %s\n", message); - fflush (stderr); + if (level >= cdio_loglevel_default) { + fprintf (stderr, "!ASSERT: %s\n", message); + fflush (stderr); + } abort (); break; default: