]> Pileus Git - ~andy/fetchmail/blobdiff - report.c
Better skip handling.
[~andy/fetchmail] / report.c
index f5c2110de1298905c2a282bd8971e196fa9728bd..3947eb235cac3ef05c42f8371243b02bee1f5765 100644 (file)
--- a/report.c
+++ b/report.c
@@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
  */
 
 #ifdef HAVE_CONFIG_H
-# include <config.h>
+# include "config.h"
 #endif
 
 #include <stdio.h>
@@ -31,12 +31,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #if defined(HAVE_SYSLOG)
 #include <syslog.h>
 #endif
-#if defined(HAVE_ALLOCA_H)
-#include <alloca.h>
-#endif
 
-#if HAVE_VPRINTF || HAVE_DOPRNT || _LIBC
-# if __STDC__
+#if HAVE_VPRINTF || HAVE_DOPRNT || _LIBC || HAVE_STDARG_H
+# if HAVE_STDARG_H
 #  include <stdarg.h>
 #  define VA_START(args, lastarg) va_start(args, lastarg)
 # else
@@ -55,13 +52,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 void exit ();
 #endif
 
-#include "fetchmail.h"
+#include "i18n.h"
 
-#ifndef _
-# define _(String) String
-#endif
+#include "fetchmail.h"
+#define MALLOC(n)      xmalloc(n)      
+#define REALLOC(n,s)   xrealloc(n,s)   
 
-/* If NULL, error will flush stdout, then print on stderr the program
+/* If NULL, error will flush stderr, then print on stderr the program
    name, a colon and a space.  Otherwise, error will call this
    function without parameters instead.  */
 void (*error_print_progname) (
@@ -75,6 +72,7 @@ static unsigned int partial_message_size = 0;
 static unsigned int partial_message_size_used = 0;
 static char *partial_message;
 static unsigned use_stderr;
+static unsigned int use_syslog;
 
 /* This variable is incremented each time `error' is called.  */
 unsigned int error_message_count;
@@ -91,13 +89,8 @@ unsigned int error_message_count;
    name of the executing program.  */
 extern char *program_name;
 
-# if HAVE_STRERROR
-#  ifndef strerror             /* On some systems, strerror is a macro */
-char *strerror ();
-#  endif
-# else
-static char *
-private_strerror (errnum)
+# if !HAVE_STRERROR && !defined(strerror)
+char *strerror (errnum)
      int errnum;
 {
   extern char *sys_errlist[];
@@ -107,24 +100,20 @@ private_strerror (errnum)
     return sys_errlist[errnum];
   return _("Unknown system error");
 }
-#  define strerror private_strerror
 # endif        /* HAVE_STRERROR */
 #endif /* _LIBC */
 
 /* Print the program name and error message MESSAGE, which is a printf-style
    format string with optional args.
-   If ERRNUM is nonzero, print its corresponding system error message.
-   Exit with status STATUS if it is nonzero.  */
+   If ERRNUM is nonzero, print its corresponding system error message. */
 /* VARARGS */
 
 void
-#if defined(VA_START) && __STDC__
-error (int status, int errnum, const char *message, ...)
+#ifdef HAVE_STDARG_H
+report (FILE *errfp, const char *message, ...)
 #else
-error (status, errnum, message, va_alist)
-     int status;
-     int errnum;
-     char *message;
+report (FILE *errfp, message, va_alist)
+     const char *message;
      va_dcl
 #endif
 {
@@ -136,7 +125,7 @@ error (status, errnum, message, va_alist)
   if (partial_message_size_used != 0)
     {
       partial_message_size_used = 0;
-      error (0, 0, "%s (log message incomplete)", partial_message);
+      report (errfp, 0, _("%s (log message incomplete)"), partial_message);
     }
 
 #if defined(HAVE_SYSLOG)
@@ -147,38 +136,12 @@ error (status, errnum, message, va_alist)
 #ifdef VA_START
       VA_START (args, message);
 #endif
-      priority = status? LOG_ALERT : errnum? LOG_ERR : LOG_INFO;
-
-      if (errnum > 0)
-        {
-         char *msg = alloca (strlen (message) + 5);
-
-         strcpy (msg, message);
-         strcat (msg, ": %m");
+      priority = (errfp == stderr) ? LOG_ERR : LOG_INFO;
 
-         errno = errnum;
-#ifdef HAVE_VSYSLOG
-         vsyslog (priority, msg, args);
-#else
-         {
-         char *a1 = va_arg(args, char *);
-         char *a2 = va_arg(args, char *);
-         char *a3 = va_arg(args, char *);
-         char *a4 = va_arg(args, char *);
-         char *a5 = va_arg(args, char *);
-         char *a6 = va_arg(args, char *);
-         char *a7 = va_arg(args, char *);
-         char *a8 = va_arg(args, char *);
-         syslog (priority, msg, a1, a2, a3, a4, a5, a6, a7, a8);
-         }
-#endif
-       }
-      else
-        {
 #ifdef HAVE_VSYSLOG
-         vsyslog (priority, message, args);
+      vsyslog (priority, message, args);
 #else
-         {
+      {
          char *a1 = va_arg(args, char *);
          char *a2 = va_arg(args, char *);
          char *a3 = va_arg(args, char *);
@@ -188,9 +151,8 @@ error (status, errnum, message, va_alist)
          char *a7 = va_arg(args, char *);
          char *a8 = va_arg(args, char *);
          syslog (priority, message, a1, a2, a3, a4, a5, a6, a7, a8);
-         }
+      }
 #endif
-       }
 
 #ifdef VA_START
       va_end(args);
@@ -203,71 +165,76 @@ error (status, errnum, message, va_alist)
        (*error_print_progname) ();
       else
        {
-         fflush (stdout);
+         fflush (errfp);
          if ( *message == '\n' )
            {
-             fputc( '\n', stderr );
+             fputc( '\n', errfp );
              ++message;
            }
-         fprintf (stderr, "%s: ", program_name);
+         fprintf (errfp, "%s: ", program_name);
        }
 
 #ifdef VA_START
       VA_START (args, message);
 # if HAVE_VPRINTF || _LIBC
-      vfprintf (stderr, message, args);
+      vfprintf (errfp, message, args);
 # else
-      _doprnt (message, args, stderr);
+      _doprnt (message, args, errfp);
 # endif
       va_end (args);
 #else
-      fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
+      fprintf (errfp, message, a1, a2, a3, a4, a5, a6, a7, a8);
 #endif
-
-      if (errnum) {
-       char *tmps = strerror(errnum);
-       if (tmps) {
-         fprintf (stderr, ": %s", tmps);
-       }
-       else {
-         fprintf (stderr, ": Error %d", errnum);
-       }
-      }
-      putc ('\n', stderr);
-      fflush (stderr);
+      fflush (errfp);
     }
   ++error_message_count;
-  if (status)
-    exit (status);
 }
 \f
 /*
- * Calling error_init(TRUE) causes error_build and error_complete to write
- * to stderr without buffering.  This is needed for the ticker dots to
+ * Calling report_init(1) causes error_build and error_complete to write
+ * to errfp without buffering.  This is needed for the ticker dots to
  * work correctly.
  */
-void error_init(foreground)
-int foreground;
+void report_init(int mode)
 {
-    use_stderr = foreground;
+    switch(mode)
+    {
+    case 0:                    /* errfp, buffered */
+    default:
+       use_stderr = FALSE;
+       use_syslog = FALSE;
+       break;
+
+    case 1:                    /* errfp, unbuffered */
+       use_stderr = TRUE;
+       use_syslog = FALSE;
+       break;
+
+#ifdef HAVE_SYSLOG
+    case -1:                   /* syslogd */
+       use_stderr = FALSE;
+       use_syslog = TRUE;
+       break;
+#endif /* HAVE_SYSLOG */
+    }
 }
 \f
 /* Build an error message by appending MESSAGE, which is a printf-style
    format string with optional args, to the existing error message (which may
    be empty.)  The completed error message is finally printed (and reset to
    empty) by calling error_complete().
-   If an intervening call to error() occurs when a partially constructed
+   If an intervening call to report() occurs when a partially constructed
    message exists, then, in an attempt to keep the messages in their proper
-   sequence, the partial message will be printed as-is (with a trailing newline)
-   before error() prints its message.
+   sequence, the partial message will be printed as-is (with a trailing 
+   newline) before report() prints its message. */
 /* VARARGS */
 
 void
-#if defined(VA_START) && __STDC__
-error_build (const char *message, ...)
+#ifdef HAVE_STDARG_H
+report_build (FILE *errfp, const char *message, ...)
 #else
-error_build (message, va_alist)
-     char *message;
+report_build (FILE *errfp, message, va_alist)
+     const char *message;
      va_dcl
 #endif
 {
@@ -281,13 +248,13 @@ error_build (message, va_alist)
     {
       partial_message_size_used = 0;
       partial_message_size = 2048;
-      partial_message = xmalloc (partial_message_size);
+      partial_message = MALLOC (partial_message_size);
     }
   else
     if (partial_message_size - partial_message_size_used < 1024)
       {
         partial_message_size += 2048;
-        partial_message = xrealloc (partial_message, partial_message_size);
+        partial_message = REALLOC (partial_message, partial_message_size);
       }
 
 #if defined(VA_START)
@@ -306,7 +273,7 @@ error_build (message, va_alist)
        }
 
       partial_message_size += 2048;
-      partial_message = xrealloc (partial_message, partial_message_size);
+      partial_message = REALLOC (partial_message, partial_message_size);
     }
 #else
   vsprintf (partial_message + partial_message_size_used, message, args);
@@ -316,7 +283,7 @@ error_build (message, va_alist)
   if (partial_message_size_used >= partial_message_size)
     {
       partial_message_size_used = 0;
-      error (PS_UNDEFINED, 0, "partial error message buffer overflow");
+      report (stderr, _("partial error message buffer overflow"));
     }
 #endif
   va_end (args);
@@ -335,7 +302,7 @@ error_build (message, va_alist)
        }
 
       partial_message_size += 2048;
-      partial_message = xrealloc (partial_message, partial_message_size);
+      partial_message = REALLOC (partial_message, partial_message_size);
     }
 #else
   sprintf (partial_message + partial_message_size_used, message, a1, a2, a3, a4, a5, a6, a7, a8);
@@ -344,7 +311,7 @@ error_build (message, va_alist)
   if ((partial_message_size_used = strlen (partial_message)) >= partial_message_size)
     {
       partial_message_size_used = 0;
-      error (PS_UNDEFINED, 0, "partial error message buffer overflow");
+      report (stderr, _("partial error message buffer overflow"));
     }
 #endif
 #endif
@@ -352,24 +319,22 @@ error_build (message, va_alist)
   if (use_stderr && partial_message_size_used != 0)
     {
       partial_message_size_used = 0;
-      fputs(partial_message, stderr);
+      fputs(partial_message, errfp);
     }
 }
 \f
 /* Complete an error message by appending MESSAGE, which is a printf-style
    format string with optional args, to the existing error message (which may
    be empty.)  The completed error message is then printed (and reset to
-   empty.)
+   empty.) */
 /* VARARGS */
 
 void
-#if defined(VA_START) && __STDC__
-error_complete (int status, int errnum, const char *message, ...)
+#ifdef HAVE_STDARG_H
+report_complete (FILE *errfp, const char *message, ...)
 #else
-error_complete (status, errnum, message, va_alist)
-     int status;
-     int errnum;
-     char *message;
+report_complete (FILE *errfp, message, va_alist)
+     const char *message;
      va_dcl
 #endif
 {
@@ -383,13 +348,13 @@ error_complete (status, errnum, message, va_alist)
     {
       partial_message_size_used = 0;
       partial_message_size = 2048;
-      partial_message = xmalloc (partial_message_size);
+      partial_message = MALLOC (partial_message_size);
     }
   else
     if (partial_message_size - partial_message_size_used < 1024)
       {
         partial_message_size += 2048;
-        partial_message = xrealloc (partial_message, partial_message_size);
+        partial_message = REALLOC (partial_message, partial_message_size);
       }
 
 #if defined(VA_START)
@@ -408,7 +373,7 @@ error_complete (status, errnum, message, va_alist)
        }
 
       partial_message_size += 2048;
-      partial_message = xrealloc (partial_message, partial_message_size);
+      partial_message = REALLOC (partial_message, partial_message_size);
     }
 #else
   vsprintf (partial_message + partial_message_size_used, message, args);
@@ -418,7 +383,7 @@ error_complete (status, errnum, message, va_alist)
   if (partial_message_size_used >= partial_message_size)
     {
       partial_message_size_used = 0;
-      error (PS_UNDEFINED, 0, "partial error message buffer overflow");
+      report (stderr, _("partial error message buffer overflow"));
     }
 #endif
   va_end (args);
@@ -437,7 +402,7 @@ error_complete (status, errnum, message, va_alist)
        }
 
       partial_message_size += 2048;
-      partial_message = xrealloc (partial_message, partial_message_size);
+      partial_message = REALLOC (partial_message, partial_message_size);
     }
 #else
   sprintf (partial_message + partial_message_size_used, message, a1, a2, a3, a4, a5, a6, a7, a8);
@@ -446,7 +411,7 @@ error_complete (status, errnum, message, va_alist)
   if ((partial_message_size_used = strlen (partial_message)) >= partial_message_size)
     {
       partial_message_size_used = 0;
-      error (PS_UNDEFINED, 0, "partial error message buffer overflow");
+      report (stderr, _("partial error message buffer overflow"));
     }
 #endif
 #endif
@@ -456,21 +421,13 @@ error_complete (status, errnum, message, va_alist)
 
   if (use_stderr)
     {
-      fputs(partial_message, stderr);
-
-      if (errnum)
-       fprintf (stderr, ": %s", strerror (errnum));
-
-      putc ('\n', stderr);
-      fflush (stderr);
+      fputs(partial_message, errfp);
+      fflush (errfp);
 
       ++error_message_count;
-
-      if (status)
-         exit(status);
     }
   else
-    error (status, errnum, "%s", partial_message);
+    report(errfp, "%s", partial_message);
 }
 \f
 /* Sometimes we want to have at most one error per line.  This
@@ -478,16 +435,15 @@ error_complete (status, errnum, message, va_alist)
 int error_one_per_line;
 
 void
-#if defined(VA_START) && __STDC__
-error_at_line (int status, int errnum, const char *file_name,
+#ifdef HAVE_STDARG_H
+report_at_line (FILE *errfp, int errnum, const char *file_name,
               unsigned int line_number, const char *message, ...)
 #else
-error_at_line (status, errnum, file_name, line_number, message, va_alist)
-     int status;
+report_at_line (FILE *errfp, errnum, file_name, line_number, message, va_alist)
      int errnum;
      const char *file_name;
      unsigned int line_number;
-     char *message;
+     const char *message;
      va_dcl
 #endif
 {
@@ -513,35 +469,33 @@ error_at_line (status, errnum, file_name, line_number, message, va_alist)
     (*error_print_progname) ();
   else
     {
-      fflush (stdout);
+      fflush (errfp);
       if ( *message == '\n' )
        {
-         fputc( '\n', stderr );
+         fputc( '\n', errfp );
          ++message;
        }
-      fprintf (stderr, "%s:", program_name);
+      fprintf (errfp, "%s:", program_name);
     }
 
   if (file_name != NULL)
-    fprintf (stderr, "%s:%d: ", file_name, line_number);
+    fprintf (errfp, "%s:%d: ", file_name, line_number);
 
 #ifdef VA_START
   VA_START (args, message);
 # if HAVE_VPRINTF || _LIBC
-  vfprintf (stderr, message, args);
+  vfprintf (errfp, message, args);
 # else
-  _doprnt (message, args, stderr);
+  _doprnt (message, args, errfp);
 # endif
   va_end (args);
 #else
-  fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
+  fprintf (errfp, message, a1, a2, a3, a4, a5, a6, a7, a8);
 #endif
 
   ++error_message_count;
   if (errnum)
-    fprintf (stderr, ": %s", strerror (errnum));
-  putc ('\n', stderr);
-  fflush (stderr);
-  if (status)
-    exit (status);
+    fprintf (errfp, ": %s", strerror (errnum));
+  putc ('\n', errfp);
+  fflush (errfp);
 }