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>
|
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,
|
discmode_t scsi_mmc_get_dvd_struct_physical ( const CdIo *p_cdio,
|
||||||
cdio_dvd_struct_t *s);
|
cdio_dvd_struct_t *s);
|
||||||
|
|
||||||
|
char *scsi_mmc_get_mcn ( const CdIo *p_cdio );
|
||||||
|
|
||||||
|
|
||||||
#endif /* __SCSI_MMC_H__ */
|
#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>
|
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
# include "config.h"
|
# include "config.h"
|
||||||
#endif
|
#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/cdio.h>
|
||||||
#include <cdio/sector.h>
|
#include <cdio/sector.h>
|
||||||
@@ -211,8 +211,8 @@ get_discmode_aspi (_img_private_t *p_env)
|
|||||||
if (!p_env->gen.toc_init)
|
if (!p_env->gen.toc_init)
|
||||||
return CDIO_DISC_MODE_NO_INFO;
|
return CDIO_DISC_MODE_NO_INFO;
|
||||||
|
|
||||||
for (i_track = p_env->i_first_track;
|
for (i_track = p_env->gen.i_first_track;
|
||||||
i_track < p_env->i_first_track + p_env->i_tracks ;
|
i_track < p_env->gen.i_first_track + p_env->i_tracks ;
|
||||||
i_track ++) {
|
i_track ++) {
|
||||||
track_format_t track_fmt=get_track_format_aspi(p_env, 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;
|
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;
|
p_env->i_tracks = tocheader[3] - tocheader[2] + 1;
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -771,30 +771,10 @@ wnaspi32_eject_media (void *user_data) {
|
|||||||
bool
|
bool
|
||||||
init_cdtext_aspi (_img_private_t *p_env)
|
init_cdtext_aspi (_img_private_t *p_env)
|
||||||
{
|
{
|
||||||
scsi_mmc_cdb_t cdb = {{ 0, }};
|
return scsi_mmc_init_cdtext_private( p_env->gen.cdio,
|
||||||
uint8_t wdata[5000] = { 0, };
|
&scsi_mmc_run_cmd_aspi,
|
||||||
int i_status;
|
set_cdtext_field_win32
|
||||||
|
);
|
||||||
/* 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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -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.
|
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>
|
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
# include "config.h"
|
# include "config.h"
|
||||||
#endif
|
#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/cdio.h>
|
||||||
#include <cdio/sector.h>
|
#include <cdio/sector.h>
|
||||||
@@ -545,14 +545,14 @@ _cdio_get_first_track_num(void *user_data)
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
static char *
|
static char *
|
||||||
_cdio_get_mcn (const void *env) {
|
_cdio_get_mcn (const void *p_user_data) {
|
||||||
|
const _img_private_t *p_env = p_user_data;
|
||||||
const _img_private_t *_env = env;
|
|
||||||
|
|
||||||
if( _env->hASPI ) {
|
if( _env->hASPI ) {
|
||||||
return get_mcn_aspi(_env);
|
return scsi_mmc_get_mcn( p_env->gen.cdio );
|
||||||
} else
|
} else {
|
||||||
return get_mcn_win32ioctl(_env);
|
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>
|
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
|
||||||
|
|
||||||
@@ -45,7 +45,6 @@ typedef struct {
|
|||||||
|
|
||||||
cdtext_t cdtext; /* CD-TEXT */
|
cdtext_t cdtext; /* CD-TEXT */
|
||||||
track_t i_tracks; /* number of tracks in image */
|
track_t i_tracks; /* number of tracks in image */
|
||||||
track_t i_first_track; /* track number of first track */
|
|
||||||
|
|
||||||
access_mode_t access_mode;
|
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>
|
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
# include "config.h"
|
# include "config.h"
|
||||||
#endif
|
#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/cdio.h>
|
||||||
#include <cdio/sector.h>
|
#include <cdio/sector.h>
|
||||||
@@ -224,8 +224,8 @@ get_discmode_win32ioctl (_img_private_t *p_env)
|
|||||||
if (!p_env->gen.toc_init)
|
if (!p_env->gen.toc_init)
|
||||||
return CDIO_DISC_MODE_NO_INFO;
|
return CDIO_DISC_MODE_NO_INFO;
|
||||||
|
|
||||||
for (i_track = p_env->i_first_track;
|
for (i_track = p_env->gen.i_first_track;
|
||||||
i_track < p_env->i_first_track + p_env->i_tracks ;
|
i_track < p_env->gen.i_first_track + p_env->i_tracks ;
|
||||||
i_track ++) {
|
i_track ++) {
|
||||||
track_format_t track_fmt=get_track_format_win32ioctl(p_env, 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
|
bool
|
||||||
init_cdtext_win32ioctl (_img_private_t *p_env)
|
init_cdtext_win32ioctl (_img_private_t *p_env)
|
||||||
{
|
{
|
||||||
scsi_mmc_cdb_t cdb = {{ 0, }};
|
return scsi_mmc_cdtext_init_private( p_env->gen.cdio,
|
||||||
uint8_t wdata[5000] = { 0, };
|
&scsi_mmc_run_cmd_win32ioctl,
|
||||||
int i_status;
|
set_cdtext_field_win32
|
||||||
|
);
|
||||||
/* 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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -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) 2001 Herbert Valerio Riedel <hvr@gnu.org>
|
||||||
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
|
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
# include "config.h"
|
# include "config.h"
|
||||||
#endif
|
#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/sector.h>
|
||||||
#include <cdio/util.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/types.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
#define TOTAL_TRACKS (env->tochdr.cdth_trk1)
|
#define TOTAL_TRACKS (p_env->tochdr.cdth_trk1)
|
||||||
#define FIRST_TRACK_NUM (env->tochdr.cdth_trk0)
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
_AM_NONE,
|
_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.
|
Return false if successful or true if an error.
|
||||||
*/
|
*/
|
||||||
static bool
|
static bool
|
||||||
_cdio_read_toc (_img_private_t *env)
|
_cdio_read_toc (_img_private_t *p_env)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* read TOC header */
|
/* 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",
|
cdio_warn("%s: %s\n",
|
||||||
"error in ioctl CDROMREADTOCHDR", strerror(errno));
|
"error in ioctl CDROMREADTOCHDR", strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read individual tracks */
|
/* read individual tracks */
|
||||||
for (i= FIRST_TRACK_NUM; i<=TOTAL_TRACKS; i++) {
|
for (i= p_env->gen.i_first_track; i<=TOTAL_TRACKS; i++) {
|
||||||
env->tocent[i-1].cdte_track = i;
|
p_env->tocent[i-1].cdte_track = i;
|
||||||
env->tocent[i-1].cdte_format = CDROM_MSF;
|
p_env->tocent[i-1].cdte_format = CDROM_MSF;
|
||||||
if ( ioctl(env->gen.fd, CDROMREADTOCENTRY, &env->tocent[i-1]) == -1 ) {
|
if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY, &p_env->tocent[i-1]) == -1) {
|
||||||
cdio_warn("%s %d: %s\n",
|
cdio_warn("%s %d: %s\n",
|
||||||
"error in ioctl CDROMREADTOCENTRY for track",
|
"error in ioctl CDROMREADTOCENTRY for track",
|
||||||
i, strerror(errno));
|
i, strerror(errno));
|
||||||
return false;
|
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",
|
fprintf (stdout, "--- track# %d (msf %2.2x:%2.2x:%2.2x)\n",
|
||||||
i, msf->minute, msf->second, msf->frame);
|
i, msf->minute, msf->second, msf->frame);
|
||||||
@@ -409,11 +408,11 @@ _cdio_read_toc (_img_private_t *env)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* read the lead-out track */
|
/* read the lead-out track */
|
||||||
env->tocent[TOTAL_TRACKS].cdte_track = CDIO_CDROM_LEADOUT_TRACK;
|
p_env->tocent[TOTAL_TRACKS].cdte_track = CDIO_CDROM_LEADOUT_TRACK;
|
||||||
env->tocent[TOTAL_TRACKS].cdte_format = CDROM_MSF;
|
p_env->tocent[TOTAL_TRACKS].cdte_format = CDROM_MSF;
|
||||||
|
|
||||||
if (ioctl(env->gen.fd, CDROMREADTOCENTRY,
|
if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY,
|
||||||
&env->tocent[TOTAL_TRACKS]) == -1 ) {
|
&p_env->tocent[TOTAL_TRACKS]) == -1 ) {
|
||||||
cdio_warn("%s: %s\n",
|
cdio_warn("%s: %s\n",
|
||||||
"error in ioctl CDROMREADTOCENTRY for lead-out",
|
"error in ioctl CDROMREADTOCENTRY for lead-out",
|
||||||
strerror(errno));
|
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",
|
fprintf (stdout, "--- track# %d (msf %2.2x:%2.2x:%2.2x)\n",
|
||||||
i, msf->minute, msf->second, msf->frame);
|
i, msf->minute, msf->second, msf->frame);
|
||||||
@@ -437,14 +436,14 @@ _cdio_read_toc (_img_private_t *env)
|
|||||||
static int
|
static int
|
||||||
_eject_media_bsdi (void *user_data) {
|
_eject_media_bsdi (void *user_data) {
|
||||||
|
|
||||||
_img_private_t *env = user_data;
|
_img_private_t *p_env = user_data;
|
||||||
int ret=2;
|
int ret=2;
|
||||||
int status;
|
int status;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
close(env->gen.fd);
|
close(p_env->gen.fd);
|
||||||
env->gen.fd = -1;
|
p_env->gen.fd = -1;
|
||||||
if ((fd = open (env->source_name, O_RDONLY|O_NONBLOCK)) > -1) {
|
if ((fd = open (p_env->source_name, O_RDONLY|O_NONBLOCK)) > -1) {
|
||||||
if((status = ioctl(fd, CDROM_DRIVE_STATUS, (void *) CDSL_CURRENT)) > 0) {
|
if((status = ioctl(fd, CDROM_DRIVE_STATUS, (void *) CDSL_CURRENT)) > 0) {
|
||||||
switch(status) {
|
switch(status) {
|
||||||
case CDS_TRAY_OPEN:
|
case CDS_TRAY_OPEN:
|
||||||
@@ -474,12 +473,12 @@ _eject_media_bsdi (void *user_data) {
|
|||||||
static const char *
|
static const char *
|
||||||
_get_arg_bsdi (void *user_data, const char key[])
|
_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")) {
|
if (!strcmp (key, "source")) {
|
||||||
return env->source_name;
|
return p_env->source_name;
|
||||||
} else if (!strcmp (key, "access-mode")) {
|
} else if (!strcmp (key, "access-mode")) {
|
||||||
switch (env->access_mode) {
|
switch (p_env->access_mode) {
|
||||||
case _AM_IOCTL:
|
case _AM_IOCTL:
|
||||||
return "ioctl";
|
return "ioctl";
|
||||||
case _AM_NONE:
|
case _AM_NONE:
|
||||||
@@ -496,11 +495,11 @@ _get_arg_bsdi (void *user_data, const char key[])
|
|||||||
static track_t
|
static track_t
|
||||||
_get_first_track_num_bsdi(void *user_data)
|
_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) {
|
_get_mcn_bsdi (const void *user_data) {
|
||||||
|
|
||||||
struct cdrom_mcn mcn;
|
struct cdrom_mcn mcn;
|
||||||
const _img_private_t *env = user_data;
|
const _img_private_t *p_env = user_data;
|
||||||
if (ioctl(env->gen.fd, CDROM_GET_MCN, &mcn) != 0)
|
if (ioctl(p_env->gen.fd, CDROM_GET_MCN, &mcn) != 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
return strdup(mcn.medium_catalog_number);
|
return strdup(mcn.medium_catalog_number);
|
||||||
}
|
}
|
||||||
@@ -525,9 +524,9 @@ _get_mcn_bsdi (const void *user_data) {
|
|||||||
static track_t
|
static track_t
|
||||||
_get_num_tracks_bsdi(void *user_data)
|
_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;
|
return TOTAL_TRACKS;
|
||||||
}
|
}
|
||||||
@@ -538,22 +537,22 @@ _get_num_tracks_bsdi(void *user_data)
|
|||||||
static track_format_t
|
static track_format_t
|
||||||
_get_track_format_bsdi(void *user_data, track_t i_track)
|
_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)
|
if (i_track > TOTAL_TRACKS || i_track == 0)
|
||||||
return TRACK_FORMAT_ERROR;
|
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
|
/* This is pretty much copied from the "badly broken" cdrom_count_tracks
|
||||||
in linux/cdrom.c.
|
in linux/cdrom.c.
|
||||||
*/
|
*/
|
||||||
if (env->tocent[i_track].cdte_ctrl & CDROM_DATA_TRACK) {
|
if (p_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_format == CDIO_CDROM_CDI_TRACK)
|
||||||
return TRACK_FORMAT_CDI;
|
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;
|
return TRACK_FORMAT_XA;
|
||||||
else
|
else
|
||||||
return TRACK_FORMAT_DATA;
|
return TRACK_FORMAT_DATA;
|
||||||
@@ -573,9 +572,9 @@ _get_track_format_bsdi(void *user_data, track_t i_track)
|
|||||||
static bool
|
static bool
|
||||||
_get_track_green_bsdi(void *user_data, track_t i_track)
|
_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;
|
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
|
/* FIXME: Dunno if this is the right way, but it's what
|
||||||
I was using in cdinfo for a while.
|
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
|
static bool
|
||||||
_get_track_msf_bsdi(void *user_data, track_t i_track, msf_t *msf)
|
_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 (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;
|
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;
|
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->m = to_bcd8(msf0->minute);
|
||||||
msf->s = to_bcd8(msf0->second);
|
msf->s = to_bcd8(msf0->second);
|
||||||
msf->f = to_bcd8(msf0->frame);
|
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) 2001 Herbert Valerio Riedel <hvr@gnu.org>
|
||||||
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
|
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
# include "config.h"
|
# include "config.h"
|
||||||
#endif
|
#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>
|
#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 DEFAULT_TIMEOUT 500
|
||||||
|
|
||||||
#define TOTAL_TRACKS (p_env->tochdr.cdth_trk1)
|
#define TOTAL_TRACKS (p_env->tochdr.cdth_trk1)
|
||||||
#define FIRST_TRACK_NUM (p_env->tochdr.cdth_trk0)
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
_AM_NONE,
|
_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) ;
|
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;
|
_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;
|
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
|
/* This is pretty much copied from the "badly broken" cdrom_count_tracks
|
||||||
in linux/cdrom.c.
|
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 (!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;
|
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
|
/* FIXME: Dunno if this is the right way, but it's what
|
||||||
I was using in cd-info for a while.
|
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 (!p_env->gen.toc_init) read_toc_linux (p_env) ;
|
||||||
|
|
||||||
if (i_track == CDIO_CDROM_LEADOUT_TRACK)
|
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)
|
if (i_track > (TOTAL_TRACKS+p_env->gen.i_first_track)
|
||||||
|| i_track < FIRST_TRACK_NUM) {
|
|| i_track < p_env->gen.i_first_track) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
struct cdrom_msf0 *msf0=
|
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->m = to_bcd8(msf0->minute);
|
||||||
msf->s = to_bcd8(msf0->second);
|
msf->s = to_bcd8(msf0->second);
|
||||||
msf->f = to_bcd8(msf0->frame);
|
msf->f = to_bcd8(msf0->frame);
|
||||||
@@ -846,12 +847,14 @@ read_toc_linux (_img_private_t *p_env)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p_env->gen.i_first_track = p_env->tochdr.cdth_trk0;
|
||||||
|
|
||||||
/* read individual tracks */
|
/* read individual tracks */
|
||||||
for (i= FIRST_TRACK_NUM; i<=TOTAL_TRACKS; i++) {
|
for (i= p_env->gen.i_first_track; i<=TOTAL_TRACKS; i++) {
|
||||||
p_env->tocent[i-FIRST_TRACK_NUM].cdte_track = i;
|
p_env->tocent[i-p_env->gen.i_first_track].cdte_track = i;
|
||||||
p_env->tocent[i-FIRST_TRACK_NUM].cdte_format = CDROM_MSF;
|
p_env->tocent[i-p_env->gen.i_first_track].cdte_format = CDROM_MSF;
|
||||||
if ( ioctl(p_env->gen.fd, CDROMREADTOCENTRY,
|
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",
|
cdio_warn("%s %d: %s\n",
|
||||||
"error in ioctl CDROMREADTOCENTRY for track",
|
"error in ioctl CDROMREADTOCENTRY for track",
|
||||||
i, strerror(errno));
|
i, strerror(errno));
|
||||||
@@ -1009,30 +1012,10 @@ set_cdtext_field_linux(void *user_data, track_t i_track,
|
|||||||
static bool
|
static bool
|
||||||
init_cdtext_linux (_img_private_t *p_env)
|
init_cdtext_linux (_img_private_t *p_env)
|
||||||
{
|
{
|
||||||
|
return scsi_mmc_init_cdtext_private( p_env->gen.cdio,
|
||||||
scsi_mmc_cdb_t cdb = {{0, }};
|
&scsi_mmc_run_cmd_linux,
|
||||||
|
set_cdtext_field_linux
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -1049,7 +1032,7 @@ get_cdtext_linux (void *p_user_data, track_t i_track)
|
|||||||
|
|
||||||
if ( NULL == p_env ||
|
if ( NULL == p_env ||
|
||||||
(0 != i_track
|
(0 != i_track
|
||||||
&& i_track >= TOTAL_TRACKS+FIRST_TRACK_NUM ) )
|
&& i_track >= TOTAL_TRACKS+p_env->gen.i_first_track ) )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
p_env->b_cdtext_init = init_cdtext_linux(p_env);
|
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)
|
if (0 == i_track)
|
||||||
return &(p_env->cdtext);
|
return &(p_env->cdtext);
|
||||||
else
|
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) 2001 Herbert Valerio Riedel <hvr@gnu.org>
|
||||||
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
|
Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com>
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
#ifdef HAVE_SOLARIS_CDROM
|
#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
|
#ifdef HAVE_GLOB_H
|
||||||
#include <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 DEFAULT_TIMEOUT 30
|
||||||
|
|
||||||
#define TOTAL_TRACKS (p_env->tochdr.cdth_trk1)
|
#define TOTAL_TRACKS (p_env->tochdr.cdth_trk1)
|
||||||
#define FIRST_TRACK_NUM (p_env->tochdr.cdth_trk0)
|
|
||||||
|
|
||||||
/* reader */
|
/* reader */
|
||||||
|
|
||||||
@@ -420,6 +419,8 @@ _cdio_read_toc (_img_private_t *env)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p_env->gen.i_first_track = p_env->tochdr.cdth_trk0;
|
||||||
|
|
||||||
/* read individual tracks */
|
/* read individual tracks */
|
||||||
for (i=env->tochdr.cdth_trk0; i<=env->tochdr.cdth_trk1; i++) {
|
for (i=env->tochdr.cdth_trk0; i<=env->tochdr.cdth_trk1; i++) {
|
||||||
env->tocent[i-1].cdte_track = 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
|
static bool
|
||||||
_init_cdtext_solaris (_img_private_t *p_env)
|
_init_cdtext_solaris (_img_private_t *p_env)
|
||||||
{
|
{
|
||||||
|
return scsi_mmc_init_cdtext_private( p_env->gen.cdio,
|
||||||
scsi_mmc_cdb_t cdb = {{0, }};
|
&scsi_mmc_run_cmd_solaris,
|
||||||
char wdata[5000] = { 0, };
|
set_cdtext_field_solaris
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -516,7 +495,7 @@ _get_cdtext_solaris (void *p_user_data, track_t i_track)
|
|||||||
|
|
||||||
if ( NULL == p_env ||
|
if ( NULL == p_env ||
|
||||||
(0 != i_track
|
(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 )
|
|| p_env ->b_cdtext_error )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -528,7 +507,7 @@ _get_cdtext_solaris (void *p_user_data, track_t i_track)
|
|||||||
if (0 == i_track)
|
if (0 == i_track)
|
||||||
return &(p_env->cdtext);
|
return &(p_env->cdtext);
|
||||||
else
|
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)
|
_get_mcn_solaris (const void *p_user_data)
|
||||||
{
|
{
|
||||||
const _img_private_t *p_env = p_user_data;
|
const _img_private_t *p_env = p_user_data;
|
||||||
scsi_mmc_cdb_t cdb = {{0, }};
|
return scsi_mmc_get_mcn( p_env->gen.cdio );
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -739,7 +699,7 @@ _cdio_get_first_track_num(void *p_user_data)
|
|||||||
|
|
||||||
if (!p_env->gen.toc_init) _cdio_read_toc (p_env) ;
|
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;
|
_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;
|
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
|
/* This is pretty much copied from the "badly broken" cdrom_count_tracks
|
||||||
in linux/cdrom.c.
|
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.init) init_solaris(p_env);
|
||||||
if (!p_env->gen.toc_init) _cdio_read_toc (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;
|
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
|
/* FIXME: Dunno if this is the right way, but it's what
|
||||||
I was using in cd-info for a while.
|
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 (!p_env->gen.toc_init) _cdio_read_toc (p_env) ;
|
||||||
|
|
||||||
if (i_track == CDIO_CDROM_LEADOUT_TRACK)
|
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;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
struct cdrom_tocentry *msf0 = &p_env->tocent[i_track-1];
|
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>
|
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).
|
and the second for stream reading (bincue, nrg, toc, network).
|
||||||
*/
|
*/
|
||||||
int fd; /**< File descriptor of device */
|
int fd; /**< File descriptor of device */
|
||||||
|
track_t i_first_track; /**< The starting track number. */
|
||||||
CdioDataSource *data_source;
|
CdioDataSource *data_source;
|
||||||
CdIo *cdio; /**< a way to call general cdio routines. */
|
CdIo *cdio; /**< a way to call general cdio routines. */
|
||||||
} generic_img_private_t;
|
} generic_img_private_t;
|
||||||
|
|||||||
104
lib/scsi_mmc.c
104
lib/scsi_mmc.c
@@ -1,6 +1,6 @@
|
|||||||
/* Common SCSI Multimedia Command (MMC) routines.
|
/* 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>
|
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
|
||||||
|
|
||||||
@@ -24,6 +24,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <cdio/cdio.h>
|
#include <cdio/cdio.h>
|
||||||
|
#include <cdio/logging.h>
|
||||||
#include <cdio/scsi_mmc.h>
|
#include <cdio/scsi_mmc.h>
|
||||||
#include "cdio_private.h"
|
#include "cdio_private.h"
|
||||||
|
|
||||||
@@ -184,8 +185,8 @@ scsi_mmc_read_sectors ( const CdIo *cdio, void *p_buf, lba_t lba,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
set_bsize_mmc ( const void *p_env,
|
scsi_mmc_set_bsize_private ( const void *p_env,
|
||||||
const scsi_mmc_run_cmd_fn_t *run_scsi_mmc_cmd,
|
const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd,
|
||||||
unsigned int bsize)
|
unsigned int bsize)
|
||||||
{
|
{
|
||||||
scsi_mmc_cdb_t cdb = {{0, }};
|
scsi_mmc_cdb_t cdb = {{0, }};
|
||||||
@@ -220,7 +221,7 @@ set_bsize_mmc ( const void *p_env,
|
|||||||
cdb.field[1] = 1 << 4;
|
cdb.field[1] = 1 << 4;
|
||||||
cdb.field[4] = 12;
|
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_get_cmd_len(cdb.field[0]), &cdb,
|
||||||
SCSI_MMC_DATA_WRITE, sizeof(mh), &mh);
|
SCSI_MMC_DATA_WRITE, sizeof(mh), &mh);
|
||||||
}
|
}
|
||||||
@@ -229,14 +230,15 @@ int
|
|||||||
scsi_mmc_set_bsize ( const CdIo *cdio, unsigned int bsize)
|
scsi_mmc_set_bsize ( const CdIo *cdio, unsigned int bsize)
|
||||||
{
|
{
|
||||||
if ( ! cdio ) return -2;
|
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.
|
Get the DVD type associated with cd object.
|
||||||
*/
|
*/
|
||||||
discmode_t
|
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,
|
const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd,
|
||||||
cdio_dvd_struct_t *s)
|
cdio_dvd_struct_t *s)
|
||||||
{
|
{
|
||||||
@@ -298,8 +300,96 @@ discmode_t
|
|||||||
scsi_mmc_get_dvd_struct_physical ( const CdIo *p_cdio, cdio_dvd_struct_t *s)
|
scsi_mmc_get_dvd_struct_physical ( const CdIo *p_cdio, cdio_dvd_struct_t *s)
|
||||||
{
|
{
|
||||||
if ( ! p_cdio ) return -2;
|
if ( ! p_cdio ) return -2;
|
||||||
return get_dvd_struct_physical_mmc (p_cdio->env,
|
return
|
||||||
|
scsi_mmc_get_dvd_struct_physical_private (p_cdio->env,
|
||||||
p_cdio->op.run_scsi_mmc_cmd,
|
p_cdio->op.run_scsi_mmc_cmd,
|
||||||
s);
|
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.
|
/* 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>
|
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
|
||||||
|
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <cdio/scsi_mmc.h>
|
#include <cdio/scsi_mmc.h>
|
||||||
|
#include "cdtext_private.h"
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
int (*scsi_mmc_run_cmd_fn_t) ( const void *p_user_data, int i_timeout,
|
int (*scsi_mmc_run_cmd_fn_t) ( const void *p_user_data, 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,
|
scsi_mmc_direction_t e_direction,
|
||||||
unsigned int i_buf, /*in/out*/ void *p_buf );
|
unsigned int i_buf, /*in/out*/ void *p_buf );
|
||||||
|
|
||||||
int set_bsize_mmc ( const void *p_env,
|
int scsi_mmc_set_bsize_mmc_private ( const void *p_env, const
|
||||||
const scsi_mmc_run_cmd_fn_t *run_scsi_mmc_cmd,
|
scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd,
|
||||||
unsigned int bsize );
|
unsigned int bsize );
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Get the DVD type associated with cd object.
|
Get the DVD type associated with cd object.
|
||||||
*/
|
*/
|
||||||
discmode_t
|
discmode_t
|
||||||
get_dvd_struct_physical_mmc ( void *p_env,
|
scsi_mmc_get_dvd_struct_physical_private ( void *p_env, const
|
||||||
const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd,
|
scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd,
|
||||||
cdio_dvd_struct_t *s );
|
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