From a8575df3763c45020fdd30936c581ccbc02a7468 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sat, 13 Dec 2008 14:27:58 +0000 Subject: [PATCH] New -format modes by_size_ and fast_by_size_ --- xorriso/xorriso.c | 22 ++++++++++-- xorriso/xorriso_timestamp.h | 2 +- xorriso/xorrisoburn.c | 71 +++++++++++-------------------------- xorriso/xorrisoburn.h | 14 +++++++- 4 files changed, 54 insertions(+), 55 deletions(-) diff --git a/xorriso/xorriso.c b/xorriso/xorriso.c index 27b7422c..001b27bd 100644 --- a/xorriso/xorriso.c +++ b/xorriso/xorriso.c @@ -10930,7 +10930,8 @@ int Xorriso_option_ban_stdio_write(struct XorrisO *xorriso, int flag) int Xorriso_option_blank(struct XorrisO *xorriso, char *mode, int flag) { char drive_name[SfileadrL], *cmd= "-blank"; - int aq_ret, ret, aq_flag= 2, mode_flag, as_needed= 0, idx; + int aq_ret, ret, aq_flag= 2, mode_flag= 0, as_needed= 0, idx; + off_t size= 0; if(flag&1) cmd= "-format"; @@ -10987,6 +10988,21 @@ unusable_index:; if(idx<0 || idx>255) goto unusable_index; mode_flag|= (idx<<8); + } else if(strncmp(mode, "by_size_", 8) == 0 && (flag & 1)) { + size= (off_t) Scanf_io_size(mode + 8, 0); + if(size <= 0) { +unusable_size:; + sprintf(xorriso->info_text, + "-format: mode '%s' provides unusable size value", mode); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + return(0); + } + mode_flag= 2; + } else if(strncmp(mode, "fast_by_size_", 13) == 0 && (flag & 1)) { + size= (off_t) Scanf_io_size(mode + 13, 0); + if(size <= 0) + goto unusable_size; + mode_flag= 3; } else { sprintf(xorriso->info_text, "%s: Unknown %s mode '%s'", @@ -10997,7 +11013,7 @@ unusable_index:; if(as_needed) ret= Xorriso_blank_as_needed(xorriso, (flag&1)<<2); else if(flag&1) - ret= Xorriso_format_media(xorriso, mode_flag & 0xff81); + ret= Xorriso_format_media(xorriso, size, mode_flag & 0xff83); else ret= Xorriso_blank_media(xorriso, mode_flag&3); if(ret==0) @@ -12872,7 +12888,7 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " Allow for writing only the usage of optical drives.", " -blank \"fast\"|\"all\"|\"deformat\"|\"deformat_quickest\"", " Blank media resp. invalidate ISO image on media.", -" -format \"as_needed\"|\"full\"|\"fast\"|\"by_index_#\"|\"fast_by_index_#\"", +" -format \"as_needed\"|\"full\"|\"fast\"|\"by_index_#\"|\"by_size_#\"", " Format BD-RE, DVD-RAM, DVD-RW, DVD+RW.", " -volid volume_id", " Specifies the volume ID text. (32 chars out of [A-Z0-9_])", diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index e5eba1a8..fb4f30ee 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2008.12.11.072427" +#define Xorriso_timestamP "2008.12.13.142726" diff --git a/xorriso/xorrisoburn.c b/xorriso/xorrisoburn.c index 8d50fef0..a22b000a 100644 --- a/xorriso/xorrisoburn.c +++ b/xorriso/xorrisoburn.c @@ -1014,7 +1014,7 @@ int Xorriso_auto_format(struct XorrisO *xorriso, int flag) "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); + ret= Xorriso_format_media(xorriso, (off_t) 0, 1 | 4); if(ret<=0) { sprintf(xorriso->info_text, "Automatic formatting of %s failed", profile_name); @@ -1054,42 +1054,6 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag) int profile_number; char profile_name[80]; -#ifdef NIX - - int profile, status, num_formats; - off_t size; - unsigned dummy; - - ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive, - "on attempt to write", 2); - if(ret<=0) - return(0); - ret= burn_disc_get_profile(drive, &profile, profile_name); - if(ret>0 && (!(flag&1)) && - (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); - 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); - } - ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive, - "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 ) @@ -1099,9 +1063,6 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag) "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 { @@ -4490,13 +4451,14 @@ int Xorriso_blank_media(struct XorrisO *xorriso, int flag) /* @param flag bit0= try to achieve faster formatting + bit1= use parameter size (else use default size) 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 1=success, altered media , 2=success, did not touch media */ -int Xorriso_format_media(struct XorrisO *xorriso, int flag) +int Xorriso_format_media(struct XorrisO *xorriso, off_t in_size, int flag) { int ret, mode_flag= 0, index, status, num_formats; unsigned dummy; @@ -4515,7 +4477,11 @@ int Xorriso_format_media(struct XorrisO *xorriso, int flag) if(ret<=0) return(0); - mode_flag= 4; /* format to full size */ + if(flag & 2) { + mode_flag= 0; /* format to given size */ + } else { + mode_flag= 4; /* format to full size */ + } burn_disc_get_profile(drive, ¤t_profile, current_profile_name); if(flag&128) { /* by_index */ @@ -4534,12 +4500,13 @@ int Xorriso_format_media(struct XorrisO *xorriso, int flag) Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); return(0); } - mode_flag= (flag & 0xff80) | 4; /* with size taken from descriptor */ + mode_flag|= (flag & 0xff80); if(flag&1) mode_flag|= (1<<6); } else if(current_profile == 0x12) { /* DVD+RAM */ - mode_flag= 6; /* format to default payload size */ + if(!(flag & 2)) + mode_flag= 6; /* format to default payload size */ if(flag&1) mode_flag|= (1<<6); @@ -4552,7 +4519,7 @@ int Xorriso_format_media(struct XorrisO *xorriso, int flag) } } else if(current_profile == 0x14) { /* DVD-RW sequential */ - if(flag&1) { + if((flag & 3) == 1) { size= 128*1024*1024; mode_flag= 1; /* format to size, then write size of zeros */ } @@ -4566,12 +4533,14 @@ int Xorriso_format_media(struct XorrisO *xorriso, int flag) } } else if(current_profile == 0x41) { /* BD-R SRM */ - mode_flag= 6; /* format to default payload size */ + if(!(flag & 2)) + mode_flag= 6; /* format to default payload size */ if(flag&1) mode_flag|= (1<<6); } else if(current_profile == 0x43) { /* BD-RE */ - mode_flag= 6; /* format to default payload size */ + if(!(flag & 2)) + mode_flag= 6; /* format to default payload size */ if(flag&1) mode_flag|= (1<<6); @@ -4594,6 +4563,8 @@ int Xorriso_format_media(struct XorrisO *xorriso, int flag) } sprintf(xorriso->info_text, "Beginning to format media.\n"); Xorriso_info(xorriso, 0); + if(flag & 2) + size= in_size; burn_disc_format(drive, size, mode_flag); start_time= time(0); @@ -4675,19 +4646,19 @@ int Xorriso_blank_as_needed(struct XorrisO *xorriso, int flag) return(0); } if(!is_formatted) { - ret= Xorriso_format_media(xorriso, (current_profile == 0x43)); + ret= Xorriso_format_media(xorriso, (off_t) 0, (current_profile == 0x43)); 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); + ret= Xorriso_format_media(xorriso, (off_t) 0, 0); if(ret <= 0) return(ret); did_work= (ret == 1); } else if(current_profile == 0x41) { /* BD-R SRM */ if(!is_formatted) { - ret= Xorriso_format_media(xorriso, 1); + ret= Xorriso_format_media(xorriso, (off_t) 0, 1); if(ret <= 0) return(ret); did_work= (ret == 1); diff --git a/xorriso/xorrisoburn.h b/xorriso/xorrisoburn.h index 5ce6989f..b54c2a05 100644 --- a/xorriso/xorrisoburn.h +++ b/xorriso/xorrisoburn.h @@ -74,10 +74,14 @@ int Xorriso_tell_media_space(struct XorrisO *xorriso, int Xorriso_blank_media(struct XorrisO *xorriso, int flag); /* @param flag bit0= try to achieve faster formatting + bit1= use parameter size (else use default size) + 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 1=success, altered media , 2=success, did not touch media */ -int Xorriso_format_media(struct XorrisO *xorriso, int flag); +int Xorriso_format_media(struct XorrisO *xorriso, off_t size, int flag); /* @return <=0 error, 1 success */ @@ -365,6 +369,14 @@ int Xorriso_get_relax_text(struct XorrisO *xorriso, char mode[1024], int flag); +/** + @param flag bit0= print mount command to result channel rather than + performing it +*/ +int Xorriso_mount(struct XorrisO *xorriso, char *dev, int adr_mode, + char *adr_value, char *cmd, int flag); + + /* A pseudo file type for El-Torito bootsectors as in man 2 stat : For now take the highest possible value. */