X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=report.c;h=5d9abb73a8332bb48d0fc13dc4afd54494869016;hb=91644ff0b2e6eb3b26c5544a4a769ca4aaf08a14;hp=fa1ce4adf276b0ca86fad6adf50426459d37bc45;hpb=1cecbe2bc1a9f8b939facb007c6551fb77b1048a;p=~andy%2Ffetchmail diff --git a/report.c b/report.c index fa1ce4ad..5d9abb73 100644 --- a/report.c +++ b/report.c @@ -149,12 +149,11 @@ report (FILE *errfp, message, va_alist) } } -/* - * 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) { @@ -204,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 ( ; ; ) { /* @@ -228,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) @@ -243,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 ( ; ; ) { @@ -250,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) { @@ -295,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. */