More common routiens and structures moved to cdio_generic.c or

cdio_private.h respectively.
This commit is contained in:
rocky
2003-03-30 13:01:22 +00:00
parent e510298467
commit 62d12714b1
9 changed files with 156 additions and 146 deletions

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_bincue.c,v 1.3 2003/03/29 21:13:55 rocky Exp $ $Id: _cdio_bincue.c,v 1.4 2003/03/30 13:01:22 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com>
@@ -28,7 +28,7 @@
# include "config.h" # include "config.h"
#endif #endif
static const char _rcsid[] = "$Id: _cdio_bincue.c,v 1.3 2003/03/29 21:13:55 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_bincue.c,v 1.4 2003/03/30 13:01:22 rocky Exp $";
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
@@ -64,8 +64,10 @@ typedef struct {
typedef struct { typedef struct {
char *source_name; /* Things common to all drivers like this.
bool init; This must be first. */
generic_img_private_t gen;
bool sector_2336_flag; bool sector_2336_flag;
CdioDataSource *data_source; CdioDataSource *data_source;
@@ -87,10 +89,10 @@ _cdio_init (_img_private_t *_obj)
{ {
lsn_t lead_lsn; lsn_t lead_lsn;
if (_obj->init) if (_obj->gen.init)
return false; return false;
if (!(_obj->data_source = cdio_stdio_new (_obj->source_name))) { if (!(_obj->data_source = cdio_stdio_new (_obj->gen.source_name))) {
cdio_error ("init failed"); cdio_error ("init failed");
return false; return false;
} }
@@ -98,7 +100,7 @@ _cdio_init (_img_private_t *_obj)
/* Have to set init before calling _cdio_stat_size() or we will /* Have to set init before calling _cdio_stat_size() or we will
get into infinite recursion calling passing right here. get into infinite recursion calling passing right here.
*/ */
_obj->init = true; _obj->gen.init = true;
lead_lsn = _cdio_stat_size( (_img_private_t *) _obj); lead_lsn = _cdio_stat_size( (_img_private_t *) _obj);
@@ -364,7 +366,7 @@ _cdio_free (void *user_data)
{ {
_img_private_t *_obj = user_data; _img_private_t *_obj = user_data;
free (_obj->source_name); free (_obj->gen.source_name);
if (_obj->data_source) if (_obj->data_source)
cdio_stream_destroy (_obj->data_source); cdio_stream_destroy (_obj->data_source);
@@ -438,12 +440,12 @@ _cdio_set_arg (void *user_data, const char key[], const char value[])
if (!strcmp (key, "source")) if (!strcmp (key, "source"))
{ {
free (_obj->source_name); free (_obj->gen.source_name);
if (!value) if (!value)
return -2; return -2;
_obj->source_name = strdup (value); _obj->gen.source_name = strdup (value);
} }
else if (!strcmp (key, "sector")) else if (!strcmp (key, "sector"))
{ {
@@ -469,16 +471,6 @@ _cdio_set_arg (void *user_data, const char key[], const char value[])
return 0; return 0;
} }
/*!
Eject media -- there's nothing to do here. We always return 2.
also free obj.
*/
static int
_cdio_eject_media (void *user_data) {
/* Sort of a stub here. Perhaps log a message? */
return 2;
}
/*! /*!
Return the value associated with the key "arg". Return the value associated with the key "arg".
*/ */
@@ -488,7 +480,7 @@ _cdio_get_arg (void *user_data, const char key[])
_img_private_t *_obj = user_data; _img_private_t *_obj = user_data;
if (!strcmp (key, "source")) { if (!strcmp (key, "source")) {
return _obj->source_name; return _obj->gen.source_name;
} else if (!strcmp (key, "cue")) { } else if (!strcmp (key, "cue")) {
return _obj->cue_name; return _obj->cue_name;
} }
@@ -542,7 +534,7 @@ _cdio_get_track_format(void *user_data, track_t track_num)
{ {
_img_private_t *_obj = user_data; _img_private_t *_obj = user_data;
if (!_obj->init) _cdio_init(_obj); if (!_obj->gen.init) _cdio_init(_obj);
if (track_num > _obj->total_tracks || track_num == 0) if (track_num > _obj->total_tracks || track_num == 0)
return TRACK_FORMAT_ERROR; return TRACK_FORMAT_ERROR;
@@ -563,7 +555,7 @@ _cdio_get_track_green(void *user_data, track_t track_num)
{ {
_img_private_t *_obj = user_data; _img_private_t *_obj = user_data;
if (!_obj->init) _cdio_init(_obj); if (!_obj->gen.init) _cdio_init(_obj);
if (track_num > _obj->total_tracks || track_num == 0) if (track_num > _obj->total_tracks || track_num == 0)
return false; return false;
@@ -623,7 +615,7 @@ cdio_open_bincue (const char *source_name)
_img_private_t *_data; _img_private_t *_data;
cdio_funcs _funcs = { cdio_funcs _funcs = {
.eject_media = _cdio_eject_media, .eject_media = cdio_generic_bogus_eject_media,
.free = _cdio_free, .free = _cdio_free,
.get_arg = _cdio_get_arg, .get_arg = _cdio_get_arg,
.get_default_device = _cdio_get_default_device, .get_default_device = _cdio_get_default_device,
@@ -640,7 +632,7 @@ cdio_open_bincue (const char *source_name)
}; };
_data = _cdio_malloc (sizeof (_img_private_t)); _data = _cdio_malloc (sizeof (_img_private_t));
_data->init = false; _data->gen.init = false;
/* FIXME: should set cue initially. */ /* FIXME: should set cue initially. */
_data->cue_name = NULL; _data->cue_name = NULL;
@@ -661,7 +653,7 @@ cdio_open_cue (const char *cue_name)
_img_private_t *_data; _img_private_t *_data;
cdio_funcs _funcs = { cdio_funcs _funcs = {
.eject_media = _cdio_eject_media, .eject_media = cdio_generic_bogus_eject_media,
.free = _cdio_free, .free = _cdio_free,
.get_arg = _cdio_get_arg, .get_arg = _cdio_get_arg,
.get_default_device = _cdio_get_default_device, .get_default_device = _cdio_get_default_device,
@@ -680,7 +672,7 @@ cdio_open_cue (const char *cue_name)
}; };
_data = _cdio_malloc (sizeof (_img_private_t)); _data = _cdio_malloc (sizeof (_img_private_t));
_data->init = false; _data->gen.init = false;
if (cue_name != NULL) { if (cue_name != NULL) {
char *source_name=strdup(cue_name); char *source_name=strdup(cue_name);

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_bsdi.c,v 1.4 2003/03/30 01:11:35 rocky Exp $ $Id: _cdio_bsdi.c,v 1.5 2003/03/30 13:01:22 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002,2003 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.4 2003/03/30 01:11:35 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_bsdi.c,v 1.5 2003/03/30 13:01:22 rocky Exp $";
#include "cdio_assert.h" #include "cdio_assert.h"
#include "cdio_private.h" #include "cdio_private.h"
@@ -48,7 +48,7 @@ static const char _rcsid[] = "$Id: _cdio_bsdi.c,v 1.4 2003/03/30 01:11:35 rocky
#include <sys/types.h> #include <sys/types.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#define DEFAULT_CDIO_DEVICE "/dev/sr0" #define DEFAULT_CDIO_DEVICE "/dev/rsr0c"
#define TOTAL_TRACKS (_obj->tochdr.cdth_trk1) #define TOTAL_TRACKS (_obj->tochdr.cdth_trk1)
#define FIRST_TRACK_NUM (_obj->tochdr.cdth_trk0) #define FIRST_TRACK_NUM (_obj->tochdr.cdth_trk0)

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_generic.c,v 1.2 2003/03/29 21:13:55 rocky Exp $ $Id: _cdio_generic.c,v 1.3 2003/03/30 13:01:22 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com>
@@ -27,7 +27,7 @@
# include "config.h" # include "config.h"
#endif #endif
static const char _rcsid[] = "$Id: _cdio_generic.c,v 1.2 2003/03/29 21:13:55 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_generic.c,v 1.3 2003/03/30 13:01:22 rocky Exp $";
#include "cdio_assert.h" #include "cdio_assert.h"
#include "cdio_private.h" #include "cdio_private.h"
@@ -45,6 +45,17 @@ static const char _rcsid[] = "$Id: _cdio_generic.c,v 1.2 2003/03/29 21:13:55 roc
#include <sys/types.h> #include <sys/types.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
/*!
Eject media -- there's nothing to do here. We always return 2.
Should we also free resources?
*/
int
cdio_generic_bogus_eject_media (void *user_data) {
/* Sort of a stub here. Perhaps log a message? */
return 2;
}
/*! /*!
Release and free resources associated with cd. Release and free resources associated with cd.
*/ */
@@ -62,6 +73,31 @@ cdio_generic_free (void *user_data)
free (_obj); free (_obj);
} }
/*!
Initialize CD device.
*/
bool
cdio_generic_init (void *user_data)
{
generic_img_private_t *_obj = user_data;
if (_obj->init) {
cdio_error ("init called more than once");
return false;
}
_obj->fd = open (_obj->source_name, O_RDONLY, 0);
if (_obj->fd < 0)
{
cdio_error ("open (%s): %s", _obj->source_name, strerror (errno));
return false;
}
_obj->init = true;
_obj->toc_init = false;
return true;
}
/*! /*!
Reads into buf the next size bytes. Reads into buf the next size bytes.
Returns -1 on error. Returns -1 on error.

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_linux.c,v 1.3 2003/03/29 17:32:00 rocky Exp $ $Id: _cdio_linux.c,v 1.4 2003/03/30 13:01:22 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002,2003 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.3 2003/03/29 17:32:00 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.4 2003/03/30 13:01:22 rocky Exp $";
#include "cdio_assert.h" #include "cdio_assert.h"
#include "cdio_private.h" #include "cdio_private.h"
@@ -76,39 +76,12 @@ typedef struct {
_AM_READ_10 _AM_READ_10
} access_mode; } access_mode;
int ioctls_debugged; /* for debugging */
/* Track information */ /* Track information */
bool toc_init; /* if true, info below is valid. */
struct cdrom_tochdr tochdr; struct cdrom_tochdr tochdr;
struct cdrom_tocentry tocent[100]; /* entry info for each track */ struct cdrom_tocentry tocent[100]; /* entry info for each track */
} _img_private_t; } _img_private_t;
/*!
Initialize CD device.
*/
static bool
_cdio_init (_img_private_t *_obj)
{
if (_obj->gen.init) {
cdio_error ("init called more than once");
return false;
}
_obj->gen.fd = open (_obj->gen.source_name, O_RDONLY, 0);
if (_obj->gen.fd < 0)
{
cdio_error ("open (%s): %s", _obj->gen.source_name, strerror (errno));
return false;
}
_obj->gen.init = true;
_obj->toc_init = false;
return true;
}
static int static int
_set_bsize (int fd, unsigned int bsize) _set_bsize (int fd, unsigned int bsize)
{ {
@@ -249,20 +222,20 @@ _cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn,
msf->cdmsf_sec0 = from_bcd8(_msf.s); msf->cdmsf_sec0 = from_bcd8(_msf.s);
msf->cdmsf_frame0 = from_bcd8(_msf.f); msf->cdmsf_frame0 = from_bcd8(_msf.f);
if (_obj->ioctls_debugged == 75) if (_obj->gen.ioctls_debugged == 75)
cdio_debug ("only displaying every 75th ioctl from now on"); cdio_debug ("only displaying every 75th ioctl from now on");
if (_obj->ioctls_debugged == 30 * 75) if (_obj->gen.ioctls_debugged == 30 * 75)
cdio_debug ("only displaying every 30*75th ioctl from now on"); cdio_debug ("only displaying every 30*75th ioctl from now on");
if (_obj->ioctls_debugged < 75 if (_obj->gen.ioctls_debugged < 75
|| (_obj->ioctls_debugged < (30 * 75) || (_obj->gen.ioctls_debugged < (30 * 75)
&& _obj->ioctls_debugged % 75 == 0) && _obj->gen.ioctls_debugged % 75 == 0)
|| _obj->ioctls_debugged % (30 * 75) == 0) || _obj->gen.ioctls_debugged % (30 * 75) == 0)
cdio_debug ("reading %2.2d:%2.2d:%2.2d", cdio_debug ("reading %2.2d:%2.2d:%2.2d",
msf->cdmsf_min0, msf->cdmsf_sec0, msf->cdmsf_frame0); msf->cdmsf_min0, msf->cdmsf_sec0, msf->cdmsf_frame0);
_obj->ioctls_debugged++; _obj->gen.ioctls_debugged++;
retry: retry:
switch (_obj->access_mode) switch (_obj->access_mode)
@@ -539,7 +512,7 @@ _cdio_get_first_track_num(void *user_data)
{ {
_img_private_t *_obj = user_data; _img_private_t *_obj = user_data;
if (!_obj->toc_init) _cdio_read_toc (_obj) ; if (!_obj->gen.toc_init) _cdio_read_toc (_obj) ;
return FIRST_TRACK_NUM; return FIRST_TRACK_NUM;
} }
@@ -553,7 +526,7 @@ _cdio_get_num_tracks(void *user_data)
{ {
_img_private_t *_obj = user_data; _img_private_t *_obj = user_data;
if (!_obj->toc_init) _cdio_read_toc (_obj) ; if (!_obj->gen.toc_init) _cdio_read_toc (_obj) ;
return TOTAL_TRACKS; return TOTAL_TRACKS;
} }
@@ -566,7 +539,7 @@ _cdio_get_track_format(void *user_data, track_t track_num)
{ {
_img_private_t *_obj = user_data; _img_private_t *_obj = user_data;
if (!_obj->toc_init) _cdio_read_toc (_obj) ; if (!_obj->gen.toc_init) _cdio_read_toc (_obj) ;
if (track_num > TOTAL_TRACKS || track_num == 0) if (track_num > TOTAL_TRACKS || track_num == 0)
return TRACK_FORMAT_ERROR; return TRACK_FORMAT_ERROR;
@@ -599,7 +572,7 @@ _cdio_get_track_green(void *user_data, track_t track_num)
{ {
_img_private_t *_obj = user_data; _img_private_t *_obj = user_data;
if (!_obj->toc_init) _cdio_read_toc (_obj) ; if (!_obj->gen.toc_init) _cdio_read_toc (_obj) ;
if (track_num == CDIO_LEADOUT_TRACK) track_num = TOTAL_TRACKS+1; if (track_num == CDIO_LEADOUT_TRACK) track_num = TOTAL_TRACKS+1;
@@ -626,7 +599,7 @@ _cdio_get_track_msf(void *user_data, track_t track_num, msf_t *msf)
if (NULL == msf) return false; if (NULL == msf) return false;
if (!_obj->toc_init) _cdio_read_toc (_obj) ; if (!_obj->gen.toc_init) _cdio_read_toc (_obj) ;
if (track_num == CDIO_LEADOUT_TRACK) track_num = TOTAL_TRACKS+1; if (track_num == CDIO_LEADOUT_TRACK) track_num = TOTAL_TRACKS+1;
@@ -686,7 +659,7 @@ cdio_open_linux (const char *source_name)
ret = cdio_new (_data, &_funcs); ret = cdio_new (_data, &_funcs);
if (ret == NULL) return NULL; if (ret == NULL) return NULL;
if (_cdio_init(_data)) if (cdio_generic_init(_data))
return ret; return ret;
else { else {
cdio_generic_free (_data); cdio_generic_free (_data);

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_nrg.c,v 1.3 2003/03/29 21:13:55 rocky Exp $ $Id: _cdio_nrg.c,v 1.4 2003/03/30 13:01:22 rocky Exp $
Copyright (C) 2001,2003 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001,2003 Herbert Valerio Riedel <hvr@gnu.org>
@@ -38,7 +38,7 @@
#include "util.h" #include "util.h"
#include "_cdio_stdio.h" #include "_cdio_stdio.h"
static const char _rcsid[] = "$Id: _cdio_nrg.c,v 1.3 2003/03/29 21:13:55 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_nrg.c,v 1.4 2003/03/30 13:01:22 rocky Exp $";
/* structures used */ /* structures used */
@@ -121,15 +121,17 @@ typedef struct {
typedef struct { typedef struct {
/* Things common to all drivers like this.
This must be first. */
generic_img_private_t gen;
bool sector_2336_flag; bool sector_2336_flag;
CdioDataSource *data_source; CdioDataSource *data_source;
char *source_name;
track_info_t tocent[100]; /* entry info for each track */ track_info_t tocent[100]; /* entry info for each track */
track_t total_tracks; /* number of tracks in image */ track_t total_tracks; /* number of tracks in image */
track_t first_track_num; /* track number of first track */ track_t first_track_num; /* track number of first track */
CdioList *mapping; /* List of track information */ CdioList *mapping; /* List of track information */
uint32_t size; uint32_t size;
bool init;
} _img_private_t; } _img_private_t;
static bool _cdio_parse_nero_footer (_img_private_t *_obj); static bool _cdio_parse_nero_footer (_img_private_t *_obj);
@@ -143,7 +145,7 @@ _cdio_free (void *user_data)
{ {
_img_private_t *_obj = user_data; _img_private_t *_obj = user_data;
free(_obj->source_name); free(_obj->gen.source_name);
if (_obj->data_source) if (_obj->data_source)
cdio_stream_destroy (_obj->data_source); cdio_stream_destroy (_obj->data_source);
@@ -481,18 +483,18 @@ PRAGMA_END_PACKED
static bool static bool
_cdio_init (_img_private_t *_obj) _cdio_init (_img_private_t *_obj)
{ {
if (_obj->init) { if (_obj->gen.init) {
cdio_error ("init called more than once"); cdio_error ("init called more than once");
return false; return false;
} }
if (!(_obj->data_source = cdio_stdio_new (_obj->source_name))) { if (!(_obj->data_source = cdio_stdio_new (_obj->gen.source_name))) {
cdio_error ("init failed"); cdio_error ("init failed");
return false; return false;
} }
_cdio_parse_nero_footer (_obj); _cdio_parse_nero_footer (_obj);
_obj->init = true; _obj->gen.init = true;
return true; return true;
} }
@@ -663,12 +665,12 @@ _cdio_set_arg (void *user_data, const char key[], const char value[])
if (!strcmp (key, "source")) if (!strcmp (key, "source"))
{ {
free (_obj->source_name); free (_obj->gen.source_name);
if (!value) if (!value)
return -2; return -2;
_obj->source_name = strdup (value); _obj->gen.source_name = strdup (value);
} }
else else
return -1; return -1;
@@ -676,16 +678,6 @@ _cdio_set_arg (void *user_data, const char key[], const char value[])
return 0; return 0;
} }
/*!
Eject media -- there's nothing to do here. We always return 2.
also free obj.
*/
static int
_cdio_eject_media (void *user_data) {
/* Sort of a stub here. Perhaps log a message? */
return 2;
}
/*! /*!
Return the value associated with the key "arg". Return the value associated with the key "arg".
*/ */
@@ -695,7 +687,7 @@ _cdio_get_arg (void *user_data, const char key[])
_img_private_t *_obj = user_data; _img_private_t *_obj = user_data;
if (!strcmp (key, "source")) { if (!strcmp (key, "source")) {
return _obj->source_name; return _obj->gen.source_name;
} }
return NULL; return NULL;
} }
@@ -796,7 +788,7 @@ cdio_open_nrg (const char *source_name)
_img_private_t *_data; _img_private_t *_data;
cdio_funcs _funcs = { cdio_funcs _funcs = {
.eject_media = _cdio_eject_media, .eject_media = cdio_generic_bogus_eject_media,
.free = _cdio_free, .free = _cdio_free,
.get_arg = _cdio_get_arg, .get_arg = _cdio_get_arg,
.get_default_device = _cdio_get_default_device, .get_default_device = _cdio_get_default_device,
@@ -815,7 +807,7 @@ cdio_open_nrg (const char *source_name)
}; };
_data = _cdio_malloc (sizeof (_img_private_t)); _data = _cdio_malloc (sizeof (_img_private_t));
_data->init = false; _data->gen.init = false;
_data->total_tracks = 0; _data->total_tracks = 0;

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_sunos.c,v 1.4 2003/03/29 21:13:55 rocky Exp $ $Id: _cdio_sunos.c,v 1.5 2003/03/30 13:01:22 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com>
@@ -31,7 +31,7 @@
#ifdef HAVE_SOLARIS_CDROM #ifdef HAVE_SOLARIS_CDROM
static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.4 2003/03/29 21:13:55 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.5 2003/03/30 13:01:22 rocky Exp $";
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@@ -77,10 +77,7 @@ typedef struct {
} access_mode; } access_mode;
int ioctls_debugged; /* for debugging */
/* Track information */ /* Track information */
bool toc_init; /* if true, info below is valid. */
struct cdrom_tochdr tochdr; struct cdrom_tochdr tochdr;
struct cdrom_tocentry tocent[100]; /* entry info for each track */ struct cdrom_tocentry tocent[100]; /* entry info for each track */
@@ -95,14 +92,8 @@ _cdio_init (_img_private_t *_obj)
struct dk_cinfo cinfo; struct dk_cinfo cinfo;
_obj->gen.fd = open (_obj->gen.source_name, O_RDONLY, 0); if (!cdio_generic_init(_obj)) return false;
if (_obj->gen.fd < 0)
{
cdio_error ("open (%s): %s", _obj->gen.source_name, strerror (errno));
return false;
}
/* /*
* CDROMCDXA/CDROMREADMODE2 are broken on IDE/ATAPI devices. * CDROMCDXA/CDROMREADMODE2 are broken on IDE/ATAPI devices.
* Try to send MMC3 SCSI commands via the uscsi interface on * Try to send MMC3 SCSI commands via the uscsi interface on
@@ -116,9 +107,6 @@ _cdio_init (_img_private_t *_obj)
_obj->access_mode = _AM_SUN_CTRL_SCSI; _obj->access_mode = _AM_SUN_CTRL_SCSI;
} }
_obj->gen.init = true;
_obj->toc_init = false;
return true; return true;
} }
@@ -141,20 +129,20 @@ _read_mode2_sector (void *user_data, void *data, lsn_t lsn,
msf->cdmsf_sec0 = from_bcd8(_msf.s); msf->cdmsf_sec0 = from_bcd8(_msf.s);
msf->cdmsf_frame0 = from_bcd8(_msf.f); msf->cdmsf_frame0 = from_bcd8(_msf.f);
if (_obj->ioctls_debugged == 75) if (_obj->gen.ioctls_debugged == 75)
cdio_debug ("only displaying every 75th ioctl from now on"); cdio_debug ("only displaying every 75th ioctl from now on");
if (_obj->ioctls_debugged == 30 * 75) if (_obj->gen.ioctls_debugged == 30 * 75)
cdio_debug ("only displaying every 30*75th ioctl from now on"); cdio_debug ("only displaying every 30*75th ioctl from now on");
if (_obj->ioctls_debugged < 75 if (_obj->gen.ioctls_debugged < 75
|| (_obj->ioctls_debugged < (30 * 75) || (_obj->gen.ioctls_debugged < (30 * 75)
&& _obj->ioctls_debugged % 75 == 0) && _obj->gen.ioctls_debugged % 75 == 0)
|| _obj->ioctls_debugged % (30 * 75) == 0) || _obj->gen.ioctls_debugged % (30 * 75) == 0)
cdio_debug ("reading %2.2d:%2.2d:%2.2d", cdio_debug ("reading %2.2d:%2.2d:%2.2d",
msf->cdmsf_min0, msf->cdmsf_sec0, msf->cdmsf_frame0); msf->cdmsf_min0, msf->cdmsf_sec0, msf->cdmsf_frame0);
_obj->ioctls_debugged++; _obj->gen.ioctls_debugged++;
switch (_obj->access_mode) switch (_obj->access_mode)
{ {
@@ -470,7 +458,7 @@ _cdio_get_first_track_num(void *user_data)
{ {
_img_private_t *_obj = user_data; _img_private_t *_obj = user_data;
if (!_obj->toc_init) _cdio_read_toc (_obj) ; if (!_obj->gen.toc_init) _cdio_read_toc (_obj) ;
return FIRST_TRACK_NUM; return FIRST_TRACK_NUM;
} }
@@ -483,7 +471,7 @@ _cdio_get_num_tracks(void *user_data)
{ {
_img_private_t *_obj = user_data; _img_private_t *_obj = user_data;
if (!_obj->toc_init) _cdio_read_toc (_obj) ; if (!_obj->gen.toc_init) _cdio_read_toc (_obj) ;
return TOTAL_TRACKS; return TOTAL_TRACKS;
} }
@@ -497,7 +485,7 @@ _cdio_get_track_format(void *user_data, track_t track_num)
_img_private_t *_obj = user_data; _img_private_t *_obj = user_data;
if (!_obj->gen.init) _cdio_init(_obj); if (!_obj->gen.init) _cdio_init(_obj);
if (!_obj->toc_init) _cdio_read_toc (_obj) ; if (!_obj->gen.toc_init) _cdio_read_toc (_obj) ;
if (track_num > TOTAL_TRACKS || track_num == 0) if (track_num > TOTAL_TRACKS || track_num == 0)
return TRACK_FORMAT_ERROR; return TRACK_FORMAT_ERROR;
@@ -531,7 +519,7 @@ _cdio_get_track_green(void *user_data, track_t track_num)
_img_private_t *_obj = user_data; _img_private_t *_obj = user_data;
if (!_obj->gen.init) _cdio_init(_obj); if (!_obj->gen.init) _cdio_init(_obj);
if (!_obj->toc_init) _cdio_read_toc (_obj) ; if (!_obj->gen.toc_init) _cdio_read_toc (_obj) ;
if (track_num == CDIO_LEADOUT_TRACK) track_num = TOTAL_TRACKS+1; if (track_num == CDIO_LEADOUT_TRACK) track_num = TOTAL_TRACKS+1;
@@ -559,7 +547,7 @@ _cdio_get_track_msf(void *user_data, track_t track_num, msf_t *msf)
if (NULL == msf) return false; if (NULL == msf) return false;
if (!_obj->gen.init) _cdio_init(_obj); if (!_obj->gen.init) _cdio_init(_obj);
if (!_obj->toc_init) _cdio_read_toc (_obj) ; if (!_obj->gen.toc_init) _cdio_read_toc (_obj) ;
if (track_num == CDIO_LEADOUT_TRACK) track_num = TOTAL_TRACKS+1; if (track_num == CDIO_LEADOUT_TRACK) track_num = TOTAL_TRACKS+1;

View File

@@ -1,5 +1,5 @@
/* /*
$Id: cdio.c,v 1.3 2003/03/29 17:32:00 rocky Exp $ $Id: cdio.c,v 1.4 2003/03/30 13:01:22 rocky Exp $
Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003 Rocky Bernstein <rocky@panix.com>
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
@@ -28,7 +28,7 @@
#include "logging.h" #include "logging.h"
#include "cdio_private.h" #include "cdio_private.h"
static const char _rcsid[] = "$Id: cdio.c,v 1.3 2003/03/29 17:32:00 rocky Exp $"; static const char _rcsid[] = "$Id: cdio.c,v 1.4 2003/03/30 13:01:22 rocky Exp $";
const char *track_format2str[5] = const char *track_format2str[5] =
@@ -97,20 +97,20 @@ CdIo_driver_t CdIo_all_drivers[MAX_DRIVER+1] = {
&cdio_open_solaris &cdio_open_solaris
}, },
{DRIVER_NRG,
CDIO_SRC_IS_DISK_IMAGE_MASK,
"NRG",
"Nero NRG disk image driver",
&cdio_have_nrg,
&cdio_open_nrg
},
{DRIVER_BINCUE, {DRIVER_BINCUE,
CDIO_SRC_IS_DISK_IMAGE_MASK, CDIO_SRC_IS_DISK_IMAGE_MASK,
"BIN/CUE", "BIN/CUE",
"bin/cuesheet disk image driver", "bin/cuesheet disk image driver",
&cdio_have_bincue, &cdio_have_bincue,
&cdio_open_bincue &cdio_open_bincue
},
{DRIVER_NRG,
CDIO_SRC_IS_DISK_IMAGE_MASK,
"NRG",
"Nero NRG disk image driver",
&cdio_have_nrg,
&cdio_open_nrg
} }
}; };

View File

@@ -1,5 +1,5 @@
/* /*
$Id: cdio.h,v 1.3 2003/03/29 17:32:00 rocky Exp $ $Id: cdio.h,v 1.4 2003/03/30 13:01:22 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003 Rocky Bernstein <rocky@panix.com>
@@ -51,6 +51,15 @@ extern "C" {
/* The below enumerations may be used to tag a specific driver /* The below enumerations may be used to tag a specific driver
that is opened or is desired to be opened. Note that this is that is opened or is desired to be opened. Note that this is
different than what is available on a given host. different than what is available on a given host.
Order is a little significant since the order is used in scans.
We have to start with UNKNOWN and devices should come before
disk-image readers. By putting something towards the top (a lower
enumeration number), in an iterative scan we prefer that to something
with a higher enumeration number.
NOTE: IF YOU MODIFY ENUM MAKE SURE INITIALIZATION IN CDIO.C AGREES.
*/ */
typedef enum { typedef enum {
DRIVER_UNKNOWN, DRIVER_UNKNOWN,
@@ -58,15 +67,15 @@ extern "C" {
DRIVER_FREEBSD, DRIVER_FREEBSD,
DRIVER_LINUX, DRIVER_LINUX,
DRIVER_SOLARIS, DRIVER_SOLARIS,
DRIVER_NRG, DRIVER_BINCUE, /* Prefer bincue over nrg when both exist */
DRIVER_BINCUE, DRIVER_NRG,
DRIVER_DEVICE, DRIVER_DEVICE, /* Is really a set of the above; should come last */
} driver_id_t; } driver_id_t;
/* Make sure what's listed below is the last one above. Since we have /* Make sure what's listed below is the last one above. Since we have
a bogus (but useful) 0th entry above we don't have to add one below. a bogus (but useful) 0th entry above we don't have to add one below.
*/ */
#define MAX_DRIVER DRIVER_BINCUE #define MAX_DRIVER DRIVER_NRG
typedef enum { typedef enum {

View File

@@ -1,5 +1,5 @@
/* /*
$Id: cdio_private.h,v 1.2 2003/03/29 17:32:00 rocky Exp $ $Id: cdio_private.h,v 1.3 2003/03/30 13:01:22 rocky Exp $
Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003 Rocky Bernstein <rocky@panix.com>
@@ -147,11 +147,21 @@ extern "C" {
} cdio_funcs; } cdio_funcs;
/* Things that just about all private device structures have. */ /*!
Things common to private device structures. Even though not all
devices may have some of these fields, by listing common ones
we facilitate writing generic routines and even cut-and-paste
code.
*/
typedef struct { typedef struct {
char *source_name; /* Name used in open. */ char *source_name; /* Name used in open. */
bool init; /* True if structure has been initialized */ bool init; /* True if structure has been initialized */
int fd; /* File descriptor of device */ bool toc_init; /* True TOC read in */
int ioctls_debugged; /* for debugging */
int fd; /* File descriptor of device */
off_t buff_offset; /* buffer offset in disk-image seeks.
(Not used in CD device access)
*/
} generic_img_private_t; } generic_img_private_t;
CdIo * cdio_new (void *user_data, const cdio_funcs *funcs); CdIo * cdio_new (void *user_data, const cdio_funcs *funcs);
@@ -180,11 +190,22 @@ extern "C" {
on a particular host. */ on a particular host. */
extern CdIo_driver_t CdIo_all_drivers[MAX_DRIVER+1]; extern CdIo_driver_t CdIo_all_drivers[MAX_DRIVER+1];
/*!
Bogus eject media when there is no ejectable media, e.g. a disk image
We always return 2. Should we also free resources?
*/
int cdio_generic_bogus_eject_media (void *user_data);
/*! /*!
Release and free resources associated with cd. Release and free resources associated with cd.
*/ */
void cdio_generic_free (void *user_data); void cdio_generic_free (void *user_data);
/*!
Initialize CD device.
*/
bool cdio_generic_init (void *user_data);
/*! /*!
Reads into buf the next size bytes. Reads into buf the next size bytes.
Returns -1 on error. Returns -1 on error.
@@ -212,7 +233,6 @@ extern "C" {
cdio_funcs op; cdio_funcs op;
}; };
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /* __cplusplus */