Gave problem handling finer granularity within loops

This commit is contained in:
2007-11-11 11:21:46 +00:00
parent f02c8c7ba8
commit a59c10dfec
4 changed files with 218 additions and 126 deletions

View File

@ -2422,6 +2422,7 @@ int Xorriso_request_confirmation(struct XorrisO *xorriso, int flag)
bit1= mark '@' and '@@' by return 4
bit2= accept: i|n= ignore | do not remove , r|y= retry | remove , q|x= abort
bit3= @@@ = 'done reading' rather than 'abort'
bit4= in non-dialog mode return 6 rather than 1
*/
/* return: <=0 error
1= go on | do not remove existing file
@ -2436,6 +2437,11 @@ int Xorriso_request_confirmation(struct XorrisO *xorriso, int flag)
char line[SfileadrL],*cpt,previous_line[SfileadrL];
char *abort_req_text,*abort_really_text;
if(!xorriso->dialog) {
if(flag&16)
return(6);
return(1);
}
if(flag&8) {
abort_req_text= "request to end";
abort_really_text= "done reading";
@ -2457,7 +2463,7 @@ int Xorriso_request_confirmation(struct XorrisO *xorriso, int flag)
if(flag&1) {
strcpy(previous_line,cpt);
sprintf(xorriso->info_text,
".... [%s = %s registered. Really %s ? (y/n) ] ....\n",
"... [%s = %s registered. Really %s ? (y/n) ] ...\n",
cpt,abort_req_text,abort_really_text);
Xorriso_info(xorriso,0);
ret= Xorriso_dialog_input(xorriso,line,sizeof(line),1);
@ -3201,13 +3207,8 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag)
if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2);
is_default= 0;
if(xorriso->use_stdin)
sprintf(line,"-use_stdin\n");
else {
sprintf(line,"-use_readline\n");
is_default= 1;
}
is_default= (xorriso->use_stdin==0);
sprintf(line,"-use_readline %s\n", (xorriso->use_stdin?"off":"on"));
if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2);
@ -3683,13 +3684,26 @@ int Xorriso_msgs_submit(struct XorrisO *xorriso,
}
/**
@param flag bit0= do not issue own event messages
bit1= take xorriso->request_to_abort as reason for abort
@return Gives the advice:
2= pardon was given, go on
1= no problem, go on
0= function failed but xorriso would not abort, go on
<0= do abort
-1 = due to probelm_status
-2 = due to xorriso->request_to_abort
*/
int Xorriso_eval_problem_status(struct XorrisO *xorriso, int ret, int flag)
{
static int sev= 0;
if(sev==0)
Xorriso__text_to_sev("SORRY", &sev, 0);
if((flag&2) && xorriso->request_to_abort)
return(-2);
Xorriso_process_msg_queues(xorriso, 0);
if(ret>0 && xorriso->problem_status <= 0)
return(1);
@ -3793,7 +3807,7 @@ int Xorriso_option_abort_on(struct XorrisO *xorriso, char *severity, int flag)
int Xorriso_option_add(struct XorrisO *xorriso, int argc, char **argv,
int *idx, int flag)
{
int i, end_idx, ret;
int i, end_idx, ret, was_failure= 0, fret;
char target[SfileadrL], source[SfileadrL], *ept, eff_path[SfileadrL];
end_idx= Xorriso_end_idx(xorriso, argc, argv, *idx, 0);
@ -3812,35 +3826,45 @@ int Xorriso_option_add(struct XorrisO *xorriso, int argc, char **argv,
if(target[0]!='/') {
ret= Sfile_prepend_path(xorriso->wdi, target, 0);
if(ret<=0)
goto ex;
goto problem_handler;
}
if(source[0]!='/') {
ret= Sfile_prepend_path(xorriso->wdx, source, 0);
if(ret<=0)
goto ex;
goto problem_handler;
}
ret= Xorriso_normalize_img_path(xorriso, target, eff_path, 2);
if(ret<=0)
return(ret);
goto problem_handler;
strcpy(target, eff_path);
ret= Xorriso_normalize_img_path(xorriso, source, eff_path, 2|4);
if(ret<=0)
return(ret);
goto problem_handler;
strcpy(source, eff_path);
ret= Xorriso_graft_in(xorriso, source, target, 0);
if(ret<=0)
goto ex;
if(ret<=0 || xorriso->request_to_abort)
goto problem_handler;
sprintf(xorriso->info_text, "Added to ISO image: %s '%s'='%s'\n",
(ret>1 ? "directory" : "file"), target, source);
if(!(flag&1))
Xorriso_info(xorriso, 0);
continue; /* regular bottom of loop */
problem_handler:;
was_failure= 1;
fret= Xorriso_eval_problem_status(xorriso, ret, 1|2);
if(fret>=0)
continue;
goto ex;
}
ret= 1;
ex:;
(*idx)= end_idx;
return(ret);
if(ret<=0)
return(ret);
return(!was_failure);
}
@ -3849,7 +3873,7 @@ int Xorriso_option_alter_date(struct XorrisO *xorriso,
char *time_type, char *timestring,
int argc, char **argv, int *idx, int flag)
{
int i, ret, was_failure= 0, t_type= 0, end_idx;
int i, ret, was_failure= 0, t_type= 0, end_idx, fret;
time_t t;
int optc= 0;
char **optv= NULL;
@ -3882,10 +3906,13 @@ int Xorriso_option_alter_date(struct XorrisO *xorriso,
goto ex;
for(i= 0; i<optc; i++) {
ret= Xorriso_set_time(xorriso, optv[i], t, t_type);
if(ret<0)
goto ex;
if(ret==0)
was_failure= 1;
if(ret>0 && !xorriso->request_to_abort)
continue; /* regular bottom of loop */
was_failure= 1;
fret= Xorriso_eval_problem_status(xorriso, ret, 1|2);
if(fret>=0)
continue;
goto ex;
}
ret= 1;
ex:;
@ -4089,7 +4116,7 @@ int Xorriso_option_cdx(struct XorrisO *xorriso, char *disk_path, int flag)
int Xorriso_option_chgrpi(struct XorrisO *xorriso, char *gid,
int argc, char **argv, int *idx, int flag)
{
int i, ret, was_failure= 0, end_idx;
int i, ret, was_failure= 0, end_idx, fret;
gid_t gid_number;
int optc= 0;
char **optv= NULL;
@ -4102,10 +4129,13 @@ int Xorriso_option_chgrpi(struct XorrisO *xorriso, char *gid,
goto ex;
for(i= 0; i<optc; i++) {
ret= Xorriso_set_gid(xorriso, optv[i], gid_number, 0);
if(ret<0)
goto ex;
if(ret==0)
was_failure= 1;
if(ret>0 && !xorriso->request_to_abort)
continue; /* regular bottom of loop */
was_failure= 1;
fret= Xorriso_eval_problem_status(xorriso, ret, 1|2);
if(fret>=0)
continue;
goto ex;
}
ret= 1;
ex:;
@ -4121,7 +4151,7 @@ ex:;
int Xorriso_option_chmodi(struct XorrisO *xorriso, char *mode,
int argc, char **argv, int *idx, int flag)
{
int i, ret, who_val= 0, was_failure= 0, end_idx;
int i, ret, who_val= 0, was_failure= 0, end_idx, fret;
unsigned int num;
mode_t mode_and= ~0, mode_or= 0, mode_val, mask;
char sfe[5*SfileadrL], *mpt, *opt, *vpt;
@ -4219,10 +4249,13 @@ unrecognizable:;
goto ex;
for(i= 0; i<optc; i++) {
ret= Xorriso_set_st_mode(xorriso, optv[i], mode_and, mode_or, 0);
if(ret<0)
break;
if(ret==0)
was_failure= 1;
if(ret>0 && !xorriso->request_to_abort)
continue; /* regular bottom of loop */
was_failure= 1;
fret= Xorriso_eval_problem_status(xorriso, ret, 1|2);
if(fret>=0)
continue;
goto ex;
}
ret= 1;
ex:;
@ -4238,7 +4271,7 @@ ex:;
int Xorriso_option_chowni(struct XorrisO *xorriso, char *uid,
int argc, char **argv, int *idx, int flag)
{
int i, ret, was_failure= 0, end_idx;
int i, ret, was_failure= 0, end_idx, fret;
uid_t uid_number;
int optc= 0;
char **optv= NULL;
@ -4251,10 +4284,13 @@ int Xorriso_option_chowni(struct XorrisO *xorriso, char *uid,
goto ex;
for(i= 0; i<optc; i++) {
ret= Xorriso_set_uid(xorriso, optv[i], uid_number, 0);
if(ret<0)
goto ex;
if(ret==0)
was_failure= 1;
if(ret>0 && !xorriso->request_to_abort)
continue; /* regular bottom of loop */
was_failure= 1;
fret= Xorriso_eval_problem_status(xorriso, ret, 1|2);
if(fret>=0)
continue;
ret= 0; goto ex;
}
ret= 1;
ex:;
@ -4999,21 +5035,26 @@ int Xorriso_option_mark(struct XorrisO *xorriso, char *mark, int flag)
int Xorriso_option_mkdiri(struct XorrisO *xorriso, int argc, char **argv,
int *idx, int flag)
{
int i, end_idx, ret, was_failure= 0;
int i, end_idx, ret, was_failure= 0, fret;
end_idx= Xorriso_end_idx(xorriso, argc, argv, *idx, 0);
for(i= *idx; i<end_idx; i++) {
ret= Xorriso_mkdir(xorriso, argv[i], 0);
if(ret<0)
{ret= 0; goto ex;}
if(ret==0)
was_failure= 1;
if(ret>0 && !xorriso->request_to_abort)
continue; /* regular bottom of loop */
was_failure= 1;
fret= Xorriso_eval_problem_status(xorriso, ret, 1|2);
if(fret>=0)
continue;
goto ex;
}
ret= 1;
ex:;
(*idx)= end_idx;
return(ret>0 && !was_failure);
if(ret<=0)
return(ret);
return(!was_failure);
}
@ -5021,7 +5062,7 @@ ex:;
int Xorriso_option_mvi(struct XorrisO *xorriso, int argc, char **argv,
int *idx, int flag)
{
int i, end_idx, ret, is_dir= 0, was_failure= 0;
int i, end_idx, ret, is_dir= 0, was_failure= 0, fret;
char sfe[5*SfileadrL], sfe2[5*SfileadrL];
char eff_origin[SfileadrL], eff_dest[SfileadrL];
char dest_dir[SfileadrL], *leafname;
@ -5036,10 +5077,6 @@ int Xorriso_option_mvi(struct XorrisO *xorriso, int argc, char **argv,
{ret= 0; goto ex;}
}
#ifdef NIX
optc= end_idx - *idx;
optv= argv + *idx;
#else
ret= Xorriso_opt_args(xorriso, argc, argv, *idx, &end_idx, &optc, &optv,
16); /* ignore last argument */
if(ret<=0)
@ -5048,14 +5085,17 @@ int Xorriso_option_mvi(struct XorrisO *xorriso, int argc, char **argv,
32|64); /* demand one match, or 0 with a constant */
if(ret<=0)
goto ex;
#endif /* ! NIX */
#ifdef NIX
/* <<< */
/* Check existence of old addresses */
for(i= 0; i<optc; i++) {
ret= Xorriso_normalize_img_path(xorriso, optv[i], eff_origin, 0);
if(ret<=0)
{ret= 0; goto ex;}
}
#endif /* NIX */
/* Evaluate target address */
ret= Xorriso_normalize_img_path(xorriso, destv[0], eff_dest, 1);
if(ret<0)
@ -5078,8 +5118,8 @@ int Xorriso_option_mvi(struct XorrisO *xorriso, int argc, char **argv,
/* Perform movements */
for(i= 0; i<optc; i++) {
ret= Xorriso_normalize_img_path(xorriso, optv[i], eff_origin, 0);
if(ret<=0)
{ret= 0; goto ex;}
if(ret<=0 || xorriso->request_to_abort)
goto problem_handler;
if(is_dir) {
leafname= strrchr(eff_origin, '/');
if(leafname==NULL)
@ -5092,19 +5132,23 @@ int Xorriso_option_mvi(struct XorrisO *xorriso, int argc, char **argv,
printf(xorriso->info_text, "Effective path gets much too long (%d)",
strlen(eff_dest)+strlen(leafname)+1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
{ret= 0; goto ex;}
goto problem_handler;
}
}
ret= Xorriso_rename(xorriso, eff_origin, eff_dest, 0);
if(ret<0)
goto ex;
if(ret==0)
was_failure= 1;
else {
sprintf(xorriso->info_text, "Renamed in ISO image: %s to %s\n",
Text_shellsafe(eff_origin,sfe,0),Text_shellsafe(eff_dest,sfe2,0));
Xorriso_info(xorriso, 0);
}
if(ret<=0 || xorriso->request_to_abort)
goto problem_handler;
sprintf(xorriso->info_text, "Renamed in ISO image: %s to %s\n",
Text_shellsafe(eff_origin,sfe,0),Text_shellsafe(eff_dest,sfe2,0));
Xorriso_info(xorriso, 0);
continue; /* regular bottom of loop */
problem_handler:;
was_failure= 1;
fret= Xorriso_eval_problem_status(xorriso, ret, 1|2);
if(fret>=0)
continue;
goto ex;
}
ret= !was_failure;
ex:;
@ -5135,7 +5179,7 @@ return:
<=0 error , 1 = success , 3 = end program run
*/
{
int ret,linecount= 0, argc;
int ret,linecount= 0, argc, was_failure= 0, fret;
FILE *fp= NULL;
char line[5*SfileadrL], shellsafe[5*SfileadrL];
char **argv= NULL;
@ -5168,22 +5212,32 @@ return:
if(flag&1) {
ret= Sfile_make_argv(xorriso->progname, line, &argc, &argv, 4|8);
if(ret<=0)
goto ex;
goto problem_handler;
ret= Xorriso_prescan_args(xorriso,argc,argv,1);
Sfile_make_argv("", "", &argc, &argv, 2); /* release memory */
if(ret==0)
{ret= 3; goto ex;}
if(ret<0)
goto ex;
goto problem_handler;
} else {
if(xorriso->is_dialog) {
sprintf(xorriso->info_text,"+ %d: %s\n",linecount,line);
Xorriso_info(xorriso,1);
}
ret= Xorriso_execute_option(xorriso,line,1|(1<<16));
if(ret<=0 || ret==3)
if(ret==3)
goto ex;
if(ret<=0)
goto problem_handler;
}
continue; /* regular bottom of loop */
problem_handler:;
was_failure= 1;
fret= Xorriso_eval_problem_status(xorriso, ret, 1);
if(fret>=0)
continue;
goto ex;
}
ex:;
Xorriso_reset_counters(xorriso,1);
@ -5195,7 +5249,9 @@ ex:;
linecount,shellsafe);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 1);
}
return(ret);
if(ret!=1)
return(ret);
return(!was_failure);
}
@ -5205,7 +5261,7 @@ int Xorriso_option_overwrite(struct XorrisO *xorriso, char *mode, int flag)
if(strcmp(mode, "off")==0)
xorriso->do_overwrite= 0;
else if(strcmp(mode, "on")==0)
xorriso->do_overwrite= 0;
xorriso->do_overwrite= 1;
else if(strcmp(mode, "nondir")==0)
xorriso->do_overwrite= 2;
else {
@ -5236,7 +5292,7 @@ int Xorriso_option_page(struct XorrisO *xorriso, int len, int width, int flag)
/* Option -path-list */
int Xorriso_option_path_list(struct XorrisO *xorriso, char *adr, int flag)
{
int ret,linecount= 0, insertcount= 0, null= 0;
int ret,linecount= 0, insertcount= 0, null= 0, was_failure= 0, fret= 0;
FILE *fp= NULL;
char *argpt, sfe[5*SfileadrL],line[SfileadrL];
@ -5261,21 +5317,32 @@ int Xorriso_option_path_list(struct XorrisO *xorriso, char *adr, int flag)
argpt= line;
null= 0;
ret= Xorriso_option_add(xorriso, 1, &argpt, &null, 1);
if(ret<=0)
goto ex;
if(ret<=0 || xorriso->request_to_abort)
goto problem_handler;
insertcount++;
continue; /* regular bottom of loop */
problem_handler:;
was_failure= 1;
fret= Xorriso_eval_problem_status(xorriso, ret, 1|2);
if(fret>=0)
continue;
goto ex;
}
ret= 1;
ex:;
if(ret<=0) {
sprintf(xorriso->info_text, "Aborted reading of file %s in line number %d",
Text_shellsafe(adr, sfe, 0), linecount);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
(fret==-2 ? "NOTE" : "SORRY"), 0);
}
sprintf(xorriso->info_text, "Added %d items from file %s\n",
insertcount, Text_shellsafe(adr, sfe, 0));
Xorriso_info(xorriso,0);
return(ret);
if(ret<=0)
return(ret);
return(!was_failure);
}
@ -5436,7 +5503,7 @@ int Xorriso_option_report_about(struct XorrisO *xorriso, char *severity,
int Xorriso_option_rmi(struct XorrisO *xorriso, int argc, char **argv,
int *idx, int flag)
{
int i, ret, end_idx;
int i, ret, end_idx, was_failure= 0, fret;
char path[SfileadrL], eff_path[SfileadrL];
int optc= 0;
char **optv= NULL;
@ -5446,31 +5513,41 @@ int Xorriso_option_rmi(struct XorrisO *xorriso, int argc, char **argv,
goto ex;
for(i= 0; i<optc; i++) {
if(Sfile_str(path,optv[i],0)<=0)
{ret= -1; goto ex;}
{ret= -1; goto problem_handler;}
if(path[0]!='/') {
ret= Sfile_prepend_path(xorriso->wdi, path, 0);
if(ret<=0)
goto ex;
goto problem_handler;
}
ret= Xorriso_normalize_img_path(xorriso, path, eff_path, 2);
if(ret<=0)
return(ret);
goto problem_handler;
strcpy(path, eff_path);
ret= Xorriso_rmi(xorriso, NULL, path, flag&(1|2));
if(ret<=0)
goto ex;
if(ret<=0 || xorriso->request_to_abort)
goto problem_handler;
if(ret<3) {
sprintf(xorriso->info_text, "Removed from ISO image: %s '%s'\n",
((flag&2) ? "directory" : (ret>1 ? "subtree" : "file")), path);
Xorriso_info(xorriso, 0);
}
continue; /* regular bottom of loop */
problem_handler:;
was_failure= 1;
fret= Xorriso_eval_problem_status(xorriso, ret, 1|2);
if(fret>=0)
continue;
goto ex;
}
ret= 1;
ex:;
(*idx)= end_idx;
Xorriso_opt_args(xorriso, argc, argv, *idx, &end_idx, &optc, &optv, 256);
return(ret);
if(ret<=0)
return(ret);
return(!was_failure);
}
@ -6207,7 +6284,7 @@ int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv,
/** Load content startup files into preskin cache */
int Xorriso_read_rc(struct XorrisO *xorriso, int flag)
{
int ret,i;
int ret,i,was_failure= 0,fret;
i= xorriso->rc_filename_count-1;
Sfile_home_adr_s(".xorrisorc", xorriso->rc_filenames[i],
@ -6217,10 +6294,17 @@ int Xorriso_read_rc(struct XorrisO *xorriso, int flag)
if(ret!=1)
continue;
ret= Xorriso_option_options_from_file(xorriso,xorriso->rc_filenames[i],0);
if(ret!=1)
if(ret>1)
return(ret);
if(ret==1)
continue; /* regular bottom of loop */
was_failure= 1;
fret= Xorriso_eval_problem_status(xorriso, ret, 1);
if(fret>=0)
continue;
return(ret);
}
return(1);
return(!was_failure);
}