/** Error routines for programs that can run as a daemon.*/#include "apue.h"#include/* for definition of errno */#include /* ISO C variable arguments */#include 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.*/voidlog_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.*/voidlog_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.*/voidlog_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 voidlog_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, "\n"); if(log_to_stderr) { fflush(stdout); fputs(buf, stderr); fflush(stderr); } else { syslog(priority, buf); }}
本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:。