New option -errfile_log
This commit is contained in:
parent
e947bdece4
commit
69056e7a2b
@ -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
|
||||||
|
@ -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 {
|
||||||
|
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);
|
||||||
|
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 {
|
else {
|
||||||
sprintf(xorriso->info_text, "-iso_rr_pattern: unknown mode '%s'", mode);
|
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);
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||||
return(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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user