-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy patherror.c
129 lines (112 loc) · 2.32 KB
/
error.c
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
#include "apue.h"
#include <errno.h> /* for definition of errno */
#include <stdarg.h> /* ISO C variable aruments */
static void err_doit (int, int, const char *, va_list);
/*
* 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, errno, fmt, ap);
va_end (ap);
}
/*
* 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, errno, fmt, ap);
va_end (ap);
exit (1);
}
/*
* Nonfatal error unrelated to a system call.
* Error code passed as explict parameter.
* Print a message and return.
*/
void
err_cont (int error, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
err_doit (1, error, fmt, ap);
va_end (ap);
}
/*
* Fatal error unrelated to a system call.
* Error code passed as explict parameter.
* Print a message and terminate.
*/
void
err_exit (int error, const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
err_doit (1, error, fmt, ap);
va_end (ap);
exit (1);
}
/*
* 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, errno, 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, 0, fmt, ap);
va_end (ap);
}
/*
* Fatal error unrelated to a system call.
* Print a message and terminate.
*/
void
err_quit (const char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
err_doit (0, 0, fmt, ap);
va_end (ap);
exit (1);
}
/*
* Print a message and return to caller.
* Caller specifies "errnoflag".
*/
static void
err_doit (int errnoflag, int error, const char *fmt, va_list ap)
{
char buf[MAXLINE];
vsnprintf (buf, MAXLINE - 1, fmt, ap);
if (errnoflag)
snprintf (buf + strlen (buf), MAXLINE - strlen (buf) - 1, ": %s",
strerror (error));
strcat (buf, "\n");
fflush (stdout); /* in case stdout and stderr are the same */
fputs (buf, stderr);
fflush (NULL); /* flushes all stdio output streams */
}