X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=report.c;h=5d9abb73a8332bb48d0fc13dc4afd54494869016;hb=2629c4511c68729d98acfd08637c1f00d3807f49;hp=3d4be02e34c8cabe49161625cfdcd3cee509366f;hpb=2da71d093af840881a9d19b847ff98a2e2b7a556;p=~andy%2Ffetchmail diff --git a/report.c b/report.c index 3d4be02e..5d9abb73 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. * @@ -43,12 +43,11 @@ 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; -/* This variable is incremented each time `report' is called. */ -static unsigned int report_message_count; - #ifdef _LIBC /* In the GNU C library, there is a predefined variable for this. */ @@ -126,13 +125,14 @@ report (FILE *errfp, message, va_alist) 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); @@ -147,15 +147,13 @@ report (FILE *errfp, message, va_alist) #endif fflush (errfp); } - ++report_message_count; } - -/* - * 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) { @@ -178,7 +176,7 @@ void report_init(int mode) #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 @@ -205,23 +203,11 @@ 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 ( ; ; ) { /* @@ -229,10 +215,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) @@ -244,6 +231,30 @@ report_build (FILE *errfp, message, va_alist) partial_message_size += 2048; partial_message = (char *)REALLOC (partial_message, partial_message_size); } +} +#endif + +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 +{ +#ifdef VA_START + va_list args; +#else + int n; +#endif + + rep_ensuresize(); + +#if defined(VA_START) + VA_START(args, message); + report_vbuild(message, args); + va_end(args); #else for ( ; ; ) { @@ -251,6 +262,9 @@ report_build (FILE *errfp, message, va_alist) partial_message_size - partial_message_size_used, message, a1, a2, a3, a4, a5, a6, a7, a8); + /* output error, f. i. EILSEQ */ + if (n < 0) break; + if (n >= 0 && (unsigned)n < partial_message_size - partial_message_size_used) { @@ -269,13 +283,22 @@ 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, ...) @@ -287,48 +310,16 @@ report_complete (FILE *errfp, message, va_alist) { #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); - } + VA_START(args, message); + report_vbuild(message, args); + va_end(args); #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); - } + report_build(errfp, message, a1, a2, a3, a4, a5, a6, a7, a8); #endif /* Finally... print it. */ @@ -338,13 +329,11 @@ report_complete (FILE *errfp, message, va_alist) { fputs(partial_message, errfp); fflush (errfp); - - ++report_message_count; } 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; @@ -404,7 +393,6 @@ report_at_line (FILE *errfp, errnum, file_name, line_number, message, va_alist) fprintf (errfp, message, a1, a2, a3, a4, a5, a6, a7, a8); #endif - ++report_message_count; if (errnum) fprintf (errfp, ": %s", strerror (errnum)); putc ('\n', errfp);