From e491ba74d6c23504f75f376a19f89b03074cc81d Mon Sep 17 00:00:00 2001 From: rocky Date: Thu, 10 Feb 2005 11:23:08 +0000 Subject: [PATCH] Use solaris ioctl for blocksize set/get. Prototype corrections. --- include/cdio/mmc.h | 12 ++++---- lib/driver/_cdio_sunos.c | 60 ++++++++++++++++++++++++++++++++++++---- lib/driver/mmc.c | 9 ++++-- 3 files changed, 66 insertions(+), 15 deletions(-) diff --git a/include/cdio/mmc.h b/include/cdio/mmc.h index f8069357..ff177137 100644 --- a/include/cdio/mmc.h +++ b/include/cdio/mmc.h @@ -1,5 +1,5 @@ /* - $Id: mmc.h,v 1.6 2005/02/10 01:59:06 rocky Exp $ + $Id: mmc.h,v 1.7 2005/02/10 11:23:08 rocky Exp $ Copyright (C) 2003, 2004, 2005 Rocky Bernstein @@ -388,8 +388,8 @@ const char *mmc_feature_profile2str( int i_feature_profile ); uint8_t mmc_get_cmd_len(uint8_t scsi_cmd); /*! - Set the block size for subsequest read requests, via an MMC - MODE_SENSE 6 command. + Get the block size used in read requests, via MMC. + @return the blocksize if > 0; error if <= 0 */ int mmc_get_blocksize ( CdIo_t *p_cdio ); @@ -517,10 +517,10 @@ int mmc_run_cmd( const CdIo_t *p_cdio, unsigned int i_timeout_ms, scsi_mmc_direction_t e_direction, unsigned int i_buf, /*in/out*/ void *p_buf ); /*! - Set the block size for subsequest read requests, via an MMC - MODE_SELECT 6 command. + Set the block size for subsequest read requests, via MMC. */ -int mmc_set_blocksize ( const CdIo_t *p_cdio, unsigned int i_bsize); +driver_return_code_t mmc_set_blocksize ( const CdIo_t *p_cdio, + unsigned int i_bsize); /*! Set the drive speed. diff --git a/lib/driver/_cdio_sunos.c b/lib/driver/_cdio_sunos.c index 5b29b221..91c3c5d9 100644 --- a/lib/driver/_cdio_sunos.c +++ b/lib/driver/_cdio_sunos.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_sunos.c,v 1.21 2005/02/07 03:36:02 rocky Exp $ + $Id: _cdio_sunos.c,v 1.22 2005/02/10 11:23:08 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002, 2003, 2004, 2005 Rocky Bernstein @@ -38,7 +38,7 @@ #ifdef HAVE_SOLARIS_CDROM -static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.21 2005/02/07 03:36:02 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.22 2005/02/10 11:23:08 rocky Exp $"; #ifdef HAVE_GLOB_H #include @@ -496,6 +496,26 @@ get_arg_solaris (void *p_user_data, const char key[]) return NULL; } +/*! + Get the block size used in read requests, via ioctl. + @return the blocksize if > 0; error if <= 0 + */ +static int +get_blocksize_solaris (void *p_user_data) { + + _img_private_t *p_env = p_user_data; + int ret; + int i_blocksize; + + if ( !p_env || p_env->gen.fd <=0 ) return DRIVER_OP_UNINIT; + if ((ret = ioctl(p_env->gen.fd, CDROMGBLKMODE, &i_blocksize)) != 0) { + cdio_warn ("CDROMGBLKMODE failed: %s\n", strerror(errno)); + return DRIVER_OP_ERROR; + } else { + return i_blocksize; + } +} + /*! Return a string containing the default CD device if none is specified. */ @@ -692,7 +712,7 @@ get_track_format_solaris(void *p_user_data, track_t i_track) FIXME: there's gotta be a better design for this and get_track_format? */ static bool -_cdio_get_track_green(void *p_user_data, track_t i_track) +get_track_green_solaris(void *p_user_data, track_t i_track) { _img_private_t *p_env = p_user_data; @@ -722,7 +742,7 @@ _cdio_get_track_green(void *p_user_data, track_t i_track) False is returned if there is no entry. */ static bool -_cdio_get_track_msf(void *p_user_data, track_t i_track, msf_t *msf) +get_track_msf_solaris(void *p_user_data, track_t i_track, msf_t *msf) { _img_private_t *p_env = p_user_data; @@ -746,6 +766,26 @@ _cdio_get_track_msf(void *p_user_data, track_t i_track, msf_t *msf) } } +/*! + Get the block size used in read requests, via ioctl. + @return the blocksize if > 0; error if <= 0 + */ +static driver_return_code_t +set_blocksize_solaris (void *p_user_data) { + + _img_private_t *p_env = p_user_data; + int ret; + int i_blocksize; + + if ( !p_env || p_env->gen.fd <=0 ) return DRIVER_OP_UNINIT; + if ((ret = ioctl(p_env->gen.fd, CDROMSBLKMODE, i_blocksize)) != 0) { + cdio_warn ("CDROMSBLKMODE failed: %s\n", strerror(errno)); + return DRIVER_OP_ERROR; + } else { + return DRIVER_OP_SUCCESS; + } +} + /* Set CD-ROM drive speed */ static driver_return_code_t set_speed_solaris (void *p_user_data, int i_speed) @@ -846,7 +886,11 @@ cdio_open_am_solaris (const char *psz_orig_source, const char *access_mode) _funcs.eject_media = eject_media_solaris; _funcs.free = cdio_generic_free; _funcs.get_arg = get_arg_solaris; +#if USE_MMC _funcs.get_blocksize = get_blocksize_mmc, +#else + _funcs.get_blocksize = get_blocksize_solaris, +#endif _funcs.get_cdtext = get_cdtext_generic; _funcs.get_default_device = cdio_get_default_device_solaris; _funcs.get_devices = cdio_get_devices_solaris; @@ -861,10 +905,10 @@ cdio_open_am_solaris (const char *psz_orig_source, const char *access_mode) _funcs.get_track_channels = get_track_channels_generic, _funcs.get_track_copy_permit = get_track_copy_permit_generic, _funcs.get_track_format = get_track_format_solaris; - _funcs.get_track_green = _cdio_get_track_green; + _funcs.get_track_green = get_track_green_solaris; _funcs.get_track_lba = NULL; /* This could be done if need be. */ _funcs.get_track_preemphasis = get_track_preemphasis_generic, - _funcs.get_track_msf = _cdio_get_track_msf; + _funcs.get_track_msf = get_track_msf_solaris; _funcs.lseek = cdio_generic_lseek; _funcs.read = cdio_generic_read; _funcs.read_audio_sectors = _read_audio_sectors_solaris; @@ -875,7 +919,11 @@ cdio_open_am_solaris (const char *psz_orig_source, const char *access_mode) _funcs.read_toc = read_toc_solaris; _funcs.run_mmc_cmd = run_mmc_cmd_solaris; _funcs.set_arg = _set_arg_solaris; +#if USE_MMC _funcs.set_blocksize = set_blocksize_mmc; +#else + _funcs.set_blocksize = set_blocksize_solaris; +#endif _funcs.set_speed = set_speed_solaris; _data = calloc(1, sizeof (_img_private_t)); diff --git a/lib/driver/mmc.c b/lib/driver/mmc.c index fc97c50a..3ff719f9 100644 --- a/lib/driver/mmc.c +++ b/lib/driver/mmc.c @@ -1,6 +1,6 @@ /* Common Multimedia Command (MMC) routines. - $Id: mmc.c,v 1.8 2005/02/10 03:23:10 rocky Exp $ + $Id: mmc.c,v 1.9 2005/02/10 11:23:08 rocky Exp $ Copyright (C) 2004, 2005 Rocky Bernstein @@ -54,8 +54,11 @@ corresponding publically-accessible routine. *************************************************************************/ -/* Set read blocksize (via MMC) */ -driver_return_code_t +/*! + Get the block size for subsequest read requests, via MMC. + @return the blocksize if > 0; error if <= 0 + */ +int get_blocksize_mmc (void *p_user_data) { generic_img_private_t *p_env = p_user_data;