summaryrefslogtreecommitdiff
path: root/src/ourerr.cpp
blob: 0cdec072ab30a20e4c29f48b341f5db772444e4f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
 * =====================================================================================
 *
 *       Filename:  ourerr.c
 *
 *    Description:  Error handling code from Stevens Advanced Programming in the
 *    UNIX Environment. Appendix B page 682
 *
 *        Version:  1.0
 *        Created:  06/02/2014 10:50:05 AM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Martin Miller (), miller7@illinois.edu
 *   Organization:  
 *
 * =====================================================================================
 */

#include <errno.h>
#include <stdarg.h>
#include "ourhdr.hpp"
#include "ourerr.hpp"
static void err_doit(int, const char *, va_list);
char *pname = NULL;


/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  err_ret
 *  Description:  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;
}		/* -----  end of function err_ret  ----- */

/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  err_sys
 *  Description:  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(EXIT_FAILURE);
}		/* -----  end of function err_sys  ----- */

/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  err_dump
 *  Description:  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();
    exit(EXIT_FAILURE);
    return;
}		/* -----  end of function err_dump  ----- */

/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  err_msg
 *  Description:  Nonfatal error related 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;
}		/* -----  end of function err_msg  ----- */

/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  err_quit
 *  Description:  
 * =====================================================================================
 */
    void
err_quit ( const char *fmt, ... )
{
    va_list ap;

    va_start(ap,fmt);
    err_doit(0, fmt, ap);
    va_end(ap);

    exit(EXIT_FAILURE);
}		/* -----  end of function err_quit  ----- */
/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  err_doit
 *  Description:  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[ERRMAXLINE];
    
    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;
}		/* -----  end of function err_doit  ----- */