/*
* error.c -- main error handling routines
*
- * $Id$
+ * This code is Copyright (c) 2002, by the authors of nmh. See the
+ * COPYRIGHT file in the root directory of the nmh distribution for
+ * complete copyright information.
*/
#include <h/mh.h>
-#ifdef HAVE_WRITEV
-# include <sys/types.h>
-# include <sys/uio.h>
-#endif
-
-extern int errno;
+#include <sys/types.h>
+#include <sys/uio.h>
/*
* print out error message and exit
*/
void
-adios (char *what, char *fmt, ...)
+adios (char *what, const char *fmt, ...)
{
va_list ap;
/*
* main routine for printing error messages.
- *
- * Use writev() if available, for slightly better performance.
- * Why? Well, there are a couple of reasons. Primarily, it
- * gives a smoother output... More importantly though, it's a
- * sexy syscall()...
*/
void
-advertise (char *what, char *tail, char *fmt, va_list ap)
+advertise (char *what, char *tail, const char *fmt, va_list ap)
{
int eindex = errno;
-
-#ifdef HAVE_WRITEV
char buffer[BUFSIZ], err[BUFSIZ];
struct iovec iob[20], *iov;
-#endif
fflush (stdout);
-#ifdef HAVE_WRITEV
fflush (stderr);
iov = iob;
}
iov->iov_len = strlen (iov->iov_base = "\n");
iov++;
- writev (fileno (stderr), iob, iov - iob);
-#else
- if (invo_name && *invo_name)
- fprintf (stderr, "%s: ", invo_name);
- vfprintf (stderr, fmt, ap);
-
- if (what) {
- char *s;
-
- if (*what)
- fprintf (stderr, " %s: ", what);
- if ((s = strerror(eindex)))
- fprintf (stderr, "%s", s);
- else
- fprintf (stderr, "Error %d", eindex);
+ if (writev (fileno (stderr), iob, iov - iob) < 0) {
+ advise ("stderr", "writev");
}
- if (tail)
- fprintf (stderr, ", %s", tail);
- fputc ('\n', stderr);
-#endif
}