diff --git a/include/cdio/scsi_mmc.h b/include/cdio/scsi_mmc.h index d30fb28d..d6a1a9d2 100644 --- a/include/cdio/scsi_mmc.h +++ b/include/cdio/scsi_mmc.h @@ -1,5 +1,5 @@ /* - $Id: scsi_mmc.h,v 1.17 2004/07/26 03:58:25 rocky Exp $ + $Id: scsi_mmc.h,v 1.18 2004/07/27 01:06:01 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -215,4 +215,7 @@ int scsi_mmc_set_bsize ( const CdIo *cdio, unsigned int bsize); discmode_t scsi_mmc_get_dvd_struct_physical ( const CdIo *p_cdio, cdio_dvd_struct_t *s); +char *scsi_mmc_get_mcn ( const CdIo *p_cdio ); + + #endif /* __SCSI_MMC_H__ */ diff --git a/lib/MSWindows/aspi32.c b/lib/MSWindows/aspi32.c index 8ffe8a28..6212a4e6 100644 --- a/lib/MSWindows/aspi32.c +++ b/lib/MSWindows/aspi32.c @@ -1,5 +1,5 @@ /* - $Id: aspi32.c,v 1.39 2004/07/26 04:33:21 rocky Exp $ + $Id: aspi32.c,v 1.40 2004/07/27 01:06:02 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: aspi32.c,v 1.39 2004/07/26 04:33:21 rocky Exp $"; +static const char _rcsid[] = "$Id: aspi32.c,v 1.40 2004/07/27 01:06:02 rocky Exp $"; #include #include @@ -211,8 +211,8 @@ get_discmode_aspi (_img_private_t *p_env) if (!p_env->gen.toc_init) return CDIO_DISC_MODE_NO_INFO; - for (i_track = p_env->i_first_track; - i_track < p_env->i_first_track + p_env->i_tracks ; + for (i_track = p_env->gen.i_first_track; + i_track < p_env->gen.i_first_track + p_env->i_tracks ; i_track ++) { track_format_t track_fmt=get_track_format_aspi(p_env, i_track); @@ -675,7 +675,7 @@ read_toc_aspi (_img_private_t *p_env) if (0 != i_status) return false; - p_env->i_first_track = tocheader[2]; + p_env->gen.i_first_track = tocheader[2]; p_env->i_tracks = tocheader[3] - tocheader[2] + 1; { @@ -771,30 +771,10 @@ wnaspi32_eject_media (void *user_data) { bool init_cdtext_aspi (_img_private_t *p_env) { - scsi_mmc_cdb_t cdb = {{ 0, }}; - uint8_t wdata[5000] = { 0, }; - int i_status; - - /* Operation code */ - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_TOC); - - /* Format */ - cdb.field[2] = CDIO_MMC_READTOC_FMT_CDTEXT; - - CDIO_MMC_SET_READ_LENGTH(cdb.field, sizeof(wdata)); - - i_status = scsi_mmc_run_cmd_aspi (p_env, OP_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - sizeof(wdata), &wdata); - - if (0 != i_status) { - cdio_info ("CD-TEXT reading failed\n"); - return false; - } else { - return cdtext_data_init(p_env, p_env->i_first_track, wdata, - set_cdtext_field_win32); - } + return scsi_mmc_init_cdtext_private( p_env->gen.cdio, + &scsi_mmc_run_cmd_aspi, + set_cdtext_field_win32 + ); } /*! @@ -859,36 +839,6 @@ get_drive_cap_aspi (const _img_private_t *p_env, } } -/*! - Return the media catalog number MCN. - - Note: string is malloc'd so caller should free() then returned - string when done with it. - - */ -char * -get_mcn_aspi (const _img_private_t *p_env) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - char buf[28] = { 0, }; - int i_status; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_SUBCHANNEL); - cdb.field[1] = 0x0; - cdb.field[2] = 0x40; - cdb.field[3] = CDIO_SUBCHANNEL_MEDIA_CATALOG; - CDIO_MMC_SET_READ_LENGTH(cdb.field, sizeof(buf)); - - i_status = scsi_mmc_run_cmd_aspi(p_env, OP_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - sizeof(buf), buf); - if(i_status == 0) { - return strdup(&buf[9]); - } - return NULL; -} - /*! Get format of track. */ diff --git a/lib/MSWindows/win32.c b/lib/MSWindows/win32.c index 40944585..c88793f5 100644 --- a/lib/MSWindows/win32.c +++ b/lib/MSWindows/win32.c @@ -1,5 +1,5 @@ /* - $Id: win32.c,v 1.31 2004/07/26 03:39:55 rocky Exp $ + $Id: win32.c,v 1.32 2004/07/27 01:06:02 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.31 2004/07/26 03:39:55 rocky Exp $"; +static const char _rcsid[] = "$Id: win32.c,v 1.32 2004/07/27 01:06:02 rocky Exp $"; #include #include @@ -545,14 +545,14 @@ _cdio_get_first_track_num(void *user_data) */ static char * -_cdio_get_mcn (const void *env) { - - const _img_private_t *_env = env; +_cdio_get_mcn (const void *p_user_data) { + const _img_private_t *p_env = p_user_data; if( _env->hASPI ) { - return get_mcn_aspi(_env); - } else - return get_mcn_win32ioctl(_env); + return scsi_mmc_get_mcn( p_env->gen.cdio ); + } else { + return get_mcn_win32ioctl(p_env); + } } /*! diff --git a/lib/MSWindows/win32.h b/lib/MSWindows/win32.h index 09ff0809..bc66ec92 100644 --- a/lib/MSWindows/win32.h +++ b/lib/MSWindows/win32.h @@ -1,5 +1,5 @@ /* - $Id: win32.h,v 1.15 2004/07/25 22:33:54 rocky Exp $ + $Id: win32.h,v 1.16 2004/07/27 01:06:02 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -45,7 +45,6 @@ typedef struct { cdtext_t cdtext; /* CD-TEXT */ track_t i_tracks; /* number of tracks in image */ - track_t i_first_track; /* track number of first track */ access_mode_t access_mode; diff --git a/lib/MSWindows/win32_ioctl.c b/lib/MSWindows/win32_ioctl.c index 8e5ac52a..2e73099a 100644 --- a/lib/MSWindows/win32_ioctl.c +++ b/lib/MSWindows/win32_ioctl.c @@ -1,5 +1,5 @@ /* - $Id: win32_ioctl.c,v 1.25 2004/07/26 11:25:51 rocky Exp $ + $Id: win32_ioctl.c,v 1.26 2004/07/27 01:06:02 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.25 2004/07/26 11:25:51 rocky Exp $"; +static const char _rcsid[] = "$Id: win32_ioctl.c,v 1.26 2004/07/27 01:06:02 rocky Exp $"; #include #include @@ -224,8 +224,8 @@ get_discmode_win32ioctl (_img_private_t *p_env) if (!p_env->gen.toc_init) return CDIO_DISC_MODE_NO_INFO; - for (i_track = p_env->i_first_track; - i_track < p_env->i_first_track + p_env->i_tracks ; + for (i_track = p_env->gen.i_first_track; + i_track < p_env->gen.i_first_track + p_env->i_tracks ; i_track ++) { track_format_t track_fmt=get_track_format_win32ioctl(p_env, i_track); @@ -510,31 +510,10 @@ read_toc_win32ioctl (_img_private_t *env) bool init_cdtext_win32ioctl (_img_private_t *p_env) { - scsi_mmc_cdb_t cdb = {{ 0, }}; - uint8_t wdata[5000] = { 0, }; - int i_status; - - /* Operation code */ - CDIO_MMC_SET_READ_LENGTH(cdb.field, sizeof(wdata)); - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_TOC); - - /* Format */ - cdb.field[2] = CDIO_MMC_READTOC_FMT_CDTEXT; - - CDIO_MMC_SET_READ_LENGTH(cdb.field, sizeof(wdata)); - - i_status = scsi_mmc_run_cmd_win32ioctl (p_env, OP_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - sizeof(wdata), &wdata); - - if(0 != i_status) { - cdio_info ("CD-TEXT reading failed\n"); - return false; - } else { - return cdtext_data_init(p_env, p_env->i_first_track, wdata, - set_cdtext_field_win32); - } + return scsi_mmc_cdtext_init_private( p_env->gen.cdio, + &scsi_mmc_run_cmd_win32ioctl, + set_cdtext_field_win32 + ); } /*! diff --git a/lib/_cdio_bsdi.c b/lib/_cdio_bsdi.c index 27d50baa..9eec9457 100644 --- a/lib/_cdio_bsdi.c +++ b/lib/_cdio_bsdi.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_bsdi.c,v 1.28 2004/06/26 00:39:00 rocky Exp $ + $Id: _cdio_bsdi.c,v 1.29 2004/07/27 01:06:02 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.28 2004/06/26 00:39:00 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_bsdi.c,v 1.29 2004/07/27 01:06:02 rocky Exp $"; #include #include @@ -55,8 +55,7 @@ static const char _rcsid[] = "$Id: _cdio_bsdi.c,v 1.28 2004/06/26 00:39:00 rocky #include #include -#define TOTAL_TRACKS (env->tochdr.cdth_trk1) -#define FIRST_TRACK_NUM (env->tochdr.cdth_trk0) +#define TOTAL_TRACKS (p_env->tochdr.cdth_trk1) typedef enum { _AM_NONE, @@ -378,29 +377,29 @@ _set_arg_bsdi (void *user_data, const char key[], const char value[]) Return false if successful or true if an error. */ static bool -_cdio_read_toc (_img_private_t *env) +_cdio_read_toc (_img_private_t *p_env) { int i; /* read TOC header */ - if ( ioctl(env->gen.fd, CDROMREADTOCHDR, &env->tochdr) == -1 ) { + if ( ioctl(p_env->gen.fd, CDROMREADTOCHDR, &p_env->tochdr) == -1 ) { cdio_warn("%s: %s\n", "error in ioctl CDROMREADTOCHDR", strerror(errno)); return false; } /* read individual tracks */ - for (i= FIRST_TRACK_NUM; i<=TOTAL_TRACKS; i++) { - env->tocent[i-1].cdte_track = i; - env->tocent[i-1].cdte_format = CDROM_MSF; - if ( ioctl(env->gen.fd, CDROMREADTOCENTRY, &env->tocent[i-1]) == -1 ) { + for (i= p_env->gen.i_first_track; i<=TOTAL_TRACKS; i++) { + p_env->tocent[i-1].cdte_track = i; + p_env->tocent[i-1].cdte_format = CDROM_MSF; + if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY, &p_env->tocent[i-1]) == -1) { cdio_warn("%s %d: %s\n", "error in ioctl CDROMREADTOCENTRY for track", i, strerror(errno)); return false; } /**** - struct cdrom_msf0 *msf= &env->tocent[i-1].cdte_addr.msf; + struct cdrom_msf0 *msf= &p_env->tocent[i-1].cdte_addr.msf; fprintf (stdout, "--- track# %d (msf %2.2x:%2.2x:%2.2x)\n", i, msf->minute, msf->second, msf->frame); @@ -409,11 +408,11 @@ _cdio_read_toc (_img_private_t *env) } /* read the lead-out track */ - env->tocent[TOTAL_TRACKS].cdte_track = CDIO_CDROM_LEADOUT_TRACK; - env->tocent[TOTAL_TRACKS].cdte_format = CDROM_MSF; + p_env->tocent[TOTAL_TRACKS].cdte_track = CDIO_CDROM_LEADOUT_TRACK; + p_env->tocent[TOTAL_TRACKS].cdte_format = CDROM_MSF; - if (ioctl(env->gen.fd, CDROMREADTOCENTRY, - &env->tocent[TOTAL_TRACKS]) == -1 ) { + if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY, + &p_env->tocent[TOTAL_TRACKS]) == -1 ) { cdio_warn("%s: %s\n", "error in ioctl CDROMREADTOCENTRY for lead-out", strerror(errno)); @@ -421,7 +420,7 @@ _cdio_read_toc (_img_private_t *env) } /* - struct cdrom_msf0 *msf= &env->tocent[TOTAL_TRACKS].cdte_addr.msf; + struct cdrom_msf0 *msf= &p_env->tocent[TOTAL_TRACKS].cdte_addr.msf; fprintf (stdout, "--- track# %d (msf %2.2x:%2.2x:%2.2x)\n", i, msf->minute, msf->second, msf->frame); @@ -437,14 +436,14 @@ _cdio_read_toc (_img_private_t *env) static int _eject_media_bsdi (void *user_data) { - _img_private_t *env = user_data; + _img_private_t *p_env = user_data; int ret=2; int status; int fd; - close(env->gen.fd); - env->gen.fd = -1; - if ((fd = open (env->source_name, O_RDONLY|O_NONBLOCK)) > -1) { + close(p_env->gen.fd); + p_env->gen.fd = -1; + if ((fd = open (p_env->source_name, O_RDONLY|O_NONBLOCK)) > -1) { if((status = ioctl(fd, CDROM_DRIVE_STATUS, (void *) CDSL_CURRENT)) > 0) { switch(status) { case CDS_TRAY_OPEN: @@ -474,12 +473,12 @@ _eject_media_bsdi (void *user_data) { static const char * _get_arg_bsdi (void *user_data, const char key[]) { - _img_private_t *env = user_data; + _img_private_t *p_env = user_data; if (!strcmp (key, "source")) { - return env->source_name; + return p_env->source_name; } else if (!strcmp (key, "access-mode")) { - switch (env->access_mode) { + switch (p_env->access_mode) { case _AM_IOCTL: return "ioctl"; case _AM_NONE: @@ -496,11 +495,11 @@ _get_arg_bsdi (void *user_data, const char key[]) static track_t _get_first_track_num_bsdi(void *user_data) { - _img_private_t *env = user_data; + _img_private_t *p_env = user_data; - if (!env->toc_init) _cdio_read_toc (env) ; + if (!p_env->toc_init) _cdio_read_toc (p_env) ; - return FIRST_TRACK_NUM; + return p_p_env->gen.i_first_track; } /*! @@ -512,8 +511,8 @@ static char * _get_mcn_bsdi (const void *user_data) { struct cdrom_mcn mcn; - const _img_private_t *env = user_data; - if (ioctl(env->gen.fd, CDROM_GET_MCN, &mcn) != 0) + const _img_private_t *p_env = user_data; + if (ioctl(p_env->gen.fd, CDROM_GET_MCN, &mcn) != 0) return NULL; return strdup(mcn.medium_catalog_number); } @@ -525,9 +524,9 @@ _get_mcn_bsdi (const void *user_data) { static track_t _get_num_tracks_bsdi(void *user_data) { - _img_private_t *env = user_data; + _img_private_t *p_env = user_data; - if (!env->toc_init) _cdio_read_toc (env) ; + if (!p_env->toc_init) _cdio_read_toc (p_env) ; return TOTAL_TRACKS; } @@ -538,22 +537,22 @@ _get_num_tracks_bsdi(void *user_data) static track_format_t _get_track_format_bsdi(void *user_data, track_t i_track) { - _img_private_t *env = user_data; + _img_private_t *p_env = user_data; - if (!env->toc_init) _cdio_read_toc (env) ; + if (!p_env->toc_init) _cdio_read_toc (p_env) ; if (i_track > TOTAL_TRACKS || i_track == 0) return TRACK_FORMAT_ERROR; - i_track -= FIRST_TRACK_NUM; + i_track -= p_p_env->gen.i_first_track; /* This is pretty much copied from the "badly broken" cdrom_count_tracks in linux/cdrom.c. */ - if (env->tocent[i_track].cdte_ctrl & CDROM_DATA_TRACK) { - if (env->tocent[i_track].cdte_format == CDIO_CDROM_CDI_TRACK) + if (p_env->tocent[i_track].cdte_ctrl & CDROM_DATA_TRACK) { + if (p_env->tocent[i_track].cdte_format == CDIO_CDROM_CDI_TRACK) return TRACK_FORMAT_CDI; - else if (env->tocent[i_track].cdte_format == CDIO_CDROM_XA_TRACK) + else if (p_env->tocent[i_track].cdte_format == CDIO_CDROM_XA_TRACK) return TRACK_FORMAT_XA; else return TRACK_FORMAT_DATA; @@ -573,9 +572,9 @@ _get_track_format_bsdi(void *user_data, track_t i_track) static bool _get_track_green_bsdi(void *user_data, track_t i_track) { - _img_private_t *env = user_data; + _img_private_t *p_env = user_data; - if (!env->toc_init) _cdio_read_toc (env) ; + if (!p_env->toc_init) _cdio_read_toc (p_env) ; if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = TOTAL_TRACKS+1; @@ -585,7 +584,7 @@ _get_track_green_bsdi(void *user_data, track_t i_track) /* FIXME: Dunno if this is the right way, but it's what I was using in cdinfo for a while. */ - return ((env->tocent[i_track-1].cdte_ctrl & 2) != 0); + return ((p_env->tocent[i_track-1].cdte_ctrl & 2) != 0); } /*! @@ -598,11 +597,11 @@ _get_track_green_bsdi(void *user_data, track_t i_track) static bool _get_track_msf_bsdi(void *user_data, track_t i_track, msf_t *msf) { - _img_private_t *env = user_data; + _img_private_t *p_env = user_data; if (NULL == msf) return false; - if (!env->toc_init) _cdio_read_toc (env) ; + if (!p_env->toc_init) _cdio_read_toc (p_env) ; if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = TOTAL_TRACKS+1; @@ -610,10 +609,10 @@ _get_track_msf_bsdi(void *user_data, track_t i_track, msf_t *msf) return false; } - i_track -= FIRST_TRACK_NUM; + i_track -= p_p_env->gen.i_first_track; { - struct cdrom_msf0 *msf0= &env->tocent[i_track].cdte_addr.msf; + struct cdrom_msf0 *msf0= &p_env->tocent[i_track].cdte_addr.msf; msf->m = to_bcd8(msf0->minute); msf->s = to_bcd8(msf0->second); msf->f = to_bcd8(msf0->frame); diff --git a/lib/_cdio_linux.c b/lib/_cdio_linux.c index 716073d0..e5080d6b 100644 --- a/lib/_cdio_linux.c +++ b/lib/_cdio_linux.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_linux.c,v 1.82 2004/07/26 03:58:25 rocky Exp $ + $Id: _cdio_linux.c,v 1.83 2004/07/27 01:06:02 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.82 2004/07/26 03:58:25 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.83 2004/07/27 01:06:02 rocky Exp $"; #include @@ -75,7 +75,6 @@ static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.82 2004/07/26 03:58:25 rock #define DEFAULT_TIMEOUT 500 #define TOTAL_TRACKS (p_env->tochdr.cdth_trk1) -#define FIRST_TRACK_NUM (p_env->tochdr.cdth_trk0) typedef enum { _AM_NONE, @@ -240,7 +239,7 @@ get_first_track_num_linux(void *p_user_data) if (!p_env->gen.toc_init) read_toc_linux (p_env) ; - return p_env->gen.toc_init ? FIRST_TRACK_NUM : CDIO_INVALID_TRACK; + return p_env->gen.toc_init ? p_env->gen.i_first_track : CDIO_INVALID_TRACK; } /*! @@ -349,10 +348,11 @@ _get_track_format_linux(void *p_user_data, track_t i_track) { _img_private_t *p_env = p_user_data; - if (i_track > (TOTAL_TRACKS+FIRST_TRACK_NUM) || i_track < FIRST_TRACK_NUM) + if (i_track > (TOTAL_TRACKS+p_env->gen.i_first_track) + || i_track < p_env->gen.i_first_track) return TRACK_FORMAT_ERROR; - i_track -= FIRST_TRACK_NUM; + i_track -= p_env->gen.i_first_track; /* This is pretty much copied from the "badly broken" cdrom_count_tracks in linux/cdrom.c. @@ -384,10 +384,11 @@ _get_track_green_linux(void *p_user_data, track_t i_track) if (!p_env->gen.toc_init) read_toc_linux (p_env) ; - if (i_track >= (TOTAL_TRACKS+FIRST_TRACK_NUM) || i_track < FIRST_TRACK_NUM) + if (i_track >= (TOTAL_TRACKS+p_env->gen.i_first_track) + || i_track < p_env->gen.i_first_track) return false; - i_track -= FIRST_TRACK_NUM; + i_track -= p_env->gen.i_first_track; /* FIXME: Dunno if this is the right way, but it's what I was using in cd-info for a while. @@ -414,14 +415,14 @@ _get_track_msf_linux(void *p_user_data, track_t i_track, msf_t *msf) if (!p_env->gen.toc_init) read_toc_linux (p_env) ; if (i_track == CDIO_CDROM_LEADOUT_TRACK) - i_track = TOTAL_TRACKS + FIRST_TRACK_NUM; + i_track = TOTAL_TRACKS + p_env->gen.i_first_track; - if (i_track > (TOTAL_TRACKS+FIRST_TRACK_NUM) - || i_track < FIRST_TRACK_NUM) { + if (i_track > (TOTAL_TRACKS+p_env->gen.i_first_track) + || i_track < p_env->gen.i_first_track) { return false; } else { struct cdrom_msf0 *msf0= - &p_env->tocent[i_track-FIRST_TRACK_NUM].cdte_addr.msf; + &p_env->tocent[i_track-p_env->gen.i_first_track].cdte_addr.msf; msf->m = to_bcd8(msf0->minute); msf->s = to_bcd8(msf0->second); msf->f = to_bcd8(msf0->frame); @@ -846,12 +847,14 @@ read_toc_linux (_img_private_t *p_env) return false; } + p_env->gen.i_first_track = p_env->tochdr.cdth_trk0; + /* read individual tracks */ - for (i= FIRST_TRACK_NUM; i<=TOTAL_TRACKS; i++) { - p_env->tocent[i-FIRST_TRACK_NUM].cdte_track = i; - p_env->tocent[i-FIRST_TRACK_NUM].cdte_format = CDROM_MSF; + for (i= p_env->gen.i_first_track; i<=TOTAL_TRACKS; i++) { + p_env->tocent[i-p_env->gen.i_first_track].cdte_track = i; + p_env->tocent[i-p_env->gen.i_first_track].cdte_format = CDROM_MSF; if ( ioctl(p_env->gen.fd, CDROMREADTOCENTRY, - &p_env->tocent[i-FIRST_TRACK_NUM]) == -1 ) { + &p_env->tocent[i-p_env->gen.i_first_track]) == -1 ) { cdio_warn("%s %d: %s\n", "error in ioctl CDROMREADTOCENTRY for track", i, strerror(errno)); @@ -1009,30 +1012,10 @@ set_cdtext_field_linux(void *user_data, track_t i_track, static bool init_cdtext_linux (_img_private_t *p_env) { - - scsi_mmc_cdb_t cdb = {{0, }}; - - unsigned char wdata[2000]= {0, }; /* Data read from device starts here */ - int status; - - /* Operation code */ - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_TOC); - - /* Format */ - cdb.field[2] = CDIO_MMC_READTOC_FMT_CDTEXT; - - status = scsi_mmc_run_cmd_linux (p_env, DEFAULT_TIMEOUT, - scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, - SCSI_MMC_DATA_READ, sizeof(wdata), &wdata); - - if (status < 0) { - cdio_info ("CD-TEXT reading failed\n"); - p_env->b_cdtext_error = true; - return false; - } else { - return cdtext_data_init(p_env, FIRST_TRACK_NUM, wdata, - set_cdtext_field_linux); - } + return scsi_mmc_init_cdtext_private( p_env->gen.cdio, + &scsi_mmc_run_cmd_linux, + set_cdtext_field_linux + ); } /*! @@ -1049,7 +1032,7 @@ get_cdtext_linux (void *p_user_data, track_t i_track) if ( NULL == p_env || (0 != i_track - && i_track >= TOTAL_TRACKS+FIRST_TRACK_NUM ) ) + && i_track >= TOTAL_TRACKS+p_env->gen.i_first_track ) ) return NULL; p_env->b_cdtext_init = init_cdtext_linux(p_env); @@ -1058,7 +1041,7 @@ get_cdtext_linux (void *p_user_data, track_t i_track) if (0 == i_track) return &(p_env->cdtext); else - return &(p_env->cdtext_track[i_track-FIRST_TRACK_NUM]); + return &(p_env->cdtext_track[i_track-p_env->gen.i_first_track]); } diff --git a/lib/_cdio_sunos.c b/lib/_cdio_sunos.c index 7bceab38..76dbffdf 100644 --- a/lib/_cdio_sunos.c +++ b/lib/_cdio_sunos.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_sunos.c,v 1.61 2004/07/23 10:37:17 rocky Exp $ + $Id: _cdio_sunos.c,v 1.62 2004/07/27 01:06:02 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.61 2004/07/23 10:37:17 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.62 2004/07/27 01:06:02 rocky Exp $"; #ifdef HAVE_GLOB_H #include @@ -69,7 +69,6 @@ static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.61 2004/07/23 10:37:17 rock #define DEFAULT_TIMEOUT 30 #define TOTAL_TRACKS (p_env->tochdr.cdth_trk1) -#define FIRST_TRACK_NUM (p_env->tochdr.cdth_trk0) /* reader */ @@ -420,6 +419,8 @@ _cdio_read_toc (_img_private_t *env) return false; } + p_env->gen.i_first_track = p_env->tochdr.cdth_trk0; + /* read individual tracks */ for (i=env->tochdr.cdth_trk0; i<=env->tochdr.cdth_trk1; i++) { env->tocent[i-1].cdte_track = i; @@ -474,32 +475,10 @@ set_cdtext_field_solaris(void *p_user_data, track_t i_track, static bool _init_cdtext_solaris (_img_private_t *p_env) { - - scsi_mmc_cdb_t cdb = {{0, }}; - char wdata[5000] = { 0, }; - int i_status; - - /* Operation code */ - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_TOC); - - /* Format */ - cdb.field[2] = CDIO_MMC_READTOC_FMT_CDTEXT; - - CDIO_MMC_SET_READ_LENGTH(cdb.field, sizeof(wdata)); - - errno = 0; - i_status = scsi_mmc_run_cmd_solaris (p_env, DEFAULT_TIMEOUT, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - sizeof(wdata), &wdata); - - if(i_status != 0) { - cdio_info ("CD-TEXT reading failed: %s\n", strerror(errno)); - return false; - } else { - return cdtext_data_init(p_env, FIRST_TRACK_NUM, wdata, - set_cdtext_field_solaris); - } + return scsi_mmc_init_cdtext_private( p_env->gen.cdio, + &scsi_mmc_run_cmd_solaris, + set_cdtext_field_solaris + ); } /*! @@ -516,7 +495,7 @@ _get_cdtext_solaris (void *p_user_data, track_t i_track) if ( NULL == p_env || (0 != i_track - && i_track >= TOTAL_TRACKS+FIRST_TRACK_NUM ) + && i_track >= TOTAL_TRACKS+p_env->gen.i_first_track ) || p_env ->b_cdtext_error ) return NULL; @@ -528,7 +507,7 @@ _get_cdtext_solaris (void *p_user_data, track_t i_track) if (0 == i_track) return &(p_env->cdtext); else - return &(p_env->cdtext_track[i_track-FIRST_TRACK_NUM]); + return &(p_env->cdtext_track[i_track-p_env->gen.i_first_track]); } /*! @@ -705,26 +684,7 @@ static char * _get_mcn_solaris (const void *p_user_data) { const _img_private_t *p_env = p_user_data; - scsi_mmc_cdb_t cdb = {{0, }}; - - char buf[28] = { 0, }; - int i_status; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_SUBCHANNEL); - cdb.field[1] = 0x0; - cdb.field[2] = 0x40; - cdb.field[3] = CDIO_SUBCHANNEL_MEDIA_CATALOG; - - CDIO_MMC_SET_READ_LENGTH(cdb.field, sizeof(buf)); - - i_status = scsi_mmc_run_cmd_solaris (p_env, DEFAULT_TIMEOUT, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - sizeof(buf), &buf); - if(i_status == 0) { - return strdup(&buf[9]); - } - return NULL; + return scsi_mmc_get_mcn( p_env->gen.cdio ); } @@ -739,7 +699,7 @@ _cdio_get_first_track_num(void *p_user_data) if (!p_env->gen.toc_init) _cdio_read_toc (p_env) ; - return FIRST_TRACK_NUM; + return p_env->gen.i_first_track; } @@ -762,10 +722,11 @@ _cdio_get_track_format(void *p_user_data, track_t i_track) { _img_private_t *p_env = p_user_data; - if ( (i_track > TOTAL_TRACKS+FIRST_TRACK_NUM) || i_track < FIRST_TRACK_NUM) + if ( (i_track > TOTAL_TRACKS+p_env->gen.i_first_track) + || i_track < p_env->gen.i_first_track) return TRACK_FORMAT_ERROR; - i_track -= FIRST_TRACK_NUM; + i_track -= p_env->gen.i_first_track; /* This is pretty much copied from the "badly broken" cdrom_count_tracks in linux/cdrom.c. @@ -798,10 +759,11 @@ _cdio_get_track_green(void *p_user_data, track_t i_track) if (!p_env->gen.init) init_solaris(p_env); if (!p_env->gen.toc_init) _cdio_read_toc (p_env) ; - if (i_track >= TOTAL_TRACKS+FIRST_TRACK_NUM || i_track < FIRST_TRACK_NUM) + if (i_track >= TOTAL_TRACKS+p_env->gen.i_first_track + || i_track < p_env->gen.i_first_track) return false; - i_track -= FIRST_TRACK_NUM; + i_track -= p_env->gen.i_first_track; /* FIXME: Dunno if this is the right way, but it's what I was using in cd-info for a while. @@ -829,9 +791,10 @@ _cdio_get_track_msf(void *p_user_data, track_t i_track, msf_t *msf) if (!p_env->gen.toc_init) _cdio_read_toc (p_env) ; if (i_track == CDIO_CDROM_LEADOUT_TRACK) - i_track = TOTAL_TRACKS + FIRST_TRACK_NUM; + i_track = TOTAL_TRACKS + p_env->gen.i_first_track; - if (i_track > (TOTAL_TRACKS+FIRST_TRACK_NUM) || i_track < FIRST_TRACK_NUM) { + if (i_track > (TOTAL_TRACKS+p_env->gen.i_first_track) + || i_track < p_env->gen.i_first_track) { return false; } else { struct cdrom_tocentry *msf0 = &p_env->tocent[i_track-1]; diff --git a/lib/cdio_private.h b/lib/cdio_private.h index 58c84cd2..acb6d0f8 100644 --- a/lib/cdio_private.h +++ b/lib/cdio_private.h @@ -1,5 +1,5 @@ /* - $Id: cdio_private.h,v 1.34 2004/07/26 02:54:37 rocky Exp $ + $Id: cdio_private.h,v 1.35 2004/07/27 01:06:02 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -257,6 +257,7 @@ extern "C" { and the second for stream reading (bincue, nrg, toc, network). */ int fd; /**< File descriptor of device */ + track_t i_first_track; /**< The starting track number. */ CdioDataSource *data_source; CdIo *cdio; /**< a way to call general cdio routines. */ } generic_img_private_t; diff --git a/lib/scsi_mmc.c b/lib/scsi_mmc.c index 46d5d0cc..5c17b337 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.11 2004/07/26 04:33:21 rocky Exp $ + $Id: scsi_mmc.c,v 1.12 2004/07/27 01:06:02 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -24,6 +24,7 @@ #endif #include +#include #include #include "cdio_private.h" @@ -184,9 +185,9 @@ scsi_mmc_read_sectors ( const CdIo *cdio, void *p_buf, lba_t lba, } int -set_bsize_mmc ( const void *p_env, - const scsi_mmc_run_cmd_fn_t *run_scsi_mmc_cmd, - unsigned int bsize) +scsi_mmc_set_bsize_private ( const void *p_env, + const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, + unsigned int bsize) { scsi_mmc_cdb_t cdb = {{0, }}; @@ -220,7 +221,7 @@ set_bsize_mmc ( const void *p_env, cdb.field[1] = 1 << 4; cdb.field[4] = 12; - return (*run_scsi_mmc_cmd) (p_env, DEFAULT_TIMEOUT_MS, + return run_scsi_mmc_cmd (p_env, DEFAULT_TIMEOUT_MS, scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, SCSI_MMC_DATA_WRITE, sizeof(mh), &mh); } @@ -229,16 +230,17 @@ int scsi_mmc_set_bsize ( const CdIo *cdio, unsigned int bsize) { if ( ! cdio ) return -2; - return set_bsize_mmc (cdio->env, (&cdio->op.run_scsi_mmc_cmd), bsize); + return + scsi_mmc_set_bsize_private (cdio->env, cdio->op.run_scsi_mmc_cmd, bsize); } /*! Get the DVD type associated with cd object. */ discmode_t -get_dvd_struct_physical_mmc ( void *p_env, +scsi_mmc_get_dvd_struct_physical_private ( void *p_env, const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, - cdio_dvd_struct_t *s) + cdio_dvd_struct_t *s) { scsi_mmc_cdb_t cdb = {{0, }}; unsigned char buf[20], *base; @@ -298,8 +300,96 @@ discmode_t scsi_mmc_get_dvd_struct_physical ( const CdIo *p_cdio, cdio_dvd_struct_t *s) { if ( ! p_cdio ) return -2; - return get_dvd_struct_physical_mmc (p_cdio->env, - p_cdio->op.run_scsi_mmc_cmd, - s); + return + scsi_mmc_get_dvd_struct_physical_private (p_cdio->env, + p_cdio->op.run_scsi_mmc_cmd, + s); +} + +/*! + Return the media catalog number MCN. + + Note: string is malloc'd so caller should free() then returned + string when done with it. + + */ +char * +scsi_mmc_get_mcn_private ( void *p_env, + const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd + ) +{ + scsi_mmc_cdb_t cdb = {{0, }}; + char buf[28] = { 0, }; + int i_status; + + if ( ! p_env || ! run_scsi_mmc_cmd ) + return NULL; + + CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_SUBCHANNEL); + cdb.field[1] = 0x0; + cdb.field[2] = 0x40; + cdb.field[3] = CDIO_SUBCHANNEL_MEDIA_CATALOG; + CDIO_MMC_SET_READ_LENGTH(cdb.field, sizeof(buf)); + + i_status = run_scsi_mmc_cmd(p_env, DEFAULT_TIMEOUT_MS, + scsi_mmc_get_cmd_len(cdb.field[0]), + &cdb, SCSI_MMC_DATA_READ, + sizeof(buf), buf); + if(i_status == 0) { + return strdup(&buf[9]); + } + return NULL; +} + +char * +scsi_mmc_get_mcn ( const CdIo *p_cdio ) +{ + if ( ! p_cdio ) return NULL; + return scsi_mmc_get_mcn_private (p_cdio->env, + p_cdio->op.run_scsi_mmc_cmd ); +} + +/* + Read cdtext information for a CdIo object . + + return true on success, false on error or CD-TEXT information does + not exist. +*/ +bool +scsi_mmc_init_cdtext_private ( void *p_user_data, + const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, + set_cdtext_field_fn_t set_cdtext_field_fn + ) +{ + + generic_img_private_t *p_env = p_user_data; + scsi_mmc_cdb_t cdb = {{0, }}; + char wdata[5000] = { 0, }; + int i_status; + + if ( ! p_env || ! run_scsi_mmc_cmd ) + return false; + + /* Operation code */ + CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_TOC); + + /* Format */ + cdb.field[2] = CDIO_MMC_READTOC_FMT_CDTEXT; + + CDIO_MMC_SET_READ_LENGTH(cdb.field, sizeof(wdata)); + + errno = 0; + i_status = run_scsi_mmc_cmd (p_env, DEFAULT_TIMEOUT_MS, + scsi_mmc_get_cmd_len(cdb.field[0]), + &cdb, SCSI_MMC_DATA_READ, + sizeof(wdata), &wdata); + + if (i_status != 0) { + cdio_info ("CD-TEXT reading failed: %s\n", strerror(errno)); + return false; + } else { + return cdtext_data_init(p_env, p_env->i_first_track, wdata, + set_cdtext_field_fn); + } } diff --git a/lib/scsi_mmc_private.h b/lib/scsi_mmc_private.h index 19eae9f1..26d61d46 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.4 2004/07/26 04:33:21 rocky Exp $ + $Id: scsi_mmc_private.h,v 1.5 2004/07/27 01:06:02 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -20,6 +20,7 @@ */ #include +#include "cdtext_private.h" typedef int (*scsi_mmc_run_cmd_fn_t) ( const void *p_user_data, int i_timeout, @@ -28,16 +29,33 @@ int (*scsi_mmc_run_cmd_fn_t) ( const void *p_user_data, int i_timeout, scsi_mmc_direction_t e_direction, unsigned int i_buf, /*in/out*/ void *p_buf ); -int set_bsize_mmc ( const void *p_env, - const scsi_mmc_run_cmd_fn_t *run_scsi_mmc_cmd, - unsigned int bsize ); +int scsi_mmc_set_bsize_mmc_private ( const void *p_env, const + scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, + unsigned int bsize ); /*! Get the DVD type associated with cd object. */ discmode_t -get_dvd_struct_physical_mmc ( void *p_env, - const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, - cdio_dvd_struct_t *s ); +scsi_mmc_get_dvd_struct_physical_private ( void *p_env, const + scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, + cdio_dvd_struct_t *s ); + + +int +scsi_mmc_set_bsize_private ( const void *p_env, + const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, + unsigned int bsize); + +char * +scsi_mmc_get_mcn_private ( void *p_env, + const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd + ); +bool +scsi_mmc_init_cdtext_private ( void *user_data, const + scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, + set_cdtext_field_fn_t set_cdtext_field_fn + ); +