diff options
Diffstat (limited to 'lib/libc/gen/err.c')
-rw-r--r-- | lib/libc/gen/err.c | 66 |
1 files changed, 48 insertions, 18 deletions
diff --git a/lib/libc/gen/err.c b/lib/libc/gen/err.c index 71cd1d9..bf7d347 100644 --- a/lib/libc/gen/err.c +++ b/lib/libc/gen/err.c @@ -49,7 +49,25 @@ static char sccsid[] = "@(#)err.c 8.1 (Berkeley) 6/4/93"; extern char *__progname; /* Program name, from crt0. */ -__dead void +static FILE *err_file; /* file to use for error output */ +static void (*err_exit)(int); + +void +err_set_file(void *fp) +{ + if (fp) + err_file = fp; + else + err_file = stderr; +} + +void +err_set_exit(void (*ef)(int)) +{ + err_exit = ef; +} + +void #ifdef __STDC__ err(int eval, const char *fmt, ...) #else @@ -69,7 +87,7 @@ err(eval, fmt, va_alist) va_end(ap); } -__dead void +void verr(eval, fmt, ap) int eval; const char *fmt; @@ -78,16 +96,20 @@ verr(eval, fmt, ap) int sverrno; sverrno = errno; - (void)fprintf(stderr, "%s: ", __progname); + if (! err_file) + err_set_file((FILE *)0); + (void)fprintf(err_file, "%s: ", __progname); if (fmt != NULL) { - (void)vfprintf(stderr, fmt, ap); - (void)fprintf(stderr, ": "); + (void)vfprintf(err_file, fmt, ap); + (void)fprintf(err_file, ": "); } - (void)fprintf(stderr, "%s\n", strerror(sverrno)); + (void)fprintf(err_file, "%s\n", strerror(sverrno)); + if(err_exit) + err_exit(eval); exit(eval); } -__dead void +void #if __STDC__ errx(int eval, const char *fmt, ...) #else @@ -107,16 +129,20 @@ errx(eval, fmt, va_alist) va_end(ap); } -__dead void +void verrx(eval, fmt, ap) int eval; const char *fmt; va_list ap; { - (void)fprintf(stderr, "%s: ", __progname); + if (! err_file) + err_set_file((FILE *)0); + (void)fprintf(err_file, "%s: ", __progname); if (fmt != NULL) - (void)vfprintf(stderr, fmt, ap); - (void)fprintf(stderr, "\n"); + (void)vfprintf(err_file, fmt, ap); + (void)fprintf(err_file, "\n"); + if (err_exit) + err_exit(eval); exit(eval); } @@ -147,12 +173,14 @@ vwarn(fmt, ap) int sverrno; sverrno = errno; - (void)fprintf(stderr, "%s: ", __progname); + if (! err_file) + err_set_file((FILE *)0); + (void)fprintf(err_file, "%s: ", __progname); if (fmt != NULL) { - (void)vfprintf(stderr, fmt, ap); - (void)fprintf(stderr, ": "); + (void)vfprintf(err_file, fmt, ap); + (void)fprintf(err_file, ": "); } - (void)fprintf(stderr, "%s\n", strerror(sverrno)); + (void)fprintf(err_file, "%s\n", strerror(sverrno)); } void @@ -179,8 +207,10 @@ vwarnx(fmt, ap) const char *fmt; va_list ap; { - (void)fprintf(stderr, "%s: ", __progname); + if (! err_file) + err_set_file((FILE *)0); + (void)fprintf(err_file, "%s: ", __progname); if (fmt != NULL) - (void)vfprintf(stderr, fmt, ap); - (void)fprintf(stderr, "\n"); + (void)vfprintf(err_file, fmt, ap); + (void)fprintf(err_file, "\n"); } |