New option -errfile_log

This commit is contained in:
Thomas Schmitt 2008-02-23 10:28:58 +00:00
parent 5c83a138d4
commit a363e9a73c
3 changed files with 187 additions and 11 deletions

View File

@ -1374,6 +1374,26 @@ Show text at beginning of output line and
wait for the user to hit the Enter key wait for the user to hit the Enter key
resp. to send a line via stdin. resp. to send a line via stdin.
.TP .TP
\fB\-errfile_log\fR mode path|channel
.br
If problem events are related to input files from the filesystem, then their
disk_paths can be logged to a file or to output channels R or I.
.br
Mode can either be "plain" or "marked". The latter causes marker lines which
give the time of log start, burn session start, burn session end, log end
or program end. In mode "plain", only the file paths are logged.
.br
If path is "-" or "-R" then the log is directed to the result channel.
Path "-I" directs it to the info message channel. Any text that does not
begin with "-" is used as path for a file to append the log lines.
.br
Problematic files can be recorded multiple times during one program run.
If the program run aborts then the list might not be complete because
some input file arguments might not have been processed at all.
.br
The errfile paths are transported as messages of very low priority "ERRFILE".
This transport becomes visible with -report_about "ALL".
.TP
\fB\-end\fR \fB\-end\fR
.br .br
End program immediately End program immediately

View File

@ -1446,6 +1446,34 @@ completed:;
} }
/* @param flag bit0=with year and seconds
*/
char *Ftimetxt(time_t t, char timetext[40], int flag)
{
char *rpt;
struct tm tms, *tmpt;
static char months[12][4]= { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
tmpt= localtime_r(&t, &tms);
rpt= timetext;
rpt[0]= 0;
if(tmpt==0)
sprintf(rpt+strlen(rpt), "%12.f", (double) t);
else if (flag&1)
sprintf(rpt+strlen(rpt), "%2d %3s %4.4d %2.2d:%2.2d:%2.2d",
tms.tm_mday, months[tms.tm_mon], 1900+tms.tm_year,
tms.tm_hour, tms.tm_min, tms.tm_sec);
else if(time(NULL)-t < 180*86400 && time(NULL)-t >= 0)
sprintf(rpt+strlen(rpt), "%3s %2d %2.2d:%2.2d",
months[tms.tm_mon], tms.tm_mday, tms.tm_hour, tms.tm_min);
else
sprintf(rpt+strlen(rpt), "%3s %2d %4.4d",
months[tms.tm_mon], tms.tm_mday, 1900+tms.tm_year);
return(timetext);
}
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
@ -2719,6 +2747,8 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
Xorriso__text_to_sev(m->abort_on_text, &m->abort_on_severity, 0); Xorriso__text_to_sev(m->abort_on_text, &m->abort_on_severity, 0);
m->problem_status= 0; m->problem_status= 0;
m->problem_status_text[0]= 0; m->problem_status_text[0]= 0;
m->errfile_log[0]= 0;
m->errfile_fp= NULL;
strcpy(m->return_with_text, "SORRY"); strcpy(m->return_with_text, "SORRY");
Xorriso__text_to_sev(m->return_with_text, &m->return_with_severity, 0); Xorriso__text_to_sev(m->return_with_text, &m->return_with_severity, 0);
m->return_with_value= 32; m->return_with_value= 32;
@ -3798,6 +3828,11 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag)
Xorriso_status_result(xorriso,filter,fp,flag&2); Xorriso_status_result(xorriso,filter,fp,flag&2);
} }
is_default= (xorriso->errfile_log[0]==0);
sprintf(line,"-errfile_log %s\n",Text_shellsafe(xorriso->errfile_log,sfe,0));
if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2);
is_default= (xorriso->mark_text[0]==0); is_default= (xorriso->mark_text[0]==0);
sprintf(line,"-mark %s\n",Text_shellsafe(xorriso->mark_text,sfe,0)); sprintf(line,"-mark %s\n",Text_shellsafe(xorriso->mark_text,sfe,0));
if(!(is_default && no_defaults)) if(!(is_default && no_defaults))
@ -4889,10 +4924,12 @@ int Xorriso_get_problem_status(struct XorrisO *xorriso, char severity[80],
int Xorriso_set_problem_status(struct XorrisO *xorriso, char *severity, int Xorriso_set_problem_status(struct XorrisO *xorriso, char *severity,
int flag) int flag)
{ {
char *sev_text= "FATAL"; char *sev_text= "ALL";
int sev, ret; int sev, ret;
ret= Xorriso__text_to_sev(severity, &sev, 0); if(severity[0])
sev_text= severity;
ret= Xorriso__text_to_sev(sev_text, &sev, 0);
if(ret<=0) if(ret<=0)
return(0); return(0);
xorriso->problem_status= sev; xorriso->problem_status= sev;
@ -4905,6 +4942,57 @@ int Xorriso_set_problem_status(struct XorrisO *xorriso, char *severity,
} }
/* @param flag bit0-7= purpose
0= ERRFILE
1= mark line (only to be put out if enabled)
*/
int Xorriso_process_errfile(struct XorrisO *xorriso,
int error_code, char msg_text[], int os_errno,
int flag)
{
char ttx[41];
int purpose;
if(strlen(msg_text)>SfileadrL)
return(-1);
purpose= flag&255;
if(purpose==1 && !(xorriso->errfile_mode&1))
return(2);
if(xorriso->errfile_fp!=NULL) {
if(purpose==1)
fprintf(xorriso->errfile_fp, "----------------- %s %s\n",
msg_text, Ftimetxt(time(0), ttx, 1));
else
fprintf(xorriso->errfile_fp, "%s\n", msg_text);
fflush(xorriso->errfile_fp);
return(1);
}
if(xorriso->errfile_log[0]==0)
return(1);
if(strcmp(xorriso->errfile_log, "-")==0 ||
strcmp(xorriso->errfile_log, "-R")==0) {
if(purpose==1)
sprintf(xorriso->result_line, "----------------- %s %s\n",
msg_text, Ftimetxt(time(0), ttx, 1));
else
sprintf(xorriso->result_line, "%s\n", msg_text);
Xorriso_result(xorriso, 1);
return(1);
}
if(strcmp(xorriso->errfile_log, "-I")==0) {
if(purpose==1)
sprintf(xorriso->info_text, "ERRFILE_MARK=%s %s\n",
msg_text, Ftimetxt(time(0), ttx, 1));
else
sprintf(xorriso->info_text, "ERRFILE=%s", msg_text);
Xorriso_info(xorriso, 0);
return(1);
}
return(2);
}
/* Note: It is ok to submit xorriso->info_text as msg_text here. */ /* Note: It is ok to submit xorriso->info_text as msg_text here. */
/* flag: /* flag:
bit0= for Xorriso_info() : use pager (as with result) bit0= for Xorriso_info() : use pager (as with result)
@ -4926,6 +5014,9 @@ int Xorriso_msgs_submit(struct XorrisO *xorriso,
"xorriso : ", "libisofs: ", "libburn : ", "libisoburn: ", "xorriso : ", "libisofs: ", "libburn : ", "libisoburn: ",
"", "", "", "", "", "", "", "", "", "", "", "" }; "", "", "", "", "", "", "", "", "", "", "", "" };
if(strcmp(severity, "ERRFILE")==0)
Xorriso_process_errfile(xorriso, error_code, msg_text, os_errno, 0);
/* Set problem status */ /* Set problem status */
ret= Xorriso__text_to_sev(severity, &sev, 0); ret= Xorriso__text_to_sev(severity, &sev, 0);
if(ret<=0) if(ret<=0)
@ -5589,10 +5680,13 @@ int Xorriso_format_ls_l(struct XorrisO *xorriso, struct stat *stbuf, int flag)
{ {
char *rpt, perms[10]; char *rpt, perms[10];
mode_t st_mode; mode_t st_mode;
#ifdef NIX
time_t mtime; time_t mtime;
struct tm tms, *tmpt; struct tm tms, *tmpt;
static char months[12][4]= { "Jan", "Feb", "Mar", "Apr", "May", "Jun", static char months[12][4]= { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
#endif
rpt= xorriso->result_line; rpt= xorriso->result_line;
rpt[0]= 0; rpt[0]= 0;
@ -5623,6 +5717,10 @@ int Xorriso_format_ls_l(struct XorrisO *xorriso, struct stat *stbuf, int flag)
sprintf(rpt+strlen(rpt), "%-8lu ", (unsigned long) stbuf->st_uid); sprintf(rpt+strlen(rpt), "%-8lu ", (unsigned long) stbuf->st_uid);
sprintf(rpt+strlen(rpt), "%-8lu ", (unsigned long) stbuf->st_gid); sprintf(rpt+strlen(rpt), "%-8lu ", (unsigned long) stbuf->st_gid);
sprintf(rpt+strlen(rpt), "%8.f ", (double) stbuf->st_size); sprintf(rpt+strlen(rpt), "%8.f ", (double) stbuf->st_size);
#ifndef NIX
Ftimetxt(stbuf->st_mtime, rpt+strlen(rpt), 0);
#else
mtime= stbuf->st_mtime; mtime= stbuf->st_mtime;
tmpt= localtime_r(&mtime, &tms); tmpt= localtime_r(&mtime, &tms);
if(tmpt==0) if(tmpt==0)
@ -5633,6 +5731,8 @@ int Xorriso_format_ls_l(struct XorrisO *xorriso, struct stat *stbuf, int flag)
else else
sprintf(rpt+strlen(rpt), "%3s %2d %4.4d ", sprintf(rpt+strlen(rpt), "%3s %2d %4.4d ",
months[tms.tm_mon], tms.tm_mday, 1900+tms.tm_year); months[tms.tm_mon], tms.tm_mday, 1900+tms.tm_year);
#endif
return(1); return(1);
} }
@ -7402,7 +7502,9 @@ int Xorriso_option_commit(struct XorrisO *xorriso, int flag)
if(ret<=0) if(ret<=0)
return(2); return(2);
} }
Xorriso_process_errfile(xorriso, 0, "burn session start", 0, 1);
ret= Xorriso_write_session(xorriso, 0); ret= Xorriso_write_session(xorriso, 0);
Xorriso_process_errfile(xorriso, 0, "burn session end", 0, 1);
if(ret<=0) if(ret<=0)
return(ret); return(ret);
xorriso->volset_change_pending= 0; xorriso->volset_change_pending= 0;
@ -7734,20 +7836,47 @@ int Xorriso_option_end(struct XorrisO *xorriso, int flag)
} }
/* Option -iso_rr_pattern "on"|"ls"|"off" */ /* Option -errfile_log marked|plain path|-|"" */
int Xorriso_option_iso_rr_pattern(struct XorrisO *xorriso, char *mode,int flag) int Xorriso_option_errfile_log(struct XorrisO *xorriso,
char *mode, char *path, int flag)
{ {
if(strcmp(mode, "off")==0) int ret, mode_word;
xorriso->do_iso_rr_pattern= 0; FILE *fp= NULL;
else if(strcmp(mode, "on")==0) char sfe[5*SfileadrL];
xorriso->do_iso_rr_pattern= 1;
else if(strcmp(mode, "ls")==0) if(path[0]==0 || path[0]=='-') {
xorriso->do_iso_rr_pattern= 2; /* ok */;
else { } else {
sprintf(xorriso->info_text, "-iso_rr_pattern: unknown mode '%s'", mode); fp= fopen(path, "a");
if(fp==0) {
sprintf(xorriso->info_text, "-errfile_log: Cannot open file %s",
Text_shellsafe(path, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0); return(0);
} }
}
mode_word= xorriso->errfile_mode;
if(strcmp(mode, "marked")==0)
mode_word|= 1;
else if(strcmp(mode, "plain")==0)
mode_word&= ~1;
else {
sprintf(xorriso->info_text, "-errfile_log: Unknown mode %s",
Text_shellsafe(mode, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
Xorriso_process_errfile(xorriso, 0, "log end", 0, 1);
if(xorriso->errfile_fp!=NULL)
fclose(xorriso->errfile_fp);
xorriso->errfile_fp= fp;
xorriso->errfile_mode= mode_word;
ret= Sfile_str(xorriso->errfile_log, path, 0);
if(ret>0)
ret= Xorriso_process_errfile(xorriso, 0, "log start", 0, 1);
if(ret<=0)
return(ret);
return(1); return(1);
} }
@ -8343,6 +8472,24 @@ int Xorriso_option_history(struct XorrisO *xorriso, char *line, int flag)
} }
/* Option -iso_rr_pattern "on"|"ls"|"off" */
int Xorriso_option_iso_rr_pattern(struct XorrisO *xorriso, char *mode,int flag)
{
if(strcmp(mode, "off")==0)
xorriso->do_iso_rr_pattern= 0;
else if(strcmp(mode, "on")==0)
xorriso->do_iso_rr_pattern= 1;
else if(strcmp(mode, "ls")==0)
xorriso->do_iso_rr_pattern= 2;
else {
sprintf(xorriso->info_text, "-iso_rr_pattern: unknown mode '%s'", mode);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
return(1);
}
/* Option -joliet "on"|"off" */ /* Option -joliet "on"|"off" */
int Xorriso_option_joliet(struct XorrisO *xorriso, char *mode, int flag) int Xorriso_option_joliet(struct XorrisO *xorriso, char *mode, int flag)
{ {
@ -9619,6 +9766,10 @@ next_command:;
if(end_ret!=2) if(end_ret!=2)
{ret= 3; goto ex;} {ret= 3; goto ex;}
} else if(strcmp(cmd,"errfile_log")==0) {
(*idx)+= 2;
ret= Xorriso_option_errfile_log(xorriso, arg1, arg2, 0);
} else if(strcmp(cmd,"iso_rr_pattern")==0) { } else if(strcmp(cmd,"iso_rr_pattern")==0) {
(*idx)++; (*idx)++;
ret= Xorriso_option_iso_rr_pattern(xorriso, arg1, 0); ret= Xorriso_option_iso_rr_pattern(xorriso, arg1, 0);
@ -10237,6 +10388,7 @@ end_sucessfully:;
Xorriso_option_end(xorriso, 2); Xorriso_option_end(xorriso, 2);
Xorriso_process_msg_queues(xorriso, 0); Xorriso_process_msg_queues(xorriso, 0);
ret= Xorriso_make_return_value(xorriso, 0); ret= Xorriso_make_return_value(xorriso, 0);
Xorriso_process_errfile(xorriso, 0, "xorriso end", 0, 1);
Xorriso_destroy(&xorriso,1); Xorriso_destroy(&xorriso,1);
exit(ret); exit(ret);
} }

View File

@ -174,6 +174,10 @@ struct XorrisO { /* the global context of xorriso */
int problem_status; /* Severity rank number. 0= no abort condition present */ int problem_status; /* Severity rank number. 0= no abort condition present */
char problem_status_text[20]; char problem_status_text[20];
char errfile_log[SfileadrL]; /* for -errfile_log */
int errfile_mode; /* bit0= marked */
FILE *errfile_fp;
char return_with_text[20]; char return_with_text[20];
int return_with_severity; int return_with_severity;
int return_with_value; int return_with_value;