|
|
|
@ -992,6 +992,40 @@ int Xorriso_set_isolinux_options(struct XorrisO *xorriso,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int Xorriso_auto_format(struct XorrisO *xorriso, int flag)
|
|
|
|
|
{
|
|
|
|
|
int ret, profile, status, num_formats;
|
|
|
|
|
char profile_name[80];
|
|
|
|
|
struct burn_drive_info *dinfo;
|
|
|
|
|
struct burn_drive *drive;
|
|
|
|
|
off_t size;
|
|
|
|
|
unsigned dummy;
|
|
|
|
|
|
|
|
|
|
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
|
|
|
|
"on attempt to autoformat", 2);
|
|
|
|
|
if(ret<=0)
|
|
|
|
|
return(0);
|
|
|
|
|
ret= burn_disc_get_profile(drive, &profile, profile_name);
|
|
|
|
|
if(ret>0 && (profile==0x12 || profile==0x43)) { /* DVD-RAM or BD-RE */
|
|
|
|
|
ret= burn_disc_get_formats(drive, &status, &size, &dummy, &num_formats);
|
|
|
|
|
if(ret>0 && status==BURN_FORMAT_IS_UNFORMATTED) {
|
|
|
|
|
sprintf(xorriso->info_text,
|
|
|
|
|
"Unformatted %s media detected. Trying -format fast.",
|
|
|
|
|
profile_name);
|
|
|
|
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
|
|
|
|
ret= Xorriso_format_media(xorriso, 1 | 4);
|
|
|
|
|
if(ret<=0) {
|
|
|
|
|
sprintf(xorriso->info_text, "Automatic formatting of %s failed",
|
|
|
|
|
profile_name);
|
|
|
|
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
|
|
|
|
return(ret);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define Xorriso_with_make_isohybrid_mbR 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -999,16 +1033,15 @@ int Xorriso_set_isolinux_options(struct XorrisO *xorriso,
|
|
|
|
|
*/
|
|
|
|
|
int Xorriso_write_session(struct XorrisO *xorriso, int flag)
|
|
|
|
|
{
|
|
|
|
|
int ret, relax= 0, i, profile, status, num_formats;
|
|
|
|
|
int ret, relax= 0, i;
|
|
|
|
|
int major, minor, micro;
|
|
|
|
|
unsigned dummy;
|
|
|
|
|
char xorriso_id[256], *img_id, profile_name[80], sfe[5*SfileadrL], *cpt;
|
|
|
|
|
char xorriso_id[256], *img_id, sfe[5*SfileadrL], *cpt;
|
|
|
|
|
struct isoburn_imgen_opts *sopts= NULL;
|
|
|
|
|
struct burn_drive_info *dinfo, *source_dinfo;
|
|
|
|
|
struct burn_drive *drive, *source_drive;
|
|
|
|
|
struct burn_disc *disc= NULL;
|
|
|
|
|
struct burn_write_opts *burn_options;
|
|
|
|
|
off_t readcounter= 0,writecounter= 0, size;
|
|
|
|
|
off_t readcounter= 0,writecounter= 0;
|
|
|
|
|
int num_sessions= 0, num_tracks= 0;
|
|
|
|
|
struct burn_session **sessions;
|
|
|
|
|
struct burn_track **tracks;
|
|
|
|
@ -1018,6 +1051,13 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
|
|
|
|
|
ElToritoBootImage *bootimg;
|
|
|
|
|
enum eltorito_boot_media_type emul_type= ELTORITO_NO_EMUL;
|
|
|
|
|
|
|
|
|
|
#ifdef NIX
|
|
|
|
|
|
|
|
|
|
int profile, status, num_formats;
|
|
|
|
|
char profile_name[80];
|
|
|
|
|
off_t size;
|
|
|
|
|
unsigned dummy;
|
|
|
|
|
|
|
|
|
|
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
|
|
|
|
"on attempt to write", 2);
|
|
|
|
|
if(ret<=0)
|
|
|
|
@ -1042,9 +1082,24 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
|
|
|
|
|
"on attempt to write", 2);
|
|
|
|
|
if(ret<=0)
|
|
|
|
|
return(0);
|
|
|
|
|
ret= burn_disc_get_profile(drive, &profile, profile_name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#else /* NIX */
|
|
|
|
|
|
|
|
|
|
if(!(flag & 1)) {
|
|
|
|
|
ret= Xorriso_auto_format(xorriso, 0);
|
|
|
|
|
if(ret <=0 )
|
|
|
|
|
return(0);
|
|
|
|
|
}
|
|
|
|
|
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
|
|
|
|
"on attempt to write", 2);
|
|
|
|
|
if(ret<=0)
|
|
|
|
|
return(0);
|
|
|
|
|
|
|
|
|
|
#endif /* ! NIX */
|
|
|
|
|
|
|
|
|
|
if(xorriso->out_drive_handle == xorriso->in_drive_handle) {
|
|
|
|
|
source_drive= drive;
|
|
|
|
|
} else {
|
|
|
|
@ -4317,7 +4372,9 @@ int Xorriso_tell_media_space(struct XorrisO *xorriso,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* @param flag bit0=fast , bit1=deformat
|
|
|
|
|
/* @param flag bit0= fast
|
|
|
|
|
bit1= deformat
|
|
|
|
|
bit2= do not re-aquire drive
|
|
|
|
|
@return 0=failure, did not touch media , -1=failure, altered media
|
|
|
|
|
1=success, altered media , 2=success, did not touch media
|
|
|
|
|
*/
|
|
|
|
@ -4406,11 +4463,18 @@ int Xorriso_blank_media(struct XorrisO *xorriso, int flag)
|
|
|
|
|
Xorriso_process_msg_queues(xorriso,0);
|
|
|
|
|
sprintf(xorriso->info_text, "Blanking done\n");
|
|
|
|
|
Xorriso_info(xorriso,0);
|
|
|
|
|
if(!(flag & 4)) {
|
|
|
|
|
ret= Xorriso_reaquire_outdev(xorriso,
|
|
|
|
|
2 + (xorriso->in_drive_handle == xorriso->out_drive_handle));
|
|
|
|
|
if(ret <= 0)
|
|
|
|
|
return(-1);
|
|
|
|
|
}
|
|
|
|
|
return(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* @param flag bit0= try to achieve faster formatting
|
|
|
|
|
bit2= do not re-aquire drive
|
|
|
|
|
bit7= by_index mode:
|
|
|
|
|
bit8 to bit15 contain the index of the format to use.
|
|
|
|
|
@return 0=failure, did not touch media , -1=failure, altered media
|
|
|
|
@ -4428,6 +4492,7 @@ int Xorriso_format_media(struct XorrisO *xorriso, int flag)
|
|
|
|
|
char current_profile_name[80];
|
|
|
|
|
off_t size= 0;
|
|
|
|
|
time_t start_time;
|
|
|
|
|
enum burn_disc_status disc_state;
|
|
|
|
|
|
|
|
|
|
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
|
|
|
|
"on attempt to -format", 2);
|
|
|
|
@ -4525,6 +4590,20 @@ int Xorriso_format_media(struct XorrisO *xorriso, int flag)
|
|
|
|
|
Xorriso_process_msg_queues(xorriso,0);
|
|
|
|
|
sprintf(xorriso->info_text, "Formatting done\n");
|
|
|
|
|
Xorriso_info(xorriso,0);
|
|
|
|
|
|
|
|
|
|
if(!(flag & 4)) {
|
|
|
|
|
ret= Xorriso_reaquire_outdev(xorriso,
|
|
|
|
|
2 + (xorriso->in_drive_handle == xorriso->out_drive_handle));
|
|
|
|
|
if(ret <= 0)
|
|
|
|
|
return(-1);
|
|
|
|
|
}
|
|
|
|
|
disc_state = isoburn_disc_get_status(drive);
|
|
|
|
|
if(disc_state==BURN_DISC_FULL && !(flag&1)) {
|
|
|
|
|
/* Blank because full format certification pattern might be non-zero */
|
|
|
|
|
ret= Xorriso_blank_media(xorriso, 1);
|
|
|
|
|
if(ret <= 0)
|
|
|
|
|
return(0);
|
|
|
|
|
}
|
|
|
|
|
return(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -4535,7 +4614,7 @@ int Xorriso_format_media(struct XorrisO *xorriso, int flag)
|
|
|
|
|
*/
|
|
|
|
|
int Xorriso_blank_as_needed(struct XorrisO *xorriso, int flag)
|
|
|
|
|
{
|
|
|
|
|
int ret, is_formatted= -1, status, num_formats;
|
|
|
|
|
int ret, is_formatted= -1, status, num_formats, did_work= 0;
|
|
|
|
|
struct burn_drive_info *dinfo;
|
|
|
|
|
struct burn_drive *drive;
|
|
|
|
|
enum burn_disc_status disc_state;
|
|
|
|
@ -4568,11 +4647,15 @@ int Xorriso_blank_as_needed(struct XorrisO *xorriso, int flag)
|
|
|
|
|
}
|
|
|
|
|
if(!is_formatted) {
|
|
|
|
|
ret= Xorriso_format_media(xorriso, (current_profile == 0x43));
|
|
|
|
|
return(ret);
|
|
|
|
|
if(ret <= 0)
|
|
|
|
|
return(ret);
|
|
|
|
|
did_work= (ret == 1);
|
|
|
|
|
}
|
|
|
|
|
} else if(current_profile == 0x14 && (flag&4)) { /* DVD-RW sequential */
|
|
|
|
|
ret= Xorriso_format_media(xorriso, 0);
|
|
|
|
|
return(ret);
|
|
|
|
|
if(ret <= 0)
|
|
|
|
|
return(ret);
|
|
|
|
|
did_work= (ret == 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
disc_state = isoburn_disc_get_status(drive);
|
|
|
|
@ -4580,6 +4663,8 @@ int Xorriso_blank_as_needed(struct XorrisO *xorriso, int flag)
|
|
|
|
|
ret= Xorriso_blank_media(xorriso, 1);
|
|
|
|
|
return(ret);
|
|
|
|
|
}
|
|
|
|
|
if(did_work)
|
|
|
|
|
return(1);
|
|
|
|
|
sprintf(xorriso->info_text, "%s as_needed: no need for action detected",
|
|
|
|
|
(flag&4) ? "-format" : "-blank");
|
|
|
|
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
|
|
|
@ -7031,6 +7116,10 @@ int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address,
|
|
|
|
|
char reasons[BURN_REASONS_LEN], sfe[5*SfileadrL], profile_name[80];
|
|
|
|
|
char head_buffer[64*1024];
|
|
|
|
|
|
|
|
|
|
ret= Xorriso_auto_format(xorriso, 0);
|
|
|
|
|
if(ret <=0 )
|
|
|
|
|
return(0);
|
|
|
|
|
|
|
|
|
|
do_isosize= !!(flag&2);
|
|
|
|
|
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
|
|
|
|
"on attempt to burn track", 2);
|
|
|
|
|