Automatic re-try with -close "as_needed" and unannounced fast-blanked DVD-RW

This commit is contained in:
Thomas Schmitt 2013-10-28 15:10:35 +00:00
parent 7586fa80db
commit 9e1acb731d
8 changed files with 177 additions and 56 deletions

View File

@ -1974,7 +1974,8 @@ int Xorriso_option_close_filter_list(struct XorrisO *xorriso, int flag)
*/ */
int Xorriso_option_commit(struct XorrisO *xorriso, int flag) int Xorriso_option_commit(struct XorrisO *xorriso, int flag)
{ {
int ret; int ret, eternal_problem_status_mem;
char eternal_problem_status_text_mem[80];
if(!Xorriso_change_is_pending(xorriso, 0)) { if(!Xorriso_change_is_pending(xorriso, 0)) {
sprintf(xorriso->info_text, "-commit: No image modifications pending"); sprintf(xorriso->info_text, "-commit: No image modifications pending");
@ -1988,7 +1989,15 @@ int Xorriso_option_commit(struct XorrisO *xorriso, int flag)
{ret= 2; goto ex;} {ret= 2; goto ex;}
} }
Xorriso_process_errfile(xorriso, 0, "burn session start", 0, 1); Xorriso_process_errfile(xorriso, 0, "burn session start", 0, 1);
eternal_problem_status_mem= Xorriso_get_problem_status(xorriso,
eternal_problem_status_text_mem, 1);
ret= Xorriso_write_session(xorriso, 0); ret= Xorriso_write_session(xorriso, 0);
if(ret == 2) {
if(Xorriso__severity_cmp("WARNING", eternal_problem_status_text_mem) > 0)
strcpy(eternal_problem_status_text_mem, "WARNING");
Xorriso_set_problem_status(xorriso, eternal_problem_status_text_mem, 1);
ret= Xorriso_retry_write_session(xorriso, 0);
}
Xorriso_process_errfile(xorriso, 0, "burn session end", 0, 1); Xorriso_process_errfile(xorriso, 0, "burn session end", 0, 1);
if(ret<=0) if(ret<=0)
goto ex; goto ex;

View File

@ -197,14 +197,24 @@ ex:;
} }
/* @param flag bit0= get eternal problem status
*/
int Xorriso_get_problem_status(struct XorrisO *xorriso, char severity[80], int Xorriso_get_problem_status(struct XorrisO *xorriso, char severity[80],
int flag) int flag)
{ {
strcpy(severity, xorriso->problem_status_text); if(flag & 1) {
return(xorriso->problem_status); strcpy(severity, xorriso->eternal_problem_status_text);
return(xorriso->eternal_problem_status);
} else {
strcpy(severity, xorriso->problem_status_text);
return(xorriso->problem_status);
}
} }
/* @param flag bit0= set eternal problem status to severity,
and set problem status to ALL
*/
int Xorriso_set_problem_status(struct XorrisO *xorriso, char *severity, int Xorriso_set_problem_status(struct XorrisO *xorriso, char *severity,
int flag) int flag)
{ {
@ -237,9 +247,15 @@ int Xorriso_set_problem_status(struct XorrisO *xorriso, char *severity,
#endif /* Xorriso_fetch_with_msg_queueS */ #endif /* Xorriso_fetch_with_msg_queueS */
xorriso->problem_status= sev; if(flag & 1) {
strcpy(xorriso->problem_status_text, sev_text); strcpy(xorriso->problem_status_text, "ALL");
if(sev > xorriso->eternal_problem_status) { Xorriso__text_to_sev(xorriso->problem_status_text,
&(xorriso->problem_status), 0);
} else {
xorriso->problem_status= sev;
strcpy(xorriso->problem_status_text, sev_text);
}
if(sev > xorriso->eternal_problem_status || (flag & 1)) {
xorriso->eternal_problem_status= sev; xorriso->eternal_problem_status= sev;
strcpy(xorriso->eternal_problem_status_text, sev_text); strcpy(xorriso->eternal_problem_status_text, sev_text);
} }

View File

@ -132,8 +132,10 @@ int Xorriso_make_write_options(
struct XorrisO *xorriso, struct burn_drive *drive, struct XorrisO *xorriso, struct burn_drive *drive,
struct burn_write_opts **burn_options, int flag) struct burn_write_opts **burn_options, int flag)
{ {
int drive_role, stream_mode= 0; int drive_role, stream_mode= 0, ret, profile;
char profile_name[80];
enum burn_disc_status s;
*burn_options= burn_write_opts_new(drive); *burn_options= burn_write_opts_new(drive);
if(*burn_options==NULL) { if(*burn_options==NULL) {
Xorriso_process_msg_queues(xorriso,0); Xorriso_process_msg_queues(xorriso,0);
@ -145,6 +147,16 @@ int Xorriso_make_write_options(
drive_role= burn_drive_get_drive_role(drive); drive_role= burn_drive_get_drive_role(drive);
burn_write_opts_set_multi(*burn_options, burn_write_opts_set_multi(*burn_options,
!(xorriso->do_close || drive_role==0 || drive_role==3)); !(xorriso->do_close || drive_role==0 || drive_role==3));
ret= burn_disc_get_profile(drive, &profile, profile_name);
if(ret > 0) {
s= isoburn_disc_get_status(drive);
if(xorriso->auto_close && xorriso->do_close == 0 &&
profile == 0x14 && s == BURN_DISC_BLANK)
/* Prepare for missing feature 21h despite drive's announcement */
burn_write_opts_set_fail21h_sev(*burn_options, "NOTE");
}
if(xorriso->write_speed != -2) if(xorriso->write_speed != -2)
burn_drive_set_speed(drive, 0, xorriso->write_speed); burn_drive_set_speed(drive, 0, xorriso->write_speed);
if(xorriso->do_stream_recording == 1) if(xorriso->do_stream_recording == 1)
@ -707,7 +719,31 @@ ex:
} }
int Xorriso_retry_write_session(struct XorrisO *xorriso, int flag)
{
int ret, auto_close_mem, do_close_mem;
if(xorriso->do_tao == 1) {
Xorriso_msgs_submit(xorriso, 0,
"There is no hope for a re-try with -close \"on\" as long as -write_type is \"tao\"",
0, "FAILURE", 0);
return(0);
}
Xorriso_msgs_submit(xorriso, 0, "Re-trying with -close \"on\"", 0, "NOTE", 0);
do_close_mem= xorriso->do_close;
auto_close_mem= xorriso->auto_close;
xorriso->do_close= 1;
xorriso->auto_close= 0;
ret= Xorriso_write_session(xorriso, 0);
xorriso->do_close= do_close_mem;
xorriso->auto_close= auto_close_mem;
return(ret);
}
/* @param flag bit0= do not write but only prepare and return size in sectors /* @param flag bit0= do not write but only prepare and return size in sectors
@return <=0 error , 1= success
2= failure with DVD-RW, please call Xorriso_retry_write_session()
*/ */
int Xorriso_write_session(struct XorrisO *xorriso, int flag) int Xorriso_write_session(struct XorrisO *xorriso, int flag)
{ {
@ -1163,6 +1199,15 @@ fprintf(stderr, "XORRISO_DEBUG: isoburn_igopt_set_tail_blocks(%d)\n",
if(!isoburn_drive_wrote_well(drive)) { if(!isoburn_drive_wrote_well(drive)) {
isoburn_cancel_prepared_write(source_drive, drive, 0); isoburn_cancel_prepared_write(source_drive, drive, 0);
Xorriso_process_msg_queues(xorriso,0); Xorriso_process_msg_queues(xorriso,0);
if(xorriso->auto_close && xorriso->do_close == 0) {
if(burn_drive_was_feat21_failure(drive)) {
sprintf(xorriso->info_text,
"libburn indicates failure with writing DVD-RW to appendable state.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
/* Urge caller to call Xorriso_retry_write_session() */
ret= 2; goto ex;
}
}
sprintf(xorriso->info_text, sprintf(xorriso->info_text,
"libburn indicates failure with writing."); "libburn indicates failure with writing.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
@ -1855,11 +1900,38 @@ int Xorriso_blank_as_needed(struct XorrisO *xorriso, int flag)
} }
int Xorriso_retry_burn_track(struct XorrisO *xorriso,
off_t write_start_address,
char *track_source, off_t tsize, int flag)
{
int ret, auto_close_mem, do_close_mem;
if(xorriso->do_tao == 1) {
Xorriso_msgs_submit(xorriso, 0,
"There is no hope for a re-try with -close \"on\" as long as -write_type is \"tao\"",
0, "FAILURE", 0);
return(0);
}
Xorriso_msgs_submit(xorriso, 0, "Re-trying with -close \"on\"", 0, "NOTE", 0);
do_close_mem= xorriso->do_close;
auto_close_mem= xorriso->auto_close;
xorriso->do_close= 1;
xorriso->auto_close= 0;
ret= Xorriso_burn_track(xorriso, write_start_address, track_source, tsize,
flag);
xorriso->do_close= do_close_mem;
xorriso->auto_close= auto_close_mem;
return(ret);
}
/* @param write_start_address is valid if >=0 /* @param write_start_address is valid if >=0
@param tsize is valid if >0 @param tsize is valid if >0
@param flag bit0= grow_overwriteable_iso @param flag bit0= grow_overwriteable_iso
bit1= do_isosize bit1= do_isosize
bit2= do_xa1 conversion bit2= do_xa1 conversion
@return <=0 error , 1= success
2= failure with DVD-RW, please call Xorriso_retry_burn_track()
*/ */
int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address, int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address,
char *track_source, off_t tsize, int flag) char *track_source, off_t tsize, int flag)
@ -2113,6 +2185,15 @@ int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address,
goto ex; goto ex;
if(!burn_drive_wrote_well(drive)) { if(!burn_drive_wrote_well(drive)) {
Xorriso_process_msg_queues(xorriso,0); Xorriso_process_msg_queues(xorriso,0);
if(xorriso->auto_close && xorriso->do_close == 0) {
if(burn_drive_was_feat21_failure(drive)) {
sprintf(xorriso->info_text,
"libburn indicates failure with writing DVD-RW to appendable state.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
/* Urge caller to call Xorriso_retry_burn_rack() */
ret= 2; goto ex;
}
}
sprintf(xorriso->info_text, sprintf(xorriso->info_text,
"libburn indicates failure with writing."); "libburn indicates failure with writing.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);

View File

@ -9,7 +9,7 @@
.\" First parameter, NAME, should be all caps .\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1) .\" other parameters are allowed: see man(7), man(1)
.TH XORRISO 1 "Version 1.3.3, Oct 14, 2013" .TH XORRISO 1 "Version 1.3.3, Oct 27, 2013"
.\" Please adjust this date whenever revising the manpage. .\" Please adjust this date whenever revising the manpage.
.\" .\"
.\" Some roff macros, for reference: .\" Some roff macros, for reference:
@ -2778,8 +2778,11 @@ and is one aspect of growisofs option \-dvd\-compat.
If set to "off" then keep the medium writable for an appended session. If set to "off" then keep the medium writable for an appended session.
.br .br
If set to "as_needed" then use "on" only if "off" is predicted to If set to "as_needed" then use "on" only if "off" is predicted to
fail with the given medium and its state. But not all drives correctly fail with the given medium and its state.
recognize fast\-blanked DVD\-RW which need "on". .br
Not all drives correctly recognize fast\-blanked DVD\-RW which need "on".
If there is well founded suspicion that a burn run failed due to
\-close "off", then \-close "as_needed" causes a re\-try with "on".
.br .br
Note that emulation command \-as "cdrecord" temporarily overrides Note that emulation command \-as "cdrecord" temporarily overrides
the current setting of \-close by its own default \-close "on" if the current setting of \-close by its own default \-close "on" if

View File

@ -2454,8 +2454,11 @@ according to the setting of command -acl.
If set to "off" then keep the medium writable for an appended If set to "off" then keep the medium writable for an appended
session. session.
If set to "as_needed" then use "on" only if "off" is predicted to If set to "as_needed" then use "on" only if "off" is predicted to
fail with the given medium and its state. But not all drives fail with the given medium and its state.
correctly recognize fast-blanked DVD-RW which need "on". Not all drives correctly recognize fast-blanked DVD-RW which need
"on". If there is well founded suspicion that a burn run failed
due to -close "off", then -close "as_needed" causes a re-try with
"on".
Note that emulation command -as "cdrecord" temporarily overrides Note that emulation command -as "cdrecord" temporarily overrides
the current setting of -close by its own default -close "on" if the current setting of -close by its own default -close "on" if
its option -multi is missing. its option -multi is missing.
@ -4976,7 +4979,7 @@ File: xorriso.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top
* -outdev acquires a drive for output: AqDrive. (line 31) * -outdev acquires a drive for output: AqDrive. (line 31)
* -overwrite enables overwriting in ISO: SetInsert. (line 127) * -overwrite enables overwriting in ISO: SetInsert. (line 127)
* -pacifier controls pacifier text form: Emulation. (line 163) * -pacifier controls pacifier text form: Emulation. (line 163)
* -padding sets amount or mode of image padding: SetWrite. (line 375) * -padding sets amount or mode of image padding: SetWrite. (line 378)
* -page set terminal geometry: DialogCtl. (line 19) * -page set terminal geometry: DialogCtl. (line 19)
* -paste_in copies file into disk file: Restore. (line 124) * -paste_in copies file into disk file: Restore. (line 124)
* -path_list inserts paths from disk file: Insert. (line 79) * -path_list inserts paths from disk file: Insert. (line 79)
@ -5051,7 +5054,7 @@ File: xorriso.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top
* -volid sets volume id: SetWrite. (line 160) * -volid sets volume id: SetWrite. (line 160)
* -volset_id sets volume set id: SetWrite. (line 181) * -volset_id sets volume set id: SetWrite. (line 181)
* -volume_date sets volume timestamp: SetWrite. (line 208) * -volume_date sets volume timestamp: SetWrite. (line 208)
* -write_type chooses TAO or SAO/DAO: SetWrite. (line 367) * -write_type chooses TAO or SAO/DAO: SetWrite. (line 370)
* -x enables automatic execution order of arguments: ArgSort. * -x enables automatic execution order of arguments: ArgSort.
(line 16) (line 16)
* -xattr controls handling of xattr (EA): Loading. (line 176) * -xattr controls handling of xattr (EA): Loading. (line 176)
@ -5335,12 +5338,12 @@ File: xorriso.info, Node: ConceptIdx, Prev: CommandIdx, Up: Top
* Write, free space, -tell_media_space: Inquiry. (line 104) * Write, free space, -tell_media_space: Inquiry. (line 104)
* Write, log problematic disk files, -errfile_log: Scripting. (line 129) * Write, log problematic disk files, -errfile_log: Scripting. (line 129)
* Write, log written sessions, -session_log: Scripting. (line 149) * Write, log written sessions, -session_log: Scripting. (line 149)
* Write, padding image, -padding: SetWrite. (line 375) * Write, padding image, -padding: SetWrite. (line 378)
* Write, pending ISO image, -commit: Writing. (line 29) * Write, pending ISO image, -commit: Writing. (line 29)
* Write, predict image size, -print_size: Inquiry. (line 91) * Write, predict image size, -print_size: Inquiry. (line 91)
* Write, set speed, -speed: SetWrite. (line 298) * Write, set speed, -speed: SetWrite. (line 298)
* Write, simulation, -dummy: SetWrite. (line 342) * Write, simulation, -dummy: SetWrite. (line 342)
* Write, TAO or SAO/DAO, -write_type: SetWrite. (line 367) * Write, TAO or SAO/DAO, -write_type: SetWrite. (line 370)
* xattr, _definition: Extras. (line 65) * xattr, _definition: Extras. (line 65)
* xattr, control handling, -xattr: Loading. (line 176) * xattr, control handling, -xattr: Loading. (line 176)
* xattr, set in ISO image, -setfattr: Manip. (line 118) * xattr, set in ISO image, -setfattr: Manip. (line 118)
@ -5372,40 +5375,40 @@ Node: CmdFind75955
Node: Filter90997 Node: Filter90997
Node: Writing95553 Node: Writing95553
Node: SetWrite105545 Node: SetWrite105545
Node: Bootable125728 Node: Bootable125870
Node: Jigdo142118 Node: Jigdo142260
Node: Charset146365 Node: Charset146507
Node: Exception149127 Node: Exception149269
Node: DialogCtl155247 Node: DialogCtl155389
Node: Inquiry157845 Node: Inquiry157987
Node: Navigate164162 Node: Navigate164304
Node: Verify172460 Node: Verify172602
Node: Restore181492 Node: Restore181634
Node: Emulation188579 Node: Emulation188721
Node: Scripting198881 Node: Scripting199023
Node: Frontend206652 Node: Frontend206794
Node: Examples216259 Node: Examples216401
Node: ExDevices217437 Node: ExDevices217579
Node: ExCreate218096 Node: ExCreate218238
Node: ExDialog219381 Node: ExDialog219523
Node: ExGrowing220646 Node: ExGrowing220788
Node: ExModifying221451 Node: ExModifying221593
Node: ExBootable221955 Node: ExBootable222097
Node: ExCharset222507 Node: ExCharset222649
Node: ExPseudo223328 Node: ExPseudo223470
Node: ExCdrecord224226 Node: ExCdrecord224368
Node: ExMkisofs224543 Node: ExMkisofs224685
Node: ExGrowisofs225883 Node: ExGrowisofs226025
Node: ExException227018 Node: ExException227160
Node: ExTime227472 Node: ExTime227614
Node: ExIncBackup227931 Node: ExIncBackup228073
Node: ExRestore231911 Node: ExRestore232053
Node: ExRecovery232844 Node: ExRecovery232986
Node: Files233414 Node: Files233556
Node: Seealso234713 Node: Seealso234855
Node: Bugreport235436 Node: Bugreport235578
Node: Legal236017 Node: Legal236159
Node: CommandIdx237028 Node: CommandIdx237170
Node: ConceptIdx253690 Node: ConceptIdx253832
 
End Tag Table End Tag Table

View File

@ -50,7 +50,7 @@
@c man .\" First parameter, NAME, should be all caps @c man .\" First parameter, NAME, should be all caps
@c man .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection @c man .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
@c man .\" other parameters are allowed: see man(7), man(1) @c man .\" other parameters are allowed: see man(7), man(1)
@c man .TH XORRISO 1 "Version 1.3.3, Oct 14, 2013" @c man .TH XORRISO 1 "Version 1.3.3, Oct 27, 2013"
@c man .\" Please adjust this date whenever revising the manpage. @c man .\" Please adjust this date whenever revising the manpage.
@c man .\" @c man .\"
@c man .\" Some roff macros, for reference: @c man .\" Some roff macros, for reference:
@ -3282,8 +3282,11 @@ and is one aspect of growisofs option -dvd-compat.
If set to "off" then keep the medium writable for an appended session. If set to "off" then keep the medium writable for an appended session.
@* @*
If set to "as_needed" then use "on" only if "off" is predicted to If set to "as_needed" then use "on" only if "off" is predicted to
fail with the given medium and its state. But not all drives correctly fail with the given medium and its state.
recognize fast-blanked DVD-RW which need "on". @*
Not all drives correctly recognize fast-blanked DVD-RW which need "on".
If there is well founded suspicion that a burn run failed due to
-close "off", then -close "as_needed" causes a re-try with "on".
@* @*
Note that emulation command -as "cdrecord" temporarily overrides Note that emulation command -as "cdrecord" temporarily overrides
the current setting of -close by its own default -close "on" if the current setting of -close by its own default -close "on" if

View File

@ -1 +1 @@
#define Xorriso_timestamP "2013.10.27.115427" #define Xorriso_timestamP "2013.10.28.150924"

View File

@ -45,6 +45,8 @@ int Xorriso_give_up_drive(struct XorrisO *xorriso, int flag);
int Xorriso_write_session(struct XorrisO *xorriso, int flag); int Xorriso_write_session(struct XorrisO *xorriso, int flag);
int Xorriso_retry_write_session(struct XorrisO *xorriso, int flag);
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image /* @param boss_iter Opaque handle to be forwarded to actions in ISO image
Set to NULL if calling this function from outside ISO world Set to NULL if calling this function from outside ISO world
@param flag bit0= mkdir: graft in as empty directory, not as copy from disk @param flag bit0= mkdir: graft in as empty directory, not as copy from disk
@ -233,6 +235,10 @@ int Xorriso_atip(struct XorrisO *xorriso, int flag);
int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address, int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address,
char *track_source, off_t tsize, int flag); char *track_source, off_t tsize, int flag);
int Xorriso_retry_burn_track(struct XorrisO *xorriso,
off_t write_start_address,
char *track_source, off_t tsize, int flag);
/* @param flag bit1= outdev rather than indev /* @param flag bit1= outdev rather than indev
@return <=0 = failure , 1= ok , 2= ok, is CD profile @return <=0 = failure , 1= ok , 2= ok, is CD profile
*/ */