X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=report.c;h=b6101e406d7550c1b0be70c87a303344aea8e7cb;hb=f16d8d23439b5569f0c2e1af22494708b507f277;hp=f8a39f87f7f9e8abbb4be1720ceed28577cc7f9a;hpb=cf6664a9ac26e7d1f40afaca3e7c3520039d3645;p=~andy%2Ffetchmail diff --git a/report.c b/report.c index f8a39f87..b6101e40 100644 --- a/report.c +++ b/report.c @@ -1,4 +1,4 @@ -/* report.c -- report function for noninteractive utilities +/** \file report.c report function for noninteractive utilities * * For license terms, see the file COPYING in this directory. * @@ -16,24 +16,11 @@ #include #include #include -#if defined(HAVE_SYSLOG) #include -#endif -#include "i18n.h" +#include "gettext.h" #include "fetchmail.h" -#if defined(HAVE_VPRINTF) || defined(HAVE_DOPRNT) || defined(_LIBC) || defined(HAVE_STDARG_H) -# if HAVE_STDARG_H -# include -# define VA_START(args, lastarg) va_start(args, lastarg) -# else -# include -# define VA_START(args, lastarg) va_start(args) -# endif -#else -# define va_alist a1, a2, a3, a4, a5, a6, a7, a8 -# define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8; -#endif +#include #define MALLOC(n) xmalloc(n) #define REALLOC(n,s) xrealloc(n,s) @@ -43,45 +30,16 @@ static unsigned int partial_message_size = 0; static unsigned int partial_message_size_used = 0; static char *partial_message; +static int partial_suppress_tag = 0; + static unsigned unbuffered; static unsigned int use_syslog; -#ifdef _LIBC -/* In the GNU C library, there is a predefined variable for this. */ - -# define program_name program_invocation_name -# include - -#else - -# if !HAVE_STRERROR && !defined(strerror) -char *strerror (int errnum) -{ - extern char *sys_errlist[]; - extern int sys_nerr; - - if (errnum > 0 && errnum <= sys_nerr) - return sys_errlist[errnum]; - return GT_("Unknown system error"); -} -# endif /* HAVE_STRERROR */ -#endif /* _LIBC */ - /* Print the program name and error message MESSAGE, which is a printf-style format string with optional args. */ -/* VARARGS */ -void -#ifdef HAVE_STDARG_H -report (FILE *errfp, const char *message, ...) -#else -report (FILE *errfp, message, va_alist) - const char *message; - va_dcl -#endif +void report(FILE *errfp, const char *message, ...) { -#ifdef VA_START va_list args; -#endif /* If a partially built message exists, print it now so it's not lost. */ if (partial_message_size_used != 0) @@ -90,14 +48,11 @@ report (FILE *errfp, message, va_alist) report (errfp, GT_("%s (log message incomplete)\n"), partial_message); } -#if defined(HAVE_SYSLOG) if (use_syslog) { int priority; -#ifdef VA_START - VA_START (args, message); -#endif + va_start (args, message); priority = (errfp == stderr) ? LOG_ERR : LOG_INFO; #ifdef HAVE_VSYSLOG @@ -116,42 +71,31 @@ report (FILE *errfp, message, va_alist) } #endif -#ifdef VA_START va_end(args); -#endif } else /* i. e. not using syslog */ -#endif { - fflush (errfp); if ( *message == '\n' ) { fputc( '\n', errfp ); ++message; } - fprintf (errfp, "%s: ", program_name); + if (!partial_suppress_tag) + fprintf (errfp, "%s: ", program_name); + partial_suppress_tag = 0; -#ifdef VA_START - VA_START (args, message); -# if defined(HAVE_VPRINTF) || defined(_LIBC) + va_start (args, message); vfprintf (errfp, message, args); -# else - _doprnt (message, args, errfp); -# endif va_end (args); -#else - fprintf (errfp, message, a1, a2, a3, a4, a5, a6, a7, a8); -#endif fflush (errfp); } } - -/* - * Calling report_init(1) causes report_build and report_complete to write - * to errfp without buffering. This is needed for the ticker dots to - * work correctly. + +/** + * Configure the report module. The output is set according to + * \a mode. */ -void report_init(int mode) +void report_init(int mode /** 0: regular output, 1: unbuffered output, -1: syslog */) { switch(mode) { @@ -166,15 +110,13 @@ void report_init(int mode) use_syslog = FALSE; break; -#ifdef HAVE_SYSLOG case -1: /* syslogd */ unbuffered = FALSE; use_syslog = TRUE; break; -#endif /* HAVE_SYSLOG */ } } - + /* Build an report message by appending MESSAGE, which is a printf-style format string with optional args, to the existing report message (which may be empty.) The completed report message is finally printed (and reset to @@ -201,23 +143,10 @@ static void rep_ensuresize(void) { } } -void -#ifdef HAVE_STDARG_H -report_build (FILE *errfp, const char *message, ...) -#else -report_build (FILE *errfp, message, va_alist) - const char *message; - va_dcl -#endif +static void report_vbuild(const char *message, va_list args) { -#ifdef VA_START - va_list args; int n; -#endif - rep_ensuresize(); - -#if defined(VA_START) for ( ; ; ) { /* @@ -225,10 +154,11 @@ report_build (FILE *errfp, message, va_alist) * because vsnprintf() invokes va_arg macro and thus args is * undefined after the call. */ - VA_START(args, message); n = vsnprintf (partial_message + partial_message_size_used, partial_message_size - partial_message_size_used, message, args); - va_end (args); + + /* output error, f. i. EILSEQ */ + if (n < 0) break; if (n >= 0 && (unsigned)n < partial_message_size - partial_message_size_used) @@ -240,24 +170,17 @@ report_build (FILE *errfp, message, va_alist) partial_message_size += 2048; partial_message = (char *)REALLOC (partial_message, partial_message_size); } -#else - for ( ; ; ) - { - n = snprintf (partial_message + partial_message_size_used, - partial_message_size - partial_message_size_used, - message, a1, a2, a3, a4, a5, a6, a7, a8); +} - if (n >= 0 - && (unsigned)n < partial_message_size - partial_message_size_used) - { - partial_message_size_used += n; - break; - } +void report_build (FILE *errfp, const char *message, ...) +{ + va_list args; - partial_message_size += 2048; - partial_message = REALLOC (partial_message, partial_message_size); - } -#endif + rep_ensuresize(); + + va_start(args, message); + report_vbuild(message, args); + va_end(args); if (unbuffered && partial_message_size_used != 0) { @@ -265,67 +188,31 @@ report_build (FILE *errfp, message, va_alist) fputs(partial_message, errfp); } } - + +void report_flush(FILE *errfp) +{ + if (partial_message_size_used != 0) + { + partial_message_size_used = 0; + report(errfp, "%s", partial_message); + partial_suppress_tag = 1; + } +} + /* Complete a report message by appending MESSAGE, which is a printf-style format string with optional args, to the existing report message (which may be empty.) The completed report message is then printed (and reset to empty.) */ /* VARARGS */ - -void -#ifdef HAVE_STDARG_H -report_complete (FILE *errfp, const char *message, ...) -#else -report_complete (FILE *errfp, message, va_alist) - const char *message; - va_dcl -#endif +void report_complete (FILE *errfp, const char *message, ...) { -#ifdef VA_START va_list args; - int n; -#endif rep_ensuresize(); -#if defined(VA_START) - for ( ; ; ) - { - VA_START(args, message); - n = vsnprintf (partial_message + partial_message_size_used, - partial_message_size - partial_message_size_used, - message, args); - va_end(args); - - /* old glibc versions return -1 for truncation */ - if (n >= 0 - && (unsigned)n < partial_message_size - partial_message_size_used) - { - partial_message_size_used += n; - break; - } - - partial_message_size += 2048; - partial_message = (char *)REALLOC (partial_message, partial_message_size); - } -#else - for ( ; ; ) - { - n = snprintf (partial_message + partial_message_size_used, - partial_message_size - partial_message_size_used, - message, a1, a2, a3, a4, a5, a6, a7, a8); - - if (n >= 0 - && (unsigned)n < partial_message_size - partial_message_size_used) - { - partial_message_size_used += n; - break; - } - - partial_message_size += 2048; - partial_message = REALLOC (partial_message, partial_message_size); - } -#endif + va_start(args, message); + report_vbuild(message, args); + va_end(args); /* Finally... print it. */ partial_message_size_used = 0; @@ -338,28 +225,16 @@ report_complete (FILE *errfp, message, va_alist) else report(errfp, "%s", partial_message); } - + /* Sometimes we want to have at most one error per line. This variable controls whether this mode is selected or not. */ static int error_one_per_line; /* If errnum is nonzero, print its corresponding system error message. */ -void -#ifdef HAVE_STDARG_H -report_at_line (FILE *errfp, int errnum, const char *file_name, +void report_at_line (FILE *errfp, int errnum, const char *file_name, unsigned int line_number, const char *message, ...) -#else -report_at_line (FILE *errfp, errnum, file_name, line_number, message, va_alist) - int errnum; - const char *file_name; - unsigned int line_number; - const char *message; - va_dcl -#endif { -#ifdef VA_START va_list args; -#endif if (error_one_per_line) { @@ -386,17 +261,9 @@ report_at_line (FILE *errfp, errnum, file_name, line_number, message, va_alist) if (file_name != NULL) fprintf (errfp, "%s:%u: ", file_name, line_number); -#ifdef VA_START - VA_START (args, message); -# if defined(HAVE_VPRINTF) || defined(_LIBC) + va_start (args, message); vfprintf (errfp, message, args); -# else - _doprnt (message, args, errfp); -# endif va_end (args); -#else - fprintf (errfp, message, a1, a2, a3, a4, a5, a6, a7, a8); -#endif if (errnum) fprintf (errfp, ": %s", strerror (errnum));