www.pudn.com > ph2.zip > error.c


#include  
#include  
#include "ourhdr.h" 
 
#define MAXLINE 100 
 
static void err_doit(int, const char *, va_list); 
char   *pname = 0;     /* caller can set this from argv[0] */ 
 
/* Fatal error related to a system call. 
 * Print a message and terminate. */ 
 
void err_sys(const char *fmt, ...) 
{ 
    va_list ap; 
    va_start(ap, fmt); 
    err_doit(1, fmt, ap); 
    va_end(ap); 
    exit(1); 
} 
 
/* Fatal error unrelated to a system call. 
 * Print a meesage and terminate. */ 
 
void err_quit(const char *fmt, ...) 
{ 
    va_list ap; 
    va_start(ap, fmt); 
    err_doit(0, fmt, ap); 
    va_end(ap); 
    exit(1); 
} 
 
/* 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, fmt, ap); 
    va_end(ap); 
    return; 
} 
 
/* Fatal error related to a system call. 
 * Print a message, dump core, and terminate. */ 
 
void err_dump(const char *fmt, ...) 
{ 
    va_list ap; 
    va_start(ap, fmt); 
    err_doit(1, fmt, ap); 
    va_end(ap); 
    abort();         /* dump core and terminate */ 
    exit(1);         /* shouldn't get here */ 
} 
 
/* Nonfatal error unrelated to a system call. 
 * Print a message and return. */ 
 
void err_msg(const char *fmt, ...) 
{ 
    va_list ap; 
    va_start(ap,fmt); 
    err_doit(0, fmt, ap); 
    va_end(ap); 
    return; 
} 
 
/* Print a message and return to caller. 
 * Caller specifies "errnoflag". */ 
 
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(0); 
    return; 
}