Triggered fallback by unsuitable media, made -version report fallback program

This commit is contained in:
2007-09-20 13:00:02 +00:00
parent 7a5f385b4f
commit 83616fda90
3 changed files with 101 additions and 66 deletions

View File

@ -1915,6 +1915,71 @@ int Cdrpreskin_queue_msgs(struct CdrpreskiN *o, int flag)
}
/* Start the fallback program as replacement of the cdrskin run.
@param flag bit0=do not report start command
*/
int Cdrpreskin_fallback(struct CdrpreskiN *preskin, int argc, char **argv,
int flag)
{
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;
}
if(!(flag&1)) {
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;
if(!(flag&1))
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;
if(!(flag&1))
fprintf(stderr," %s", hargv[wp]);
wp++;
}
hargv[wp]= NULL;
if(!(flag&1)) {
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);
}
/** Convert a cdrecord-style device address into a libburn device address or
into a libburn drive number. It depends on the "scsibus" number of the
cdrecord-style address which kind of libburn address emerges:
@ -2602,7 +2667,16 @@ set_severities:;
printf("Version timestamp : %s\n",Cdrskin_timestamP);
printf("Build timestamp : %s\n",Cdrskin_build_timestamP);
{ret= 2; goto final_checks;}
if(o->fallback_program[0]) {
char *hargv[2];
printf("Fallback program : %s\n",o->fallback_program);
printf("Fallback version :\n");
hargv[0]= argv[0];
hargv[1]= "-version";
Cdrpreskin_fallback(o,2,hargv,1); /* dirty never come back */
}
{ret= 2; goto ex;}
} else if(strcmp(argv[i],"-waiti")==0) {
o->do_waiti= 1;
@ -2715,61 +2789,6 @@ 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);
}
/* --------------------------------------------------------------------- */
@ -3331,6 +3350,7 @@ int Cdrskin_determine_media_caps(struct CdrskiN *skin, int flag)
bit1= do not load drive tray
bit2= do not issue error message on failure
bit3= demand and evtl. report media, return 0 if none to see
bit4= grab drive with unsuitable media even if fallback program
@return <=0 error, 1 success
*/
int Cdrskin_grab_drive(struct CdrskiN *skin, int flag)
@ -3443,8 +3463,8 @@ int Cdrskin_grab_drive(struct CdrskiN *skin, int flag)
}
skin->drive_is_grabbed= 1;
s= burn_disc_get_status(drive);
if((flag&8)) {
s= burn_disc_get_status(drive);
if(skin->verbosity>=Cdrskin_verbose_progresS)
Cdrskin_report_disc_status(skin,s,1);
if(s==BURN_DISC_EMPTY) {
@ -3468,6 +3488,16 @@ int Cdrskin_grab_drive(struct CdrskiN *skin, int flag)
}
}
#endif /* Cdrskin_libburn_has_get_profilE */
if(skin->preskin->fallback_program[0] && s==BURN_DISC_UNSUITABLE &&
skin->preskin->demands_cdrskin_caps<=0 && !(flag&16)) {
skin->preskin->demands_cdrecord_caps= 1;
fprintf(stderr,
"cdrskin: NOTE : Will delegate job to fallback program '%s'.\n",
skin->preskin->fallback_program);
Cdrskin_release_drive(skin,0);
ret= 0; goto ex;
}
Cdrskin_determine_media_caps(skin,0);
ret= 1;
@ -6409,7 +6439,7 @@ int Cdrskin_eject(struct CdrskiN *skin, int flag)
me. Waiting seems to help. I suspect the media demon. */
for(i= 0;i<max_try;i++) {
ret= Cdrskin_grab_drive(skin,2|((i<max_try-1)<<2));
ret= Cdrskin_grab_drive(skin,2|((i<max_try-1)<<2)|16);
if(ret>0 || i>=max_try-1)
break;
if(skin->verbosity>=Cdrskin_verbose_progresS)
@ -6433,7 +6463,7 @@ sorry_failed_to_eject:;
if(!skin->do_eject)
return(1);
if(Cdrskin_grab_drive(skin,2)>0) {
if(Cdrskin_grab_drive(skin,2|16)>0) {
Cdrskin_release_drive(skin,1);
} else {
fprintf(stderr,"cdrskin: SORRY : Failed to finally eject tray.\n");
@ -7244,6 +7274,9 @@ track_too_large:;
strcmp(argv[i],"-vvvv")==0) {
/* is handled in Cdrpreskin_setup() */;
} else if(strcmp(argv[i],"-version")==0) {
/* is handled in Cdrpreskin_setup() and should really not get here */;
} else if(strcmp(argv[i],"-waiti")==0) {
/* is handled in Cdrpreskin_setup() */;
@ -7391,7 +7424,7 @@ ignore_unknown:;
}
}
if(grab_and_wait_value>0) {
Cdrskin_grab_drive(skin,0);
Cdrskin_grab_drive(skin,16);
for(k= 0; k<grab_and_wait_value; k++) {
fprintf(stderr,
"\rcdrskin: holding drive grabbed since %d seconds ",
@ -7694,8 +7727,9 @@ ex:;
else if(skin!=NULL)
h_preskin= skin->preskin;
if(h_preskin!=NULL) {
if(skin->verbosity>=Cdrskin_verbose_debuG)
ClN(fprintf(stderr,
if(skin!=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));
@ -7710,13 +7744,14 @@ ex:;
}
if(skin!=NULL) {
Cleanup_set_handlers(NULL,NULL,1);
Cdrskin_eject(skin,0);
if(skin->preskin!=NULL)
Cdrskin_eject(skin,0);
Cdrskin_destroy(&skin,0);
}
Cdrpreskin_destroy(&preskin,0);
if(lib_initialized)
burn_finish();
if(h_preskin!=NULL)
Cdrpreskin_fallback(h_preskin,argc,argv); /* never come back */
Cdrpreskin_fallback(h_preskin,argc,argv,0); /* never come back */
exit(exit_value);
}