Set initialization of TOC when that's done. Test for TOC

initialization success in routines that depend on that.
This commit is contained in:
rocky
2004-07-25 11:15:08 +00:00
parent a7fcd6e83e
commit 18d135a99b

View File

@@ -1,5 +1,5 @@
/*
$Id: freebsd.c,v 1.28 2004/07/24 11:50:50 rocky Exp $
$Id: freebsd.c,v 1.29 2004/07/25 11:15:08 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
@@ -27,7 +27,7 @@
# include "config.h"
#endif
static const char _rcsid[] = "$Id: freebsd.c,v 1.28 2004/07/24 11:50:50 rocky Exp $";
static const char _rcsid[] = "$Id: freebsd.c,v 1.29 2004/07/25 11:15:08 rocky Exp $";
#include "freebsd.h"
@@ -183,26 +183,26 @@ _set_arg_freebsd (void *user_data, const char key[], const char value[])
/*!
Read and cache the CD's Track Table of Contents and track info.
Return false if successful or true if an error.
Return false if unsuccessful;
*/
static bool
_cdio_read_toc (_img_private_t *env)
_cdio_read_toc (_img_private_t *p_env)
{
track_t i, j;
/* read TOC header */
if ( ioctl(env->gen.fd, CDIOREADTOCHEADER, &env->tochdr) == -1 ) {
if ( ioctl(p_env->gen.fd, CDIOREADTOCHEADER, &p_env->tochdr) == -1 ) {
cdio_warn("error in ioctl(CDIOREADTOCHEADER): %s\n", strerror(errno));
return false;
}
j=0;
for ( i = env->tochdr.starting_track; i <= env->tochdr.ending_track;
for ( i = p_env->tochdr.starting_track; i <= p_env->tochdr.ending_track;
i++, j++) {
env->tocent[j].track = i;
env->tocent[j].address_format = CD_LBA_FORMAT;
p_env->tocent[j].track = i;
p_env->tocent[j].address_format = CD_LBA_FORMAT;
if ( ioctl(env->gen.fd, CDIOREADTOCENTRY, &(env->tocent[j]) ) ) {
if ( ioctl(p_env->gen.fd, CDIOREADTOCENTRY, &(p_env->tocent[j]) ) ) {
cdio_warn("%s %d: %s\n",
"error in ioctl CDROMREADTOCENTRY for track",
i, strerror(errno));
@@ -210,15 +210,16 @@ _cdio_read_toc (_img_private_t *env)
}
}
env->tocent[j].track = CDIO_CDROM_LEADOUT_TRACK;
env->tocent[j].address_format = CD_LBA_FORMAT;
if ( ioctl(env->gen.fd, CDIOREADTOCENTRY, &(env->tocent[j]) ) ){
p_env->tocent[j].track = CDIO_CDROM_LEADOUT_TRACK;
p_env->tocent[j].address_format = CD_LBA_FORMAT;
if ( ioctl(p_env->gen.fd, CDIOREADTOCENTRY, &(p_env->tocent[j]) ) ){
cdio_warn("%s: %s\n",
"error in ioctl CDROMREADTOCENTRY for leadout track",
strerror(errno));
return false;
}
p_env->toc_init = true;
return true;
}
@@ -265,11 +266,11 @@ _get_arg_freebsd (void *user_data, const char key[])
static track_t
_get_first_track_num_freebsd(void *user_data)
{
_img_private_t *env = user_data;
_img_private_t *p_env = user_data;
if (!env->toc_init) _cdio_read_toc (env) ;
if (!p_env->toc_init) _cdio_read_toc (p_env) ;
return FIRST_TRACK_NUM;
return p_env->toc_init ? FIRST_TRACK_NUM : CDIO_INVALID_TRACK;
}
/*!
@@ -344,11 +345,11 @@ scsi_mmc_run_cmd_freebsd( const void *p_user_data, int i_timeout,
static track_t
_get_num_tracks_freebsd(void *user_data)
{
_img_private_t *env = user_data;
_img_private_t *p_env = user_data;
if (!env->toc_init) _cdio_read_toc (env) ;
if (!p_env->toc_init) _cdio_read_toc (p_env) ;
return TOTAL_TRACKS;
return p_env->toc_init ? TOTAL_TRACKS : CDIO_INVALID_TRACK;
}
/*!
@@ -360,7 +361,7 @@ _get_num_tracks_freebsd(void *user_data)
static track_format_t
_get_track_format_freebsd(void *user_data, track_t i_track)
{
_img_private_t *env = user_data;
_img_private_t *p_env = user_data;
if (i_track > TOTAL_TRACKS || i_track == 0)
return TRACK_FORMAT_ERROR;
@@ -370,10 +371,10 @@ _get_track_format_freebsd(void *user_data, track_t i_track)
/* This is pretty much copied from the "badly broken" cdrom_count_tracks
in linux/cdrom.c.
*/
if (env->tocent[i_track].entry.control & CDIO_CDROM_DATA_TRACK) {
if (env->tocent[i_track].address_format == CDIO_CDROM_CDI_TRACK)
if (p_env->tocent[i_track].entry.control & CDIO_CDROM_DATA_TRACK) {
if (p_env->tocent[i_track].address_format == CDIO_CDROM_CDI_TRACK)
return TRACK_FORMAT_CDI;
else if (env->tocent[i_track].address_format == CDIO_CDROM_XA_TRACK)
else if (p_env->tocent[i_track].address_format == CDIO_CDROM_XA_TRACK)
return TRACK_FORMAT_XA;
else
return TRACK_FORMAT_DATA;
@@ -393,7 +394,7 @@ _get_track_format_freebsd(void *user_data, track_t i_track)
static bool
_get_track_green_freebsd(void *user_data, track_t i_track)
{
_img_private_t *env = user_data;
_img_private_t *p_env = user_data;
if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = TOTAL_TRACKS+1;
@@ -403,7 +404,7 @@ _get_track_green_freebsd(void *user_data, track_t i_track)
/* FIXME: Dunno if this is the right way, but it's what
I was using in cdinfo for a while.
*/
return ((env->tocent[i_track-FIRST_TRACK_NUM].entry.control & 2) != 0);
return ((p_env->tocent[i_track-FIRST_TRACK_NUM].entry.control & 2) != 0);
}
/*!
@@ -411,21 +412,21 @@ _get_track_green_freebsd(void *user_data, track_t i_track)
i_track in obj. Track numbers start at 1.
The "leadout" track is specified either by
using i_track LEADOUT_TRACK or the total tracks+1.
False is returned if there is no track entry.
CDIO_INVALID_LBA is returned if there is no track entry.
*/
static lba_t
_get_track_lba_freebsd(void *user_data, track_t i_track)
{
_img_private_t *env = user_data;
_img_private_t *p_env = user_data;
if (!env->toc_init) _cdio_read_toc (env) ;
if (!p_env->toc_init) _cdio_read_toc (p_env) ;
if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = TOTAL_TRACKS+1;
if (i_track > TOTAL_TRACKS+1 || i_track == 0) {
if (i_track > TOTAL_TRACKS+1 || i_track == 0 || !p_env->toc_init) {
return CDIO_INVALID_LBA;
} else {
return cdio_lsn_to_lba(ntohl(env->tocent[i_track-FIRST_TRACK_NUM].entry.addr.lba));
return cdio_lsn_to_lba(ntohl(p_env->tocent[i_track-FIRST_TRACK_NUM].entry.addr.lba));
}
}