Add generic mode_sense(), add cdio_have_atapi() and use these.

API number bumped
Add bool_3way_t (yes, nope, dunno)
This commit is contained in:
rocky
2005-02-10 01:59:05 +00:00
parent 43e8856bfa
commit 8296df8b3d
9 changed files with 168 additions and 43 deletions

View File

@@ -1,5 +1,5 @@
/* -*- c -*- /* -*- c -*-
$Id: cdio.h,v 1.79 2005/02/05 14:42:28 rocky Exp $ $Id: cdio.h,v 1.80 2005/02/10 01:59:05 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
@@ -32,7 +32,7 @@
/** Application Interface or Protocol version number. If the public /** Application Interface or Protocol version number. If the public
* interface changes, we increase this number. * interface changes, we increase this number.
*/ */
#define CDIO_API_VERSION 4 #define CDIO_API_VERSION 5
#include <cdio/version.h> #include <cdio/version.h>

View File

@@ -1,5 +1,5 @@
/* -*- c -*- /* -*- c -*-
$Id: device.h,v 1.12 2005/02/06 11:13:37 rocky Exp $ $Id: device.h,v 1.13 2005/02/10 01:59:06 rocky Exp $
Copyright (C) 2005 Rocky Bernstein <rocky@panix.com> Copyright (C) 2005 Rocky Bernstein <rocky@panix.com>
@@ -282,6 +282,9 @@ extern "C" {
*/ */
int cdio_get_media_changed(CdIo_t *p_cdio); int cdio_get_media_changed(CdIo_t *p_cdio);
/*! True if CD-ROM understand ATAPI commands. */
bool_3way_t cdio_have_atapi (CdIo_t *p_cdio);
/*! True if AIX driver is available. */ /*! True if AIX driver is available. */
bool cdio_have_aix (void); bool cdio_have_aix (void);

View File

@@ -1,5 +1,5 @@
/* /*
$Id: mmc.h,v 1.5 2005/02/09 02:50:47 rocky Exp $ $Id: mmc.h,v 1.6 2005/02/10 01:59:06 rocky Exp $
Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
@@ -391,7 +391,7 @@ uint8_t mmc_get_cmd_len(uint8_t scsi_cmd);
Set the block size for subsequest read requests, via an MMC Set the block size for subsequest read requests, via an MMC
MODE_SENSE 6 command. MODE_SENSE 6 command.
*/ */
int mmc_get_blocksize ( const CdIo_t *p_cdio ); int mmc_get_blocksize ( CdIo_t *p_cdio );
/*! /*!
Get the lsn of the end of the CD Get the lsn of the end of the CD
@@ -416,10 +416,10 @@ discmode_t mmc_get_discmode( const CdIo_t *p_cdio );
Get drive capabilities for a device. Get drive capabilities for a device.
@return the drive capabilities. @return the drive capabilities.
*/ */
void mmc_get_drive_cap (const CdIo_t *p_cdio, void mmc_get_drive_cap ( CdIo_t *p_cdio,
/*out*/ cdio_drive_read_cap_t *p_read_cap, /*out*/ cdio_drive_read_cap_t *p_read_cap,
/*out*/ cdio_drive_write_cap_t *p_write_cap, /*out*/ cdio_drive_write_cap_t *p_write_cap,
/*out*/ cdio_drive_misc_cap_t *p_misc_cap); /*out*/ cdio_drive_misc_cap_t *p_misc_cap);
/*! /*!
Get the DVD type associated with cd object. Get the DVD type associated with cd object.
@@ -465,15 +465,29 @@ char * mmc_get_mcn ( const CdIo_t *p_cdio );
routine could probably return the sincle mmc_feature_interface_t. routine could probably return the sincle mmc_feature_interface_t.
@return true if we have the interface and false if not. @return true if we have the interface and false if not.
*/ */
bool mmc_have_interface( const CdIo_t *p_cdio, bool_3way_t mmc_have_interface( CdIo_t *p_cdio,
mmc_feature_interface_t e_interface ); mmc_feature_interface_t e_interface );
/*! Run a MODE_SENSE_10 and put the results in p_buf */ /*! Run a MODE_SENSE command (6- or 10-byte version)
int mmc_mode_sense_10( const CdIo_t *p_cdio, void *p_buf, int i_size, and put the results in p_buf
@return DRIVER_OP_SUCCESS if we ran the command ok.
*/
int mmc_mode_sense( CdIo_t *p_cdio, /*out*/ void *p_buf, int i_size,
int page);
/*! Run a MODE_SENSE command (10-byte version)
and put the results in p_buf
@return DRIVER_OP_SUCCESS if we ran the command ok.
*/
int mmc_mode_sense_10( CdIo_t *p_cdio, /*out*/ void *p_buf, int i_size,
int page); int page);
/*! Run a MODE_SENSE_6 and put the results in p_buf */ /*! Run a MODE_SENSE command (6-byte version)
int mmc_mode_sense_6( const CdIo_t *p_cdio, void *p_buf, int i_size, and put the results in p_buf
@return DRIVER_OP_SUCCESS if we ran the command ok.
*/
int mmc_mode_sense_6( CdIo_t *p_cdio, /*out*/ void *p_buf, int i_size,
int page); int page);

View File

@@ -1,5 +1,5 @@
/* /*
$Id: types.h,v 1.25 2005/01/04 04:33:36 rocky Exp $ $Id: types.h,v 1.26 2005/02/10 01:59:06 rocky Exp $
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2000 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>
@@ -192,6 +192,12 @@ extern "C" {
#define msf_t_SIZEOF 3 #define msf_t_SIZEOF 3
typedef enum {
nope = 0,
yep = 1,
dunno = 2
} bool_3way_t;
/* type used for bit-fields in structs (1 <= bits <= 8) */ /* type used for bit-fields in structs (1 <= bits <= 8) */
#if defined(__GNUC__) #if defined(__GNUC__)
/* this is strict ISO C99 which allows only 'unsigned int', 'signed /* this is strict ISO C99 which allows only 'unsigned int', 'signed

View File

@@ -1,5 +1,5 @@
/* /*
$Id: interface.c,v 1.21 2005/02/07 03:36:02 rocky Exp $ $Id: interface.c,v 1.22 2005/02/10 01:59:06 rocky Exp $
Copyright (C) 2005 Rocky Bernstein <rocky@panix.com> Copyright (C) 2005 Rocky Bernstein <rocky@panix.com>
Copyright (C) 1998 Monty xiphmont@mit.edu Copyright (C) 1998 Monty xiphmont@mit.edu
@@ -121,8 +121,8 @@ cdio_cddap_open(cdrom_drive_t *d)
/* d->select_speed(d,d->maxspeed); most drives are full speed by default */ /* d->select_speed(d,d->maxspeed); most drives are full speed by default */
if ( -1 == d->bigendianp ) { if ( -1 == d->bigendianp ) {
if (mmc_have_interface(d->p_cdio, CDIO_MMC_FEATURE_INTERFACE_ATAPI)) if (yep == cdio_have_atapi(d->p_cdio))
/* Is this right? */ /* Is this right? Might we also have to check for SCSI ATAPI? */
d->bigendianp = 1; d->bigendianp = 1;
else else
d->bigendianp = data_bigendianp(d); d->bigendianp = data_bigendianp(d);

View File

@@ -1,5 +1,5 @@
/* /*
$Id: device.c,v 1.9 2005/02/06 11:13:37 rocky Exp $ $Id: device.c,v 1.10 2005/02/10 01:59:06 rocky Exp $
Copyright (C) 2005 Rocky Bernstein <rocky@panix.com> Copyright (C) 2005 Rocky Bernstein <rocky@panix.com>
@@ -37,6 +37,14 @@
#include <string.h> #include <string.h>
#endif #endif
/* This probably will get moved to driver code, i.e _cdio_linux.c */
#ifdef HAVE_LINUX_MAJOR_H
#include <linux/major.h>
#endif
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
/* The below array gives of the drivers that are currently available for /* The below array gives of the drivers that are currently available for
on a particular host. */ on a particular host. */
@@ -583,6 +591,76 @@ cdio_get_media_changed(CdIo_t *p_cdio)
return DRIVER_OP_UNSUPPORTED; return DRIVER_OP_UNSUPPORTED;
} }
bool_3way_t
cdio_have_atapi(CdIo_t *p_cdio)
{
bool_3way_t i_status;
if (!p_cdio) return nope;
i_status = mmc_have_interface(p_cdio, CDIO_MMC_FEATURE_INTERFACE_ATAPI);
if (dunno != i_status) return i_status;
{
/* cdparanoia seems to think that if we have a mode sense command
we have an atapi drive or is atapi compatible.
*/
uint8_t buf[22];
if (DRIVER_OP_SUCCESS == mmc_mode_sense(p_cdio, buf, sizeof(buf),
CDIO_MMC_CAPABILITIES_PAGE) ) {
uint8_t *b = buf;
b+=b[3]+4;
if( CDIO_MMC_CAPABILITIES_PAGE == (b[0]&0x3F) ) {
/* MMC style drive! */
return yep;
}
}
}
/* Put these in the various drivers? If we get more, yes!
*/
#ifdef HAVE_LINUX_MAJOR_H
{
/* This too is from cdparanoia. */
struct stat st;
generic_img_private_t *p_env = p_cdio->env;
if ( 0 == lstat(p_env->source_name, &st) ) {
if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
int drive_type=(int)(st.st_rdev>>8);
switch (drive_type) {
case IDE0_MAJOR:
case IDE1_MAJOR:
case IDE2_MAJOR:
case IDE3_MAJOR:
/* Yay, ATAPI... */
return yep;
break;
case CDU31A_CDROM_MAJOR:
case CDU535_CDROM_MAJOR:
case MATSUSHITA_CDROM_MAJOR:
case MATSUSHITA_CDROM2_MAJOR:
case MATSUSHITA_CDROM3_MAJOR:
case MATSUSHITA_CDROM4_MAJOR:
case SANYO_CDROM_MAJOR:
case MITSUMI_CDROM_MAJOR:
case MITSUMI_X_CDROM_MAJOR:
case OPTICS_CDROM_MAJOR:
case AZTECH_CDROM_MAJOR:
case GOLDSTAR_CDROM_MAJOR:
case CM206_CDROM_MAJOR:
case SCSI_CDROM_MAJOR:
case SCSI_GENERIC_MAJOR:
return nope;
break;
default:
return dunno;
}
}
}
}
#endif /*HAVE_LINUX_MAJOR_H*/
return dunno;
}
bool bool
cdio_have_driver(driver_id_t driver_id) cdio_have_driver(driver_id_t driver_id)
{ {

View File

@@ -55,6 +55,7 @@ cdio_get_first_track_num
cdio_get_hwinfo cdio_get_hwinfo
cdio_get_joliet_level cdio_get_joliet_level
cdio_get_last_track_num cdio_get_last_track_num
cdio_get_media_changed
cdio_get_mcn cdio_get_mcn
cdio_get_num_tracks cdio_get_num_tracks
cdio_get_track cdio_get_track
@@ -69,6 +70,7 @@ cdio_get_track_msf
cdio_get_track_preemphasis cdio_get_track_preemphasis
cdio_get_track_sec_count cdio_get_track_sec_count
cdio_guess_cd_type cdio_guess_cd_type
cdio_have_atapi
cdio_have_bincue cdio_have_bincue
cdio_have_bsdi cdio_have_bsdi
cdio_have_cdrdao cdio_have_cdrdao
@@ -159,6 +161,9 @@ mmc_get_last_lsn
mmc_feature2str mmc_feature2str
mmc_feature_profile2str mmc_feature_profile2str
mmc_have_interface mmc_have_interface
mmc_mode_sense
mmc_mode_sense_10
mmc_mode_sense_6
mmc_read_sectors mmc_read_sectors
mmc_run_cmd mmc_run_cmd
mmc_set_blocksize mmc_set_blocksize

View File

@@ -1,6 +1,6 @@
/* Common Multimedia Command (MMC) routines. /* Common Multimedia Command (MMC) routines.
$Id: mmc.c,v 1.6 2005/02/09 02:50:47 rocky Exp $ $Id: mmc.c,v 1.7 2005/02/10 01:59:06 rocky Exp $
Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com> Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
@@ -249,8 +249,29 @@ mmc_get_mcn_private ( void *p_env,
return NULL; return NULL;
} }
/* Run a MODE SENSE command (either the 6- or 10-byte version
@return DRIVER_OP_SUCCESS if we ran the command ok.
*/
int int
mmc_mode_sense_6( const CdIo_t *p_cdio, void *p_buf, int i_size, int page) mmc_mode_sense( CdIo_t *p_cdio, /*out*/ void *p_buf, int i_size,
int page)
{
if ( cdio_have_atapi(p_cdio) ) {
if ( DRIVER_OP_SUCCESS == mmc_mode_sense_6(p_cdio, p_buf, i_size, page) )
return DRIVER_OP_SUCCESS;
return mmc_mode_sense_10(p_cdio, p_buf, i_size, page);
}
if ( DRIVER_OP_SUCCESS == mmc_mode_sense_10(p_cdio, p_buf, i_size, page) )
return DRIVER_OP_SUCCESS;
return mmc_mode_sense_6(p_cdio, p_buf, i_size, page);
}
/*! Run a MODE_SENSE command (6-byte version)
and put the results in p_buf
@return DRIVER_OP_SUCCESS if we ran the command ok.
*/
int
mmc_mode_sense_6( CdIo_t *p_cdio, void *p_buf, int i_size, int page)
{ {
scsi_mmc_cdb_t cdb = {{0, }}; scsi_mmc_cdb_t cdb = {{0, }};
@@ -271,8 +292,12 @@ mmc_mode_sense_6( const CdIo_t *p_cdio, void *p_buf, int i_size, int page)
} }
/*! Run a MODE_SENSE command (10-byte version)
and put the results in p_buf
@return DRIVER_OP_SUCCESS if we ran the command ok.
*/
int int
mmc_mode_sense_10( const CdIo_t *p_cdio, void *p_buf, int i_size, int page) mmc_mode_sense_10( CdIo_t *p_cdio, void *p_buf, int i_size, int page)
{ {
scsi_mmc_cdb_t cdb = {{0, }}; scsi_mmc_cdb_t cdb = {{0, }};
@@ -500,10 +525,10 @@ mmc_get_discmode( const CdIo_t *p_cdio )
} }
void void
mmc_get_drive_cap (const CdIo_t *p_cdio, mmc_get_drive_cap (CdIo_t *p_cdio,
/*out*/ cdio_drive_read_cap_t *p_read_cap, /*out*/ cdio_drive_read_cap_t *p_read_cap,
/*out*/ cdio_drive_write_cap_t *p_write_cap, /*out*/ cdio_drive_write_cap_t *p_write_cap,
/*out*/ cdio_drive_misc_cap_t *p_misc_cap) /*out*/ cdio_drive_misc_cap_t *p_misc_cap)
{ {
if ( ! p_cdio ) return; if ( ! p_cdio ) return;
/* Largest buffer size we use. */ /* Largest buffer size we use. */
@@ -688,7 +713,7 @@ mmc_run_cmd( const CdIo_t *p_cdio, unsigned int i_timeout_ms,
} }
int int
mmc_get_blocksize ( const CdIo_t *p_cdio) mmc_get_blocksize ( CdIo_t *p_cdio)
{ {
int i_status; int i_status;
@@ -915,8 +940,8 @@ const char *mmc_feature_profile2str( int i_feature_profile )
* See if CD-ROM has feature with value value * See if CD-ROM has feature with value value
* @return true if we have the feature and false if not. * @return true if we have the feature and false if not.
*/ */
bool bool_3way_t
mmc_have_interface( const CdIo_t *p_cdio, mmc_feature_interface_t interface ) mmc_have_interface( CdIo_t *p_cdio, mmc_feature_interface_t e_interface )
{ {
int i_status; /* Result of MMC command */ int i_status; /* Result of MMC command */
uint8_t buf[500] = { 0, }; /* Place to hold returned data */ uint8_t buf[500] = { 0, }; /* Place to hold returned data */
@@ -929,7 +954,7 @@ mmc_have_interface( const CdIo_t *p_cdio, mmc_feature_interface_t interface )
i_status = mmc_run_cmd(p_cdio, 0, &cdb, SCSI_MMC_DATA_READ, sizeof(buf), i_status = mmc_run_cmd(p_cdio, 0, &cdb, SCSI_MMC_DATA_READ, sizeof(buf),
&buf); &buf);
if (i_status == 0) { if (DRIVER_OP_SUCCESS == i_status) {
uint8_t *p; uint8_t *p;
uint32_t i_data; uint32_t i_data;
uint8_t *p_max = buf + 65530; uint8_t *p_max = buf + 65530;
@@ -945,12 +970,13 @@ mmc_have_interface( const CdIo_t *p_cdio, mmc_feature_interface_t interface )
if (CDIO_MMC_FEATURE_CORE == i_feature) { if (CDIO_MMC_FEATURE_CORE == i_feature) {
uint8_t *q = p+4; uint8_t *q = p+4;
uint32_t i_interface_standard = CDIO_MMC_GET_LEN32(q); uint32_t i_interface_standard = CDIO_MMC_GET_LEN32(q);
if (interface == i_interface_standard) return true; if (e_interface == i_interface_standard) return yep;
} }
p += i_feature_additional + 4; p += i_feature_additional + 4;
} }
} return nope;
return false; } else
return dunno;
} }
/*! Read sectors using SCSI-MMC GPCMD_READ_CD. /*! Read sectors using SCSI-MMC GPCMD_READ_CD.

View File

@@ -1,5 +1,5 @@
/* /*
$Id: iso9660_fs.c,v 1.10 2005/02/06 11:32:22 rocky Exp $ $Id: iso9660_fs.c,v 1.11 2005/02/10 01:59:06 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
@@ -51,14 +51,7 @@
#include <stdio.h> #include <stdio.h>
typedef enum { static const char _rcsid[] = "$Id: iso9660_fs.c,v 1.11 2005/02/10 01:59:06 rocky Exp $";
nope = 0,
yep = 1,
dunno = 2
} bool_3way_t;
static const char _rcsid[] = "$Id: iso9660_fs.c,v 1.10 2005/02/06 11:32:22 rocky Exp $";
/* Implementation of iso9660_t type */ /* Implementation of iso9660_t type */
struct _iso9660 { struct _iso9660 {