diff --git a/include/cdio/dvd.h b/include/cdio/dvd.h index 655276d3..0f9213c5 100644 --- a/include/cdio/dvd.h +++ b/include/cdio/dvd.h @@ -1,5 +1,5 @@ /* - $Id: dvd.h,v 1.2 2004/07/25 15:46:40 rocky Exp $ + $Id: dvd.h,v 1.3 2004/07/28 01:09:59 rocky Exp $ Copyright (C) 2004 Rocky Bernstein Modeled after GNU/Linux definitions in linux/cdrom.h @@ -29,7 +29,7 @@ #include -/* DVD structure types */ +/*! Values used in a READ DVD STRUCTURE */ #define CDIO_DVD_STRUCT_PHYSICAL 0x00 #define CDIO_DVD_STRUCT_COPYRIGHT 0x01 @@ -37,12 +37,13 @@ #define CDIO_DVD_STRUCT_BCA 0x03 #define CDIO_DVD_STRUCT_MANUFACT 0x04 +/*! Media definitions for "Book Type" */ #define CDIO_DVD_BOOK_DVD_ROM 0 #define CDIO_DVD_BOOK_DVD_RAM 1 -#define CDIO_DVD_BOOK_DVD_R 2 -#define CDIO_DVD_BOOK_DVD_RW 3 -#define CDIO_DVD_BOOK_DVD_PW 8 -#define CDIO_DVD_BOOK_DVD_PRW 9 +#define CDIO_DVD_BOOK_DVD_R 2 /**< DVD-R */ +#define CDIO_DVD_BOOK_DVD_RW 3 /**< DVD-RW */ +#define CDIO_DVD_BOOK_DVD_PR 8 /**< DVD+R */ +#define CDIO_DVD_BOOK_DVD_PRW 9 /**< DVD+RW */ typedef struct cdio_dvd_layer { uint8_t book_version : 4; diff --git a/include/cdio/scsi_mmc.h b/include/cdio/scsi_mmc.h index 6ec8d321..1e304af0 100644 --- a/include/cdio/scsi_mmc.h +++ b/include/cdio/scsi_mmc.h @@ -1,5 +1,5 @@ /* - $Id: scsi_mmc.h,v 1.19 2004/07/27 02:45:16 rocky Exp $ + $Id: scsi_mmc.h,v 1.20 2004/07/28 01:09:59 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -170,9 +170,8 @@ uint8_t scsi_mmc_get_cmd_len(uint8_t scsi_cmd); Run a SCSI MMC command. cdio CD structure set by cdio_open(). - i_timeout time in milliseconds we will wait for the command - to complete. If this value is -1, use the default - time-out value. + i_timeout_ms time in milliseconds we will wait for the command + to complete. p_cdb CDB bytes. All values that are needed should be set on input. We'll figure out what the right CDB length should be. e_direction direction the transfer is to go. @@ -181,7 +180,7 @@ uint8_t scsi_mmc_get_cmd_len(uint8_t scsi_cmd); Returns 0 if command completed successfully. */ -int scsi_mmc_run_cmd( const CdIo *cdio, int t_timeout, +int scsi_mmc_run_cmd( const CdIo *cdio, unsigned int i_timeout_ms, const scsi_mmc_cdb_t *p_cdb, scsi_mmc_direction_t e_direction, unsigned int i_buf, /*in/out*/ void *p_buf ); diff --git a/lib/FreeBSD/freebsd_cam.c b/lib/FreeBSD/freebsd_cam.c index 85736a17..01b67e56 100644 --- a/lib/FreeBSD/freebsd_cam.c +++ b/lib/FreeBSD/freebsd_cam.c @@ -1,5 +1,5 @@ /* - $Id: freebsd_cam.c,v 1.24 2004/07/25 09:39:40 rocky Exp $ + $Id: freebsd_cam.c,v 1.25 2004/07/28 01:09:59 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.24 2004/07/25 09:39:40 rocky Exp $"; +static const char _rcsid[] = "$Id: freebsd_cam.c,v 1.25 2004/07/28 01:09:59 rocky Exp $"; #ifdef HAVE_FREEBSD_CDROM @@ -35,7 +35,7 @@ static const char _rcsid[] = "$Id: freebsd_cam.c,v 1.24 2004/07/25 09:39:40 rock /* Default value in seconds we will wait for a command to complete. */ -#define DEFAULT_TIMEOUT_SECS 10 +#define DEFAULT_TIMEOUT_MSECS 10000 /*! Run a SCSI MMC command. @@ -180,7 +180,7 @@ get_mcn_freebsd_cam (const _img_private_t *p_env) cdb.field[3] = CDIO_SUBCHANNEL_MEDIA_CATALOG; CDIO_MMC_SET_READ_LENGTH(cdb.field, sizeof(buf)); - i_status = scsi_mmc_run_cmd_freebsd_cam(p_env, DEFAULT_TIMEOUT_SECS, + i_status = scsi_mmc_run_cmd_freebsd_cam(p_env, DEFAULT_TIMEOUT_MSECS, scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, SCSI_MMC_DATA_READ, sizeof(buf), buf); @@ -210,7 +210,7 @@ get_drive_cap_freebsd_cam (const _img_private_t *p_env, cdb.field[7] = 0x01; cdb.field[8] = 0x00; - i_status = scsi_mmc_run_cmd_freebsd_cam(p_env, DEFAULT_TIMEOUT_SECS, + i_status = scsi_mmc_run_cmd_freebsd_cam(p_env, DEFAULT_TIMEOUT_MSECS, scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, SCSI_MMC_DATA_READ, sizeof(buf), buf); @@ -287,7 +287,7 @@ _set_bsize (_img_private_t *p_env, unsigned int bsize) cdb.field[1] = 1 << 4; cdb.field[4] = 12; - return scsi_mmc_run_cmd_freebsd_cam (p_env, DEFAULT_TIMEOUT_SECS, + return scsi_mmc_run_cmd_freebsd_cam (p_env, DEFAULT_TIMEOUT_MSECS, scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, SCSI_MMC_DATA_WRITE, sizeof(mh), &mh); @@ -389,7 +389,7 @@ stat_size_freebsd_cam (_img_private_t *p_env) p_env->ccb.csio.data_ptr = buf; p_env->ccb.csio.dxfer_len = sizeof (buf); - i_status = scsi_mmc_run_cmd_freebsd_cam(p_env, DEFAULT_TIMEOUT_SECS, + i_status = scsi_mmc_run_cmd_freebsd_cam(p_env, DEFAULT_TIMEOUT_MSECS, scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, SCSI_MMC_DATA_READ, sizeof(buf), buf); @@ -422,14 +422,14 @@ eject_media_freebsd_cam (_img_private_t *p_env) CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_ALLOW_MEDIUM_REMOVAL); - i_status = scsi_mmc_run_cmd_freebsd_cam (p_env, DEFAULT_TIMEOUT_SECS, + i_status = scsi_mmc_run_cmd_freebsd_cam (p_env, DEFAULT_TIMEOUT_MSECS, scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, SCSI_MMC_DATA_WRITE, 0, &buf); if (0 != i_status) return i_status; cdb.field[4] = 1; - i_status = scsi_mmc_run_cmd_freebsd_cam (p_env, DEFAULT_TIMEOUT_SECS, + i_status = scsi_mmc_run_cmd_freebsd_cam (p_env, DEFAULT_TIMEOUT_MSECS, scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, SCSI_MMC_DATA_WRITE, 0, &buf); if (0 != i_status) @@ -438,7 +438,7 @@ eject_media_freebsd_cam (_img_private_t *p_env) CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_START_STOP); cdb.field[4] = 2; /* eject */ - return scsi_mmc_run_cmd_freebsd_cam (p_env, DEFAULT_TIMEOUT_SECS, + return scsi_mmc_run_cmd_freebsd_cam (p_env, DEFAULT_TIMEOUT_MSECS, scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, SCSI_MMC_DATA_WRITE, 0, &buf); diff --git a/lib/MSWindows/aspi32.c b/lib/MSWindows/aspi32.c index 5b8236cb..9fd4346c 100644 --- a/lib/MSWindows/aspi32.c +++ b/lib/MSWindows/aspi32.c @@ -1,5 +1,5 @@ /* - $Id: aspi32.c,v 1.41 2004/07/27 01:23:27 rocky Exp $ + $Id: aspi32.c,v 1.42 2004/07/28 01:09:59 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: aspi32.c,v 1.41 2004/07/27 01:23:27 rocky Exp $"; +static const char _rcsid[] = "$Id: aspi32.c,v 1.42 2004/07/28 01:09:59 rocky Exp $"; #include #include @@ -199,7 +199,7 @@ get_discmode_aspi (_img_private_t *p_env) case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM; case CDIO_DVD_BOOK_DVD_R: return CDIO_DISC_MODE_DVD_R; case CDIO_DVD_BOOK_DVD_RW: return CDIO_DISC_MODE_DVD_RW; - case CDIO_DVD_BOOK_DVD_PW: return CDIO_DISC_MODE_DVD_PR; + case CDIO_DVD_BOOK_DVD_PR: return CDIO_DISC_MODE_DVD_PR; case CDIO_DVD_BOOK_DVD_PRW: return CDIO_DISC_MODE_DVD_PRW; default: return CDIO_DISC_MODE_DVD_OTHER; } diff --git a/lib/MSWindows/win32_ioctl.c b/lib/MSWindows/win32_ioctl.c index 909f0140..649afe58 100644 --- a/lib/MSWindows/win32_ioctl.c +++ b/lib/MSWindows/win32_ioctl.c @@ -1,5 +1,5 @@ /* - $Id: win32_ioctl.c,v 1.27 2004/07/27 02:21:23 rocky Exp $ + $Id: win32_ioctl.c,v 1.28 2004/07/28 01:09:59 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -26,7 +26,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: win32_ioctl.c,v 1.27 2004/07/27 02:21:23 rocky Exp $"; +static const char _rcsid[] = "$Id: win32_ioctl.c,v 1.28 2004/07/28 01:09:59 rocky Exp $"; #include #include @@ -212,7 +212,7 @@ get_discmode_win32ioctl (_img_private_t *p_env) case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM; case CDIO_DVD_BOOK_DVD_R: return CDIO_DISC_MODE_DVD_R; case CDIO_DVD_BOOK_DVD_RW: return CDIO_DISC_MODE_DVD_RW; - case CDIO_DVD_BOOK_DVD_PW: return CDIO_DISC_MODE_DVD_PR; + case CDIO_DVD_BOOK_DVD_PR: return CDIO_DISC_MODE_DVD_PR; case CDIO_DVD_BOOK_DVD_PRW: return CDIO_DISC_MODE_DVD_PRW; default: return CDIO_DISC_MODE_DVD_OTHER; } diff --git a/lib/_cdio_bsdi.c b/lib/_cdio_bsdi.c index 7d7924c9..6e7b37ef 100644 --- a/lib/_cdio_bsdi.c +++ b/lib/_cdio_bsdi.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_bsdi.c,v 1.33 2004/07/27 16:51:14 rocky Exp $ + $Id: _cdio_bsdi.c,v 1.34 2004/07/28 01:09:59 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_bsdi.c,v 1.33 2004/07/27 16:51:14 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_bsdi.c,v 1.34 2004/07/28 01:09:59 rocky Exp $"; #include #include @@ -93,11 +93,11 @@ typedef struct { /* Define the Cdrom Generic Command structure */ typedef struct cgc { - u_char cdb[12]; + scsi_mmc_cdb_t cdb; u_char *buf; int buflen; int rw; - int timeout; + unsigned int timeout; scsi_user_sense_t *sus; } cgc_t; @@ -106,10 +106,10 @@ typedef struct cgc This code adapted from Steven M. Schultz's libdvd */ static int -scsi_mmc_run_cmd_bsdi(const void *p_user_data, int i_timeout, - unsigned int i_cdb, const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, /*in/out*/ void *p_buf ) +run_scsi_cmd_bsdi(const void *p_user_data, int i_timeout_ms, + unsigned int i_cdb, const scsi_mmc_cdb_t *p_cdb, + scsi_mmc_direction_t e_direction, + unsigned int i_buf, /*in/out*/ void *p_buf ) { const _img_private_t *p_env = p_user_data; int i_status, i_asc; @@ -123,7 +123,7 @@ scsi_mmc_run_cmd_bsdi(const void *p_user_data, int i_timeout, memcpy(suc.suc_cdb, p_cdb, i_cdb); suc.suc_data = p_buf; suc.suc_datalen = i_buf; - suc.suc_timeout = i_timeout; + suc.suc_timeout = msecs2secs(i_timeout_ms); if (ioctl(p_env->gen.fd, SCSIRAWCDB, &suc) == -1) return(errno); i_status = suc.suc_sus.sus_status; @@ -551,7 +551,7 @@ static bool _init_cdtext_bsdi (_img_private_t *p_env) { return scsi_mmc_init_cdtext_private( p_env->gen.cdio, - &scsi_mmc_run_cmd_bsdi, + &run_scsi_cmd_bsdi, set_cdtext_field_bsdi ); } @@ -776,64 +776,6 @@ _get_track_msf_bsdi(void *user_data, track_t i_track, msf_t *msf) } } -#endif /* HAVE_BSDI_CDROM */ - -/*! - Return an array of strings giving possible CD devices. - */ -char ** -cdio_get_devices_bsdi (void) -{ -#ifndef HAVE_BSDI_CDROM - return NULL; -#else - char drive[40]; - char **drives = NULL; - unsigned int num_drives=0; - bool exists=true; - char c; - - /* Scan the system for CD-ROM drives. - */ - -#ifdef USE_ETC_FSTAB - - struct fstab *fs; - setfsent(); - - /* Check what's in /etc/fstab... */ - while ( (fs = getfsent()) ) - { - if (strncmp(fs->fs_spec, "/dev/sr", 7)) - cdio_add_device_list(&drives, fs->fs_spec, &num_drives); - } - -#endif - - /* Scan the system for CD-ROM drives. - Not always 100% reliable, so use the USE_MNTENT code above first. - */ - for ( c='0'; exists && c <='9'; c++ ) { - sprintf(drive, "/dev/rsr%cc", c); - exists = cdio_is_cdrom(drive, NULL); - if ( exists ) { - cdio_add_device_list(&drives, drive, &num_drives); - } - } - cdio_add_device_list(&drives, NULL, &num_drives); - return drives; -#endif /*HAVE_BSDI_CDROM*/ -} - -/*! - Return a string containing the default CD device if none is specified. - */ -char * -cdio_get_default_device_bsdi(void) -{ - return strdup(DEFAULT_CDIO_DEVICE); -} - /*! Get disc type associated with cd object. */ @@ -850,14 +792,14 @@ get_discmode_bsdi (void *p_user_data) dvd.physical.type = CDIO_DVD_STRUCT_PHYSICAL; dvd.physical.layer_num = 0; if (0 == scsi_mmc_get_dvd_struct_physical_private (p_env, - &scsi_mmc_run_cmd_bsdi, + &run_scsi_cmd_bsdi, &dvd)) { switch(dvd.physical.layer[0].book_type) { case CDIO_DVD_BOOK_DVD_ROM: return CDIO_DISC_MODE_DVD_ROM; case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM; case CDIO_DVD_BOOK_DVD_R: return CDIO_DISC_MODE_DVD_R; case CDIO_DVD_BOOK_DVD_RW: return CDIO_DISC_MODE_DVD_RW; - case CDIO_DVD_BOOK_DVD_PW: return CDIO_DISC_MODE_DVD_PR; + case CDIO_DVD_BOOK_DVD_PR: return CDIO_DISC_MODE_DVD_PR; case CDIO_DVD_BOOK_DVD_PRW: return CDIO_DISC_MODE_DVD_PRW; default: return CDIO_DISC_MODE_DVD_OTHER; } @@ -925,6 +867,64 @@ get_discmode_bsdi (void *p_user_data) return discmode; } +#endif /* HAVE_BSDI_CDROM */ + +/*! + Return an array of strings giving possible CD devices. + */ +char ** +cdio_get_devices_bsdi (void) +{ +#ifndef HAVE_BSDI_CDROM + return NULL; +#else + char drive[40]; + char **drives = NULL; + unsigned int num_drives=0; + bool exists=true; + char c; + + /* Scan the system for CD-ROM drives. + */ + +#ifdef USE_ETC_FSTAB + + struct fstab *fs; + setfsent(); + + /* Check what's in /etc/fstab... */ + while ( (fs = getfsent()) ) + { + if (strncmp(fs->fs_spec, "/dev/sr", 7)) + cdio_add_device_list(&drives, fs->fs_spec, &num_drives); + } + +#endif + + /* Scan the system for CD-ROM drives. + Not always 100% reliable, so use the USE_MNTENT code above first. + */ + for ( c='0'; exists && c <='9'; c++ ) { + sprintf(drive, "/dev/rsr%cc", c); + exists = cdio_is_cdrom(drive, NULL); + if ( exists ) { + cdio_add_device_list(&drives, drive, &num_drives); + } + } + cdio_add_device_list(&drives, NULL, &num_drives); + return drives; +#endif /*HAVE_BSDI_CDROM*/ +} + +/*! + Return a string containing the default CD device if none is specified. + */ +char * +cdio_get_default_device_bsdi(void) +{ + return strdup(DEFAULT_CDIO_DEVICE); +} + /*! Initialization routine. This is the only thing that doesn't get called via a function pointer. In fact *we* are the @@ -977,7 +977,7 @@ cdio_open_bsdi (const char *psz_orig_source) .read_mode1_sectors = _read_mode1_sectors_bsdi, .read_mode2_sector = _read_mode2_sector_bsdi, .read_mode2_sectors = _read_mode2_sectors_bsdi, - .run_scsi_mmc_cmd = scsi_mmc_run_cmd_bsdi, + .run_scsi_mmc_cmd = &run_scsi_cmd_bsdi, .set_arg = _set_arg_bsdi, .stat_size = _stat_size_bsdi }; diff --git a/lib/_cdio_linux.c b/lib/_cdio_linux.c index e5080d6b..f9c34a43 100644 --- a/lib/_cdio_linux.c +++ b/lib/_cdio_linux.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_linux.c,v 1.83 2004/07/27 01:06:02 rocky Exp $ + $Id: _cdio_linux.c,v 1.84 2004/07/28 01:09:59 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.83 2004/07/27 01:06:02 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.84 2004/07/28 01:09:59 rocky Exp $"; #include @@ -110,12 +110,13 @@ typedef struct { /**** prototypes for static functions ****/ static bool is_cdrom_linux(const char *drive, char *mnttype); static bool read_toc_linux (_img_private_t *p_env); -static int scsi_mmc_run_cmd_linux( const void *p_user_data, int i_timeout, - unsigned int i_cdb, - const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, - /*in/out*/ void *p_buf ); +static int run_scsi_cmd_linux( const void *p_user_data, + unsigned int i_timeout, + unsigned int i_cdb, + const scsi_mmc_cdb_t *p_cdb, + scsi_mmc_direction_t e_direction, + unsigned int i_buf, + /*in/out*/ void *p_buf ); static access_mode_t str_to_access_mode_linux(const char *psz_access_mode) @@ -502,7 +503,7 @@ get_discmode_linux (void *p_user_data) case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM; case CDIO_DVD_BOOK_DVD_R: return CDIO_DISC_MODE_DVD_R; case CDIO_DVD_BOOK_DVD_RW: return CDIO_DISC_MODE_DVD_RW; - case CDIO_DVD_BOOK_DVD_PW: return CDIO_DISC_MODE_DVD_PR; + case CDIO_DVD_BOOK_DVD_PR: return CDIO_DISC_MODE_DVD_PR; case CDIO_DVD_BOOK_DVD_PRW: return CDIO_DISC_MODE_DVD_PRW; default: return CDIO_DISC_MODE_DVD_OTHER; } @@ -600,12 +601,12 @@ _read_mode2_sectors_mmc (_img_private_t *p_env, void *p_buf, lba_t lba, if ((retval = scsi_mmc_set_bsize (p_env->gen.cdio, M2RAW_SECTOR_SIZE))) return retval; - if ((retval = scsi_mmc_run_cmd_linux (p_env, 0, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, - SCSI_MMC_DATA_READ, - M2RAW_SECTOR_SIZE * nblocks, - p_buf))) + if ((retval = run_scsi_cmd_linux (p_env, 0, + scsi_mmc_get_cmd_len(cdb.field[0]), + &cdb, + SCSI_MMC_DATA_READ, + M2RAW_SECTOR_SIZE * nblocks, + p_buf))) { scsi_mmc_set_bsize (p_env->gen.cdio, CDIO_CD_FRAMESIZE); return retval; @@ -614,11 +615,11 @@ _read_mode2_sectors_mmc (_img_private_t *p_env, void *p_buf, lba_t lba, if ((retval = scsi_mmc_set_bsize (p_env->gen.cdio, CDIO_CD_FRAMESIZE))) return retval; } else - return scsi_mmc_run_cmd_linux (p_env, 0, - scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, - SCSI_MMC_DATA_READ, - M2RAW_SECTOR_SIZE * nblocks, p_buf); - + return run_scsi_cmd_linux (p_env, 0, + scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, + SCSI_MMC_DATA_READ, + M2RAW_SECTOR_SIZE * nblocks, p_buf); + return 0; } @@ -908,10 +909,11 @@ read_toc_linux (_img_private_t *p_env) We return true if command completed successfully and false if not. */ static int -scsi_mmc_run_cmd_linux( const void *p_user_data, int i_timeout, - unsigned int i_cdb, const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, /*in/out*/ void *p_buf ) +run_scsi_cmd_linux( const void *p_user_data, + unsigned int i_timeout_ms, + unsigned int i_cdb, const scsi_mmc_cdb_t *p_cdb, + scsi_mmc_direction_t e_direction, + unsigned int i_buf, /*in/out*/ void *p_buf ) { const _img_private_t *p_env = p_user_data; struct cdrom_generic_command cgc; @@ -923,8 +925,7 @@ scsi_mmc_run_cmd_linux( const void *p_user_data, int i_timeout, ? CGC_DATA_READ : CGC_DATA_WRITE; #ifdef HAVE_LINUX_CDROM_TIMEOUT - if (i_timeout >= 0) - cgc.timeout = i_timeout; + cgc.timeout = i_timeout_ms; #endif return ioctl (p_env->gen.fd, CDROM_SEND_PACKET, &cgc); @@ -1013,7 +1014,7 @@ static bool init_cdtext_linux (_img_private_t *p_env) { return scsi_mmc_init_cdtext_private( p_env->gen.cdio, - &scsi_mmc_run_cmd_linux, + &run_scsi_cmd_linux, set_cdtext_field_linux ); } @@ -1216,7 +1217,7 @@ cdio_open_am_linux (const char *psz_orig_source, const char *access_mode) .read_mode1_sectors = _read_mode1_sectors_linux, .read_mode2_sector = _read_mode2_sector_linux, .read_mode2_sectors = _read_mode2_sectors_linux, - .run_scsi_mmc_cmd = scsi_mmc_run_cmd_linux, + .run_scsi_mmc_cmd = &run_scsi_cmd_linux, .set_arg = set_arg_linux, .stat_size = stat_size_linux }; diff --git a/lib/_cdio_sunos.c b/lib/_cdio_sunos.c index 14829b11..91d4708d 100644 --- a/lib/_cdio_sunos.c +++ b/lib/_cdio_sunos.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_sunos.c,v 1.64 2004/07/27 02:45:16 rocky Exp $ + $Id: _cdio_sunos.c,v 1.65 2004/07/28 01:09:59 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002, 2003, 2004 Rocky Bernstein @@ -38,7 +38,7 @@ #ifdef HAVE_SOLARIS_CDROM -static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.64 2004/07/27 02:45:16 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.65 2004/07/28 01:09:59 rocky Exp $"; #ifdef HAVE_GLOB_H #include @@ -65,9 +65,6 @@ static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.64 2004/07/27 02:45:16 rock #include #include "cdtext_private.h" -/* Number of seconds we wait for a SCSI MMC command to complete. */ -#define DEFAULT_TIMEOUT 30 - #define TOTAL_TRACKS (p_env->tochdr.cdth_trk1) /* reader */ @@ -143,9 +140,8 @@ init_solaris (_img_private_t *env) Run a SCSI MMC command. p_user_data internal CD structure. - i_timeout time in milliseconds we will wait for the command - to complete. If this value is -1, use the default - time-out value. + i_timeout_ms time in milliseconds we will wait for the command + to complete. i_cdb Size of p_cdb p_cdb CDB bytes. e_direction direction the transfer is to go. @@ -155,10 +151,10 @@ init_solaris (_img_private_t *env) Return 0 if no error. */ static int -scsi_mmc_run_cmd_solaris( const void *p_user_data, int i_timeout, - unsigned int i_cdb, const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, /*in/out*/ void *p_buf ) +run_scsi_cmd_solaris( const void *p_user_data, unsigned int i_timeout_ms, + unsigned int i_cdb, const scsi_mmc_cdb_t *p_cdb, + scsi_mmc_direction_t e_direction, + unsigned int i_buf, /*in/out*/ void *p_buf ) { const _img_private_t *p_env = p_user_data; struct uscsi_cmd cgc; @@ -169,7 +165,7 @@ scsi_mmc_run_cmd_solaris( const void *p_user_data, int i_timeout, cgc.uscsi_flags = SCSI_MMC_DATA_READ == e_direction ? USCSI_READ : USCSI_WRITE; - cgc.uscsi_timeout = i_timeout; /* # of seconds for completion */ + cgc.uscsi_timeout = msecs2secs(i_timeout_ms); cgc.uscsi_bufaddr = p_buf; cgc.uscsi_buflen = i_buf; cgc.uscsi_cdblen = i_cdb; @@ -479,7 +475,7 @@ static bool _init_cdtext_solaris (_img_private_t *p_env) { return scsi_mmc_init_cdtext_private( p_env->gen.cdio, - &scsi_mmc_run_cmd_solaris, + &run_scsi_cmd_solaris, set_cdtext_field_solaris ); } @@ -623,14 +619,14 @@ get_discmode_solaris (void *p_user_data) dvd.physical.type = CDIO_DVD_STRUCT_PHYSICAL; dvd.physical.layer_num = 0; if (0 == scsi_mmc_get_dvd_struct_physical_private (p_env, - &scsi_mmc_run_cmd_solaris, + &run_scsi_cmd_solaris, &dvd)) { switch(dvd.physical.layer[0].book_type) { case CDIO_DVD_BOOK_DVD_ROM: return CDIO_DISC_MODE_DVD_ROM; case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM; case CDIO_DVD_BOOK_DVD_R: return CDIO_DISC_MODE_DVD_R; case CDIO_DVD_BOOK_DVD_RW: return CDIO_DISC_MODE_DVD_RW; - case CDIO_DVD_BOOK_DVD_PW: return CDIO_DISC_MODE_DVD_PR; + case CDIO_DVD_BOOK_DVD_PR: return CDIO_DISC_MODE_DVD_PR; case CDIO_DVD_BOOK_DVD_PRW: return CDIO_DISC_MODE_DVD_PRW; default: return CDIO_DISC_MODE_DVD_OTHER; } @@ -903,7 +899,7 @@ cdio_open_am_solaris (const char *psz_orig_source, const char *access_mode) .read_mode1_sectors = _read_mode1_sectors_solaris, .read_mode2_sector = _read_mode2_sector_solaris, .read_mode2_sectors = _read_mode2_sectors_solaris, - .run_scsi_mmc_cmd = scsi_mmc_run_cmd_solaris, + .run_scsi_mmc_cmd = &run_scsi_cmd_solaris, .stat_size = _cdio_stat_size, .set_arg = _set_arg_solaris }; diff --git a/lib/scsi_mmc.c b/lib/scsi_mmc.c index 1fba2a89..da06e1ff 100644 --- a/lib/scsi_mmc.c +++ b/lib/scsi_mmc.c @@ -1,6 +1,6 @@ /* Common SCSI Multimedia Command (MMC) routines. - $Id: scsi_mmc.c,v 1.14 2004/07/27 18:57:04 rocky Exp $ + $Id: scsi_mmc.c,v 1.15 2004/07/28 01:09:59 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -98,7 +98,7 @@ scsi_mmc_get_cmd_len(uint8_t scsi_cmd) We return 0 if command completed successfully and 1 if not. */ int -scsi_mmc_run_cmd( const CdIo *cdio, int i_timeout, +scsi_mmc_run_cmd( const CdIo *cdio, unsigned int i_timeout, const scsi_mmc_cdb_t *p_cdb, scsi_mmc_direction_t e_direction, unsigned int i_buf, /*in/out*/ void *p_buf ) diff --git a/lib/scsi_mmc_private.h b/lib/scsi_mmc_private.h index fc9572e7..a1aaf3c7 100644 --- a/lib/scsi_mmc_private.h +++ b/lib/scsi_mmc_private.h @@ -1,6 +1,6 @@ /* private MMC helper routines. - $Id: scsi_mmc_private.h,v 1.6 2004/07/27 02:45:16 rocky Exp $ + $Id: scsi_mmc_private.h,v 1.7 2004/07/28 01:09:59 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -22,8 +22,20 @@ #include #include "cdtext_private.h" +/*! Convert milliseconds to seconds taking the ceiling value, i.e. + 1002 milliseconds gets rounded to 2 seconds. +*/ +#define SECS2MSECS 1000 +static inline unsigned int +msec2secs(unsigned int msecs) +{ + return (msecs+(SECS2MSECS-1)) / SECS2MSECS; +} +#undef SECS2MSECS + typedef -int (*scsi_mmc_run_cmd_fn_t) ( const void *p_user_data, int i_timeout, +int (*scsi_mmc_run_cmd_fn_t) ( const void *p_user_data, + unsigned int i_timeout_ms, unsigned int i_cdb, const scsi_mmc_cdb_t *p_cdb, scsi_mmc_direction_t e_direction,