More consolidation of code by adding routines to scsi_mmc.

This commit is contained in:
rocky
2004-07-27 01:06:01 +00:00
parent 46d287060c
commit db337e5665
11 changed files with 246 additions and 261 deletions

View File

@@ -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 <rocky@panix.com>
@@ -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__ */

View File

@@ -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 <rocky@panix.com>
@@ -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 <cdio/cdio.h>
#include <cdio/sector.h>
@@ -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.
*/

View File

@@ -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 <rocky@panix.com>
@@ -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 <cdio/cdio.h>
#include <cdio/sector.h>
@@ -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);
}
}
/*!

View File

@@ -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 <rocky@panix.com>
@@ -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;

View File

@@ -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 <rocky@panix.com>
@@ -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 <cdio/cdio.h>
#include <cdio/sector.h>
@@ -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
);
}
/*!

View File

@@ -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 <hvr@gnu.org>
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -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 <cdio/sector.h>
#include <cdio/util.h>
@@ -55,8 +55,7 @@ static const char _rcsid[] = "$Id: _cdio_bsdi.c,v 1.28 2004/06/26 00:39:00 rocky
#include <sys/types.h>
#include <sys/ioctl.h>
#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);

View File

@@ -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 <hvr@gnu.org>
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -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 <string.h>
@@ -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]);
}

View File

@@ -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 <hvr@gnu.org>
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -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 <glob.h>
@@ -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];

View File

@@ -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 <rocky@panix.com>
@@ -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;

View File

@@ -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 <rocky@panix.com>
@@ -24,6 +24,7 @@
#endif
#include <cdio/cdio.h>
#include <cdio/logging.h>
#include <cdio/scsi_mmc.h>
#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);
}
}

View File

@@ -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 <rocky@panix.com>
@@ -20,6 +20,7 @@
*/
#include <cdio/scsi_mmc.h>
#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
);