diff --git a/lib/FreeBSD/freebsd.c b/lib/FreeBSD/freebsd.c index 415a8e87..9f26e7c9 100644 --- a/lib/FreeBSD/freebsd.c +++ b/lib/FreeBSD/freebsd.c @@ -1,5 +1,5 @@ /* - $Id: freebsd.c,v 1.1 2004/04/30 09:59:54 rocky Exp $ + $Id: freebsd.c,v 1.2 2004/04/30 21:36:53 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: freebsd.c,v 1.1 2004/04/30 09:59:54 rocky Exp $"; +static const char _rcsid[] = "$Id: freebsd.c,v 1.2 2004/04/30 21:36:53 rocky Exp $"; #include "freebsd.h" @@ -93,7 +93,11 @@ static int _read_mode2_sector_freebsd (void *env, void *data, lsn_t lsn, bool b_form2) { - return read_mode2_sector_freebsd_ioctl(env, data, lsn, b_form2); + _img_private_t *_obj = env; + if ( _obj->access_mode == _AM_CAM ) + return read_mode2_sector_freebsd_ioctl(_obj, data, lsn, b_form2); + else + return read_mode2_sector_freebsd_cam(_obj, data, lsn, b_form2); } /*! @@ -109,15 +113,19 @@ _read_mode2_sectors_freebsd (void *env, void *data, lsn_t lsn, int i; int retval; + if ( _obj->access_mode == _AM_CAM ) + return read_mode2_sectors_freebsd_cam(_obj); + for (i = 0; i < nblocks; i++) { if (b_form2) { - if ( (retval = _read_mode2_sector_freebsd (_obj, + if ( (retval = read_mode2_sector_freebsd_ioctl (_obj, ((char *)data) + (M2RAW_SECTOR_SIZE * i), lsn + i, true)) ) return retval; } else { char buf[M2RAW_SECTOR_SIZE] = { 0, }; - if ( (retval = _read_mode2_sector_freebsd (_obj, buf, lsn + i, true)) ) + if ( (retval = read_mode2_sector_freebsd_ioctl (_obj, buf, + lsn + i, true)) ) return retval; memcpy (((char *)data) + (CDIO_CD_FRAMESIZE * i), @@ -131,9 +139,16 @@ _read_mode2_sectors_freebsd (void *env, void *data, lsn_t lsn, Return the size of the CD in logical block address (LBA) units. */ static uint32_t -_stat_size_freebsd (void *env) +_stat_size_freebsd (void *obj) { - return stat_size_freebsd_ioctl(env); + _img_private_t *env = obj; + + if (NULL == env) return CDIO_INVALID_LBA; + + if (_AM_CAM == env->access_mode) + return stat_size_freebsd_cam(env); + else + return stat_size_freebsd_ioctl(env); } /*! @@ -155,7 +170,10 @@ _set_arg_freebsd (void *env, const char key[], const char value[]) } else if (!strcmp (key, "access-mode")) { - return str_to_access_mode_freebsd(value); + _obj->access_mode = str_to_access_mode_freebsd(value); + if (_obj->access_mode == _AM_CAM && !_obj->b_cam_init) + return init_freebsd_cam(_obj) ? 1 : -3; + return 0; } else return -1; @@ -502,13 +520,13 @@ cdio_open_am_freebsd (const char *psz_source_name, const char *psz_access_mode) ret = cdio_new (_data, &_funcs); if (ret == NULL) return NULL; + if (!cdio_generic_init(_data)) + cdio_generic_free (_data); + return NULL; + } + if ( _data->access_mode == _AM_IOCTL ) { - if (cdio_generic_init(_data)) - return ret; - else { - cdio_generic_free (_data); - return NULL; - } + return ret; } else { if (init_freebsd_cam(_data)) return ret; diff --git a/lib/FreeBSD/freebsd.h b/lib/FreeBSD/freebsd.h index 24f3260d..e4582410 100644 --- a/lib/FreeBSD/freebsd.h +++ b/lib/FreeBSD/freebsd.h @@ -1,5 +1,5 @@ /* - $Id: freebsd.h,v 1.1 2004/04/30 09:59:54 rocky Exp $ + $Id: freebsd.h,v 1.2 2004/04/30 21:36:54 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -125,21 +125,22 @@ int eject_media_freebsd_cam (_img_private_t *env); void free_freebsd_cam (void *obj); -int read_audio_sectors_freebsd_ioctl (void *env, void *data, lsn_t lsn, - unsigned int nblocks); -int read_mode2_sector_freebsd_ioctl (void *env, void *data, lsn_t lsn, - bool b_form2); +int read_audio_sectors_freebsd_ioctl (_img_private_t *env, void *data, + lsn_t lsn, unsigned int nblocks); +int read_mode2_sector_freebsd_ioctl (_img_private_t *env, void *data, + lsn_t lsn, bool b_form2); -int read_mode2_sectors_freebsd_cam (void *env, void *buf, uint32_t lba, - unsigned int nblocks, bool b_form2); +int read_mode2_sectors_freebsd_cam (_img_private_t *env, void *buf, + uint32_t lba, unsigned int nblocks, + bool b_form2); bool read_toc_freebsd_ioctl (_img_private_t *_obj); /*! Return the size of the CD in logical block address (LBA) units. */ -uint32_t stat_size_freebsd_cam (void *env); -uint32_t stat_size_freebsd_ioctl (void *env); +uint32_t stat_size_freebsd_cam (_img_private_t *env); +uint32_t stat_size_freebsd_ioctl (_img_private_t *env); bool init_freebsd_cam (_img_private_t *_obj); void free_freebsd_cam (void *obj); diff --git a/lib/FreeBSD/freebsd_cam.c b/lib/FreeBSD/freebsd_cam.c index aed9c45d..5458bc16 100644 --- a/lib/FreeBSD/freebsd_cam.c +++ b/lib/FreeBSD/freebsd_cam.c @@ -1,5 +1,5 @@ /* - $Id: freebsd_cam.c,v 1.1 2004/04/30 09:59:54 rocky Exp $ + $Id: freebsd_cam.c,v 1.2 2004/04/30 21:36:54 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -26,7 +26,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: freebsd_cam.c,v 1.1 2004/04/30 09:59:54 rocky Exp $"; +static const char _rcsid[] = "$Id: freebsd_cam.c,v 1.2 2004/04/30 21:36:54 rocky Exp $"; #ifdef HAVE_FREEBSD_CDROM @@ -63,8 +63,6 @@ bool init_freebsd_cam (_img_private_t *_obj) { char pass[100]; - if (_obj->gen.init) - return true; _obj->cam=NULL; memset (&_obj->ccb, 0, sizeof(_obj->ccb)); @@ -160,10 +158,9 @@ _set_bsize (_img_private_t *_obj, unsigned int bsize) } int -read_mode2_sectors_freebsd_cam (void *env, void *buf, uint32_t lba, +read_mode2_sectors_freebsd_cam (_img_private_t *_obj, void *buf, uint32_t lba, unsigned int nblocks, bool b_form2) { - _img_private_t *_obj = env; int retval = 0; memset(&_obj->ccb,0,sizeof(_obj->ccb)); _obj->ccb.ccb_h.path_id = _obj->cam->path_id; @@ -216,11 +213,8 @@ read_mode2_sectors_freebsd_cam (void *env, void *buf, uint32_t lba, Return the size of the CD in logical block address (LBA) units. */ uint32_t -stat_size_freebsd_cam (void *env) +stat_size_freebsd_cam (_img_private_t *_obj) { - _img_private_t *_obj = env; - - uint8_t buf[12] = { 0, }; uint32_t retval; @@ -234,9 +228,10 @@ stat_size_freebsd_cam (void *env) sizeof(_obj->ccb.csio.sense_data), 0, 30*1000); _obj->ccb.csio.cdb_len = 8+1; - _obj->ccb.csio.cdb_io.cdb_bytes[0] = CDIO_MMC_READ_TOC; + CDIO_MMC_SET_COMMAND(_obj->ccb.csio.cdb_io.cdb_bytes, CDIO_MMC_READ_TOC); _obj->ccb.csio.cdb_io.cdb_bytes[1] = 0; /* lba; msf: 0x2 */ - _obj->ccb.csio.cdb_io.cdb_bytes[6] = CDIO_CDROM_LEADOUT_TRACK; + CDIO_MMC_SET_START_TRACK(_obj->ccb.csio.cdb_io.cdb_bytes, + CDIO_CDROM_LEADOUT_TRACK); _obj->ccb.csio.cdb_io.cdb_bytes[8] = 12; /* ? */ _obj->ccb.csio.data_ptr = buf; diff --git a/lib/FreeBSD/freebsd_ioctl.c b/lib/FreeBSD/freebsd_ioctl.c index f334b118..5099338e 100644 --- a/lib/FreeBSD/freebsd_ioctl.c +++ b/lib/FreeBSD/freebsd_ioctl.c @@ -1,5 +1,5 @@ /* - $Id: freebsd_ioctl.c,v 1.1 2004/04/30 09:59:54 rocky Exp $ + $Id: freebsd_ioctl.c,v 1.2 2004/04/30 21:36:54 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: freebsd_ioctl.c,v 1.1 2004/04/30 09:59:54 rocky Exp $"; +static const char _rcsid[] = "$Id: freebsd_ioctl.c,v 1.2 2004/04/30 21:36:54 rocky Exp $"; #ifdef HAVE_FREEBSD_CDROM @@ -74,10 +74,9 @@ cdio_is_cdrom_freebsd_ioctl(char *drive, char *mnttype) Returns 0 if no error. */ int -read_audio_sectors_freebsd_ioctl (void *env, void *data, lsn_t lsn, +read_audio_sectors_freebsd_ioctl (_img_private_t *_obj, void *data, lsn_t lsn, unsigned int nblocks) { - _img_private_t *_obj = env; unsigned char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; struct ioc_read_audio cdda; @@ -101,7 +100,7 @@ read_audio_sectors_freebsd_ioctl (void *env, void *data, lsn_t lsn, from lsn. Returns 0 if no error. */ int -read_mode2_sector_freebsd_ioctl (void *env, void *data, lsn_t lsn, +read_mode2_sector_freebsd_ioctl (_img_private_t *env, void *data, lsn_t lsn, bool b_form2) { char buf[M2RAW_SECTOR_SIZE] = { 0, }; @@ -122,10 +121,8 @@ read_mode2_sector_freebsd_ioctl (void *env, void *data, lsn_t lsn, Return the size of the CD in logical block address (LBA) units. */ uint32_t -stat_size_freebsd_ioctl (void *env) +stat_size_freebsd_ioctl (_img_private_t *_obj) { - _img_private_t *_obj = env; - struct ioc_read_toc_single_entry tocent; uint32_t size; diff --git a/lib/MSWindows/aspi32.c b/lib/MSWindows/aspi32.c index 2aab265f..71147b73 100644 --- a/lib/MSWindows/aspi32.c +++ b/lib/MSWindows/aspi32.c @@ -1,5 +1,5 @@ /* - $Id: aspi32.c,v 1.2 2004/04/30 06:54:15 rocky Exp $ + $Id: aspi32.c,v 1.3 2004/04/30 21:36:54 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: aspi32.c,v 1.2 2004/04/30 06:54:15 rocky Exp $"; +static const char _rcsid[] = "$Id: aspi32.c,v 1.3 2004/04/30 21:36:54 rocky Exp $"; #include #include @@ -320,9 +320,7 @@ wnaspi32_mmc_read_sectors (_img_private_t *env, void *data, lsn_t lsn, ssc.SRB_PostProc = (LPVOID) hEvent; ssc.SRB_CDBLen = 12; - /* Operation code */ - ssc.CDBByte[ 0 ] = CDIO_MMC_GPCMD_READ_CD; - + CDIO_MMC_SET_COMMAND(ssc.CDBByte, CDIO_MMC_GPCMD_READ_CD)); CDIO_MMC_SET_READ_TYPE(ssc.CDBByte, sector_type); CDIO_MMC_SET_READ_LBA(ssc.CDBByte, lsn); CDIO_MMC_SET_READ_LENGTH(ssc.CDBByte, nblocks); @@ -417,13 +415,13 @@ wnaspi32_read_toc (_img_private_t *env) ssc.SRB_CDBLen = 10; /* Operation code */ - ssc.CDBByte[ 0 ] = READ_TOC; + CDIO_MMC_SET_COMMAND(ssc.CDBByte, CDIO_MMC_READ_TOC); /* Format */ ssc.CDBByte[ 2 ] = READ_TOC_FORMAT_TOC; /* Starting track */ - ssc.CDBByte[ 6 ] = 0; + CDIO_MMC_SET_START_TRACK(ssc.CDBByte, 0); /* Allocation length and buffer */ ssc.SRB_BufLen = sizeof( p_tocheader ); diff --git a/lib/MSWindows/win32.c b/lib/MSWindows/win32.c index 89a7fcf1..957f00c0 100644 --- a/lib/MSWindows/win32.c +++ b/lib/MSWindows/win32.c @@ -1,5 +1,5 @@ /* - $Id: win32.c,v 1.9 2004/04/30 07:33:51 rocky Exp $ + $Id: win32.c,v 1.10 2004/04/30 21:36:54 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -26,7 +26,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: win32.c,v 1.9 2004/04/30 07:33:51 rocky Exp $"; +static const char _rcsid[] = "$Id: win32.c,v 1.10 2004/04/30 21:36:54 rocky Exp $"; #include #include @@ -337,7 +337,14 @@ _set_arg_win32 (void *user_data, const char key[], const char value[]) } else if (!strcmp (key, "access-mode")) { - return str_to_access_mode_win32(value); + _obj->access_mode = str_to_access_mode_win32(value); + if (_obj->access_mode == _AM_ASPI && !_obj->b_aspi_init) + return winaspi_init_win32(_obj) ? 1 : -3; + else if (_obj->access_mode == _AM_IOCTL && !_obj->b_ioctl_init) + return win32ioctl_init_win32(_obj) ? 1 : -3; + else + return -4; + return 0; } else return -1; diff --git a/lib/_cdio_linux.c b/lib/_cdio_linux.c index 214b81e2..d49dbdef 100644 --- a/lib/_cdio_linux.c +++ b/lib/_cdio_linux.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_linux.c,v 1.40 2004/04/30 06:54:15 rocky Exp $ + $Id: _cdio_linux.c,v 1.41 2004/04/30 21:36:53 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002, 2003, 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.40 2004/04/30 06:54:15 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.41 2004/04/30 21:36:53 rocky Exp $"; #include @@ -306,7 +306,8 @@ _read_packet_mode2_sectors_mmc (int fd, void *buf, lba_t lba, memset (&cgc, 0, sizeof (struct cdrom_generic_command)); - cgc.cmd[0] = use_read_10 ? GPCMD_READ_10 : CDIO_MMC_GPCMD_READ_CD; + CDIO_MMC_SET_COMMAND(cgc.cmd, + use_read_10 ? GPCMD_READ_10 : CDIO_MMC_GPCMD_READ_CD); CDIO_MMC_SET_READ_LBA(cgc.cmd, lba); CDIO_MMC_SET_READ_LENGTH(cgc.cmd, nblocks); @@ -701,7 +702,7 @@ _eject_media_mmc(int fd) scsi_cmd.inlen = 0; scsi_cmd.outlen = 0; - scsi_cmd.cmd[0] = START_STOP; + CDIO_MMC_SET_COMMAND(scsi_cmd.cmd, CDIO_MMC_START_STOP); scsi_cmd.cmd[1] = 0; scsi_cmd.cmd[2] = 0; scsi_cmd.cmd[3] = 0; @@ -713,7 +714,7 @@ _eject_media_mmc(int fd) scsi_cmd.inlen = 0; scsi_cmd.outlen = 0; - scsi_cmd.cmd[0] = START_STOP; + CDIO_MMC_SET_COMMAND(scsi_cmd.cmd, CDIO_MMC_START_STOP); scsi_cmd.cmd[1] = 0; scsi_cmd.cmd[2] = 0; scsi_cmd.cmd[3] = 0; diff --git a/lib/scsi_mmc.h b/lib/scsi_mmc.h index 7d15fb7f..7ccac0ed 100644 --- a/lib/scsi_mmc.h +++ b/lib/scsi_mmc.h @@ -1,5 +1,5 @@ /* - $Id: scsi_mmc.h,v 1.9 2004/04/27 03:05:23 rocky Exp $ + $Id: scsi_mmc.h,v 1.10 2004/04/30 21:36:53 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -45,6 +45,9 @@ #define CDIO_MMC_GPCMD_READ_12 0xa8 #define CDIO_MMC_GPCMD_READ_CD 0xbe +#define CDIO_MMC_SET_COMMAND(rec, command) \ + rec[0] = command + #define CDIO_MMC_SET_READ_TYPE(rec, sector_type) \ rec[1] = (sector_type << 2) @@ -55,6 +58,9 @@ rec[4] = (lba >> 8) & 0xff; \ rec[5] = (lba ) & 0xff +#define CDIO_MMC_SET_START_TRACK(rec, command) \ + rec[6] = command + #define CDIO_MMC_SET_READ_LENGTH(rec, len) \ rec[6] = (len >> 16) & 0xff; \ rec[7] = (len >> 8) & 0xff; \