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 ret;
int ret, eternal_problem_status_mem;
char eternal_problem_status_text_mem[80];
if(!Xorriso_change_is_pending(xorriso, 0)) {
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;}
}
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);
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);
if(ret<=0)
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 flag)
{
if(flag & 1) {
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 flag)
{
@ -237,9 +247,15 @@ int Xorriso_set_problem_status(struct XorrisO *xorriso, char *severity,
#endif /* Xorriso_fetch_with_msg_queueS */
if(flag & 1) {
strcpy(xorriso->problem_status_text, "ALL");
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) {
}
if(sev > xorriso->eternal_problem_status || (flag & 1)) {
xorriso->eternal_problem_status= sev;
strcpy(xorriso->eternal_problem_status_text, sev_text);
}

View File

@ -132,7 +132,9 @@ int Xorriso_make_write_options(
struct XorrisO *xorriso, struct burn_drive *drive,
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);
if(*burn_options==NULL) {
@ -145,6 +147,16 @@ int Xorriso_make_write_options(
drive_role= burn_drive_get_drive_role(drive);
burn_write_opts_set_multi(*burn_options,
!(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)
burn_drive_set_speed(drive, 0, xorriso->write_speed);
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
@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)
{
@ -1163,6 +1199,15 @@ fprintf(stderr, "XORRISO_DEBUG: isoburn_igopt_set_tail_blocks(%d)\n",
if(!isoburn_drive_wrote_well(drive)) {
isoburn_cancel_prepared_write(source_drive, drive, 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,
"libburn indicates failure with writing.");
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 tsize is valid if >0
@param flag bit0= grow_overwriteable_iso
bit1= do_isosize
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,
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;
if(!burn_drive_wrote_well(drive)) {
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,
"libburn indicates failure with writing.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);

View File

@ -9,7 +9,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 "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.
.\"
.\" 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.
.br
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
recognize fast\-blanked DVD\-RW which need "on".
fail with the given medium and its state.
.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
Note that emulation command \-as "cdrecord" temporarily overrides
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
session.
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 recognize fast-blanked DVD-RW which need "on".
fail with the given medium and its state.
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
the current setting of -close by its own default -close "on" if
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)
* -overwrite enables overwriting in ISO: SetInsert. (line 127)
* -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)
* -paste_in copies file into disk file: Restore. (line 124)
* -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)
* -volset_id sets volume set id: SetWrite. (line 181)
* -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.
(line 16)
* -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, log problematic disk files, -errfile_log: Scripting. (line 129)
* 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, predict image size, -print_size: Inquiry. (line 91)
* Write, set speed, -speed: SetWrite. (line 298)
* 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, control handling, -xattr: Loading. (line 176)
* xattr, set in ISO image, -setfattr: Manip. (line 118)
@ -5372,40 +5375,40 @@ Node: CmdFind75955
Node: Filter90997
Node: Writing95553
Node: SetWrite105545
Node: Bootable125728
Node: Jigdo142118
Node: Charset146365
Node: Exception149127
Node: DialogCtl155247
Node: Inquiry157845
Node: Navigate164162
Node: Verify172460
Node: Restore181492
Node: Emulation188579
Node: Scripting198881
Node: Frontend206652
Node: Examples216259
Node: ExDevices217437
Node: ExCreate218096
Node: ExDialog219381
Node: ExGrowing220646
Node: ExModifying221451
Node: ExBootable221955
Node: ExCharset222507
Node: ExPseudo223328
Node: ExCdrecord224226
Node: ExMkisofs224543
Node: ExGrowisofs225883
Node: ExException227018
Node: ExTime227472
Node: ExIncBackup227931
Node: ExRestore231911
Node: ExRecovery232844
Node: Files233414
Node: Seealso234713
Node: Bugreport235436
Node: Legal236017
Node: CommandIdx237028
Node: ConceptIdx253690
Node: Bootable125870
Node: Jigdo142260
Node: Charset146507
Node: Exception149269
Node: DialogCtl155389
Node: Inquiry157987
Node: Navigate164304
Node: Verify172602
Node: Restore181634
Node: Emulation188721
Node: Scripting199023
Node: Frontend206794
Node: Examples216401
Node: ExDevices217579
Node: ExCreate218238
Node: ExDialog219523
Node: ExGrowing220788
Node: ExModifying221593
Node: ExBootable222097
Node: ExCharset222649
Node: ExPseudo223470
Node: ExCdrecord224368
Node: ExMkisofs224685
Node: ExGrowisofs226025
Node: ExException227160
Node: ExTime227614
Node: ExIncBackup228073
Node: ExRestore232053
Node: ExRecovery232986
Node: Files233556
Node: Seealso234855
Node: Bugreport235578
Node: Legal236159
Node: CommandIdx237170
Node: ConceptIdx253832

End Tag Table

View File

@ -50,7 +50,7 @@
@c man .\" First parameter, NAME, should be all caps
@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 .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 .\"
@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 "as_needed" then use "on" only if "off" is predicted to
fail with the given medium and its state. But not all drives correctly
recognize fast-blanked DVD-RW which need "on".
fail with the given medium and its state.
@*
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
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_retry_write_session(struct XorrisO *xorriso, int flag);
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
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
@ -233,6 +235,10 @@ int Xorriso_atip(struct XorrisO *xorriso, int flag);
int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address,
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
@return <=0 = failure , 1= ok , 2= ok, is CD profile
*/