diff options
author | Guillem Jover <guillem@hadrons.org> | 2019-08-06 15:37:43 +0200 |
---|---|---|
committer | Guillem Jover <guillem@hadrons.org> | 2019-08-08 03:47:05 +0200 |
commit | 9628798d7d02e5f93b8dea02677676449a1ccd6c (patch) | |
tree | 14257edb56189317ca0f6fb804e24506dc94bf63 | |
parent | f34a5f71d92f5625875f16a883790de75dd4477d (diff) |
err: Rewrite warnc() and errc() family functions to be standalone
Do not depend on the system vwarn() and verr() functions to implement
the *c() variants, as the system might actually lack any of the <err.h>
BSD extensions.
-rw-r--r-- | COPYING | 2 | ||||
-rw-r--r-- | include/bsd/err.h | 8 | ||||
-rw-r--r-- | src/err.c | 38 |
3 files changed, 28 insertions, 20 deletions
@@ -81,7 +81,7 @@ Files: src/fgetln.c src/progname.c Copyright: - Copyright © 2005, 2008-2012 Guillem Jover <guillem@hadrons.org> + Copyright © 2005, 2008-2012, 2019 Guillem Jover <guillem@hadrons.org> Copyright © 2005 Hector Garcia Alvarez Copyright © 2005 Aurelien Jarno Copyright © 2006 Robert Millan diff --git a/include/bsd/err.h b/include/bsd/err.h index ff37e55..9e83260 100644 --- a/include/bsd/err.h +++ b/include/bsd/err.h @@ -43,15 +43,15 @@ #include <stdarg.h> __BEGIN_DECLS -void warnc(int code, const char *format, ...) - __printflike(2, 3); void vwarnc(int code, const char *format, va_list ap) __printflike(2, 0); +void warnc(int code, const char *format, ...) + __printflike(2, 3); -void errc(int status, int code, const char *format, ...) - __printflike(3, 4) __dead2; void verrc(int status, int code, const char *format, va_list ap) __printflike(3, 0) __dead2; +void errc(int status, int code, const char *format, ...) + __printflike(3, 4) __dead2; __END_DECLS #endif @@ -1,6 +1,6 @@ /* * Copyright © 2006 Robert Millan - * Copyright © 2011 Guillem Jover <guillem@hadrons.org> + * Copyright © 2011, 2019 Guillem Jover <guillem@hadrons.org> * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,8 +26,21 @@ */ #include <err.h> -#include <errno.h> +#include <string.h> #include <stdarg.h> +#include <stdlib.h> +#include <stdio.h> + +void +vwarnc(int code, const char *format, va_list ap) +{ + fprintf(stderr, "%s: ", getprogname()); + if (format) { + vfprintf(stderr, format, ap); + fprintf(stderr, ": "); + } + fprintf(stderr, "%s\n", strerror(code)); +} void warnc(int code, const char *format, ...) @@ -40,13 +53,15 @@ warnc(int code, const char *format, ...) } void -vwarnc(int code, const char *format, va_list ap) +verrc(int status, int code, const char *format, va_list ap) { - int tmp = errno; - - errno = code; - vwarn(format, ap); - errno = tmp; + fprintf(stderr, "%s: ", getprogname()); + if (format) { + vfprintf(stderr, format, ap); + fprintf(stderr, ": "); + } + fprintf(stderr, "%s\n", strerror(code)); + exit(status); } void @@ -58,10 +73,3 @@ errc(int status, int code, const char *format, ...) verrc(status, code, format, ap); va_end(ap); } - -void -verrc(int status, int code, const char *format, va_list ap) -{ - errno = code; - verr(status, format, ap); -} |