On Wed, Feb 15, 2023 at 03:24:30AM -0500, Laine Stump wrote: > Almost all occurences of err() are either immediately followed by > exit(EXIT_FAILURE), usage(argv[0]) (which itself then calls > exit(EXIT_FAILURE), or that is what's done immediately after returning > from the function that calls err(). Modify the errfn macro so that its > instantiations can include exit(EXIT_FAILURE) at the end, and use that > to create a new function die() that will log an error and then > exit. > > Signed-off-by: Laine Stump Reviewed-by: David Gibson > --- > log.c | 14 +++++++++----- > log.h | 1 + > 2 files changed, 10 insertions(+), 5 deletions(-) > > diff --git a/log.c b/log.c > index 6dc6673..2920aba 100644 > --- a/log.c > +++ b/log.c > @@ -44,7 +44,7 @@ static char log_header[BUFSIZ]; /* File header, written back on cuts */ > static time_t log_start; /* Start timestamp */ > int log_trace; /* --trace mode enabled */ > > -#define logfn(name, level) \ > +#define logfn(name, level, doexit) \ > void name(const char *format, ...) { \ > struct timespec tp; \ > va_list args; \ > @@ -74,6 +74,9 @@ void name(const char *format, ...) { \ > if (format[strlen(format)] != '\n') \ > fprintf(stderr, "\n"); \ > } \ > + \ > + if (doexit) \ > + exit(EXIT_FAILURE); \ > } > > /* Prefixes for log file messages, indexed by priority */ > @@ -86,10 +89,11 @@ const char *logfile_prefix[] = { > " ", /* LOG_DEBUG */ > }; > > -logfn(err, LOG_ERR) > -logfn(warn, LOG_WARNING) > -logfn(info, LOG_INFO) > -logfn(debug, LOG_DEBUG) > +logfn(die, LOG_ERR, 1) > +logfn(err, LOG_ERR, 0) > +logfn(warn, LOG_WARNING, 0) > +logfn(info, LOG_INFO, 0) > +logfn(debug,LOG_DEBUG, 0) > > /** > * trace_init() - Set log_trace depending on trace (debug) mode > diff --git a/log.h b/log.h > index 987dc17..d4e9d85 100644 > --- a/log.h > +++ b/log.h > @@ -10,6 +10,7 @@ > #define LOGFILE_CUT_RATIO 30 /* When full, cut ~30% size */ > #define LOGFILE_SIZE_MIN (5UL * MAX(BUFSIZ, PAGE_SIZE)) > > +void die(const char *format, ...); > void err(const char *format, ...); > void warn(const char *format, ...); > void info(const char *format, ...); -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson