]> git.wh0rd.org - dump.git/blob - compat/lib/compaterr.c
Copyright notice for Alcôve, for paying me to work on dump...
[dump.git] / compat / lib / compaterr.c
1 /*
2 * Ported to Linux's Second Extended File System as part of the
3 * dump and restore backup suit
4 * Remy Card <card@Linux.EU.Org>, 1994-1997
5 * Stelian Pop <pop@cybercable.fr>, 1999-2000
6 * Stelian Pop <pop@cybercable.fr> - Alcôve <www.alcove.fr>, 2000
7 */
8
9 /*-
10 * Copyright (c) 1993
11 * The Regents of the University of California. All rights reserved.
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
21 * 3. All advertising materials mentioning features or use of this software
22 * must display the following acknowledgement:
23 * This product includes software developed by the University of
24 * California, Berkeley and its contributors.
25 * 4. Neither the name of the University nor the names of its contributors
26 * may be used to endorse or promote products derived from this software
27 * without specific prior written permission.
28 *
29 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
30 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 * SUCH DAMAGE.
40 */
41
42 #ifndef lint
43 static const char rcsid[] =
44 "$Id: compaterr.c,v 1.6 2000/11/10 14:42:25 stelian Exp $";
45 #endif /* not lint */
46
47 #include <compaterr.h>
48 #include <errno.h>
49 #include <stdio.h>
50 #include <stdlib.h>
51 #include <string.h>
52
53 #include <stdarg.h>
54
55 #include <config.h>
56
57 extern char *__progname; /* Program name, from crt0. */
58
59 #if !defined(HAVE_ERR) || !defined(HAVE_ERRX) || !defined(HAVE_VERR) || !defined(HAVE_VERRX) || !defined(HAVE_VWARN) || !defined(HAVE_VWARNX) || !defined(HAVE_WARN) || !defined(HAVE_WARNX)
60
61 __BEGIN_DECLS
62 __dead void errc __P((int, int, const char *, ...));
63 __dead void verrc __P((int, int, const char *, _BSD_VA_LIST_));
64 void warnc __P((int, const char *, ...));
65 void vwarnc __P((int, const char *, _BSD_VA_LIST_));
66 void err_set_file __P((void *));
67 void err_set_exit __P((void (*)(int)));
68 __END_DECLS
69
70 static void (*err_exit)(int);
71
72 static FILE *err_file; /* file to use for error output */
73 /*
74 * This is declared to take a `void *' so that the caller is not required
75 * to include <stdio.h> first. However, it is really a `FILE *', and the
76 * manual page documents it as such.
77 */
78 void
79 err_set_file(void *fp)
80 {
81 if (fp)
82 err_file = fp;
83 else
84 err_file = stderr;
85 }
86
87 void
88 err_set_exit(void (*ef)(int))
89 {
90 err_exit = ef;
91 }
92
93 __dead void
94 errc(int eval, int code, const char *fmt, ...)
95 {
96 va_list ap;
97 va_start(ap, fmt);
98 verrc(eval, code, fmt, ap);
99 va_end(ap);
100 }
101
102 __dead void
103 verrc(int eval, int code, const char *fmt, va_list ap)
104 {
105 if (err_file == 0)
106 err_set_file((FILE *)0);
107 fprintf(err_file, "%s: ", __progname);
108 if (fmt != NULL) {
109 vfprintf(err_file, fmt, ap);
110 fprintf(err_file, ": ");
111 }
112 fprintf(err_file, "%s\n", strerror(code));
113 if (err_exit)
114 err_exit(eval);
115 exit(eval);
116 }
117
118 void
119 warnc(int code, const char *fmt, ...)
120 {
121 va_list ap;
122 va_start(ap, fmt);
123 vwarnc(code, fmt, ap);
124 va_end(ap);
125 }
126
127 void
128 vwarnc(int code, const char *fmt, va_list ap)
129 {
130 if (err_file == 0)
131 err_set_file((FILE *)0);
132 fprintf(err_file, "%s: ", __progname);
133 if (fmt != NULL) {
134 vfprintf(err_file, fmt, ap);
135 fprintf(err_file, ": ");
136 }
137 fprintf(err_file, "%s\n", strerror(code));
138 }
139 #endif
140
141 #ifndef HAVE_ERR
142 __dead void
143 err(int eval, const char *fmt, ...)
144 {
145 va_list ap;
146 va_start(ap, fmt);
147 verrc(eval, errno, fmt, ap);
148 va_end(ap);
149 }
150 #endif
151
152 #ifndef HAVE_VERR
153 __dead void
154 verr(int eval, const char *fmt, va_list ap)
155 {
156 verrc(eval, errno, fmt, ap);
157 }
158 #endif
159
160 #ifndef HAVE_ERRX
161 __dead void
162 errx(int eval, const char *fmt, ...)
163 {
164 va_list ap;
165 va_start(ap, fmt);
166 verrx(eval, fmt, ap);
167 va_end(ap);
168 }
169 #endif
170
171 #ifndef HAVE_VERRX
172 __dead void
173 verrx(int eval, const char *fmt, va_list ap)
174 {
175 if (err_file == 0)
176 err_set_file((FILE *)0);
177 fprintf(err_file, "%s: ", __progname);
178 if (fmt != NULL)
179 vfprintf(err_file, fmt, ap);
180 fprintf(err_file, "\n");
181 if (err_exit)
182 err_exit(eval);
183 exit(eval);
184 }
185 #endif
186
187 #ifndef HAVE_WARN
188 void
189 warn(const char *fmt, ...)
190 {
191 va_list ap;
192 va_start(ap, fmt);
193 vwarnc(errno, fmt, ap);
194 va_end(ap);
195 }
196 #endif
197
198 #ifndef HAVE_VWARN
199 void
200 vwarn(const char *fmt, va_list ap)
201 {
202 vwarnc(errno, fmt, ap);
203 }
204 #endif
205
206 #ifndef HAVE_WARNX
207 void
208 warnx(const char *fmt, ...)
209 {
210 va_list ap;
211 va_start(ap, fmt);
212 vwarnx(fmt, ap);
213 va_end(ap);
214 }
215 #endif
216
217 #ifndef HAVE_VWARNX
218 void
219 vwarnx(const char *fmt, va_list ap)
220 {
221 if (err_file == 0)
222 err_set_file((FILE *)0);
223 fprintf(err_file, "%s: ", __progname);
224 if (fmt != NULL)
225 vfprintf(err_file, fmt, ap);
226 fprintf(err_file, "\n");
227 }
228 #endif