New option fallback_program=

This commit is contained in:
2007-09-19 21:28:18 +00:00
parent 312b4af25c
commit 7a5f385b4f
3 changed files with 178 additions and 12 deletions

View File

@ -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);
}