Merge commit 'upstream/1.7.6p1'
[debian/sudo] / error.c
1 /*
2  * Copyright (c) 2004-2005 Todd C. Miller <Todd.Miller@courtesan.com>
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16
17 #include <config.h>
18
19 #include <sys/types.h>
20
21 #include <errno.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25
26 #include "missing.h"
27 #include "error.h"
28
29 static void _warning    __P((int, const char *, va_list));
30        void cleanup     __P((int));
31
32 void
33 #ifdef __STDC__
34 error(int eval, const char *fmt, ...)
35 #else
36 error(eval, fmt, va_alist)
37         int eval;
38         const char *fmt;
39         va_dcl
40 #endif
41 {
42         va_list ap;
43 #ifdef __STDC__
44         va_start(ap, fmt);
45 #else
46         va_start(ap);
47 #endif
48         _warning(1, fmt, ap);
49         va_end(ap);
50         cleanup(0);
51         exit(eval);
52 }
53
54 void
55 #ifdef __STDC__
56 errorx(int eval, const char *fmt, ...)
57 #else
58 errorx(eval, fmt, va_alist)
59         int eval;
60         const char *fmt;
61         va_dcl
62 #endif
63 {
64         va_list ap;
65 #ifdef __STDC__
66         va_start(ap, fmt);
67 #else
68         va_start(ap);
69 #endif
70         _warning(0, fmt, ap);
71         va_end(ap);
72         cleanup(0);
73         exit(eval);
74 }
75
76 void
77 #ifdef __STDC__
78 warning(const char *fmt, ...)
79 #else
80 warning(fmt, va_alist)
81         const char *fmt;
82         va_dcl
83 #endif
84 {
85         va_list ap;
86 #ifdef __STDC__
87         va_start(ap, fmt);
88 #else
89         va_start(ap);
90 #endif
91         _warning(1, fmt, ap);
92         va_end(ap);
93 }
94
95 void
96 #ifdef __STDC__
97 warningx(const char *fmt, ...)
98 #else
99 warningx(fmt, va_alist)
100         const char *fmt;
101         va_dcl
102 #endif
103 {
104         va_list ap;
105 #ifdef __STDC__
106         va_start(ap, fmt);
107 #else
108         va_start(ap);
109 #endif
110         _warning(0, fmt, ap);
111         va_end(ap);
112 }
113
114 static void
115 _warning(use_errno, fmt, ap)
116         int use_errno;
117         const char *fmt;
118         va_list ap;
119 {
120         int serrno = errno;
121
122         fputs(getprogname(), stderr);
123         if (fmt != NULL) {
124                 fputs(": ", stderr);
125                 vfprintf(stderr, fmt, ap);
126         }
127         if (use_errno) {
128             fputs(": ", stderr);
129             fputs(strerror(serrno), stderr);
130         }
131         putc('\n', stderr);
132 }