1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
#include "unp.h"
#include <stdarg.h> /* ANSI C header file */
#include <syslog.h> /* for syslog() */
int daemon_proc; /* set non-zero by daemon_init() */
static void err_doit(int, int, const char *, va_list);
/* Nonfatal error related to a system call.
* Print a message and return */
void err_ret(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
err_doit(1, LOG_INFO, fmt, ap);
va_end(ap);
return;
}
void err_sys(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
err_doit(1, LOG_ERR, fmt, ap);
va_end(ap);
return;
}
void err_dump(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
err_doit(1, LOG_ERR, fmt, ap);
va_end(ap);
abort(); //dump core and terminate
exit(1); // Hopefully doesn't get here
}
void err_msg(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
err_doit(0, LOG_INFO, fmt, ap);
va_end(ap);
return;
}
void err_quit(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
err_doit(0, LOG_ERR, fmt, ap);
va_end(ap);
exit(1);
}
/* Print a message and return to caller.
* Caller specifies "errnoflag" and "level" */
static void err_doit(int errnoflag, int level, const char *fmt, va_list ap) {
int errno_save, n;
char buf[MAXLINE];
errno_save = errno; //Value caller might want printed
#ifdef HAVE_VSNPRINTF
vsnprintf(buf, sizeof(buf), fmt, ap); // This is safe
#endif
n = strlen(buf);
if (errnoflag)
vsnprintf(buf + n, sizeof(buf) - n, " : %s", strerror(errno_save) );
strcat(buf, "\n");
if (daemon_proc) {
syslog(level, buf);
} else {
fflush(stdout); //incase stdout and stderr are the same
fputs(buf, stderr);
fflush(stderr);
}
return;
}
|