Add cdio_open_am_cd.

Use network order for FreeBSD lsn/lba's and other small FreeBSD patches.
Thanks again to Heiner.
This commit is contained in:
rocky
2004-05-19 03:00:03 +00:00
parent 2a54d504c0
commit b4090f3ca5
5 changed files with 81 additions and 28 deletions

View File

@@ -1,5 +1,5 @@
/* -*- c -*- /* -*- c -*-
$Id: cdio.h,v 1.49 2004/05/13 01:50:10 rocky Exp $ $Id: cdio.h,v 1.50 2004/05/19 03:00:03 rocky Exp $
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -546,20 +546,32 @@ extern "C" {
/*! Set up CD-ROM for reading. The device_name is /*! Set up CD-ROM for reading. The device_name is
the some sort of device name. the some sort of device name.
NULL is returned on error. @return the cdio object for subsequent operations.
NULL on error or there is no driver for a some sort of hardware CD-ROM.
*/ */
CdIo * cdio_open_cd (const char *device_name); CdIo * cdio_open_cd (const char *device_name);
/*! cdrao BIN/CUE CD disk-image routines. Source is the .cue file /*! Set up CD-ROM for reading. The device_name is
the some sort of device name.
NULL is returned on error. @return the cdio object for subsequent operations.
NULL on error or there is no driver for a some sort of hardware CD-ROM.
*/
CdIo * cdio_open_am_cd (const char *psz_device,
const char *psz_access_mode);
/*! CDRWIN BIN/CUE CD disk-image routines. Source is the .cue file
@return the cdio object for subsequent operations.
NULL on error.
*/ */
CdIo * cdio_open_cue (const char *cue_name); CdIo * cdio_open_cue (const char *cue_name);
/*! Set up CD-ROM for reading using the BSDI driver. The device_name is /*! Set up CD-ROM for reading using the BSDI driver. The device_name is
the some sort of device name. the some sort of device name.
NULL is returned on error or there is no BSDI driver. @return the cdio object for subsequent operations.
NULL on error or there is no BSDI driver.
@see cdio_open @see cdio_open
*/ */
@@ -568,7 +580,8 @@ extern "C" {
/*! Set up CD-ROM for reading using the BSDI driver. The device_name is /*! Set up CD-ROM for reading using the BSDI driver. The device_name is
the some sort of device name. the some sort of device name.
NULL is returned on error or there is no BSDI driver. @return the cdio object for subsequent operations.
NULL on error or there is no BSDI driver.
@see cdio_open @see cdio_open
*/ */
@@ -578,7 +591,8 @@ extern "C" {
/*! Return a string containing the default device name that the /*! Return a string containing the default device name that the
BSDI driver would use when none is specified. BSDI driver would use when none is specified.
NULL is returned on error or there is no CD-ROM device. @return the cdio object for subsequent operations.
NULL on error or there is no BSDI driver.
@see cdio_open_cd, cdio_open @see cdio_open_cd, cdio_open
*/ */
@@ -623,14 +637,16 @@ extern "C" {
/*! Set up CD-ROM for reading using the GNU/Linux driver. The device_name is /*! Set up CD-ROM for reading using the GNU/Linux driver. The device_name is
the some sort of device name. the some sort of device name.
NULL is returned on error or there is no GNU/Linux driver. @return the cdio object for subsequent operations.
NULL on error or there is no GNU/Linux driver.
*/ */
CdIo * cdio_open_linux (const char *source_name); CdIo * cdio_open_linux (const char *source_name);
/*! Set up CD-ROM for reading using the GNU/Linux driver. The device_name is /*! Set up CD-ROM for reading using the GNU/Linux driver. The
the some sort of device name. device_name is the some sort of device name.
NULL is returned on error or there is no GNU/Linux driver. @return the cdio object for subsequent operations.
NULL on error or there is no GNU/Linux driver.
*/ */
CdIo * cdio_open_am_linux (const char *source_name, CdIo * cdio_open_am_linux (const char *source_name,
const char *access_mode); const char *access_mode);
@@ -653,14 +669,16 @@ extern "C" {
/*! Set up CD-ROM for reading using the Sun Solaris driver. The /*! Set up CD-ROM for reading using the Sun Solaris driver. The
device_name is the some sort of device name. device_name is the some sort of device name.
NULL is returned on error or there is no Solaris driver. @return the cdio object for subsequent operations.
NULL on error or there is no Solaris driver.
*/ */
CdIo * cdio_open_solaris (const char *source_name); CdIo * cdio_open_solaris (const char *source_name);
/*! Set up CD-ROM for reading using the Sun Solaris driver. The /*! Set up CD-ROM for reading using the Sun Solaris driver. The
device_name is the some sort of device name. device_name is the some sort of device name.
NULL is returned on error or there is no Solaris driver. @return the cdio object for subsequent operations.
NULL on error or there is no Solaris driver.
*/ */
CdIo * cdio_open_am_solaris (const char *psz_source_name, CdIo * cdio_open_am_solaris (const char *psz_source_name,
const char *psz_access_mode); const char *psz_access_mode);

View File

@@ -1,5 +1,5 @@
/* /*
$Id: freebsd.c,v 1.13 2004/05/16 13:33:26 rocky Exp $ $Id: freebsd.c,v 1.14 2004/05/19 03:00:12 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -27,7 +27,7 @@
# include "config.h" # include "config.h"
#endif #endif
static const char _rcsid[] = "$Id: freebsd.c,v 1.13 2004/05/16 13:33:26 rocky Exp $"; static const char _rcsid[] = "$Id: freebsd.c,v 1.14 2004/05/19 03:00:12 rocky Exp $";
#include "freebsd.h" #include "freebsd.h"
@@ -288,6 +288,7 @@ _get_first_track_num_freebsd(void *env)
static char * static char *
_get_mcn_freebsd (const void *env) { _get_mcn_freebsd (const void *env) {
#if FIXED
const _img_private_t *_obj = env; const _img_private_t *_obj = env;
struct ioc_read_subchannel subchannel; struct ioc_read_subchannel subchannel;
struct cd_sub_channel_info subchannel_info; struct cd_sub_channel_info subchannel_info;
@@ -310,6 +311,10 @@ _get_mcn_freebsd (const void *env) {
return strdup(subchannel_info.what.media_catalog.mc_number); return strdup(subchannel_info.what.media_catalog.mc_number);
else else
return NULL; return NULL;
#else
return NULL;
#endif
} }
/*! /*!
@@ -395,7 +400,7 @@ _get_track_lba_freebsd(void *env, track_t track_num)
if (track_num > TOTAL_TRACKS+1 || track_num == 0) { if (track_num > TOTAL_TRACKS+1 || track_num == 0) {
return CDIO_INVALID_LBA; return CDIO_INVALID_LBA;
} else { } else {
return cdio_lsn_to_lba(_obj->tocent[track_num-1].entry.addr.lba); return cdio_lsn_to_lba(ntohl(_obj->tocent[track_num-1].entry.addr.lba));
} }
} }
@@ -509,18 +514,18 @@ cdio_open_am_freebsd (const char *psz_orig_source_name,
_data = _cdio_malloc (sizeof (_img_private_t)); _data = _cdio_malloc (sizeof (_img_private_t));
_data->access_mode = str_to_access_mode_freebsd(psz_access_mode); _data->access_mode = str_to_access_mode_freebsd(psz_access_mode);
_data->device = strdup(psz_source_name);
_data->gen.init = false; _data->gen.init = false;
_data->gen.fd = -1; _data->gen.fd = -1;
if (NULL == psz_orig_source_name) { if (NULL == psz_orig_source_name) {
psz_source_name=cdio_get_default_device_freebsd(); psz_source_name=cdio_get_default_device_freebsd();
_data->device = psz_source_name;
_set_arg_freebsd(_data, "source", psz_source_name); _set_arg_freebsd(_data, "source", psz_source_name);
free(psz_source_name);
} else { } else {
if (cdio_is_device_generic(psz_orig_source_name)) if (cdio_is_device_generic(psz_orig_source_name)) {
_set_arg_freebsd(_data, "source", psz_orig_source_name); _set_arg_freebsd(_data, "source", psz_orig_source_name);
else { _data->device = strdup(psz_orig_source_name);
} else {
/* The below would be okay if all device drivers worked this way. */ /* The below would be okay if all device drivers worked this way. */
#if 0 #if 0
cdio_info ("source %s is a not a device", psz_orig_source_name); cdio_info ("source %s is a not a device", psz_orig_source_name);

View File

@@ -1,5 +1,5 @@
/* /*
$Id: freebsd.h,v 1.5 2004/05/13 04:32:14 rocky Exp $ $Id: freebsd.h,v 1.6 2004/05/19 03:00:12 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -63,6 +63,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/param.h>
#define HAVE_FREEBSD_CAM #define HAVE_FREEBSD_CAM
#ifdef HAVE_FREEBSD_CAM #ifdef HAVE_FREEBSD_CAM
@@ -144,6 +145,9 @@ int read_mode2_sector_freebsd_ioctl (_img_private_t *env, void *data,
int read_mode2_sectors_freebsd_cam (_img_private_t *env, void *buf, int read_mode2_sectors_freebsd_cam (_img_private_t *env, void *buf,
uint32_t lba, unsigned int nblocks, uint32_t lba, unsigned int nblocks,
bool b_form2); bool b_form2);
bool read_toc_freebsd_ioctl (_img_private_t *_obj);
/*! /*!
Return the size of the CD in logical block address (LBA) units. Return the size of the CD in logical block address (LBA) units.
*/ */

View File

@@ -1,5 +1,5 @@
/* /*
$Id: cdio.c,v 1.52 2004/05/13 01:50:20 rocky Exp $ $Id: cdio.c,v 1.53 2004/05/19 03:00:03 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
@@ -37,7 +37,7 @@
#include <cdio/logging.h> #include <cdio/logging.h>
#include "cdio_private.h" #include "cdio_private.h"
static const char _rcsid[] = "$Id: cdio.c,v 1.52 2004/05/13 01:50:20 rocky Exp $"; static const char _rcsid[] = "$Id: cdio.c,v 1.53 2004/05/19 03:00:03 rocky Exp $";
const char *track_format2str[6] = const char *track_format2str[6] =
@@ -913,7 +913,7 @@ cdio_open_am (const char *psz_orig_source, driver_id_t driver_id,
case DRIVER_DEVICE: case DRIVER_DEVICE:
{ {
/* Scan for a driver. */ /* Scan for a driver. */
CdIo *ret = cdio_open_cd(psz_source); CdIo *ret = cdio_open_am_cd(psz_source, psz_access_mode);
free(psz_source); free(psz_source);
return ret; return ret;
} }
@@ -942,6 +942,26 @@ cdio_open_am (const char *psz_orig_source, driver_id_t driver_id,
} }
/*!
Set up CD-ROM for reading. The device_name is
the some sort of device name.
@return the cdio object for subsequent operations.
NULL on error or there is no driver for a some sort of hardware CD-ROM.
*/
CdIo *
cdio_open_cd (const char *psz_source)
{
return cdio_open_am_cd(psz_source, NULL);
}
/*!
Set up CD-ROM for reading. The device_name is
the some sort of device name.
@return the cdio object for subsequent operations.
NULL on error or there is no driver for a some sort of hardware CD-ROM.
*/
/* In the future we'll have more complicated code to allow selection /* In the future we'll have more complicated code to allow selection
of an I/O routine as well as code to find an appropriate default of an I/O routine as well as code to find an appropriate default
routine among the "registered" routines. Possibly classes too routine among the "registered" routines. Possibly classes too
@@ -951,13 +971,13 @@ cdio_open_am (const char *psz_orig_source, driver_id_t driver_id,
For now though, we'll start more simply... For now though, we'll start more simply...
*/ */
CdIo * CdIo *
cdio_open_cd (const char *source_name) cdio_open_am_cd (const char *psz_source, const char *psz_access_mode)
{ {
if (CdIo_last_driver == -1) cdio_init(); if (CdIo_last_driver == -1) cdio_init();
/* Scan for a driver. */ /* Scan for a driver. */
return scan_for_driver(CDIO_MIN_DEVICE_DRIVER, CDIO_MAX_DEVICE_DRIVER, return scan_for_driver(CDIO_MIN_DEVICE_DRIVER, CDIO_MAX_DEVICE_DRIVER,
source_name, NULL); psz_source, psz_access_mode);
} }

View File

@@ -1,5 +1,5 @@
/* /*
$Id: sector.c,v 1.8 2004/05/11 12:17:17 rocky Exp $ $Id: sector.c,v 1.9 2004/05/19 03:00:12 rocky Exp $
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
@@ -25,6 +25,7 @@
#include <cdio/sector.h> #include <cdio/sector.h>
#include <cdio/util.h> #include <cdio/util.h>
#include <cdio/logging.h>
#include "cdio_assert.h" #include "cdio_assert.h"
#include <stdio.h> #include <stdio.h>
@@ -33,7 +34,7 @@
#endif #endif
static const char _rcsid[] = "$Id: sector.c,v 1.8 2004/05/11 12:17:17 rocky Exp $"; static const char _rcsid[] = "$Id: sector.c,v 1.9 2004/05/19 03:00:12 rocky Exp $";
lba_t lba_t
cdio_lba_to_lsn (lba_t lba) cdio_lba_to_lsn (lba_t lba)
@@ -68,6 +69,11 @@ cdio_lsn_to_msf (lsn_t lsn, msf_t *msf)
f = lsn + CDIO_CD_MAX_LSN; f = lsn + CDIO_CD_MAX_LSN;
} }
if (m > 99) {
cdio_warn ("number of minutes (%d) truncated to 99.", m);
m = 99;
}
msf->m = to_bcd8 (m); msf->m = to_bcd8 (m);
msf->s = to_bcd8 (s); msf->s = to_bcd8 (s);
msf->f = to_bcd8 (f); msf->f = to_bcd8 (f);