]>
git.saurik.com Git - apple/libc.git/blob - gen/FreeBSD/err.c
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 4. Neither the name of the University nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 #if defined(LIBC_SCCS) && !defined(lint)
31 static char sccsid
[] = "@(#)err.c 8.1 (Berkeley) 6/4/93";
32 #endif /* LIBC_SCCS and not lint */
33 #include <sys/cdefs.h>
34 __FBSDID("$FreeBSD: src/lib/libc/gen/err.c,v 1.15 2008/04/03 20:36:44 imp Exp $");
36 #include "namespace.h"
44 #include "un-namespace.h"
48 #endif /* __BLOCKS__ */
49 #include "libc_private.h"
51 #define ERR_EXIT_UNDEF 0
53 #define ERR_EXIT_BLOCK 1
54 #endif /* __BLOCKS__ */
55 #define ERR_EXIT_FUNC 2
60 #endif /* __BLOCKS__ */
65 #endif /* __BLOCKS__ */
68 #ifdef BUILDING_VARIANT
70 __private_extern__
FILE *_e_err_file
; /* file to use for error output */
71 __private_extern__
struct _e_err_exit _e_err_exit
;
72 __private_extern__
void _e_visprintf(FILE * __restrict
, const char * __restrict
, va_list);
74 #else /* !BUILDING_VARIANT */
76 __private_extern__
FILE *_e_err_file
= NULL
; /* file to use for error output */
77 __private_extern__
struct _e_err_exit _e_err_exit
= {ERR_EXIT_UNDEF
};
80 * zero means pass as is
81 * 255 means use \nnn (octal)
82 * otherwise use \x (x is value)
85 static const unsigned char escape
[256] = {
87 0, /* Unused: strings can't contain nulls */
88 /* SOH STX ETX EOT ENQ ACK BEL */
89 255, 255, 255, 255, 255, 255, 'a',
90 /* BS HT NL VT NP CR SO SI */
91 'b', 0, 0, 'v', 'f', 'r', 255, 255,
92 /* DLE DC1 DC2 DC3 DC4 NAK SYN ETB */
93 255, 255, 255, 255, 255, 255, 255, 255,
94 /* CAN EM SUB ESC FS GS RS US */
95 255, 255, 255, 255, 255, 255, 255, 255,
96 /* the rest are zero */
100 * Make characters visible. If we can't allocate enough
101 * memory, we fall back on vfprintf().
103 __private_extern__
void
104 _e_visprintf(FILE * __restrict stream
, const char * __restrict format
, va_list ap
)
111 vasprintf(&str
, format
, ap
);
113 if ((visstr
= malloc(4 * strlen(str
) + 1)) != NULL
) {
114 unsigned char *fp
= (unsigned char *)str
;
115 unsigned char *tp
= (unsigned char *)visstr
;
117 switch(escape
[*fp
]) {
122 sprintf((char *)tp
, "\\%03o", *fp
);
133 fputs(visstr
, stream
);
141 vfprintf(stream
, format
, backup
);
146 * This is declared to take a `void *' so that the caller is not required
147 * to include <stdio.h> first. However, it is really a `FILE *', and the
148 * manual page documents it as such.
151 err_set_file(void *fp
)
156 _e_err_file
= stderr
;
160 err_set_exit(void (*ef
)(int))
163 if (_e_err_exit
.type
== ERR_EXIT_BLOCK
) {
164 Block_release(_e_err_exit
.block
);
165 _e_err_exit
.block
= NULL
;
167 #endif /* __BLOCKS__ */
168 _e_err_exit
.type
= ef
? ERR_EXIT_FUNC
: ERR_EXIT_UNDEF
;
169 _e_err_exit
.func
= ef
;
174 err_set_exit_b(void (^ef
)(int))
176 if (_e_err_exit
.type
== ERR_EXIT_BLOCK
) {
177 Block_release(_e_err_exit
.block
);
179 _e_err_exit
.type
= ef
? ERR_EXIT_BLOCK
: ERR_EXIT_UNDEF
;
180 _e_err_exit
.block
= Block_copy(ef
);
182 #endif /* __BLOCKS__ */
183 #endif /* !BUILDING_VARIANT */
185 __weak_reference(_err
, err
);
188 _err(int eval
, const char *fmt
, ...)
192 verrc(eval
, errno
, fmt
, ap
);
202 verrc(eval
, errno
, fmt
, ap
);
206 errc(int eval
, int code
, const char *fmt
, ...)
210 verrc(eval
, code
, fmt
, ap
);
215 verrc(int eval
, int code
, const char *fmt
, va_list ap
)
217 if (_e_err_file
== 0)
218 err_set_file((FILE *)0);
219 fprintf(_e_err_file
, "%s: ", _getprogname());
221 _e_visprintf(_e_err_file
, fmt
, ap
);
222 fprintf(_e_err_file
, ": ");
224 fprintf(_e_err_file
, "%s\n", strerror(code
));
225 if (_e_err_exit
.type
) {
227 if (_e_err_exit
.type
== ERR_EXIT_BLOCK
) {
228 _e_err_exit
.block(eval
);
230 _e_err_exit
.func(eval
);
233 _e_err_exit
.func(eval
);
234 #endif /* __BLOCKS__ */
240 errx(int eval
, const char *fmt
, ...)
244 verrx(eval
, fmt
, ap
);
249 verrx(int eval
, const char *fmt
, va_list ap
)
251 if (_e_err_file
== 0)
252 err_set_file((FILE *)0);
253 fprintf(_e_err_file
, "%s: ", _getprogname());
255 _e_visprintf(_e_err_file
, fmt
, ap
);
256 fprintf(_e_err_file
, "\n");
257 if (_e_err_exit
.type
) {
259 if (_e_err_exit
.type
== ERR_EXIT_BLOCK
) {
260 _e_err_exit
.block(eval
);
262 _e_err_exit
.func(eval
);
265 _e_err_exit
.func(eval
);
266 #endif /* __BLOCKS__ */
271 __weak_reference(_warn
, warn
);
274 _warn(const char *fmt
, ...)
278 vwarnc(errno
, fmt
, ap
);
283 vwarn(const char *fmt
, va_list ap
)
285 vwarnc(errno
, fmt
, ap
);
289 warnc(int code
, const char *fmt
, ...)
293 vwarnc(code
, fmt
, ap
);
298 vwarnc(int code
, const char *fmt
, va_list ap
)
300 if (_e_err_file
== 0)
301 err_set_file((FILE *)0);
302 fprintf(_e_err_file
, "%s: ", _getprogname());
304 _e_visprintf(_e_err_file
, fmt
, ap
);
305 fprintf(_e_err_file
, ": ");
307 fprintf(_e_err_file
, "%s\n", strerror(code
));
311 warnx(const char *fmt
, ...)
320 vwarnx(const char *fmt
, va_list ap
)
322 if (_e_err_file
== 0)
323 err_set_file((FILE *)0);
324 fprintf(_e_err_file
, "%s: ", _getprogname());
326 _e_visprintf(_e_err_file
, fmt
, ap
);
327 fprintf(_e_err_file
, "\n");