UNIX环境高级编程一书中示例程序经常使用的错误处理函数。
把这些函数保存到一个文件中,方便学习使用。
my_err.h
#include <errno.h>
#include <stdarg.h>
static void err_doit(int, const char*, va_list);
char *pname = NULL;
void err_ret(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(1, fmt, ap);
va_end(ap);
return ;
}
void err_sys(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(1, fmt, ap);
va_end(ap);
exit(1);
}
void err_dump(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(1, fmt, ap);
va_end(ap);
abort();
exit(1);
}
void err_msg(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(0, fmt, ap);
va_end(ap);
return ;
}
void err_quit(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(0, fmt, ap);
va_end(ap);
exit(1);
}
static void err_doit(int errnoflag, const char *fmt, va_list ap)
{
int errno_save;
char buf[MAXLINE];
errno_save = errno;
vsprintf(buf, fmt, ap);
if(errnoflag)
sprintf(buf+strlen(buf), ":%s", strerror(errno_save));
strcat(buf,"\n");
fflush(stdout);
fputs(buf, stderr);
fflush(NULL);
return ;
}
my_log.h
#include <errno.h>
#include <stdarg.h>
#include <syslog.h>
#include "ourhdr.h"
static void log_doit(int, int, const char*, va_list ap);
extern int debug;
void log_open(const char *ident, int option, int facility)
{
if(debug==0)
openlog(ident, option, facility);
}
void log_ret(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
log_doit(1, LOG_ERR, fmt, ap);
va_end(ap);
return ;
}
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);
}
void log_msg(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
log_doit(0, LOG_ERR, fmt, ap);
va_end(ap);
return ;
}
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);
}
static void log_doit(int errnoflag, int priority, const char *fmt, va_list ap)
{
int errno_save;
char buf[MAXLINE];
errno_save = errno;
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 ;
}