*/
#ifdef HAVE_CONFIG_H
-# include <config.h>
+# include "config.h"
#endif
#include <stdio.h>
#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
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) (
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;
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[];
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 */
-#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, ...)
+#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
{
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)
{
int priority;
-# ifdef VA_START
+#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");
+#endif
+ priority = (errfp == stderr) ? LOG_ERR : LOG_INFO;
- errno = errnum;
-# ifdef VA_START
- vsyslog (priority, msg, args);
- va_end (args);
-# else
- syslog (priority, msg, a1, a2, a3, a4, a5, a6, a7, a8);
-# endif
- }
- else
- {
-# ifdef VA_START
- vsyslog (priority, message, args);
- va_end (args);
-# else
+#ifdef HAVE_VSYSLOG
+ vsyslog (priority, message, 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, message, a1, a2, a3, a4, a5, a6, a7, a8);
-# endif
- }
+ }
+#endif
+
+#ifdef VA_START
+ va_end(args);
+#endif
}
else
#endif
(*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)
- fprintf (stderr, ": %s", strerror (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
{
{
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)
}
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);
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);
}
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);
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
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
{
{
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)
}
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);
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);
}
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);
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
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
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
{
(*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);
}