FreeBSD fixes mostlyh.

This commit is contained in:
rocky
2003-10-03 07:54:58 +00:00
parent 7b440596af
commit 980822f07f
4 changed files with 120 additions and 120 deletions

View File

@@ -16,7 +16,7 @@ dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
dnl 02111-1307, USA. dnl 02111-1307, USA.
AC_PREREQ(2.54) AC_PREREQ(2.54)
AC_REVISION([$Id: configure.ac,v 1.48 2003/09/29 02:56:22 rocky Exp $])dnl AC_REVISION([$Id: configure.ac,v 1.49 2003/10/03 07:54:58 rocky Exp $])dnl
AC_INIT(lib/cdio.c) AC_INIT(lib/cdio.c)
AM_INIT_AUTOMAKE(libcdio, 0.64-cvs) AM_INIT_AUTOMAKE(libcdio, 0.64-cvs)
AM_CONFIG_HEADER(config.h) AM_CONFIG_HEADER(config.h)
@@ -250,17 +250,23 @@ int has_timeout=sizeof(test.timeout);],
LIBS="$LIBS -lwinmm -mwindows" LIBS="$LIBS -lwinmm -mwindows"
cd_drivers="${cd_drivers}, MinGW " cd_drivers="${cd_drivers}, MinGW "
;; ;;
freebsd4.9)
AC_DEFINE([HAVE_FREEBSD_CDROM], [1],
[Define 1 if you have FreeBSD CD-ROM support])
cd_drivers="${cd_drivers}, FreeBSD "
;;
*) *)
AC_MSG_WARN(Don't have OS CD-reading support for ${host_os}...) AC_MSG_WARN(Don't have OS CD-reading support for ${host_os}...)
AC_MSG_WARN(Will use generic support.) AC_MSG_WARN(Will use generic support.)
;; ;;
esac esac
AC_SUBST(LINUX_CDROM_TIMEOUT) AC_SUBST(LINUX_CDROM_TIMEOUT)
AC_SUBST(HAVE_LINUX_CDROM)
AC_SUBST(HAVE_BSDI_CDROM) AC_SUBST(HAVE_BSDI_CDROM)
AC_SUBST(HAVE_DARWIN_CDROM)
AC_SUBST(HAVE_FREEBSD_CDROM)
AC_SUBST(HAVE_LINUX_CDROM)
AC_SUBST(HAVE_SOLARIS_CDROM) AC_SUBST(HAVE_SOLARIS_CDROM)
AC_SUBST(HAVE_WIN32_CDROM) AC_SUBST(HAVE_WIN32_CDROM)
AC_SUBST(HAVE_DARWIN_CDROM)
AC_CHECK_FUNCS( bzero memcpy ) AC_CHECK_FUNCS( bzero memcpy )

View File

@@ -1,5 +1,5 @@
/* -*- c -*- /* -*- c -*-
$Id: cdio.h,v 1.29 2003/10/03 02:36:52 rocky Exp $ $Id: cdio.h,v 1.30 2003/10/03 07:54:59 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>
@@ -376,6 +376,8 @@ extern "C" {
char * cdio_get_default_device_freebsd(void); char * cdio_get_default_device_freebsd(void);
char **cdio_get_devices_freebsd(void);
/*! Linux CD-reading routines. /*! Linux CD-reading routines.
NULL is returned on error. NULL is returned on error.
*/ */

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_bincue.c,v 1.35 2003/10/03 02:36:52 rocky Exp $ $Id: _cdio_bincue.c,v 1.36 2003/10/03 07:55:00 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>
@@ -24,7 +24,7 @@
(*.cue). (*.cue).
*/ */
static const char _rcsid[] = "$Id: _cdio_bincue.c,v 1.35 2003/10/03 02:36:52 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_bincue.c,v 1.36 2003/10/03 07:55:00 rocky Exp $";
#include "cdio_assert.h" #include "cdio_assert.h"
#include "cdio_private.h" #include "cdio_private.h"
@@ -769,11 +769,11 @@ _cdio_get_track_green(void *env, track_t track_num)
} }
/*! /*!
Return the starting MSF (minutes/secs/frames) for track number Return the starting LSN track number
track_num in obj. Tracks numbers start at 1. track_num in obj. Track numbers start at 1.
The "leadout" track is specified either by The "leadout" track is specified either by
using track_num LEADOUT_TRACK or the total tracks+1. using track_num LEADOUT_TRACK or the total tracks+1.
1 is returned on error. False is returned if there is no track entry.
*/ */
static lba_t static lba_t
_cdio_get_track_lba(void *env, track_t track_num) _cdio_get_track_lba(void *env, track_t track_num)

View File

@@ -1,5 +1,5 @@
/* /*
$Id: _cdio_freebsd.c,v 1.18 2003/10/03 04:36:51 rocky Exp $ $Id: _cdio_freebsd.c,v 1.19 2003/10/03 07:55:01 rocky Exp $
Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003 Rocky Bernstein <rocky@panix.com>
@@ -27,7 +27,7 @@
# include "config.h" # include "config.h"
#endif #endif
static const char _rcsid[] = "$Id: _cdio_freebsd.c,v 1.18 2003/10/03 04:36:51 rocky Exp $"; static const char _rcsid[] = "$Id: _cdio_freebsd.c,v 1.19 2003/10/03 07:55:01 rocky Exp $";
#include <cdio/sector.h> #include <cdio/sector.h>
#include <cdio/util.h> #include <cdio/util.h>
@@ -77,7 +77,7 @@ typedef struct {
/* Track information */ /* Track information */
bool toc_init; /* if true, info below is valid. */ bool toc_init; /* if true, info below is valid. */
struct ioc_toc_header tochdr; struct ioc_toc_header tochdr;
struct ioc_read_toc_single_entry tocent[100]; /* entry info for each track */ struct cd_toc_entry tocent[100]; /* entry info for each track */
} _img_private_t; } _img_private_t;
@@ -117,18 +117,6 @@ cdio_is_cdrom(char *drive, char *mnttype)
return(is_cd); return(is_cd);
} }
static int
_set_bsize (int fd, unsigned int bsize)
{
struct cdrom_generic_command cgc;
if (ioctl (fd, CDRIOCSETBLOCKSIZE, &bsize) == -1) {
cdio_error("error in ioctl(CDRIOCSETBLOCKSIZE): %s\n", strerror(errno));
return 0;
}
return 1;
}
static int static int
_read_mode2 (int fd, void *buf, lba_t lba, unsigned int nblocks, _read_mode2 (int fd, void *buf, lba_t lba, unsigned int nblocks,
bool _workaround) bool _workaround)
@@ -161,19 +149,18 @@ static int
_cdio_read_audio_sectors (void *env, void *data, lsn_t lsn, _cdio_read_audio_sectors (void *env, void *data, lsn_t lsn,
unsigned int nblocks) unsigned int nblocks)
{ {
unsigned char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, };
struct cdrom_cdda cdda;
_img_private_t *_obj = env; _img_private_t *_obj = env;
unsigned char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, };
struct ioc_read_audio cdda;
cdda.address.lba = lsn; cdda.address.lba = lsn;
cdda.buffer = buf; cdda.buffer = buf;
cdda.nframes = nblocks; cdda.nframes = nblocks;
cdda.address_format = CD_LBA_FORMAT; cdda.address_format = CD_LBA_FORMAT;
/* read a frame */ /* read a frame */
if(ioctl(_obj->gen.fd, CDROMCDREADAUDIO, &cdda) < 0) { if(ioctl(_obj->gen.fd, CDIOCREADAUDIO, &cdda) < 0) {
perror("CDROMCDDA"); perror("CDIOCREADAUDIO");
return 1; return 1;
} }
memcpy (data, buf, CDIO_CD_FRAMESIZE_RAW); memcpy (data, buf, CDIO_CD_FRAMESIZE_RAW);
@@ -187,56 +174,18 @@ _cdio_read_audio_sectors (void *env, void *data, lsn_t lsn,
*/ */
static int static int
_cdio_read_mode2_sector (void *env, void *data, lsn_t lsn, _cdio_read_mode2_sector (void *env, void *data, lsn_t lsn,
bool mode2_form2) bool mode2_form2)
{ {
char buf[M2RAW_SECTOR_SIZE] = { 0, }; char buf[M2RAW_SECTOR_SIZE] = { 0, };
struct cdrom_msf *msf = (struct cdrom_msf *) &buf; int retval;
msf_t _msf;
_img_private_t *_obj = env; if ( (retval = _cdio_read_audio_sectors (env, buf, lsn, 1)) )
return retval;
cdio_lba_to_msf (cdio_lsn_to_lba(lsn), &_msf);
msf->cdmsf_min0 = from_bcd8(_msf.m);
msf->cdmsf_sec0 = from_bcd8(_msf.s);
msf->cdmsf_frame0 = from_bcd8(_msf.f);
if (_obj->gen.ioctls_debugged == 75)
cdio_debug ("only displaying every 75th ioctl from now on");
if (_obj->gen.ioctls_debugged == 30 * 75)
cdio_debug ("only displaying every 30*75th ioctl from now on");
if (_obj->gen.ioctls_debugged < 75
|| (_obj->gen.ioctls_debugged < (30 * 75)
&& _obj->gen.ioctls_debugged % 75 == 0)
|| _obj->ioctls_debugged % (30 * 75) == 0)
cdio_debug ("reading %2.2d:%2.2d:%2.2d",
msf->cdmsf_min0, msf->cdmsf_sec0, msf->cdmsf_frame0);
_obj->gen.ioctls_debugged++;
retry:
switch (_obj->access_mode)
{
case _AM_NONE:
cdio_error ("no way to read mode2");
return 1;
break;
case _AM_IOCTL:
if (ioctl (_obj->gen.fd, CDROMREADMODE2, &buf) == -1)
{
perror ("ioctl()");
return 1;
/* exit (EXIT_FAILURE); */
}
break;
}
if (mode2_form2) if (mode2_form2)
memcpy (data, buf, M2RAW_SECTOR_SIZE); memcpy (data, buf + CDIO_CD_XA_SYNC_HEADER, M2RAW_SECTOR_SIZE);
else else
memcpy (((char *)data), buf + CDIO_CD_SUBHEADER_SIZE, CDIO_CD_FRAMESIZE); memcpy (data, buf + CDIO_CD_XA_SYNC_HEADER, CDIO_CD_FRAMESIZE);
return 0; return 0;
} }
@@ -283,15 +232,15 @@ _cdio_stat_size (void *env)
struct ioc_read_toc_single_entry tocent; struct ioc_read_toc_single_entry tocent;
uint32_t size; uint32_t size;
tocent.cdte_track = CDIO_CDROM_LEADOUT_TRACK; tocent.track = CDIO_CDROM_LEADOUT_TRACK;
tocent.cdte_format = CD_LBA_FORMAT; tocent.address_format = CD_LBA_FORMAT;
if (ioctl (_obj->gen.fd, CDROMREADTOCENTRY, &tocent) == -1) if (ioctl (_obj->gen.fd, CDIOREADTOCENTRY, &tocent) == -1)
{ {
perror ("ioctl(CDROMREADTOCENTRY)"); perror ("ioctl(CDROMREADTOCENTRY)");
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
} }
size = tocent.cdte_addr.lba; size = tocent.entry.addr.lba;
return size; return size;
} }
@@ -337,12 +286,12 @@ _cdio_read_toc (_img_private_t *_obj)
struct ioc_read_toc_entry te; struct ioc_read_toc_entry te;
/* read TOC header */ /* read TOC header */
if ( ioctl(_obj->gen.fd, CDROMREADTOCHDR, &_obj->tochdr) == -1 ) { if ( ioctl(_obj->gen.fd, CDIOREADTOCHEADER, &_obj->tochdr) == -1 ) {
cdio_error("error in ioctl(CDROMREADTOCHDR): %s\n", strerror(errno)); cdio_error("error in ioctl(CDIOREADTOCHEADER): %s\n", strerror(errno));
return false; return false;
} }
te.address_format = CD_MSF_FORMAT; te.address_format = CD_LBA_FORMAT;
te.starting_track = 0; te.starting_track = 0;
te.data_len = (TOTAL_TRACKS+1) * sizeof(struct cd_toc_entry); te.data_len = (TOTAL_TRACKS+1) * sizeof(struct cd_toc_entry);
@@ -350,7 +299,7 @@ _cdio_read_toc (_img_private_t *_obj)
if ( ioctl(_obj->gen.fd, CDIOREADTOCENTRYS, &te) == -1 ) { if ( ioctl(_obj->gen.fd, CDIOREADTOCENTRYS, &te) == -1 ) {
cdio_error("%s %d: %s\n", cdio_error("%s %d: %s\n",
"error in ioctl CDROMREADTOCENTRY for track", "error in ioctl CDROMREADTOCENTRYS for track",
i, strerror(errno)); i, strerror(errno));
return false; return false;
} }
@@ -366,7 +315,6 @@ _cdio_eject_media (void *env) {
_img_private_t *_obj = env; _img_private_t *_obj = env;
int ret=2; int ret=2;
int status;
int fd; int fd;
if ((fd = open(_obj->gen.source_name, O_RDONLY|O_NONBLOCK)) > -1) { if ((fd = open(_obj->gen.source_name, O_RDONLY|O_NONBLOCK)) > -1) {
@@ -374,7 +322,7 @@ _cdio_eject_media (void *env) {
if (ioctl(fd, CDIOCALLOW) == -1) { if (ioctl(fd, CDIOCALLOW) == -1) {
cdio_error("ioctl(fd, CDIOCALLOW) failed: %s\n", strerror(errno)); cdio_error("ioctl(fd, CDIOCALLOW) failed: %s\n", strerror(errno));
} else if (ioctl(fd, CDIOCEJECT) == -1) { } else if (ioctl(fd, CDIOCEJECT) == -1) {
cdio_error("ioctl(CDIOCEJECT) failed: %s\n" strerror(errno)); cdio_error("ioctl(CDIOCEJECT) failed: %s\n", strerror(errno));
} else { } else {
ret = 0; ret = 0;
} }
@@ -419,6 +367,42 @@ _cdio_get_first_track_num(void *env)
return FIRST_TRACK_NUM; return FIRST_TRACK_NUM;
} }
/*!
Return the media catalog number MCN.
Note: string is malloc'd so caller should free() then returned
string when done with it.
FIXME: This is just a guess.
*/
static char *
_cdio_get_mcn (void *env) {
_img_private_t *_obj = env;
struct ioc_read_subchannel subchannel;
struct cd_sub_channel_info subchannel_info;
subchannel.address_format = CD_LBA_FORMAT;
subchannel.data_format = CD_MEDIA_CATALOG;
subchannel.track = 0;
subchannel.data_len = 1;
subchannel.data = &subchannel_info;
if(ioctl(_obj->gen.fd, CDIOCREADSUBCHANNEL, &subchannel) < 0) {
perror("CDIOCREADSUBCHANNEL");
return NULL;
}
/* Probably need a loop over tracks rather than give up if we
can't find in track 0.
*/
if (subchannel_info.what.media_catalog.mc_valid)
return strdup(subchannel_info.what.media_catalog.mc_number);
else
return NULL;
}
/*! /*!
Return the number of tracks in the current medium. Return the number of tracks in the current medium.
CDIO_INVALID_TRACK is returned on error. CDIO_INVALID_TRACK is returned on error.
@@ -435,27 +419,37 @@ _cdio_get_num_tracks(void *env)
/*! /*!
Get format of track. Get format of track.
FIXME: We're just guessing this from the GNU/Linux code.
*/ */
static track_format_t static track_format_t
_cdio_get_track_format(void *env, track_t track_num) _cdio_get_track_format(void *env, track_t track_num)
{ {
_img_private_t *_obj = env; _img_private_t *_obj = env;
struct ioc_read_subchannel subchannel;
struct cd_sub_channel_info subchannel_info;
if (!_obj->toc_init) _cdio_read_toc (_obj) ; subchannel.address_format = CD_LBA_FORMAT;
subchannel.data_format = CD_CURRENT_POSITION;
subchannel.track = track_num;
subchannel.data_len = 1;
subchannel.data = &subchannel_info;
if (track_num > TOTAL_TRACKS || track_num == 0) if(ioctl(_obj->gen.fd, CDIOCREADSUBCHANNEL, &subchannel) < 0) {
return TRACK_FORMAT_ERROR; perror("CDIOCREADSUBCHANNEL");
return 1;
}
if (_obj->tocent[track_num-1].entry.control & CDROM_DATA_TRACK) { if (subchannel_info.what.position.control == 0x04) {
if (_obj->tocent[track_num-1].cdte_format == 0x10) if (subchannel_info.what.position.data_format == 0x10)
return TRACK_FORMAT_CDI; return TRACK_FORMAT_CDI;
else if (_obj->tocent[track_num-1].cdte_format == 0x20) else if (subchannel_info.what.position.data_format == 0x20)
return TRACK_FORMAT_XA; return TRACK_FORMAT_XA;
else else
return TRACK_FORMAT_DATA; return TRACK_FORMAT_DATA;
} else } else
return TRACK_FORMAT_AUDIO; return TRACK_FORMAT_AUDIO;
} }
/*! /*!
@@ -470,46 +464,46 @@ static bool
_cdio_get_track_green(void *env, track_t track_num) _cdio_get_track_green(void *env, track_t track_num)
{ {
_img_private_t *_obj = env; _img_private_t *_obj = env;
struct ioc_read_subchannel subchannel;
struct cd_sub_channel_info subchannel_info;
if (!_obj->toc_init) _cdio_read_toc (_obj) ; subchannel.address_format = CD_LBA_FORMAT;
subchannel.data_format = CD_CURRENT_POSITION;
subchannel.track = track_num;
subchannel.data_len = 1;
subchannel.data = &subchannel_info;
if (track_num == CDIO_CDROM_LEADOUT_TRACK) track_num = TOTAL_TRACKS+1; if(ioctl(_obj->gen.fd, CDIOCREADSUBCHANNEL, &subchannel) < 0) {
perror("CDIOCREADSUBCHANNEL");
if (track_num > TOTAL_TRACKS+1 || track_num == 0) return 1;
return false; }
/* 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 ((_obj->tocent[track_num-1].cdte_ctrl & 2) != 0); return (subchannel_info.what.position.control & 2) != 0;
} }
/*! /*!
Return the starting MSF (minutes/secs/frames) for track number Return the starting LSN track number
track_num in obj. Track numbers start at 1. track_num in obj. Track numbers start at 1.
The "leadout" track is specified either by The "leadout" track is specified either by
using track_num LEADOUT_TRACK or the total tracks+1. using track_num LEADOUT_TRACK or the total tracks+1.
False is returned if there is no track entry. False is returned if there is no track entry.
*/ */
static bool static lba_t
_cdio_get_track_msf(void *env, track_t track_num, msf_t *msf) _cdio_get_track_lba(void *env, track_t track_num)
{ {
_img_private_t *_obj = env; _img_private_t *_obj = env;
if (NULL == msf) return false;
if (!_obj->toc_init) _cdio_read_toc (_obj) ; if (!_obj->toc_init) _cdio_read_toc (_obj) ;
if (track_num == CDIO_CDROM_LEADOUT_TRACK) track_num = TOTAL_TRACKS+1; if (track_num == CDIO_CDROM_LEADOUT_TRACK) track_num = TOTAL_TRACKS+1;
if (track_num > TOTAL_TRACKS+1 || track_num == 0) { if (track_num > TOTAL_TRACKS+1 || track_num == 0) {
return false; return CDIO_INVALID_LBA;
} else { } else {
struct cdrom_msf0 *msf0= &_obj->tocent[track_num-1].cdte_addr.msf; return _obj->tocent[track_num-1].addr.lba;
msf->m = to_bcd8(msf0->minute);
msf->s = to_bcd8(msf0->second);
msf->f = to_bcd8(msf0->frame);
return true;
} }
} }
@@ -588,15 +582,15 @@ cdio_open_freebsd (const char *source_name)
.eject_media = _cdio_eject_media, .eject_media = _cdio_eject_media,
.free = cdio_generic_free, .free = cdio_generic_free,
.get_arg = _cdio_get_arg, .get_arg = _cdio_get_arg,
.get_default_device = _cdio_get_default_device_freebsd, .get_default_device = cdio_get_default_device_freebsd,
.get_devices = cdio_get_devices_freebsd, .get_devices = cdio_get_devices_freebsd,
.get_first_track_num= _cdio_get_first_track_num, .get_first_track_num= _cdio_get_first_track_num,
.get_mcn = NULL, .get_mcn = _cdio_get_mcn,
.get_num_tracks = _cdio_get_num_tracks, .get_num_tracks = _cdio_get_num_tracks,
.get_track_format = _cdio_get_track_format, .get_track_format = _cdio_get_track_format,
.get_track_green = _cdio_get_track_green, .get_track_green = _cdio_get_track_green,
.get_track_lba = NULL, /* This could be implemented if need be. */ .get_track_lba = _cdio_get_track_lba,
.get_track_msf = _cdio_get_track_msf, .get_track_msf = NULL,
.lseek = cdio_generic_lseek, .lseek = cdio_generic_lseek,
.read = cdio_generic_read, .read = cdio_generic_read,
.read_audio_sectors = _cdio_read_audio_sectors, .read_audio_sectors = _cdio_read_audio_sectors,
@@ -617,7 +611,7 @@ cdio_open_freebsd (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_generic_init(_data)) if (cdio_generic_init(_data))
return ret; return ret;
else { else {
cdio_generic_free (_data); cdio_generic_free (_data);
@@ -639,5 +633,3 @@ cdio_have_freebsd (void)
return false; return false;
#endif /* HAVE_FREEBSD_CDROM */ #endif /* HAVE_FREEBSD_CDROM */
} }