Check header for PVD MSF. Get XA mode more often.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
$Id: iso9660_fs.c,v 1.7 2005/02/05 17:29:01 rocky Exp $
|
$Id: iso9660_fs.c,v 1.8 2005/02/05 18:41:31 rocky Exp $
|
||||||
|
|
||||||
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
|
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
|
||||||
Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
||||||
@@ -58,12 +58,12 @@ typedef enum {
|
|||||||
} bool_3way_t;
|
} bool_3way_t;
|
||||||
|
|
||||||
|
|
||||||
static const char _rcsid[] = "$Id: iso9660_fs.c,v 1.7 2005/02/05 17:29:01 rocky Exp $";
|
static const char _rcsid[] = "$Id: iso9660_fs.c,v 1.8 2005/02/05 18:41:31 rocky Exp $";
|
||||||
|
|
||||||
/* Implementation of iso9660_t type */
|
/* Implementation of iso9660_t type */
|
||||||
struct _iso9660 {
|
struct _iso9660 {
|
||||||
CdioDataSource_t *stream; /* Stream pointer */
|
CdioDataSource_t *stream; /* Stream pointer */
|
||||||
bool_3way_t b_xa; /* true if has XA attributes. If true
|
bool_3way_t b_xa; /* true if has XA attributes. If true
|
||||||
b_mode2 should be set true as well.
|
b_mode2 should be set true as well.
|
||||||
*/
|
*/
|
||||||
bool_3way_t b_mode2; /* true if has mode 2, false for mode 1. */
|
bool_3way_t b_mode2; /* true if has mode 2, false for mode 1. */
|
||||||
@@ -129,13 +129,23 @@ adjust_fuzzy_pvd( iso9660_t *p_iso )
|
|||||||
SEEK_SET) )
|
SEEK_SET) )
|
||||||
return;
|
return;
|
||||||
if (sizeof(buf) == cdio_stream_read (p_iso->stream, buf, sizeof(buf), 1)) {
|
if (sizeof(buf) == cdio_stream_read (p_iso->stream, buf, sizeof(buf), 1)) {
|
||||||
|
/* Does the sector frame header suggest Mode 1 format? */
|
||||||
if (!memcmp(CDIO_SECTOR_SYNC_HEADER, buf+CDIO_CD_SUBHEADER_SIZE,
|
if (!memcmp(CDIO_SECTOR_SYNC_HEADER, buf+CDIO_CD_SUBHEADER_SIZE,
|
||||||
CDIO_CD_SYNC_SIZE)) {
|
CDIO_CD_SYNC_SIZE)) {
|
||||||
|
if (buf[14+CDIO_CD_SUBHEADER_SIZE] != 0x16) {
|
||||||
|
cdio_warn ("Expecting the PVD sector header MSF to be 0x16, is: %x",
|
||||||
|
buf[14]);
|
||||||
|
}
|
||||||
p_iso->b_mode2 = nope;
|
p_iso->b_mode2 = nope;
|
||||||
p_iso->b_xa = nope;
|
p_iso->b_xa = nope;
|
||||||
} else if (!memcmp(CDIO_SECTOR_SYNC_HEADER, buf, CDIO_CD_SYNC_SIZE)) {
|
} else if (!memcmp(CDIO_SECTOR_SYNC_HEADER, buf, CDIO_CD_SYNC_SIZE)) {
|
||||||
|
/* Frame header indicates Mode 2 Form 1*/
|
||||||
|
if (buf[14] != 0x16) {
|
||||||
|
cdio_warn ("Expecting the PVD sector header MSF to be 0x16, is: %x",
|
||||||
|
buf[14]);
|
||||||
|
}
|
||||||
p_iso->b_mode2 = yep;
|
p_iso->b_mode2 = yep;
|
||||||
|
/* Do do: check Mode 2 Form 2? */
|
||||||
} else {
|
} else {
|
||||||
/* Has no frame header */
|
/* Has no frame header */
|
||||||
p_iso->i_framesize = M2RAW_SECTOR_SIZE;
|
p_iso->i_framesize = M2RAW_SECTOR_SIZE;
|
||||||
@@ -945,9 +955,10 @@ _fs_stat_root (CdIo_t *p_cdio)
|
|||||||
{
|
{
|
||||||
iso_extension_mask_t iso_extension_mask = ISO_EXTENSION_ALL;
|
iso_extension_mask_t iso_extension_mask = ISO_EXTENSION_ALL;
|
||||||
generic_img_private_t *p_env = (generic_img_private_t *) p_cdio->env;
|
generic_img_private_t *p_env = (generic_img_private_t *) p_cdio->env;
|
||||||
bool b_mode2 = cdio_get_track_green(p_cdio, 1);
|
bool b_mode2;
|
||||||
iso9660_dir_t *p_iso9660_dir;
|
iso9660_dir_t *p_iso9660_dir;
|
||||||
iso9660_stat_t *p_stat;
|
iso9660_stat_t *p_stat;
|
||||||
|
bool_3way_t b_xa;
|
||||||
|
|
||||||
if (!p_env->i_joliet_level)
|
if (!p_env->i_joliet_level)
|
||||||
iso_extension_mask &= ~ISO_EXTENSION_JOLIET;
|
iso_extension_mask &= ~ISO_EXTENSION_JOLIET;
|
||||||
@@ -958,6 +969,19 @@ _fs_stat_root (CdIo_t *p_cdio)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
b_mode2 = cdio_get_track_green(p_cdio, 1);
|
||||||
|
|
||||||
|
switch(cdio_get_discmode(p_cdio)) {
|
||||||
|
case CDIO_DISC_MODE_CD_XA:
|
||||||
|
b_xa = yep;
|
||||||
|
break;
|
||||||
|
case CDIO_DISC_MODE_CD_DATA:
|
||||||
|
b_xa = nope;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
b_xa = dunno;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_JOLIET
|
#ifdef HAVE_JOLIET
|
||||||
p_iso9660_dir = p_env->i_joliet_level
|
p_iso9660_dir = p_env->i_joliet_level
|
||||||
? &(p_env->svd.root_directory_record)
|
? &(p_env->svd.root_directory_record)
|
||||||
@@ -966,7 +990,7 @@ _fs_stat_root (CdIo_t *p_cdio)
|
|||||||
p_iso9660_dir = &(p_env->pvd.root_directory_record) ;
|
p_iso9660_dir = &(p_env->pvd.root_directory_record) ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
p_stat = _iso9660_dir_to_statbuf (p_iso9660_dir, b_mode2, dunno,
|
p_stat = _iso9660_dir_to_statbuf (p_iso9660_dir, b_mode2, b_xa,
|
||||||
p_env->i_joliet_level);
|
p_env->i_joliet_level);
|
||||||
return p_stat;
|
return p_stat;
|
||||||
}
|
}
|
||||||
@@ -994,7 +1018,8 @@ _fs_stat_iso_root (iso9660_t *p_iso)
|
|||||||
|
|
||||||
static iso9660_stat_t *
|
static iso9660_stat_t *
|
||||||
_fs_stat_traverse (const CdIo_t *p_cdio, const iso9660_stat_t *_root,
|
_fs_stat_traverse (const CdIo_t *p_cdio, const iso9660_stat_t *_root,
|
||||||
char **splitpath, bool b_mode2, bool translate)
|
char **splitpath, bool b_mode2, bool b_xa,
|
||||||
|
bool translate)
|
||||||
{
|
{
|
||||||
unsigned offset = 0;
|
unsigned offset = 0;
|
||||||
uint8_t *_dirbuf = NULL;
|
uint8_t *_dirbuf = NULL;
|
||||||
@@ -1067,7 +1092,7 @@ _fs_stat_traverse (const CdIo_t *p_cdio, const iso9660_stat_t *_root,
|
|||||||
|
|
||||||
if (!cmp) {
|
if (!cmp) {
|
||||||
iso9660_stat_t *ret_stat
|
iso9660_stat_t *ret_stat
|
||||||
= _fs_stat_traverse (p_cdio, p_stat, &splitpath[1], b_mode2,
|
= _fs_stat_traverse (p_cdio, p_stat, &splitpath[1], b_mode2, b_xa,
|
||||||
translate);
|
translate);
|
||||||
free(p_stat);
|
free(p_stat);
|
||||||
free (_dirbuf);
|
free (_dirbuf);
|
||||||
@@ -1183,16 +1208,29 @@ iso9660_fs_stat (CdIo_t *p_cdio, const char psz_path[])
|
|||||||
iso9660_stat_t *p_stat;
|
iso9660_stat_t *p_stat;
|
||||||
/* A bit of a hack, we'll assume track 1 contains ISO_PVD_SECTOR.*/
|
/* A bit of a hack, we'll assume track 1 contains ISO_PVD_SECTOR.*/
|
||||||
bool b_mode2;
|
bool b_mode2;
|
||||||
|
bool_3way_t b_xa;
|
||||||
|
|
||||||
if (!p_cdio) return NULL;
|
if (!p_cdio) return NULL;
|
||||||
if (!psz_path) return NULL;
|
if (!psz_path) return NULL;
|
||||||
|
if (!p_root) return NULL;
|
||||||
p_root = _fs_stat_root (p_cdio);
|
|
||||||
if (!p_root) return NULL;
|
|
||||||
|
|
||||||
b_mode2 = cdio_get_track_green(p_cdio, 1);
|
b_mode2 = cdio_get_track_green(p_cdio, 1);
|
||||||
|
p_root = _fs_stat_root (p_cdio);
|
||||||
|
|
||||||
|
switch(cdio_get_discmode(p_cdio)) {
|
||||||
|
case CDIO_DISC_MODE_CD_XA:
|
||||||
|
b_xa = yep;
|
||||||
|
break;
|
||||||
|
case CDIO_DISC_MODE_CD_DATA:
|
||||||
|
b_xa = nope;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
b_xa = dunno;
|
||||||
|
}
|
||||||
|
|
||||||
p_psz_splitpath = _cdio_strsplit (psz_path, '/');
|
p_psz_splitpath = _cdio_strsplit (psz_path, '/');
|
||||||
p_stat = _fs_stat_traverse (p_cdio, p_root, p_psz_splitpath, b_mode2, false);
|
p_stat = _fs_stat_traverse (p_cdio, p_root, p_psz_splitpath, b_mode2,
|
||||||
|
b_xa, false);
|
||||||
free(p_root);
|
free(p_root);
|
||||||
_cdio_strfreev (p_psz_splitpath);
|
_cdio_strfreev (p_psz_splitpath);
|
||||||
|
|
||||||
@@ -1212,6 +1250,7 @@ iso9660_fs_stat_translate (CdIo_t *p_cdio, const char psz_path[],
|
|||||||
iso9660_stat_t *p_root;
|
iso9660_stat_t *p_root;
|
||||||
char **p_psz_splitpath;
|
char **p_psz_splitpath;
|
||||||
iso9660_stat_t *p_stat;
|
iso9660_stat_t *p_stat;
|
||||||
|
bool_3way_t b_xa;
|
||||||
|
|
||||||
if (!p_cdio) return NULL;
|
if (!p_cdio) return NULL;
|
||||||
if (psz_path) return NULL;
|
if (psz_path) return NULL;
|
||||||
@@ -1219,8 +1258,20 @@ iso9660_fs_stat_translate (CdIo_t *p_cdio, const char psz_path[],
|
|||||||
p_root = _fs_stat_root (p_cdio);
|
p_root = _fs_stat_root (p_cdio);
|
||||||
if (!p_root) return NULL;
|
if (!p_root) return NULL;
|
||||||
|
|
||||||
|
switch(cdio_get_discmode(p_cdio)) {
|
||||||
|
case CDIO_DISC_MODE_CD_XA:
|
||||||
|
b_xa = yep;
|
||||||
|
break;
|
||||||
|
case CDIO_DISC_MODE_CD_DATA:
|
||||||
|
b_xa = nope;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
b_xa = dunno;
|
||||||
|
}
|
||||||
|
|
||||||
p_psz_splitpath = _cdio_strsplit (psz_path, '/');
|
p_psz_splitpath = _cdio_strsplit (psz_path, '/');
|
||||||
p_stat = _fs_stat_traverse (p_cdio, p_root, p_psz_splitpath, b_mode2, true);
|
p_stat = _fs_stat_traverse (p_cdio, p_root, p_psz_splitpath, b_mode2,
|
||||||
|
b_xa, true);
|
||||||
free(p_root);
|
free(p_root);
|
||||||
_cdio_strfreev (p_psz_splitpath);
|
_cdio_strfreev (p_psz_splitpath);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user