|
|
|
@ -7,7 +7,7 @@ A cdrecord compatible command line interface for libburn.
|
|
|
|
|
|
|
|
|
|
This project is neither directed against original cdrecord nor does it exploit |
|
|
|
|
any source code of said program. It rather tries to be an alternative method |
|
|
|
|
to burn CD which is not based on the same code as cdrecord. |
|
|
|
|
to burn CD or DVD, which is not based on the same code as cdrecord. |
|
|
|
|
See also : http://scdbackup.sourceforge.net/cdrskin_eng.html
|
|
|
|
|
|
|
|
|
|
Interested users of cdrecord are encouraged to contribute further option |
|
|
|
@ -33,48 +33,10 @@ The implementation of an option would probably consist of
|
|
|
|
|
See option blank= for an example. |
|
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------ |
|
|
|
|
About compliance with *strong urge* of API towards burn_drive_scan_and_grab()
|
|
|
|
|
|
|
|
|
|
For a more comprehensive example of the advised way to behave with libburn |
|
|
|
|
see test/libburner.c . |
|
|
|
|
For a more comprehensive example of the advised way to write an application |
|
|
|
|
of libburn see test/libburner.c . |
|
|
|
|
|
|
|
|
|
cdrskin was the initiator of the whitelist functionality within libburn. |
|
|
|
|
Now it has problems to obviously comply with the new API best practice |
|
|
|
|
presciptions literally. Therefore this explanation: |
|
|
|
|
|
|
|
|
|
On start it restricts the library to a single drive if it already knows the |
|
|
|
|
persistent address by option dev= . This is done with a combination of |
|
|
|
|
burn_drive_add_whitelist() and burn_drive_scan(). Not compliant to the |
|
|
|
|
literal strong urge but in fact exactly fulfilling the reason for that |
|
|
|
|
urge in the API: any scanned drive might be opened exclusively after |
|
|
|
|
burn_drive_scan(). It is kernel dependent wether this behavior is on, off |
|
|
|
|
or switchable. The sysdamin will want it on - but only for one drive. |
|
|
|
|
|
|
|
|
|
So with dev=... cdrskin complies to the spirit of the strong urge. |
|
|
|
|
Without dev=... it has to leave out the whitelist in order to enable bus |
|
|
|
|
scanning and implicit drive address 0. A tradition of 9 months shall not |
|
|
|
|
be broken. So burns without dev= will stay possible - but harmless only |
|
|
|
|
on single drive systems. |
|
|
|
|
|
|
|
|
|
Burns without dev= resp. with dev=number are harmless on multi-drive systems. |
|
|
|
|
|
|
|
|
|
This is because Cdrskin_grab_drive() either drops the unwanted drives or |
|
|
|
|
it enforces a restart of the library with the desired drive's persistent |
|
|
|
|
address. This restart then really uses the strongly urged function |
|
|
|
|
burn_drive_scan_and_grab(). |
|
|
|
|
Thus, cdrskin complies with the new spirit of API by closing down libburn |
|
|
|
|
or by dropping unused drives as soon as the persistent drive address is |
|
|
|
|
known and the drive is to be used with a long running operation. To my |
|
|
|
|
knowlege all long running operations in cdrskin need a grabbed drive. |
|
|
|
|
|
|
|
|
|
This spaghetti approach seems necessary to keep small the impact of new API |
|
|
|
|
urge on cdrskin's stability. cdrskin suffers from having donated the body |
|
|
|
|
parts which have been transplanted to libburn in order to create |
|
|
|
|
burn_drive_scan_and_grab() . The desired sysadmin friendlyness was already |
|
|
|
|
achieved by most cdrskin runs. The remaining problem situations should now |
|
|
|
|
be defused by releasing any short time grabbed flocks of drives during the |
|
|
|
|
restart of libburn. |
|
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------ |
|
|
|
|
This program is currently copyright Thomas Schmitt only. |
|
|
|
|
The copyrights of several components of libburnia.pykix.org are willfully |
|
|
|
@ -2388,7 +2350,7 @@ struct CdrskiN {
|
|
|
|
|
bit8 = write zeros after formatting |
|
|
|
|
bit9 = insist in size 0 |
|
|
|
|
bit10= format to maximum available size |
|
|
|
|
2=format_sequential (unimplemented yet) |
|
|
|
|
2=deformat_sequential (blank_fast might matter) |
|
|
|
|
*/ |
|
|
|
|
double blank_format_size; /* to be used with burn_disc_format() */ |
|
|
|
|
|
|
|
|
@ -3900,10 +3862,10 @@ int Cdrskin_blank(struct CdrskiN *skin, int flag)
|
|
|
|
|
int ret,loop_counter= 0,hint_force= 0,do_format= 0, profile_number= -1; |
|
|
|
|
int wrote_well= 1; |
|
|
|
|
double start_time; |
|
|
|
|
char *verb= "blank", *presperf="blanking", *fmt_text= "format_..."; |
|
|
|
|
char *verb= "blank", *presperf="blanking", *fmt_text= "..."; |
|
|
|
|
char profile_name[80]; |
|
|
|
|
static char fmtp[][40]= { |
|
|
|
|
"format_default", "format_overwrite", "format_sequential"}; |
|
|
|
|
"format_default", "format_overwrite", "deformat_sequential"}; |
|
|
|
|
static int fmtp_max= 2; |
|
|
|
|
|
|
|
|
|
start_time= Sfile_microtime(0); /* will be refreshed later */ |
|
|
|
@ -3921,7 +3883,7 @@ int Cdrskin_blank(struct CdrskiN *skin, int flag)
|
|
|
|
|
if(skin->verbosity>=Cdrskin_verbose_progresS) |
|
|
|
|
Cdrskin_report_disc_status(skin,s,0); |
|
|
|
|
do_format= skin->blank_format_type & 0xff; |
|
|
|
|
if(do_format) { |
|
|
|
|
if(do_format == 1) { |
|
|
|
|
verb= "format"; |
|
|
|
|
presperf= "formatting"; |
|
|
|
|
} |
|
|
|
@ -3938,29 +3900,28 @@ int Cdrskin_blank(struct CdrskiN *skin, int flag)
|
|
|
|
|
} |
|
|
|
|
#endif /* Cdrskin_libburn_has_pretend_fulL */ |
|
|
|
|
|
|
|
|
|
if(do_format) { |
|
|
|
|
if(do_format) |
|
|
|
|
if(do_format>=0 && do_format<=fmtp_max) |
|
|
|
|
fmt_text= fmtp[do_format]; |
|
|
|
|
if(do_format!=1) { |
|
|
|
|
|
|
|
|
|
/* >>> other formats to come. At least _sequential */; |
|
|
|
|
if(do_format==2) { |
|
|
|
|
/* Forceful blanking to Sequential Recording for DVD-R[W] and CD-RW */ |
|
|
|
|
|
|
|
|
|
if(!(profile_number == 0x14 || profile_number == 0x13 || |
|
|
|
|
profile_number == 0x11 || profile_number == 0x0a)) |
|
|
|
|
goto unsupported_format_type; |
|
|
|
|
if(s==BURN_DISC_UNSUITABLE) |
|
|
|
|
fprintf(stderr, |
|
|
|
|
"cdrskin: SORRY : only blank=%s is implemented yet\n",fmtp[1]); |
|
|
|
|
return(0); |
|
|
|
|
} else if(profile_number == 0x14) { /* DVD-RW sequential */ |
|
|
|
|
if(do_format!=1) |
|
|
|
|
goto unsupported_format_type; |
|
|
|
|
} else if(profile_number == 0x13) { /* DVD-RW restricted overwrite */ |
|
|
|
|
if(do_format==1 && skin->force_is_set) { |
|
|
|
|
"cdrskin: NOTE : blank=%s accepted not yet suitable media\n", |
|
|
|
|
fmt_text); |
|
|
|
|
|
|
|
|
|
} else if (do_format==1) { |
|
|
|
|
/* Formatting to become overwriteable for DVD-RW and DVD+RW */ |
|
|
|
|
|
|
|
|
|
if(profile_number == 0x14) { /* DVD-RW sequential */ |
|
|
|
|
/* ok */; |
|
|
|
|
} else if(do_format!=1) { |
|
|
|
|
unsupported_format_type:; |
|
|
|
|
fprintf(stderr, |
|
|
|
|
"cdrskin: SORRY : blank=%s : unsupported format and/or media type\n", |
|
|
|
|
fmt_text); |
|
|
|
|
return(0); |
|
|
|
|
} else { |
|
|
|
|
} else if(profile_number == 0x13) { /* DVD-RW restricted overwrite */ |
|
|
|
|
if(!(skin->force_is_set || ((skin->blank_format_type>>8)&4))) { |
|
|
|
|
fprintf(stderr, |
|
|
|
|
"cdrskin: NOTE : blank=format_... : media is already formatted\n"); |
|
|
|
|
fprintf(stderr, |
|
|
|
@ -3968,15 +3929,11 @@ unsupported_format_type:;
|
|
|
|
|
return(2); |
|
|
|
|
} |
|
|
|
|
} else if(profile_number == 0x1a) { /* DVD+RW */ |
|
|
|
|
if(do_format!=1) |
|
|
|
|
goto unsupported_format_type; |
|
|
|
|
if(!((skin->blank_format_type>>8)&4)) { |
|
|
|
|
fprintf(stderr, |
|
|
|
|
"cdrskin: NOTE : blank=format_... : DVD+RW do not need this\n"); |
|
|
|
|
fprintf(stderr, |
|
|
|
|
"cdrskin: HINT : For de-icing use option blank=format_overwrite_full"); |
|
|
|
|
fprintf(stderr, |
|
|
|
|
"cdrskin: HINT : If you really want to re-format, add option -force\n"); |
|
|
|
|
return(2); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
@ -3989,7 +3946,8 @@ unsupported_format_type:;
|
|
|
|
|
"cdrskin: NOTE : blank=%s accepted not yet suitable media\n", |
|
|
|
|
fmt_text); |
|
|
|
|
|
|
|
|
|
} else { /* do_format */ |
|
|
|
|
} else if(do_format==0) { |
|
|
|
|
/* Classical blanking of erasable media */ |
|
|
|
|
|
|
|
|
|
if(s!=BURN_DISC_FULL &&
|
|
|
|
|
(s!=BURN_DISC_APPENDABLE || skin->no_blank_appendable)) { |
|
|
|
@ -4015,7 +3973,13 @@ unsupported_format_type:;
|
|
|
|
|
return(0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} /* ! do_format */ |
|
|
|
|
} else { |
|
|
|
|
unsupported_format_type:; |
|
|
|
|
fprintf(stderr, |
|
|
|
|
"cdrskin: SORRY : blank=%s is unsupported with media type %s\n", |
|
|
|
|
fmt_text, profile_name); |
|
|
|
|
return(0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(skin->dummy_mode) { |
|
|
|
|
fprintf(stderr, |
|
|
|
@ -4027,11 +3991,11 @@ unsupported_format_type:;
|
|
|
|
|
Cdrskin_adjust_speed(skin,0); |
|
|
|
|
|
|
|
|
|
#ifndef Cdrskin_extra_leaN |
|
|
|
|
Cdrskin_wait_before_action(skin,1+(!!do_format)); |
|
|
|
|
Cdrskin_wait_before_action(skin,1+(do_format==1)); |
|
|
|
|
#endif /* ! Cdrskin_extra_leaN */ |
|
|
|
|
|
|
|
|
|
skin->drive_is_busy= 1; |
|
|
|
|
if(do_format==0) { |
|
|
|
|
if(do_format==0 || do_format==2) { |
|
|
|
|
burn_disc_erase(drive,skin->blank_fast); |
|
|
|
|
|
|
|
|
|
#ifdef Cdrskin_libburn_has_burn_disc_formaT |
|
|
|
@ -4074,7 +4038,7 @@ blanking_done:;
|
|
|
|
|
fprintf(stderr, |
|
|
|
|
"\rcdrskin: %s done \n", |
|
|
|
|
presperf); |
|
|
|
|
printf("%s time: %.3fs\n",(do_format?"Formatting":"Blanking"), |
|
|
|
|
printf("%s time: %.3fs\n",(do_format==1?"Formatting":"Blanking"), |
|
|
|
|
Sfile_microtime(0)-start_time); |
|
|
|
|
} |
|
|
|
|
fflush(stdout); |
|
|
|
@ -5159,9 +5123,10 @@ set_blank:;
|
|
|
|
|
skin->do_blank= 1; |
|
|
|
|
skin->blank_format_type= 1; |
|
|
|
|
skin->blank_format_size= 0; |
|
|
|
|
} else if(strcmp(cpt,"format_sequential")==0) {/* >>> not yet supported */ |
|
|
|
|
} else if(strcmp(cpt,"deformat_sequential")==0) { |
|
|
|
|
skin->do_blank= 1; |
|
|
|
|
skin->blank_format_type= 2; |
|
|
|
|
skin->blank_fast= 0; |
|
|
|
|
} else if(strcmp(cpt,"help")==0) {
|
|
|
|
|
/* is handled in Cdrpreskin_setup() */; |
|
|
|
|
continue; |
|
|
|
|