New -blank and -format modes as_needed

This commit is contained in:
Thomas Schmitt 2008-05-12 19:36:23 +00:00
parent 9b7451f893
commit 0f8e6f24db
5 changed files with 189 additions and 32 deletions

View File

@ -2,7 +2,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 "May, 10, 2008" .TH XORRISO 1 "May, 12, 2008"
.\" 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:
@ -918,18 +918,23 @@ Combined -commit and -eject. When writing has finished do not make
-indev and/or -outdev. Eventually give up any non-ejected drive. -indev and/or -outdev. Eventually give up any non-ejected drive.
.TP .TP
\fB\-blank\fR mode \fB\-blank\fR mode
Blank media resp. invalidate ISO image on media if not -dummy Make media ready for writing from scratch (if not -dummy is activated).
is activated.
.br .br
This affects only the -outdev not the -indev. This affects only the -outdev not the -indev.
If both drives are the same and if the ISO image was altered If both drives are the same and if the ISO image was altered
then this command leads to a FAILURE event. then this command leads to a FAILURE event.
Defined modes are: Defined modes are:
fast, all, deformat, deformat_quickest as_needed, fast, all, deformat, deformat_quickest
.br
"as_needed" cares for used CD-RW, DVD-RW and for used overwriteable media
by applying -blank "fast". It applies -format "full" to yet unformatted
DVD-RAM or BD-RE.
.br .br
"fast" and "all" make CD-RW and unformatted DVD-RW re-usable, "fast" and "all" make CD-RW and unformatted DVD-RW re-usable,
or invalidate overwriteable ISO images. or invalidate overwriteable ISO images.
.br
"deformat" converts overwriteable DVD-RW into unformatted ones. "deformat" converts overwriteable DVD-RW into unformatted ones.
.br
"deformat_quickest" is a faster way to deformat or blank DVD-RW "deformat_quickest" is a faster way to deformat or blank DVD-RW
but produces media which are only suitable for a single session. but produces media which are only suitable for a single session.
xorriso will write onto them only if option -close is set to "on". xorriso will write onto them only if option -close is set to "on".
@ -940,9 +945,19 @@ reported percentages. Blanking was successful if no SORRY event or
worse occured. worse occured.
.TP .TP
\fB\-format\fR mode \fB\-format\fR mode
Convert unformatted DVD-RW into overwriteable ones, Convert unformatted DVD-RW into overwriteable ones, "de-ice" DVD+RW, format
"de-ice" DVD+RW. newly purchased BD-RE, re-format DVD-RAM or BD-RE.
For now, mode should be the word "full". .br
Defined modes are:
.br
as_needed, full, fast
.br
"as_needed" formats yet unformatted DVD-RW, DVD-RAM, BD-RE. Other media
are left untouched.
.br
"full" (re-)formats DVD-RW, DVD+RW, DVD-RAM, BD-RE.
.br
"fast" does the same as "full" but tries to be quicker.
.br .br
This action has no effect on media if -dummy is activated. This action has no effect on media if -dummy is activated.
.br .br
@ -954,7 +969,6 @@ readable in some DVD players.
On the other hand unreliable DVD+RW can sometimes be repaired by On the other hand unreliable DVD+RW can sometimes be repaired by
re-formatting. re-formatting.
.br .br
The progress reports issued by some drives while formatting are The progress reports issued by some drives while formatting are
quite unrealistic. Do not conclude success or failure from the quite unrealistic. Do not conclude success or failure from the
reported percentages. Formatting was successful if no SORRY event reported percentages. Formatting was successful if no SORRY event

View File

@ -7712,8 +7712,7 @@ int Xorriso_option_ban_stdio_write(struct XorrisO *xorriso, int flag)
int Xorriso_option_blank(struct XorrisO *xorriso, char *mode, int flag) int Xorriso_option_blank(struct XorrisO *xorriso, char *mode, int flag)
{ {
char drive_name[SfileadrL], *cmd= "-blank"; char drive_name[SfileadrL], *cmd= "-blank";
int aq_ret; int aq_ret, ret, aq_flag= 2, mode_flag, as_needed= 0;
int ret, aq_flag= 2, mode_flag;
if(flag&1) if(flag&1)
cmd= "-format"; cmd= "-format";
@ -7737,26 +7736,33 @@ int Xorriso_option_blank(struct XorrisO *xorriso, char *mode, int flag)
if(ret<=0) if(ret<=0)
return(2); return(2);
if(strcmp(mode, "all")==0 || strcmp(mode, "full")==0) if(strcmp(mode, "as_needed")==0)
as_needed= 1;
else if(strcmp(mode, "all")==0 || strcmp(mode, "full")==0)
mode_flag= 0; mode_flag= 0;
else if(strcmp(mode, "deformat")==0 || strcmp(mode, "deformat_sequential")==0) else if((strcmp(mode, "deformat")==0 ||
strcmp(mode, "deformat_sequential")==0) && !(flag&1))
mode_flag= 2; mode_flag= 2;
else if(strcmp(mode, "deformat_quickest")==0 || else if((strcmp(mode, "deformat_quickest")==0 ||
strcmp(mode, "deformat_sequential_quickest")==0) strcmp(mode, "deformat_sequential_quickest")==0) && !(flag&1))
mode_flag= 3; mode_flag= 3;
else if(strcmp(mode, "fast")==0 || mode[0]==0) else if(strcmp(mode, "fast")==0)
mode_flag= 1; mode_flag= 1;
else if(mode[0]==0)
mode_flag= !(flag&1);
else { else {
sprintf(xorriso->info_text, sprintf(xorriso->info_text,
"%s: Unknown %s mode '%s'", "%s: Unknown %s mode '%s'",
cmd, ((flag&1) ? "format" : "blank"), mode); cmd, ((flag&1) ? "-format" : "-blank"), mode);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0); return(0);
} }
if(flag&1) if(as_needed)
ret= Xorriso_format_media(xorriso, 0); ret= Xorriso_blank_as_needed(xorriso, (flag&1)<<2);
else if(flag&1)
ret= Xorriso_format_media(xorriso, mode_flag&1);
else else
ret= Xorriso_blank_media(xorriso, mode_flag); ret= Xorriso_blank_media(xorriso, mode_flag&3);
if(ret==0) if(ret==0)
return(ret); return(ret);
strcpy(drive_name, xorriso->outdev); strcpy(drive_name, xorriso->outdev);

View File

@ -1 +1 @@
#define Xorriso_timestamP "2008.05.12.193341" #define Xorriso_timestamP "2008.05.12.193642"

View File

@ -558,8 +558,25 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag)
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex; ret= 0; goto ex;
} }
if(flag&1)
if(xorriso->image_start_mode&(1<<31)) /* used up setting */
xorriso->image_start_mode= 0; /* no need to perform auto setting */
} }
drive= dinfo[0].drive; drive= dinfo[0].drive;
if(flag&1) {
if(xorriso->image_start_mode&(1<<31)) /* used up setting */
xorriso->image_start_mode&= ~0xffff; /* perform auto setting */
if((xorriso->image_start_mode&(1<<30))) { /* if enabled at all */
ret= isoburn_set_msc1(drive, xorriso->image_start_mode & 0xffff,
xorriso->image_start_value, 0);
if(ret<=0)
goto ex;
if(xorriso->image_start_mode&(1<<31))
xorriso->image_start_mode= 0; /* disable msc1 setting completely */
else
xorriso->image_start_mode|= (1<<31); /* mark as used up */
}
}
state= isoburn_disc_get_status(drive); state= isoburn_disc_get_status(drive);
Xorriso_process_msg_queues(xorriso,0); Xorriso_process_msg_queues(xorriso,0);
if(flag&1) { if(flag&1) {
@ -2337,7 +2354,7 @@ int Xorriso_toc(struct XorrisO *xorriso, int flag)
#ifdef Xorriso_new_toc_formaT #ifdef Xorriso_new_toc_formaT
sprintf(respt, "TOC layout : %3s , %9s , %10s , %s\n", sprintf(respt, "TOC layout : %3s , %9s , %10s , %s\n",
"Idx", "sbsector=", "Size", "Volume Id"); "Idx", "sbsector", "Size", "Volume Id");
if(!(flag&1)) if(!(flag&1))
Xorriso_result(xorriso,0); Xorriso_result(xorriso,0);
#endif #endif
@ -2453,13 +2470,13 @@ int Xorriso_toc(struct XorrisO *xorriso, int flag)
ret= 0; ret= 0;
else else
ret= isoburn_read_iso_head(drive, lba, &image_blocks, volume_id, 1); ret= isoburn_read_iso_head(drive, lba, &image_blocks, volume_id, 1);
if(ret>0 && track_no==num_tracks-1) { if(ret>0 && track_no==0) {
sprintf(respt, "ISO session : %3d , %9d , %9ds , %s\n", sprintf(respt, "ISO session : %3d , %9d , %9ds , %s\n",
session_no+1, lba, image_blocks , volume_id); session_no+1, lba, image_blocks , volume_id);
} else if(ret>0 && track_no==num_tracks-1) { } else if(ret>0) {
sprintf(respt, "ISO track : %3d , %9d , %9ds , %s\n", sprintf(respt, "ISO track : %3d , %9d , %9ds , %s\n",
track_count, lba, image_blocks , volume_id); track_count, lba, image_blocks , volume_id);
} else if(track_no==num_tracks-1) { } else if(track_no==0) {
sprintf(respt, "Other session: %3d , %9d , %9ds , \n", sprintf(respt, "Other session: %3d , %9d , %9ds , \n",
session_no+1, lba, track_size); session_no+1, lba, track_size);
} else { } else {
@ -2659,8 +2676,6 @@ int Xorriso_blank_media(struct XorrisO *xorriso, int flag)
burn_disc_get_profile(drive, &current_profile, current_profile_name); burn_disc_get_profile(drive, &current_profile, current_profile_name);
/* >>> */;
disc_state = isoburn_disc_get_status(drive); disc_state = isoburn_disc_get_status(drive);
if(current_profile == 0x13) { /* overwriteable DVD-RW */ if(current_profile == 0x13) { /* overwriteable DVD-RW */
/* Depending on flag bit1 formatted DVD-RW will get blanked to sequential /* Depending on flag bit1 formatted DVD-RW will get blanked to sequential
@ -2714,6 +2729,7 @@ int Xorriso_blank_media(struct XorrisO *xorriso, int flag)
isoburn_disc_erase(drive, (flag&1)); isoburn_disc_erase(drive, (flag&1));
usleep(1000000); usleep(1000000);
while (burn_drive_get_status(drive, &p) != BURN_DRIVE_IDLE) { while (burn_drive_get_status(drive, &p) != BURN_DRIVE_IDLE) {
Xorriso_process_msg_queues(xorriso,0);
if(p.sectors>0 && p.sector>=0) /* display 1 to 99 percent */ if(p.sectors>0 && p.sector>=0) /* display 1 to 99 percent */
percent = 1.0 + ((double) p.sector+1.0) / ((double) p.sectors) * 98.0; percent = 1.0 + ((double) p.sector+1.0) / ((double) p.sectors) * 98.0;
sprintf(xorriso->info_text, "Blanking ( %.1f%% done )", percent); sprintf(xorriso->info_text, "Blanking ( %.1f%% done )", percent);
@ -2726,7 +2742,9 @@ int Xorriso_blank_media(struct XorrisO *xorriso, int flag)
return(1); return(1);
} }
/* @return 0=failure, did not touch media , -1=failure, altered media
/* @param flag bit0= try to achieve faster formatting
@return 0=failure, did not touch media , -1=failure, altered media
1=success, altered media , 2=success, did not touch 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, int flag)
@ -2734,24 +2752,56 @@ int Xorriso_format_media(struct XorrisO *xorriso, int flag)
int ret, mode_flag= 0; int ret, mode_flag= 0;
struct burn_drive_info *dinfo; struct burn_drive_info *dinfo;
struct burn_drive *drive; struct burn_drive *drive;
struct burn_progress p;
double percent = 1.0;
int current_profile; int current_profile;
char current_profile_name[80]; char current_profile_name[80];
off_t size= 0; off_t size= 0;
time_t start_time;
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive, ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
"on attempt to -format", 2); "on attempt to -format", 2);
if(ret<=0) if(ret<=0)
return(0); return(0);
mode_flag= 4; /* format to full size */
burn_disc_get_profile(drive, &current_profile, current_profile_name); burn_disc_get_profile(drive, &current_profile, current_profile_name);
if(current_profile == 0x14) { /* DVD-RW sequential */
size= 128*1024*1024; if(current_profile == 0x12) { /* DVD+RAM */
mode_flag= 1; mode_flag= 6; /* format to default payload size */
if(flag&1)
mode_flag|= (1<<6);
} else if(current_profile == 0x13) { /* DVD-RW */
if(flag&1) {
sprintf(xorriso->info_text,
"Detected formatted DVD-RW. Thus omitting desired fast format run.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
return(2);
}
} else if(current_profile == 0x14) { /* DVD-RW sequential */
if(flag&1) {
size= 128*1024*1024;
mode_flag= 1; /* format to size, then write size of zeros */
}
} else if(current_profile == 0x1a) { /* DVD+RW */ } else if(current_profile == 0x1a) { /* DVD+RW */
mode_flag= 2; if(flag&1) {
sprintf(xorriso->info_text,
"Detected DVD+RW. Thus omitting desired fast format run.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
return(2);
}
} else if(current_profile == 0x43) { /* BD-RE */
mode_flag= 6; /* format to default payload size */
if(flag&1)
mode_flag|= (1<<6);
} else { } else {
sprintf(xorriso->info_text, sprintf(xorriso->info_text,
"Can only -format DVD+RW and sequential DVD-RW"); "-format: Unsuitable media detected.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
sprintf(xorriso->info_text,"Media current: %s (%4.4xh)", sprintf(xorriso->info_text,"Media current: %s (%4.4xh)",
current_profile_name, current_profile); current_profile_name, current_profile);
@ -2768,9 +2818,27 @@ int Xorriso_format_media(struct XorrisO *xorriso, int flag)
Xorriso_info(xorriso, 0); Xorriso_info(xorriso, 0);
burn_disc_format(drive, size, mode_flag); burn_disc_format(drive, size, mode_flag);
#ifdef NIX
/* <<< too boring */
ret= Xorriso_pacifier_loop(xorriso, drive, 0); ret= Xorriso_pacifier_loop(xorriso, drive, 0);
if(ret<=0) if(ret<=0)
return(ret); return(ret);
#else
start_time= time(0);
usleep(1000000);
while (burn_drive_get_status(drive, &p) != BURN_DRIVE_IDLE) {
Xorriso_process_msg_queues(xorriso,0);
if(p.sectors>0 && p.sector>=0) /* display 1 to 99 percent */
percent = 1.0 + ((double) p.sector+1.0) / ((double) p.sectors) * 98.0;
sprintf(xorriso->info_text, "Formatting ( %.1f%% done in %d seconds)",
percent, (int) (time(0) - start_time));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 0);
usleep(1000000);
}
#endif /* ! NIX */
Xorriso_process_msg_queues(xorriso,0); Xorriso_process_msg_queues(xorriso,0);
sprintf(xorriso->info_text, "Formatting done\n"); sprintf(xorriso->info_text, "Formatting done\n");
@ -2779,6 +2847,60 @@ int Xorriso_format_media(struct XorrisO *xorriso, int flag)
} }
/* @param flag bit2= formatting rather than blanking
@return 0=failure, did not touch media , -1=failure, altered media
1=success, altered media , 2=success, did not touch media
*/
int Xorriso_blank_as_needed(struct XorrisO *xorriso, int flag)
{
int ret, is_formatted= -1, status, num_formats;
struct burn_drive_info *dinfo;
struct burn_drive *drive;
enum burn_disc_status disc_state;
unsigned dummy;
int current_profile;
char current_profile_name[80];
off_t size;
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
"on attempt to blank or format", 2);
if(ret<=0)
return(0);
burn_disc_get_profile(drive, &current_profile, current_profile_name);
ret= burn_disc_get_formats(drive, &status, &size, &dummy, &num_formats);
if(ret>0 && status==BURN_FORMAT_IS_FORMATTED)
is_formatted= 1;
if(current_profile == 0x12 || current_profile == 0x43) { /* DVD+RAM , BD-RE */
if(is_formatted<0) {
sprintf(xorriso->info_text,
"-blank or -format: Unclear formatting status of %s",
current_profile_name);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
if(!is_formatted) {
ret= Xorriso_format_media(xorriso, 0);
return(ret);
}
} else if(current_profile == 0x14 && (flag&4)) { /* DVD-RW sequential */
ret= Xorriso_format_media(xorriso, 0);
return(ret);
}
disc_state = isoburn_disc_get_status(drive);
if(disc_state != BURN_DISC_BLANK && !(flag&4)) {
ret= Xorriso_blank_media(xorriso, 1);
return(ret);
}
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);
return(2);
}
int Xorriso_cannot_create_iter(struct XorrisO *xorriso, int iso_error,int flag) int Xorriso_cannot_create_iter(struct XorrisO *xorriso, int iso_error,int flag)
{ {
Xorriso_process_msg_queues(xorriso,0); Xorriso_process_msg_queues(xorriso,0);

View File

@ -62,10 +62,25 @@ int Xorriso_show_devices(struct XorrisO *xorriso, int flag);
int Xorriso_tell_media_space(struct XorrisO *xorriso, int Xorriso_tell_media_space(struct XorrisO *xorriso,
int *media_space, int *free_space, int flag); int *media_space, int *free_space, int flag);
/* @param flag bit0=fast , bit1=deformat
@return 0=failure, did not touch media , -1=failure, altered media
1=success, altered media , 2=success, did not touch media
*/
int Xorriso_blank_media(struct XorrisO *xorriso, int flag); int Xorriso_blank_media(struct XorrisO *xorriso, int flag);
/* @param flag bit0= try to achieve faster formatting
@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, int flag);
/* @param flag bit2= formatting rather than blanking
@return 0=failure, did not touch media , -1=failure, altered media
1=success, altered media , 2=success, did not touch media
*/
int Xorriso_blank_as_needed(struct XorrisO *xorriso, int flag);
/* @param boss_iter Opaque internal handle. Use NULL outside xorrisoburn.c : /* @param boss_iter Opaque internal handle. Use NULL outside xorrisoburn.c :
If not NULL then this is an iterator suitable for If not NULL then this is an iterator suitable for
iso_dir_iter_remove() which is then to be used instead iso_dir_iter_remove() which is then to be used instead