From cb7c0e870a3f945079e37390c9ed56ddf6228721 Mon Sep 17 00:00:00 2001 From: rocky Date: Thu, 13 May 2004 04:32:12 +0000 Subject: [PATCH] Go over FreeBSD code based on output from Heiner. Hopefully 3 bugs are fixed: - we get the leadout track now, no core dumps - MSF reporting is corrected - track format and mode _cdio_linux.c: use cdio #define rather than GNU/Linux one. --- lib/FreeBSD/freebsd.c | 77 +++++++++++++++++-------------------- lib/FreeBSD/freebsd.h | 7 +--- lib/FreeBSD/freebsd_ioctl.c | 37 +----------------- lib/_cdio_linux.c | 6 +-- 4 files changed, 43 insertions(+), 84 deletions(-) diff --git a/lib/FreeBSD/freebsd.c b/lib/FreeBSD/freebsd.c index 45b81095..33b713c9 100644 --- a/lib/FreeBSD/freebsd.c +++ b/lib/FreeBSD/freebsd.c @@ -1,5 +1,5 @@ /* - $Id: freebsd.c,v 1.11 2004/05/13 01:50:22 rocky Exp $ + $Id: freebsd.c,v 1.12 2004/05/13 04:32:13 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -27,12 +27,14 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: freebsd.c,v 1.11 2004/05/13 01:50:22 rocky Exp $"; +static const char _rcsid[] = "$Id: freebsd.c,v 1.12 2004/05/13 04:32:13 rocky Exp $"; #include "freebsd.h" #ifdef HAVE_FREEBSD_CDROM +#include + static access_mode_t str_to_access_mode_freebsd(const char *psz_access_mode) { @@ -190,7 +192,7 @@ _set_arg_freebsd (void *env, const char key[], const char value[]) static bool _cdio_read_toc (_img_private_t *_obj) { - struct ioc_read_toc_entry te; + track_t i, j; /* read TOC header */ if ( ioctl(_obj->gen.fd, CDIOREADTOCHEADER, &_obj->tochdr) == -1 ) { @@ -198,15 +200,25 @@ _cdio_read_toc (_img_private_t *_obj) return false; } - te.address_format = CD_LBA_FORMAT; - te.starting_track = 0; - te.data_len = (TOTAL_TRACKS+1) * sizeof(struct cd_toc_entry); + j=0; + for ( i = _obj->tochdr.starting_track; i <= _obj->tochdr.ending_track; + i++, j++) { + _obj->tocent[j].track = i; + _obj->tocent[j].address_format = CD_LBA_FORMAT; - te.data = _obj->tocent; - - if ( ioctl(_obj->gen.fd, CDIOREADTOCENTRYS, &te) == -1 ) { + if ( ioctl(_obj->gen.fd, CDIOREADTOCENTRY, &(_obj->tocent[j]) ) ) { + cdio_error("%s %d: %s\n", + "error in ioctl CDROMREADTOCENTRY for track", + i, strerror(errno)); + return false; + } + } + + _obj->tocent[j].track = CDIO_CDROM_LEADOUT_TRACK; + _obj->tocent[j].address_format = CD_LBA_FORMAT; + if ( ioctl(_obj->gen.fd, CDIOREADTOCENTRY, &(_obj->tocent[j]) ) ){ cdio_error("%s: %s\n", - "error in ioctl CDROMREADTOCENTRYS for track", + "error in ioctl CDROMREADTOCENTRY for leadout track", strerror(errno)); return false; } @@ -324,29 +336,20 @@ static track_format_t _get_track_format_freebsd(void *env, track_t track_num) { _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_CURRENT_POSITION; - subchannel.track = track_num; - subchannel.data_len = 1; - subchannel.data = &subchannel_info; - - if(ioctl(_obj->gen.fd, CDIOCREADSUBCHANNEL, &subchannel) < 0) { - perror("CDIOCREADSUBCHANNEL"); - return 1; - } - - if (subchannel_info.what.position.control == 0x04) { - if (subchannel_info.what.position.data_format == 0x10) + /* This is pretty much copied from the "badly broken" cdrom_count_tracks + in linux/cdrom.c. + */ + if (_obj->tocent[track_num-1].entry.control & CDIO_CDROM_DATA_TRACK) { + if (_obj->tocent[track_num-1].address_format == 0x10) return TRACK_FORMAT_CDI; - else if (subchannel_info.what.position.data_format == 0x20) + else if (_obj->tocent[track_num-1].address_format == 0x20) return TRACK_FORMAT_XA; else return TRACK_FORMAT_DATA; } else return TRACK_FORMAT_AUDIO; + } /*! @@ -361,24 +364,16 @@ static bool _get_track_green_freebsd(void *env, track_t track_num) { _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_CURRENT_POSITION; - subchannel.track = track_num; - subchannel.data_len = 1; - subchannel.data = &subchannel_info; - - if(ioctl(_obj->gen.fd, CDIOCREADSUBCHANNEL, &subchannel) < 0) { - perror("CDIOCREADSUBCHANNEL"); - return 1; - } + if (track_num == CDIO_CDROM_LEADOUT_TRACK) track_num = TOTAL_TRACKS+1; + + if (track_num > TOTAL_TRACKS+1 || track_num == 0) + return false; + /* FIXME: Dunno if this is the right way, but it's what I was using in cdinfo for a while. */ - return (subchannel_info.what.position.control & 2) != 0; + return ((_obj->tocent[track_num-1].entry.control & 2) != 0); } /*! @@ -400,7 +395,7 @@ _get_track_lba_freebsd(void *env, track_t track_num) if (track_num > TOTAL_TRACKS+1 || track_num == 0) { return CDIO_INVALID_LBA; } else { - return _obj->tocent[track_num-1].addr.lba; + return cdio_lsn_to_lba(_obj->tocent[track_num-1].entry.addr.lba); } } diff --git a/lib/FreeBSD/freebsd.h b/lib/FreeBSD/freebsd.h index e7c14cef..beb5a753 100644 --- a/lib/FreeBSD/freebsd.h +++ b/lib/FreeBSD/freebsd.h @@ -1,5 +1,5 @@ /* - $Id: freebsd.h,v 1.4 2004/05/13 01:50:23 rocky Exp $ + $Id: freebsd.h,v 1.5 2004/05/13 04:32:14 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -120,7 +120,7 @@ typedef struct { /* Track information */ bool toc_init; /* if true, info below is valid. */ struct ioc_toc_header tochdr; - struct cd_toc_entry tocent[100]; /* entry info for each track */ + struct ioc_read_toc_single_entry tocent[100]; /* entry info for each track */ } _img_private_t; @@ -144,9 +144,6 @@ int read_mode2_sector_freebsd_ioctl (_img_private_t *env, void *data, int read_mode2_sectors_freebsd_cam (_img_private_t *env, void *buf, uint32_t lba, unsigned int nblocks, bool b_form2); - -bool read_toc_freebsd_ioctl (_img_private_t *_obj); - /*! Return the size of the CD in logical block address (LBA) units. */ diff --git a/lib/FreeBSD/freebsd_ioctl.c b/lib/FreeBSD/freebsd_ioctl.c index bbda9991..4e94b556 100644 --- a/lib/FreeBSD/freebsd_ioctl.c +++ b/lib/FreeBSD/freebsd_ioctl.c @@ -1,5 +1,5 @@ /* - $Id: freebsd_ioctl.c,v 1.4 2004/05/12 20:06:10 rocky Exp $ + $Id: freebsd_ioctl.c,v 1.5 2004/05/13 04:32:14 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: freebsd_ioctl.c,v 1.4 2004/05/12 20:06:10 rocky Exp $"; +static const char _rcsid[] = "$Id: freebsd_ioctl.c,v 1.5 2004/05/13 04:32:14 rocky Exp $"; #ifdef HAVE_FREEBSD_CDROM @@ -139,38 +139,6 @@ stat_size_freebsd_ioctl (_img_private_t *_obj) return size; } -/*! - Read and cache the CD's Track Table of Contents and track info. - Return false if successful or true if an error. -*/ -bool -read_toc_freebsd_ioctl (_img_private_t *_obj) -{ - int i; - struct ioc_read_toc_entry te; - - /* read TOC header */ - if ( ioctl(_obj->gen.fd, CDIOREADTOCHEADER, &_obj->tochdr) == -1 ) { - cdio_error("error in ioctl(CDIOREADTOCHEADER): %s\n", strerror(errno)); - return false; - } - - te.address_format = CD_LBA_FORMAT; - te.starting_track = 0; - te.data_len = (TOTAL_TRACKS+1) * sizeof(struct cd_toc_entry); - - te.data = _obj->tocent; - - if ( ioctl(_obj->gen.fd, CDIOREADTOCENTRYS, &te) == -1 ) { - cdio_error("%s %d: %s\n", - "error in ioctl CDROMREADTOCENTRYS for track", - i, strerror(errno)); - return false; - } - - return true; -} - /*! Eject media. Return 1 if successful, 0 otherwise. */ @@ -300,4 +268,3 @@ get_track_green_freebsd_ioctl(void *env, track_t track_num) } #endif /* HAVE_FREEBSD_CDROM */ - diff --git a/lib/_cdio_linux.c b/lib/_cdio_linux.c index ae4a4035..9cc8265c 100644 --- a/lib/_cdio_linux.c +++ b/lib/_cdio_linux.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_linux.c,v 1.45 2004/05/10 03:28:54 rocky Exp $ + $Id: _cdio_linux.c,v 1.46 2004/05/13 04:32:12 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002, 2003, 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.45 2004/05/10 03:28:54 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.46 2004/05/13 04:32:12 rocky Exp $"; #include @@ -882,7 +882,7 @@ _get_track_format_linux(void *env, track_t track_num) /* This is pretty much copied from the "badly broken" cdrom_count_tracks in linux/cdrom.c. */ - if (_obj->tocent[track_num-1].cdte_ctrl & CDROM_DATA_TRACK) { + if (_obj->tocent[track_num-1].cdte_ctrl & CDIO_CDROM_DATA_TRACK) { if (_obj->tocent[track_num-1].cdte_format == 0x10) return TRACK_FORMAT_CDI; else if (_obj->tocent[track_num-1].cdte_format == 0x20)