/* Error routines for programs that can run as a daemon. */ #include /* for definition of errno */ #include /* ANSI C header file */ #include #include "ourhdr.h" static void log_doit(int, int, const char *, va_list ap); extern int debug; /* caller must define and set this: nonzero if interactive, zero if daemon */ /* Initialize syslog(), if running as daemon. */ void log_open(const char *ident, int option, int facility) { if (debug == 0) openlog(ident, option, facility); } /* Nonfatal error related to a system call. * Print a message with the system's errno value and return. */ void log_ret(const char *fmt, ...) { va_list ap; va_start(ap, fmt); log_doit(1, LOG_ERR, fmt, ap); va_end(ap); return; } /* Fatal error related to a system call. * Print a message and terminate. */ void log_sys(const char *fmt, ...) { va_list ap; va_start(ap, fmt); log_doit(1, LOG_ERR, fmt, ap); va_end(ap); exit(2); } /* Nonfatal error unrelated to a system call. * Print a message and return. */ void log_msg(const char *fmt, ...) { va_list ap; va_start(ap, fmt); log_doit(0, LOG_ERR, fmt, ap); va_end(ap); return; } /* Fatal error unrelated to a system call. * Print a message and terminate. */ void log_quit(const char *fmt, ...) { va_list ap; va_start(ap, fmt); log_doit(0, LOG_ERR, fmt, ap); va_end(ap); exit(2); } /* Print a message and return to caller. * Caller specifies "errnoflag" and "priority". */ static void log_doit(int errnoflag, int priority, const char *fmt, va_list ap) { int errno_save; char buf[MAXLINE]; errno_save = errno; /* value caller might want printed */ vsprintf(buf, fmt, ap); if (errnoflag) sprintf(buf+strlen(buf), ": %s", strerror(errno_save)); strcat(buf, "\n"); if (debug) { fflush(stdout); fputs(buf, stderr); fflush(stderr); } else syslog(priority, buf); return; }