/* * Error routines for programs that can run as a daemon. */ #include "apue.h" #include <errno.h> /* for definition of errno */ #include <stdarg.h> /* ISO C variable arguments */ #include <syslog.h> static void log_doit(int, int, const char *, va_list ap); /* * Caller must define and set this: nonzero if * interactive, zero if daemon */ extern int log_to_stderr;; /* * Initialize syslog(), is running as daemon. */ void log_open(const char *ident, int option, int facility) { if(log_to_stderr == 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); } /* * Fatal error realted 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); } /* * 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 */ vsnprintf(buf, MAXLINE, fmt, ap); if(errnoflag) snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s", strerror(errno_save)); strcat(buf, " "); if(log_to_stderr) { fflush(stdout); fputs(buf, stderr); fflush(stderr); } else { syslog(priority, buf); } }
本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。