]>
git.saurik.com Git - apple/libc.git/blob - gen/err-fbsd.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 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 #if defined(LIBC_SCCS) && !defined(lint)
35 static char sccsid
[] = "@(#)err.c 8.1 (Berkeley) 6/4/93";
36 #endif /* LIBC_SCCS and not lint */
37 #include <sys/cdefs.h>
38 __FBSDID("$FreeBSD: src/lib/libc/gen/err.c,v 1.13 2002/03/29 22:43:41 markm Exp $");
40 #include "namespace.h"
48 #include "un-namespace.h"
52 #endif /* __BLOCKS__ */
53 #include "libc_private.h"
55 #define ERR_EXIT_UNDEF 0
57 #define ERR_EXIT_BLOCK 1
58 #endif /* __BLOCKS__ */
59 #define ERR_EXIT_FUNC 2
64 #endif /* __BLOCKS__ */
69 #endif /* __BLOCKS__ */
72 #ifdef BUILDING_VARIANT
74 __private_extern__
FILE *_e_err_file
; /* file to use for error output */
75 __private_extern__
struct _e_err_exit _e_err_exit
;
76 __private_extern__
void _e_visprintf(FILE * __restrict
, const char * __restrict
, va_list);
78 #else /* !BUILDING_VARIANT */
80 __private_extern__
FILE *_e_err_file
= NULL
; /* file to use for error output */
81 __private_extern__
struct _e_err_exit _e_err_exit
= {ERR_EXIT_UNDEF
};
84 * zero means pass as is
85 * 255 means use \nnn (octal)
86 * otherwise use \x (x is value)
89 static unsigned char escape
[256] = {
90 /* NUL SOH STX ETX EOT ENQ ACK BEL */
91 0 , 255, 255, 255, 255, 255, 255, 'a',
92 /* BS HT NL VT NP CR SO SI */
93 'b', 't', 'n', 'v', 'f', 'r', 255, 255,
94 /* DLE DC1 DC2 DC3 DC4 NAK SYN ETB */
95 255, 255, 255, 255, 255, 255, 255, 255,
96 /* CAN EM SUB ESC FS GS RS US */
97 255, 255, 255, 255, 255, 255, 255, 255,
98 /* the rest are zero */
102 * Make characters visible. If we can't allocate enough
103 * memory, we fall back on vfprintf().
105 __private_extern__
void
106 _e_visprintf(FILE * __restrict stream
, const char * __restrict format
, va_list ap
)
113 vasprintf(&str
, format
, ap
);
115 if ((visstr
= malloc(4 * strlen(str
) + 1)) != NULL
) {
116 unsigned char *fp
= (unsigned char *)str
;
117 unsigned char *tp
= (unsigned char *)visstr
;
119 switch(escape
[*fp
]) {
124 sprintf(tp
, "\\%03o", *fp
);
135 fputs(visstr
, stream
);
143 vfprintf(stream
, format
, backup
);
148 * This is declared to take a `void *' so that the caller is not required
149 * to include <stdio.h> first. However, it is really a `FILE *', and the
150 * manual page documents it as such.
153 err_set_file(void *fp
)
158 _e_err_file
= stderr
;
162 err_set_exit(void (*ef
)(int))
164 _e_err_exit
.type
= ERR_EXIT_FUNC
;
165 _e_err_exit
.func
= ef
;
170 err_set_exit_b(void (^ef
)(int))
172 _e_err_exit
.type
= ERR_EXIT_BLOCK
;
173 _e_err_exit
.block
= Block_copy(ef
);
175 #endif /* __BLOCKS__ */
176 #endif /* !BUILDING_VARIANT */
178 __weak_reference(_err
, err
);
181 _err(int eval
, const char *fmt
, ...)
185 verrc(eval
, errno
, fmt
, ap
);
195 verrc(eval
, errno
, fmt
, ap
);
199 errc(int eval
, int code
, const char *fmt
, ...)
203 verrc(eval
, code
, fmt
, ap
);
208 verrc(eval
, code
, fmt
, ap
)
214 if (_e_err_file
== 0)
215 err_set_file((FILE *)0);
216 fprintf(_e_err_file
, "%s: ", _getprogname());
218 _e_visprintf(_e_err_file
, fmt
, ap
);
219 fprintf(_e_err_file
, ": ");
221 fprintf(_e_err_file
, "%s\n", strerror(code
));
222 if (_e_err_exit
.type
)
224 if (_e_err_exit
.type
== ERR_EXIT_BLOCK
)
225 _e_err_exit
.block(eval
);
227 #endif /* __BLOCKS__ */
228 _e_err_exit
.func(eval
);
233 errx(int eval
, const char *fmt
, ...)
237 verrx(eval
, fmt
, ap
);
247 if (_e_err_file
== 0)
248 err_set_file((FILE *)0);
249 fprintf(_e_err_file
, "%s: ", _getprogname());
251 _e_visprintf(_e_err_file
, fmt
, ap
);
252 fprintf(_e_err_file
, "\n");
253 if (_e_err_exit
.type
)
255 if (_e_err_exit
.type
== ERR_EXIT_BLOCK
)
256 _e_err_exit
.block(eval
);
258 #endif /* __BLOCKS__ */
259 _e_err_exit
.func(eval
);
263 __weak_reference(_warn
, warn
);
266 _warn(const char *fmt
, ...)
270 vwarnc(errno
, fmt
, ap
);
279 vwarnc(errno
, fmt
, ap
);
283 warnc(int code
, const char *fmt
, ...)
287 vwarnc(code
, fmt
, ap
);
292 vwarnc(code
, fmt
, ap
)
297 if (_e_err_file
== 0)
298 err_set_file((FILE *)0);
299 fprintf(_e_err_file
, "%s: ", _getprogname());
301 _e_visprintf(_e_err_file
, fmt
, ap
);
302 fprintf(_e_err_file
, ": ");
304 fprintf(_e_err_file
, "%s\n", strerror(code
));
308 warnx(const char *fmt
, ...)
321 if (_e_err_file
== 0)
322 err_set_file((FILE *)0);
323 fprintf(_e_err_file
, "%s: ", _getprogname());
325 _e_visprintf(_e_err_file
, fmt
, ap
);
326 fprintf(_e_err_file
, "\n");