|
|
|
@ -1721,8 +1721,14 @@ struct CdrpreskiN {
|
|
|
|
|
|
|
|
|
|
#endif /* ! Cdrskin_extra_leaN */
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
/* The eventual name of a program to be executed if demands_cdrecord_caps
|
|
|
|
|
is >0 and demands_cdrskin_caps is <=0
|
|
|
|
|
*/
|
|
|
|
|
char fallback_program[Cdrskin_strleN];
|
|
|
|
|
int demands_cdrecord_caps;
|
|
|
|
|
int demands_cdrskin_caps;
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Create a preliminary cdrskin program run control object. It will become
|
|
|
|
@ -1778,6 +1784,9 @@ int Cdrpreskin_new(struct CdrpreskiN **preskin, int flag)
|
|
|
|
|
o->pre_arglno= NULL;
|
|
|
|
|
#endif /* ! Cdrskin_extra_leaN */
|
|
|
|
|
|
|
|
|
|
o->fallback_program[0]= 0;
|
|
|
|
|
o->demands_cdrecord_caps= 0;
|
|
|
|
|
o->demands_cdrskin_caps= 0;
|
|
|
|
|
return(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2081,6 +2090,18 @@ return:
|
|
|
|
|
fprintf(stderr,"cdrskin: SORRY : No options given. Try option --help\n");
|
|
|
|
|
return(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* The two predefined fallback personalities are triggered by the progname */
|
|
|
|
|
value_pt= strrchr(argv[0],'/');
|
|
|
|
|
if(value_pt==NULL)
|
|
|
|
|
value_pt= argv[0];
|
|
|
|
|
else
|
|
|
|
|
value_pt++;
|
|
|
|
|
if(strcmp(value_pt,"unicord")==0)
|
|
|
|
|
strcpy(o->fallback_program,"cdrecord");
|
|
|
|
|
else if(strcmp(value_pt,"codim")==0)
|
|
|
|
|
strcpy(o->fallback_program,"wodim");
|
|
|
|
|
|
|
|
|
|
for (i= 1;i<argc;i++) {
|
|
|
|
|
|
|
|
|
|
if(strcmp(argv[i],"--abort_handler")==0) {
|
|
|
|
@ -2131,6 +2152,7 @@ return:
|
|
|
|
|
|
|
|
|
|
} else if(strcmp(argv[i],"--demand_a_drive")==0) {
|
|
|
|
|
o->scan_demands_drive= 1;
|
|
|
|
|
o->demands_cdrskin_caps= 1;
|
|
|
|
|
|
|
|
|
|
} else if(strcmp(argv[i],"--devices")==0) {
|
|
|
|
|
#ifndef Cdrskin_extra_leaN
|
|
|
|
@ -2141,8 +2163,10 @@ return:
|
|
|
|
|
#endif /* ! Cdrskin_extra_leaN */
|
|
|
|
|
|
|
|
|
|
o->no_whitelist= 1;
|
|
|
|
|
o->demands_cdrskin_caps= 1;
|
|
|
|
|
|
|
|
|
|
} else if(strncmp(argv[i],"dev_translation=",16)==0) {
|
|
|
|
|
o->demands_cdrskin_caps= 1;
|
|
|
|
|
|
|
|
|
|
#ifndef Cdrskin_extra_leaN
|
|
|
|
|
|
|
|
|
@ -2273,6 +2297,7 @@ set_dev:;
|
|
|
|
|
o->drive_scsi_dev_family= 0;
|
|
|
|
|
} else if(strcmp(argv[i],"--drive_scsi_exclusive")==0) {
|
|
|
|
|
o->drive_exclusive= 2;
|
|
|
|
|
o->demands_cdrskin_caps= 1;
|
|
|
|
|
|
|
|
|
|
} else if(strcmp(argv[i],"driveropts=help")==0 ||
|
|
|
|
|
strcmp(argv[i],"-driveropts=help")==0) {
|
|
|
|
@ -2522,6 +2547,9 @@ see_cdrskin_eng_html:;
|
|
|
|
|
} else if(strcmp(argv[i],"--ignore_signals")==0) {
|
|
|
|
|
o->abort_handler= 2;
|
|
|
|
|
|
|
|
|
|
} else if(strncmp(argv[i],"fallback_program=",17)==0) {
|
|
|
|
|
strcpy(o->fallback_program,argv[i]+17);
|
|
|
|
|
|
|
|
|
|
} else if(strcmp(argv[i],"--no_abort_handler")==0) {
|
|
|
|
|
o->abort_handler= 0;
|
|
|
|
|
|
|
|
|
@ -2530,6 +2558,7 @@ see_cdrskin_eng_html:;
|
|
|
|
|
|
|
|
|
|
} else if(strcmp(argv[i],"--old_pseudo_scsi_adr")==0) {
|
|
|
|
|
o->old_pseudo_scsi_adr= 1;
|
|
|
|
|
o->demands_cdrskin_caps= 1;
|
|
|
|
|
|
|
|
|
|
} else if(strcmp(argv[i],"--no_rc")==0) {
|
|
|
|
|
if(i!=1)
|
|
|
|
@ -2686,6 +2715,61 @@ ex:;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int Cdrpreskin_fallback(struct CdrpreskiN *preskin, int argc, char **argv)
|
|
|
|
|
{
|
|
|
|
|
char **hargv= NULL;
|
|
|
|
|
int i, wp= 1;
|
|
|
|
|
char *ept, *upt;
|
|
|
|
|
|
|
|
|
|
if(getuid()!=geteuid() && !preskin->allow_setuid) {
|
|
|
|
|
fprintf(stderr,
|
|
|
|
|
"cdrskin: SORRY : uid and euid differ. Will not start external fallback program.\n");
|
|
|
|
|
fprintf(stderr,
|
|
|
|
|
"cdrskin: HINT : Consider to allow rw-access to the writer device and\n");
|
|
|
|
|
fprintf(stderr,
|
|
|
|
|
"cdrskin: HINT : to run cdrskin under your normal user identity.\n");
|
|
|
|
|
fprintf(stderr,
|
|
|
|
|
"cdrskin: HINT : Option --allow_setuid disables this safety check.\n");
|
|
|
|
|
goto failure;
|
|
|
|
|
}
|
|
|
|
|
fprintf(stderr,"cdrskin: --------------------------------------------------------------------\n");
|
|
|
|
|
fprintf(stderr,"cdrskin: Starting fallback program:\n");
|
|
|
|
|
hargv= TSOB_FELD(char *,argc+1);
|
|
|
|
|
if(hargv==NULL)
|
|
|
|
|
goto failure;
|
|
|
|
|
hargv[0]= strdup(preskin->fallback_program);
|
|
|
|
|
if(argv[0]==NULL)
|
|
|
|
|
goto failure;
|
|
|
|
|
fprintf(stderr," %s", hargv[0]);
|
|
|
|
|
for(i= 1; i<argc; i++) {
|
|
|
|
|
/* filter away all cdrskin specific options : --?* and *_*=* */
|
|
|
|
|
if(argv[i][0]=='-' && argv[i][1]=='-' && argv[i][2])
|
|
|
|
|
continue;
|
|
|
|
|
ept= strchr(argv[i],'=');
|
|
|
|
|
if(ept!=NULL) {
|
|
|
|
|
upt= strchr(argv[i],'_');
|
|
|
|
|
if(upt!=NULL && upt<ept)
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
hargv[wp]= strdup(argv[i]);
|
|
|
|
|
if(hargv[wp]==NULL)
|
|
|
|
|
goto failure;
|
|
|
|
|
fprintf(stderr," %s", hargv[wp]);
|
|
|
|
|
wp++;
|
|
|
|
|
}
|
|
|
|
|
hargv[wp]= NULL;
|
|
|
|
|
fprintf(stderr,"\n");
|
|
|
|
|
fprintf(stderr,"cdrskin: --------------------------------------------------------------------\n");
|
|
|
|
|
execvp(hargv[0], hargv);
|
|
|
|
|
failure:;
|
|
|
|
|
fprintf(stderr,"cdrskin: FATAL : Cannot start fallback program '%s'\n",
|
|
|
|
|
hargv[0]);
|
|
|
|
|
fprintf(stderr,"cdrskin: errno=%d \"%s\"\n",
|
|
|
|
|
errno, (errno > 0 ? strerror(errno) : "unidentified error"));
|
|
|
|
|
exit(15);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -3009,7 +3093,6 @@ int Cdrskin_new(struct CdrskiN **skin, struct CdrpreskiN *preskin, int flag)
|
|
|
|
|
o->use_data_image_size= 0;
|
|
|
|
|
o->media_does_multi= 0;
|
|
|
|
|
o->media_is_overwriteable= 0;
|
|
|
|
|
|
|
|
|
|
o->grow_overwriteable_iso= 0;
|
|
|
|
|
memset(o->overwriteable_iso_head,0,sizeof(o->overwriteable_iso_head));
|
|
|
|
|
|
|
|
|
@ -6483,8 +6566,12 @@ int Cdrskin_setup(struct CdrskiN *skin, int argc, char **argv, int flag)
|
|
|
|
|
goto no_volunteer;
|
|
|
|
|
if(0) {
|
|
|
|
|
no_volunteer:;
|
|
|
|
|
fprintf(stderr,"cdrskin: NOTE : ignoring unimplemented option : '%s'\n",
|
|
|
|
|
argv[i]);
|
|
|
|
|
skin->preskin->demands_cdrecord_caps= 1;
|
|
|
|
|
if(skin->preskin->fallback_program[0])
|
|
|
|
|
fprintf(stderr,"cdrskin: NOTE : Unimplemented option: '%s'\n",argv[i]);
|
|
|
|
|
else
|
|
|
|
|
fprintf(stderr,"cdrskin: NOTE : ignoring unimplemented option : '%s'\n",
|
|
|
|
|
argv[i]);
|
|
|
|
|
fprintf(stderr,
|
|
|
|
|
"cdrskin: NOTE : option is waiting for a volunteer to implement it.\n");
|
|
|
|
|
continue;
|
|
|
|
@ -6582,22 +6669,27 @@ set_blank:;
|
|
|
|
|
skin->do_blank= 1;
|
|
|
|
|
skin->blank_format_type= 1|(1<<8);
|
|
|
|
|
skin->blank_format_size= 128*1024*1024;
|
|
|
|
|
skin->preskin->demands_cdrskin_caps= 1;
|
|
|
|
|
} else if(strcmp(cpt,"format_overwrite_full")==0) {
|
|
|
|
|
skin->do_blank= 1;
|
|
|
|
|
skin->blank_format_type= 1|(1<<10);
|
|
|
|
|
skin->blank_format_size= 0;
|
|
|
|
|
skin->preskin->demands_cdrskin_caps= 1;
|
|
|
|
|
} else if(strcmp(cpt,"format_overwrite_quickest")==0) {
|
|
|
|
|
skin->do_blank= 1;
|
|
|
|
|
skin->blank_format_type= 1;
|
|
|
|
|
skin->blank_format_size= 0;
|
|
|
|
|
skin->preskin->demands_cdrskin_caps= 1;
|
|
|
|
|
} else if(strcmp(cpt,"deformat_sequential")==0) {
|
|
|
|
|
skin->do_blank= 1;
|
|
|
|
|
skin->blank_format_type= 2;
|
|
|
|
|
skin->blank_fast= 0;
|
|
|
|
|
skin->preskin->demands_cdrskin_caps= 1;
|
|
|
|
|
} else if(strcmp(cpt,"deformat_sequential_quickest")==0) {
|
|
|
|
|
skin->do_blank= 1;
|
|
|
|
|
skin->blank_format_type= 2;
|
|
|
|
|
skin->blank_fast= 1;
|
|
|
|
|
skin->preskin->demands_cdrskin_caps= 1;
|
|
|
|
|
} else if(strcmp(cpt,"help")==0) {
|
|
|
|
|
/* is handled in Cdrpreskin_setup() */;
|
|
|
|
|
continue;
|
|
|
|
@ -6628,11 +6720,9 @@ set_blank:;
|
|
|
|
|
} else if(strcmp(argv[i],"--devices")==0) {
|
|
|
|
|
skin->do_devices= 1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef Cdrskin_extra_leaN
|
|
|
|
|
|
|
|
|
|
} else if(strncmp(argv[i],"dev_translation=",16)==0) {
|
|
|
|
|
|
|
|
|
|
if(argv[i][16]==0) {
|
|
|
|
|
fprintf(stderr,
|
|
|
|
|
"cdrskin: FATAL : dev_translation= : missing separator character\n");
|
|
|
|
@ -6669,6 +6759,7 @@ set_blank:;
|
|
|
|
|
if(skin->direct_write_amount>=0.0) {
|
|
|
|
|
skin->do_direct_write= 1;
|
|
|
|
|
printf("cdrskin: NOTE : Direct writing will only use first track source and no fifo.\n");
|
|
|
|
|
skin->preskin->demands_cdrskin_caps= 1;
|
|
|
|
|
} else
|
|
|
|
|
skin->do_direct_write= 0;
|
|
|
|
|
|
|
|
|
@ -6805,6 +6896,7 @@ fs_equals:;
|
|
|
|
|
} else if(strncmp(argv[i],"grab_drive_and_wait=",20)==0) {
|
|
|
|
|
value_pt= argv[i]+20;
|
|
|
|
|
grab_and_wait_value= Scanf_io_size(value_pt,0);
|
|
|
|
|
skin->preskin->demands_cdrskin_caps= 1;
|
|
|
|
|
|
|
|
|
|
} else if(strncmp(argv[i],"-gracetime=",11)==0) {
|
|
|
|
|
value_pt= argv[i]+11;
|
|
|
|
@ -6819,6 +6911,7 @@ gracetime_equals:;
|
|
|
|
|
} else if(strncmp(argv[i],"--grow_overwriteable_iso",24)==0) {
|
|
|
|
|
skin->grow_overwriteable_iso= 1;
|
|
|
|
|
skin->use_data_image_size= 1;
|
|
|
|
|
skin->preskin->demands_cdrskin_caps= 1;
|
|
|
|
|
#endif /* Cdrskin_libburn_has_random_access_rW */
|
|
|
|
|
#endif /* Cdrskin_libburn_has_get_multi_capS */
|
|
|
|
|
|
|
|
|
@ -6875,6 +6968,9 @@ gracetime_equals:;
|
|
|
|
|
printf("%s\n",ignored_full_options[k]);
|
|
|
|
|
printf("\n");
|
|
|
|
|
|
|
|
|
|
} else if(strncmp(argv[i],"fallback_program=",17)==0) {
|
|
|
|
|
/* is handled in Cdrpreskin_setup() */;
|
|
|
|
|
|
|
|
|
|
} else if(strcmp(argv[i],"-load")==0) {
|
|
|
|
|
skin->do_load= 1;
|
|
|
|
|
|
|
|
|
@ -6959,6 +7055,7 @@ minbuf_equals:;
|
|
|
|
|
value_pt);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
skin->preskin->demands_cdrskin_caps= 1;
|
|
|
|
|
#else
|
|
|
|
|
fprintf(stderr,
|
|
|
|
|
"cdrskin: SORRY : Option modesty_on_drive= is not available yet.\n");
|
|
|
|
@ -7055,6 +7152,7 @@ set_padsize:;
|
|
|
|
|
if(skin->verbosity>=Cdrskin_verbose_cmD)
|
|
|
|
|
ClN(printf(
|
|
|
|
|
"cdrskin: --single_track : will only accept last argument as track source\n"));
|
|
|
|
|
skin->preskin->demands_cdrskin_caps= 1;
|
|
|
|
|
|
|
|
|
|
} else if(strncmp(argv[i],"-speed=",7)==0) {
|
|
|
|
|
value_pt= argv[i]+7;
|
|
|
|
@ -7070,6 +7168,8 @@ set_speed:;
|
|
|
|
|
fprintf(stderr,"cdrskin: FATAL : speed= must be -1, 0 or at least 1\n");
|
|
|
|
|
return(0);
|
|
|
|
|
}
|
|
|
|
|
if(skin->x_speed<0)
|
|
|
|
|
skin->preskin->demands_cdrskin_caps= 1;
|
|
|
|
|
|
|
|
|
|
/* >>> cdrecord speed=0 -> minimum speed , libburn -> maximum speed */;
|
|
|
|
|
|
|
|
|
@ -7098,6 +7198,7 @@ set_speed:;
|
|
|
|
|
skin->tao_to_sao_tsize= Scanf_io_size(argv[i]+17,0);
|
|
|
|
|
if(skin->tao_to_sao_tsize>Cdrskin_tracksize_maX)
|
|
|
|
|
goto track_too_large;
|
|
|
|
|
skin->preskin->demands_cdrskin_caps= 1;
|
|
|
|
|
|
|
|
|
|
#ifndef Cdrskin_extra_leaN
|
|
|
|
|
if(skin->verbosity>=Cdrskin_verbose_cmD)
|
|
|
|
@ -7112,6 +7213,7 @@ set_speed:;
|
|
|
|
|
#ifdef Cdrskin_libburn_has_get_spacE
|
|
|
|
|
} else if(strcmp(argv[i],"--tell_media_space")==0) {
|
|
|
|
|
skin->tell_media_space= 1;
|
|
|
|
|
skin->preskin->demands_cdrskin_caps= 1;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
} else if(strcmp(argv[i],"-toc")==0) {
|
|
|
|
@ -7150,6 +7252,7 @@ track_too_large:;
|
|
|
|
|
if(skin->verbosity>=Cdrskin_verbose_cmD)
|
|
|
|
|
ClN(printf("cdrskin: write start address : %.f\n",
|
|
|
|
|
skin->write_start_address));
|
|
|
|
|
skin->preskin->demands_cdrskin_caps= 1;
|
|
|
|
|
|
|
|
|
|
} else if( i==argc-1 ||
|
|
|
|
|
(skin->single_track==0 && strchr(argv[i],'=')==NULL
|
|
|
|
@ -7225,14 +7328,28 @@ track_too_large:;
|
|
|
|
|
skin->fixed_size= 0;
|
|
|
|
|
} else {
|
|
|
|
|
ignore_unknown:;
|
|
|
|
|
fprintf(stderr,"cdrskin: NOTE : ignoring unknown option : '%s'\n",
|
|
|
|
|
argv[i]);
|
|
|
|
|
if(skin->preskin->fallback_program[0])
|
|
|
|
|
fprintf(stderr,"cdrskin: NOTE : Unknown option : '%s'\n",argv[i]);
|
|
|
|
|
else
|
|
|
|
|
fprintf(stderr,"cdrskin: NOTE : ignoring unknown option : '%s'\n",
|
|
|
|
|
argv[i]);
|
|
|
|
|
skin->preskin->demands_cdrecord_caps= 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(flag&1) /* no finalizing yet */
|
|
|
|
|
return(1);
|
|
|
|
|
|
|
|
|
|
if(skin->preskin->fallback_program[0] &&
|
|
|
|
|
skin->preskin->demands_cdrecord_caps>0 &&
|
|
|
|
|
skin->preskin->demands_cdrskin_caps<=0) {
|
|
|
|
|
fprintf(stderr,"cdrskin: NOTE : Unsupported options found.\n");
|
|
|
|
|
fprintf(stderr,
|
|
|
|
|
"cdrskin: NOTE : Will delegate job to fallback program '%s'.\n",
|
|
|
|
|
skin->preskin->fallback_program);
|
|
|
|
|
return(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifndef Cdrskin_extra_leaN
|
|
|
|
|
if(skin->verbosity>=Cdrskin_verbose_cmD) {
|
|
|
|
|
if(skin->preskin->abort_handler==1)
|
|
|
|
@ -7326,9 +7443,10 @@ int Cdrskin_create(struct CdrskiN **o, struct CdrpreskiN **preskin,
|
|
|
|
|
(*preskin)->device_adr));
|
|
|
|
|
burn_drive_add_whitelist((*preskin)->device_adr);
|
|
|
|
|
if(strncmp((*preskin)->device_adr, "stdio:", 6)==0) {
|
|
|
|
|
if((*preskin)->allow_emulated_drives)
|
|
|
|
|
if((*preskin)->allow_emulated_drives) {
|
|
|
|
|
stdio_drive= 1;
|
|
|
|
|
else {
|
|
|
|
|
(*preskin)->demands_cdrskin_caps= 1;
|
|
|
|
|
} else {
|
|
|
|
|
fprintf(stderr,"cdrskin: SORRY : dev=stdio:... works only with option --allow_emulated_drives\n");
|
|
|
|
|
{*exit_value= 2; goto ex;}
|
|
|
|
|
}
|
|
|
|
@ -7495,7 +7613,7 @@ no_drive:;
|
|
|
|
|
int main(int argc, char **argv)
|
|
|
|
|
{
|
|
|
|
|
int ret,exit_value= 0,lib_initialized= 0,i,result_fd= -1;
|
|
|
|
|
struct CdrpreskiN *preskin= NULL;
|
|
|
|
|
struct CdrpreskiN *preskin= NULL, *h_preskin= NULL;
|
|
|
|
|
struct CdrskiN *skin= NULL;
|
|
|
|
|
char *lean_id= "";
|
|
|
|
|
#ifdef Cdrskin_extra_leaN
|
|
|
|
@ -7571,6 +7689,25 @@ int main(int argc, char **argv)
|
|
|
|
|
Cdrskin_run(skin,&exit_value,0);
|
|
|
|
|
|
|
|
|
|
ex:;
|
|
|
|
|
if(preskin!=NULL)
|
|
|
|
|
h_preskin= preskin;
|
|
|
|
|
else if(skin!=NULL)
|
|
|
|
|
h_preskin= skin->preskin;
|
|
|
|
|
if(h_preskin!=NULL) {
|
|
|
|
|
if(skin->verbosity>=Cdrskin_verbose_debuG)
|
|
|
|
|
ClN(fprintf(stderr,
|
|
|
|
|
"cdrskin_debug: demands_cdrecord_caps= %d , demands_cdrskin_caps= %d\n",
|
|
|
|
|
h_preskin->demands_cdrecord_caps, h_preskin->demands_cdrskin_caps));
|
|
|
|
|
|
|
|
|
|
if(exit_value && h_preskin->demands_cdrecord_caps>0 &&
|
|
|
|
|
h_preskin->demands_cdrskin_caps<=0) { /* prepare fallback */
|
|
|
|
|
/* detach preskin from managers which would destroy it */
|
|
|
|
|
preskin= NULL;
|
|
|
|
|
if(skin!=NULL)
|
|
|
|
|
skin->preskin= NULL;
|
|
|
|
|
} else
|
|
|
|
|
h_preskin= NULL; /* prevent fallback */
|
|
|
|
|
}
|
|
|
|
|
if(skin!=NULL) {
|
|
|
|
|
Cleanup_set_handlers(NULL,NULL,1);
|
|
|
|
|
Cdrskin_eject(skin,0);
|
|
|
|
@ -7579,5 +7716,7 @@ ex:;
|
|
|
|
|
Cdrpreskin_destroy(&preskin,0);
|
|
|
|
|
if(lib_initialized)
|
|
|
|
|
burn_finish();
|
|
|
|
|
if(h_preskin!=NULL)
|
|
|
|
|
Cdrpreskin_fallback(h_preskin,argc,argv); /* never come back */
|
|
|
|
|
exit(exit_value);
|
|
|
|
|
}
|
|
|
|
|