Implemented options -format and -blank deformat, -close and closed media

This commit is contained in:
Thomas Schmitt 2007-10-20 17:10:04 +00:00
parent 4c7bf645c2
commit 91fe875266
4 changed files with 210 additions and 36 deletions

View File

@ -707,6 +707,16 @@ int Sfile_home_adr_s(char *filename, char *fileadr, int fa_size, int flag)
} }
/** Return a double representing seconds and microseconds since 1 Jan 1970 */
double Sfile_microtime(int flag)
{
struct timeval tv;
struct timezone tz;
gettimeofday(&tv,&tz);
return((double) (tv.tv_sec+1.0e-6*tv.tv_usec));
}
#endif /* Xorriso_sfile_externaL */ #endif /* Xorriso_sfile_externaL */
@ -2701,9 +2711,9 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag)
} }
is_default= 0; is_default= 0;
if(xorriso->dialog) if(xorriso->dialog)
sprintf(line,"-dialog\n"); sprintf(line,"-dialog on\n");
else { else {
sprintf(line,"-dialog_reset\n"); sprintf(line,"-dialog off\n");
is_default= 1; is_default= 1;
} }
if(!(is_default && no_defaults)) if(!(is_default && no_defaults))
@ -3160,7 +3170,7 @@ int Xorriso_option_ban_stdio_write(struct XorrisO *xorriso, int flag)
/* @param flag bit0= format rather than blank */ /* @param flag bit0= format rather than blank */
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", sfe[4*SfileadrL];
int ret, aq_flag= 2, mode_flag; int ret, aq_flag= 2, mode_flag;
if(flag&1) if(flag&1)
@ -3183,19 +3193,46 @@ int Xorriso_option_blank(struct XorrisO *xorriso, char *mode, int flag)
if(strcmp(mode, "all")==0 || strcmp(mode, "full")==0) if(strcmp(mode, "all")==0 || strcmp(mode, "full")==0)
mode_flag= 0; mode_flag= 0;
else else if(strcmp(mode, "deformat")==0 || strcmp(mode, "deformat_sequential")==0)
mode_flag= 2;
else if(strcmp(mode, "deformat_quickest")==0 ||
strcmp(mode, "deformat_sequential_quickest")==0)
mode_flag= 3;
else if(strcmp(mode, "fast")==0 || mode[0]==0)
mode_flag= 1; mode_flag= 1;
else {
sprintf(xorriso->info_text,
"%s: Unknown %s mode '%s'",
cmd, ((flag&1) ? "format" : "blank"), mode);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
return(0);
}
if(flag&1) if(flag&1)
ret= Xorriso_format_media(xorriso, mode_flag); ret= Xorriso_format_media(xorriso, 0);
else else
ret= Xorriso_blank_media(xorriso, mode_flag); ret= Xorriso_blank_media(xorriso, mode_flag);
if(ret==0)
return(ret);
strcpy(drive_name, xorriso->outdev); strcpy(drive_name, xorriso->outdev);
Xorriso_give_up_drive(xorriso, aq_flag); if(ret!=2) {
if(ret<=0) Xorriso_give_up_drive(xorriso, aq_flag);
return(ret); if(ret<=0) { /* this is the return value of the blank|format function */
ret= Xorriso_aquire_drive(xorriso, drive_name, aq_flag); sprintf(xorriso->info_text,"Gave up -outdev %s",
if(ret<=0) Text_shellsafe(xorriso->outdev, sfe, 0));
return(ret); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
return(ret);
}
sprintf(xorriso->info_text,"Re-aquiring -outdev %s",
Text_shellsafe(drive_name, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
ret= Xorriso_aquire_drive(xorriso, drive_name, aq_flag);
if(ret<=0) {
sprintf(xorriso->info_text,"Could not re-aquire -outdev %s",
Text_shellsafe(xorriso->outdev, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
return(ret);
}
}
return(1); return(1);
} }
@ -3372,6 +3409,7 @@ int Xorriso_option_commit(struct XorrisO *xorriso, int flag)
ret= Xorriso_write_growing(xorriso, 0); ret= Xorriso_write_growing(xorriso, 0);
if(ret<=0) if(ret<=0)
return(ret); return(ret);
xorriso->volset_change_pending= 0; xorriso->volset_change_pending= 0;
if(flag&1) if(flag&1)
@ -3460,7 +3498,7 @@ int Xorriso_option_dev(struct XorrisO *xorriso, char *adr, int flag)
if((flag&2) && xorriso->in_drive_handle != NULL && if((flag&2) && xorriso->in_drive_handle != NULL &&
xorriso->in_drive_handle != xorriso->out_drive_handle) { xorriso->in_drive_handle != xorriso->out_drive_handle) {
sprintf(xorriso->info_text,"Giving up -outdev %s", sprintf(xorriso->info_text,"Giving up -outdev %s",
Text_shellsafe(xorriso->indev, sfe, 0)); Text_shellsafe(xorriso->outdev, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
} }
ret= Xorriso_give_up_drive(xorriso, flag&3); ret= Xorriso_give_up_drive(xorriso, flag&3);
@ -3683,8 +3721,10 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
" Set output drive and switch from growing to modifying.", " Set output drive and switch from growing to modifying.",
" -ban_stdio_write", " -ban_stdio_write",
" Allow for writing only the usage of optical drives.", " Allow for writing only the usage of optical drives.",
" -blank \"fast\"|\"all\"|\"format\"", " -blank \"fast\"|\"all\"|\"deformat\"|\"deformat_quickest\"",
" Blank media resp. invalidate ISO image on media.", " Blank media resp. invalidate ISO image on media.",
" -format \"full\"",
" Format DVD-RW to overwriteable state or de-ice DVD+RW.",
" -V volume_id Specifies the volume ID text.", " -V volume_id Specifies the volume ID text.",
"", "",
" -J Generate Joliet info additional to Rock Ridge info.", " -J Generate Joliet info additional to Rock Ridge info.",
@ -4604,6 +4644,10 @@ next_command:;
(*idx)+= 2; (*idx)+= 2;
ret= Xorriso_option_chowni(xorriso, arg1, arg2, argc, argv, idx, 0); ret= Xorriso_option_chowni(xorriso, arg1, arg2, argc, argv, idx, 0);
} else if(strcmp(cmd,"-close")==0) {
(*idx)++;
ret= Xorriso_option_close(xorriso, arg1, 0);
} else if(strcmp(cmd,"-commit")==0) { } else if(strcmp(cmd,"-commit")==0) {
ret= Xorriso_option_commit(xorriso, 0); ret= Xorriso_option_commit(xorriso, 0);
@ -4720,7 +4764,7 @@ next_command:;
if(ret==3) if(ret==3)
goto ex; goto ex;
} else if(strcmp(cmd,"-options_from_file")==0) { } else if(strcmp(cmd,"-overwrite")==0) {
(*idx)++; (*idx)++;
ret= Xorriso_option_overwrite(xorriso,arg1,0); ret= Xorriso_option_overwrite(xorriso,arg1,0);

View File

@ -185,5 +185,7 @@ int Xorriso_execute_option(struct XorrisO *xorriso, char *line, int flag);
int Sfile_str(char target[SfileadrL], char *source, int flag); int Sfile_str(char target[SfileadrL], char *source, int flag);
double Sfile_microtime(int flag);
#endif /* Xorriso_private_includeD */ #endif /* Xorriso_private_includeD */

View File

@ -1 +1 @@
#define Xorriso_timestamP "2007.10.20.170731" #define Xorriso_timestamP "2007.10.20.171046"

View File

@ -168,9 +168,8 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag)
/* >>> show drive and media status */; /* >>> show drive and media status */;
if(state != BURN_DISC_BLANK && state != BURN_DISC_APPENDABLE) { if(state != BURN_DISC_BLANK && state != BURN_DISC_APPENDABLE) {
sprintf(xorriso->info_text, "Unsuitable disc status"); sprintf(xorriso->info_text, "Disc status unsuitable for writing");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0);
ret= 0; goto ex;
} }
/* fill read opts */ /* fill read opts */
ropts.norock= 0; ropts.norock= 0;
@ -325,6 +324,13 @@ int Xorriso_write_growing(struct XorrisO *xorriso, int flag)
ret= Xorriso_pacifier_loop(xorriso, drive, 0); ret= Xorriso_pacifier_loop(xorriso, drive, 0);
if(ret<=0) if(ret<=0)
goto ex; goto ex;
if(!isoburn_drive_wrote_well(drive)) {
Xorriso_process_msg_queues(xorriso,0);
sprintf(xorriso->info_text,
"libburn indicates failure with writing.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
ret= 0; goto ex;
}
ret= isoburn_activate_session(drive); ret= isoburn_activate_session(drive);
Xorriso_process_msg_queues(xorriso,0); Xorriso_process_msg_queues(xorriso,0);
@ -334,7 +340,7 @@ int Xorriso_write_growing(struct XorrisO *xorriso, int flag)
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
goto ex; goto ex;
} }
ret= 1; ret= 1;
ex:; ex:;
if(disc!=NULL) if(disc!=NULL)
@ -350,18 +356,38 @@ int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive,
int ret, size, free_bytes, i; int ret, size, free_bytes, i;
struct burn_progress progress; struct burn_progress progress;
char *status_text; char *status_text;
enum burn_drive_status drive_status;
double start_time, current_time;
start_time= Sfile_microtime(0);
while(burn_drive_get_status(drive, NULL) == BURN_DRIVE_SPAWNING) while(burn_drive_get_status(drive, NULL) == BURN_DRIVE_SPAWNING)
usleep(100002); usleep(100002);
while(burn_drive_get_status(drive, &progress) != BURN_DRIVE_IDLE) { while(1) {
sprintf(xorriso->info_text, "Writing: sector %d of %d", drive_status= burn_drive_get_status(drive, &progress);
progress.sector, progress.sectors); if(drive_status == BURN_DRIVE_IDLE)
ret= isoburn_get_fifo_status(drive, &size, &free_bytes, &status_text); break;
if(ret>0 ) current_time= Sfile_microtime(0);
sprintf(xorriso->info_text+strlen(xorriso->info_text), if(drive_status == BURN_DRIVE_WRITING) {
" [fifo %s, %2d%% fill]", status_text, sprintf(xorriso->info_text, "Writing: sector %d of %d",
(int) (100.0-100.0*((double) free_bytes)/(double) size)); progress.sector, progress.sectors);
ret= isoburn_get_fifo_status(drive, &size, &free_bytes, &status_text);
if(ret>0 )
sprintf(xorriso->info_text+strlen(xorriso->info_text),
" [fifo %s, %2d%% fill]", status_text,
(int) (100.0-100.0*((double) free_bytes)/(double) size));
} else if(drive_status == BURN_DRIVE_CLOSING_SESSION ||
drive_status == BURN_DRIVE_CLOSING_TRACK)
sprintf(xorriso->info_text,
"Closing track/session. Working since %.f seconds",
current_time-start_time);
else if(drive_status == BURN_DRIVE_FORMATTING)
sprintf(xorriso->info_text, "Formatting. Working since %.f seconds",
current_time-start_time);
else
sprintf(xorriso->info_text,
"Thank you for being patient since %.f seconds",
current_time-start_time);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 0);
for(i= 0; i<10; i++) { for(i= 0; i<10; i++) {
@ -768,10 +794,13 @@ int Xorriso_tell_media_space(struct XorrisO *xorriso, int flag)
} }
/* @param flag bit0=fast */ /* @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)
{ {
int ret; int ret, do_deformat= 0;
struct burn_drive_info *dinfo; struct burn_drive_info *dinfo;
struct burn_drive *drive; struct burn_drive *drive;
enum burn_disc_status disc_state; enum burn_disc_status disc_state;
@ -779,6 +808,7 @@ int Xorriso_blank_media(struct XorrisO *xorriso, int flag)
double percent = 1.0; double percent = 1.0;
int current_profile; int current_profile;
char current_profile_name[80]; char current_profile_name[80];
char mode_names[4][80]= {"all", "fast", "deformat", "deformat_quickest"};
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive, ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
"on attempt to -blank", 2); "on attempt to -blank", 2);
@ -790,8 +820,21 @@ int Xorriso_blank_media(struct XorrisO *xorriso, int flag)
/* >>> */; /* >>> */;
disc_state = isoburn_disc_get_status(drive); disc_state = isoburn_disc_get_status(drive);
if(current_profile == 0x13) { if(current_profile == 0x13) { /* overwriteable DVD-RW */
; /* formatted DVD-RW will get blanked to sequential state */ /* Depending on flag bit1 formatted DVD-RW will get blanked to sequential
state or pseudo blanked by invalidating an eventual ISO image. */
if(flag&2)
do_deformat= 1;
} else if(current_profile == 0x14) { /* sequential DVD-RW */
if((flag&1) && !(flag&2)) {
sprintf(xorriso->info_text,
"-blank: DVD-RW present. Mode 'fast' defaulted to mode 'all'.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
sprintf(xorriso->info_text,
"Mode 'deformat_quickest' produces single-session-only media.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "HINT", 0);
flag&= ~1;
}
} else if(disc_state == BURN_DISC_BLANK) { } else if(disc_state == BURN_DISC_BLANK) {
sprintf(xorriso->info_text,"Blank media detected. Will leave it untouched"); sprintf(xorriso->info_text,"Blank media detected. Will leave it untouched");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
@ -812,10 +855,21 @@ int Xorriso_blank_media(struct XorrisO *xorriso, int flag)
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
return 0; return 0;
} }
sprintf(xorriso->info_text, "Beginning to %s-blank media.\n", if(xorriso->do_dummy) {
((flag&1)?"fast":"full")); sprintf(xorriso->info_text,
"-dummy mode prevents blanking of media in mode '%s'.",
mode_names[flag&3]);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
return(1);
}
sprintf(xorriso->info_text, "Beginning to blank media in mode '%s'.\n",
mode_names[flag&3]);
Xorriso_info(xorriso,0); Xorriso_info(xorriso,0);
isoburn_disc_erase(drive, (flag&1));
if(do_deformat)
burn_disc_erase(drive, (flag&1));
else
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) {
if(p.sectors>0 && p.sector>=0) /* display 1 to 99 percent */ if(p.sectors>0 && p.sector>=0) /* display 1 to 99 percent */
@ -824,15 +878,89 @@ int Xorriso_blank_media(struct XorrisO *xorriso, int flag)
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 0);
usleep(1000000); usleep(1000000);
} }
Xorriso_process_msg_queues(xorriso,0);
sprintf(xorriso->info_text, "Blanking done\n"); sprintf(xorriso->info_text, "Blanking done\n");
Xorriso_info(xorriso,0); Xorriso_info(xorriso,0);
return(1); return(1);
} }
/* @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)
{ {
fprintf(stderr, ">>> XORRISO : -format not implemented yet\n"); int ret, mode_flag= 0;
struct burn_drive_info *dinfo;
struct burn_drive *drive;
#ifdef NIX
struct burn_progress p;
double percent = 1.0;
#endif
int current_profile;
char current_profile_name[80];
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
"on attempt to -format", 2);
if(ret<=0)
return(0);
burn_disc_get_profile(drive, &current_profile, current_profile_name);
if(current_profile == 0x14) {
; /* ok DVD-RW sequential */
} else if(current_profile == 0x1a) {
mode_flag= 2;
} else {
sprintf(xorriso->info_text,
"Can only -format DVD+RW and sequential DVD-RW");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
sprintf(xorriso->info_text,"Media current: %s (%4.4xh)",
current_profile_name, current_profile);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
return 0;
}
if(xorriso->do_dummy) {
sprintf(xorriso->info_text, "-dummy mode prevents formatting of media.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
return(1);
}
sprintf(xorriso->info_text, "Beginning to format media.\n");
Xorriso_info(xorriso, 0);
burn_disc_format(drive, (off_t) 0, mode_flag);
ret= Xorriso_pacifier_loop(xorriso, drive, 0);
if(ret<=0)
return(ret);
#ifdef NIX
usleep(1000000);
while(burn_drive_get_status(drive, &p) != BURN_DRIVE_IDLE) {
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 )", percent);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 0);
usleep(1000000);
}
burn_disc_get_profile(dinfo[0].drive, &current_profile, current_profile_name);
sprintf(xorriso->info_text, "Media type now: %4.4xh \"%s\"\n",
current_profile, current_profile_name);
Xorriso_info(xorriso, 0);
if(current_profile != 0x13 && current_profile != 0x1a) {
sprintf(xorriso->info_text,
"Failed to change media profile to desired value.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
return(0);
}
#endif
Xorriso_process_msg_queues(xorriso,0);
sprintf(xorriso->info_text, "Formatting done\n");
Xorriso_info(xorriso,0);
return(1); return(1);
} }