More consolidation of code by adding routines to scsi_mmc.
This commit is contained in:
@@ -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__ */
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
|
||||
112
lib/scsi_mmc.c
112
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 <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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user