-rom_toc_scan nonrom_off disables toc emulation on overwriteables

This commit is contained in:
Thomas Schmitt 2008-10-05 07:55:20 +00:00
parent c61358cd16
commit 943d196710
7 changed files with 61 additions and 22 deletions

View File

@ -58,7 +58,7 @@ extern void *libisoburn_default_msgs_submit_handle;
extern int libisoburn_default_msgs_submit_flag;
int isoburn_emulate_toc(struct burn_drive *d, int flag);
static int isoburn_emulate_toc(struct burn_drive *d, int flag);
int isoburn_initialize(char msg[1024], int flag)
@ -263,6 +263,7 @@ int isoburn_is_intermediate_dvd_rw(struct burn_drive *d, int flag)
@param flag bit0= pretent blank on overwriteable media
bit3= if the drive reports a -ROM profile then try to read
table of content by scanning for ISO image headers.
bit4= do not emulate TOC on overwriteable media
*/
static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
int flag)
@ -312,11 +313,13 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
(*o)->emulation_mode= -1;
goto ex;
}
/* try to read emulated toc */
ret= isoburn_emulate_toc(d, 0);
if(ret<0) {
(*o)->emulation_mode= -1;
goto ex;
if(!(flag & 16)) {
/* try to read emulated toc */
ret= isoburn_emulate_toc(d, 0);
if(ret<0) {
(*o)->emulation_mode= -1;
goto ex;
}
}
}
@ -326,9 +329,13 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
if(readonly) {
/* This might be overwriteable media in a -ROM drive */
ret= isoburn_emulate_toc(d, 1);
if(ret<0)
goto ex;
if((flag & 16)) {
ret= 0;
} else {
ret= isoburn_emulate_toc(d, 1);
if(ret<0)
goto ex;
}
if(ret==0 && profile !=0x08 && (flag&8)) {
/* This might also be multi-session media which do not
get shown with a decent TOC.
@ -373,24 +380,38 @@ ex:
table of content by scanning for ISO image headers.
(depending on media type and drive state this might
help or it might make the resulting toc even worse)
bit4= do not emulate TOC on overwriteable media
*/
int isoburn_drive_aquire(struct burn_drive_info *drive_infos[],
char *adr, int flag)
{
int ret, conv_ret, drive_grabbed= 0;
char libburn_drive_adr[BURN_DRIVE_ADR_LEN];
int ret, drive_grabbed= 0;
struct isoburn *o= NULL;
#ifndef NIX
/* <<< should be obsolete by new drive addressing of libburn-0.5.2 */
/* >>> but helps with kernel 2.4 to use /dev/sr */
int conv_ret;
char libburn_drive_adr[BURN_DRIVE_ADR_LEN];
conv_ret= burn_drive_convert_fs_adr(adr, libburn_drive_adr);
if(conv_ret<=0)
strcpy(libburn_drive_adr, adr);
ret= burn_drive_scan_and_grab(drive_infos, libburn_drive_adr, flag&1);
#else
ret= burn_drive_scan_and_grab(drive_infos, adr, flag & 1);
#endif /* ! NIX */
if(ret<=0)
goto ex;
drive_grabbed= 1;
ret= isoburn_welcome_media(&o, (*drive_infos)[0].drive,
(flag&8) | !!(flag&2));
(flag & 24) | !!(flag&2));
if(ret<=0)
goto ex;

View File

@ -364,6 +364,7 @@ int isoburn_drive_scan_and_grab(struct burn_drive_info *drive_infos[],
table of content by scanning for ISO image headers.
(depending on media type and drive this might
help or it might make the resulting toc even worse)
bit4= do not emulate table of content on overwriteable media
@return 1 = success , 0 = drive not found , <0 = other error
*/
int isoburn_drive_aquire(struct burn_drive_info *drive_infos[],

View File

@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1)
.TH XORRISO 1 "Oct 02, 2008"
.TH XORRISO 1 "Oct 06, 2008"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
@ -532,7 +532,7 @@ until the next -dev or -indev. After the image has been loaded once, the
setting is valid for -rollback until next -dev or -indev, where it
will be reset to "auto".
.TP
\fB\-rom_toc_scan\fR "on"|"off"
\fB\-rom_toc_scan\fR "on"|"off"|"nonrom_on"|"nonrom_off"
Read-only drives do not tell the actual media type but show any media as
ROM (e.g. as DVD-ROM). The session history of MMC multi-session media might
be truncated to first and last session or even be completely false.
@ -543,8 +543,13 @@ especially the address of the last session, there is a scan for ISO 9660
filesystem headers which might help but also might yield worse results
than the drive's table of content. At its end it can cause read attempts
to invalid addresses and thus ugly drive behavior.
Setting "on" enables that scan for alleged read-only media.
.br
To be in effect, -rom_toc_scan has to be enabled by "on" before the -*dev
On the other hand the emulation of session history on overwriteable media
can hamper reading of partly damaged media. Setting "nonrom_off" disables
the elsewise trustworthy table-of-content scan for those media.
.br
To be in effect, -rom_toc_scan settings have to be made before the -*dev
command which aquires drive and media.
.TP
\fB\-ban_stdio_write\fR

View File

@ -5286,6 +5286,11 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag)
xorriso->toc_emulation_flag&1 ? "on" : "off");
if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2);
is_default= !(xorriso->toc_emulation_flag&2);
sprintf(line,"-rom_toc_scan %s\n",
xorriso->toc_emulation_flag&2 ? "nonrom_off" : "nonrom_on");
if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2);
adr_mode= xorriso->image_start_mode & 0xffff;
if(adr_mode>=0 && adr_mode<=max_load_mode) {
@ -11649,8 +11654,9 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
" -load \"session\"|\"track\"|\"lba\"|\"sbsector\"|\"volid\"|\"auto\" id",
" Load a particular (outdated) ISO image from a -dev or",
" -indev which hosts more than one session.",
" -rom_toc_scan \"on\"|\"off\"",
" Enable scanning for ISO sessions on read-only drives/media.",
" -rom_toc_scan \"on\"|\"off\"|\"nonrom_on\"|\"nonrom_off\"",
" Enable scanning for ISO sessions on read-only drives/media",
" resp. on overwriteable media.",
" -ban_stdio_write",
" Allow for writing only the usage of optical drives.",
" -blank \"fast\"|\"all\"|\"deformat\"|\"deformat_quickest\"",
@ -13501,9 +13507,13 @@ int Xorriso_option_rollback(struct XorrisO *xorriso, int flag)
int Xorriso_option_rom_toc_scan(struct XorrisO *xorriso, char *mode, int flag)
{
if(strcmp(mode, "off")==0)
xorriso->toc_emulation_flag= 0;
xorriso->toc_emulation_flag&= ~1;
else if(strcmp(mode, "on")==0)
xorriso->toc_emulation_flag= 1;
xorriso->toc_emulation_flag|= 1;
else if(strcmp(mode, "nonrom_off")==0)
xorriso->toc_emulation_flag|= 2;
else if(strcmp(mode, "nonrom_on")==0)
xorriso->toc_emulation_flag&= ~2;
else {
sprintf(xorriso->info_text, "-rom_toc_scan: unknown mode '%s'", mode);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);

View File

@ -134,6 +134,8 @@ struct XorrisO { /* the global context of xorriso */
int toc_emulation_flag; /* bit0= bit3 for isoburn_drive_aquire()
scan -ROM profiles for ISO sessions
bit1= bit4 for isoburn_drive_aquire()
do not emulate TOC on overwriteable media
*/
int image_start_mode; /* From what address to load the ISO image

View File

@ -1 +1 @@
#define Xorriso_timestamP "2008.10.02.110828"
#define Xorriso_timestamP "2008.10.05.075432"

View File

@ -485,7 +485,7 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag)
if(dinfo==NULL) {
isoburn_set_msgs_submit(Xorriso_msgs_submit_void, (void *) xorriso,
(3<<2) | 128 , 0);
aquire_flag= 1 | ((flag&(8|4))>>1) | ((xorriso->toc_emulation_flag&1)<<3);
aquire_flag= 1 | ((flag&(8|4))>>1) | ((xorriso->toc_emulation_flag & 3)<<3);
ret= isoburn_drive_aquire(&dinfo, libburn_adr, aquire_flag);
Xorriso_process_msg_queues(xorriso,0);
if(ret<=0) {