]> Pileus Git - ~andy/fetchmail/blobdiff - report.c
Ready for the UIDL patch.
[~andy/fetchmail] / report.c
index 0dbfdf6ee4d24102984fac0bffac436fbe350c5c..86950dfdc6076af513ed99eccb101b5f32873b13 100644 (file)
--- a/report.c
+++ b/report.c
@@ -114,6 +114,27 @@ private_strerror (errnum)
    Exit with status STATUS if it is nonzero.  */
 /* VARARGS */
 
+#if !defined(HAVE_VSYSLOG) && !defined(VA_START)
+int vsyslog(priority, message, va_alist)
+int priority;
+char *message;
+va_dcl
+{
+    va_list args;
+  
+    char *string;
+  
+    string = (char *)malloc(LINELEN);
+    va_start(args);
+    vsprintf(string, message, args);
+    va_end(args);
+    syslog(priority, string);
+    free(string);
+}
+#endif
+
 void
 #if defined(VA_START) && __STDC__
 error (int status, int errnum, const char *message, ...)
@@ -258,8 +279,9 @@ error_build (message, va_alist)
         partial_message = xrealloc (partial_message, partial_message_size);
       }
 
-#if defined(VA_START) && (HAVE_VSNPRINTF || _LIBC)
+#if defined(VA_START)
   VA_START (args, message);
+#if HAVE_VSNPRINTF || _LIBC
   for ( ; ; )
     {
       n = vsnprintf (partial_message + partial_message_size_used,
@@ -275,6 +297,16 @@ error_build (message, va_alist)
       partial_message_size += 512;
       partial_message = xrealloc (partial_message, partial_message_size);
     }
+#else
+  partial_message_size_used += vsprintf (partial_message + partial_message_size_used, message, args);
+
+  /* Attempt to catch memory overwrites... */
+  if (partial_message_size_used >= partial_message_size)
+    {
+      partial_message_size_used = 0;
+      error (PS_UNDEFINED, 0, "partial error message buffer overflow");
+    }
+#endif
   va_end (args);
 #else
 #if HAVE_SNPRINTF
@@ -348,8 +380,9 @@ error_complete (status, errnum, message, va_alist)
         partial_message = xrealloc (partial_message, partial_message_size);
       }
 
-#if defined(VA_START) && (HAVE_VSNPRINTF || _LIBC)
+#if defined(VA_START)
   VA_START (args, message);
+#if HAVE_VSNPRINTF || _LIBC
   for ( ; ; )
     {
       n = vsnprintf (partial_message + partial_message_size_used,
@@ -365,6 +398,16 @@ error_complete (status, errnum, message, va_alist)
       partial_message_size += 512;
       partial_message = xrealloc (partial_message, partial_message_size);
     }
+#else
+  partial_message_size_used += vsprintf (partial_message + partial_message_size_used, message, args);
+
+  /* Attempt to catch memory overwrites... */
+  if (partial_message_size_used >= partial_message_size)
+    {
+      partial_message_size_used = 0;
+      error (PS_UNDEFINED, 0, "partial error message buffer overflow");
+    }
+#endif
   va_end (args);
 #else
 #if HAVE_SNPRINTF
@@ -396,23 +439,25 @@ error_complete (status, errnum, message, va_alist)
 #endif
 
   /* Finally... print it.  */
-  if (partial_message_size_used != 0)
+  partial_message_size_used = 0;
+
+  if (use_stderr)
     {
-      partial_message_size_used = 0;
-      if (use_stderr)
-      {
-         fputs(partial_message, stderr);
-         if (errnum)
-             fprintf (stderr, ": %s", strerror (errnum));
-         putc ('\n', stderr);
-         fflush (stderr);
-         ++error_message_count;
-         if (status)
-             exit(status);
-      }
-      else
-         error (status, errnum, "%s", partial_message);
+      fputs(partial_message, stderr);
+
+      if (errnum)
+       fprintf (stderr, ": %s", strerror (errnum));
+
+      putc ('\n', stderr);
+      fflush (stderr);
+
+      ++error_message_count;
+
+      if (status)
+         exit(status);
     }
+  else
+    error (status, errnum, "%s", partial_message);
 }
 \f
 /* Sometimes we want to have at most one error per line.  This