diff --git a/include/bsd/err.h b/include/bsd/err.h index 9e83260..adf08f6 100644 --- a/include/bsd/err.h +++ b/include/bsd/err.h @@ -29,11 +29,15 @@ #include #if __has_include_next() #include_next +#else +#define LIBBSD_NEED_ERR_H_FUNCS #endif #else #include #if __has_include() #include +#else +#define LIBBSD_NEED_ERR_H_FUNCS #endif #endif @@ -52,6 +56,26 @@ 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; + +#ifdef LIBBSD_NEED_ERR_H_FUNCS +void vwarn(const char *format, va_list ap) + __printflike(1, 0); +void vwarnx(const char *format, va_list ap) + __printflike(1, 0); +void warn(const char *format, ...) + __printflike(1, 2); +void warnx(const char *format, ...) + __printflike(1, 2); + +void verr(int status, const char *format, va_list ap) + __printflike(2, 0) __dead2; +void verrx(int status, const char *format, va_list ap) + __printflike(2, 0) __dead2; +void err(int status, const char *format, ...) + __printflike(2, 3) __dead2; +void errx(int status, const char *format, ...) + __printflike(2, 3) __dead2; +#endif __END_DECLS #endif diff --git a/src/err.c b/src/err.c index 45f1b61..8f09972 100644 --- a/src/err.c +++ b/src/err.c @@ -26,6 +26,9 @@ */ #include +#ifdef LIBBSD_NEED_ERR_H_FUNCS +#include +#endif #include #include #include @@ -73,3 +76,76 @@ errc(int status, int code, const char *format, ...) verrc(status, code, format, ap); va_end(ap); } + +#ifdef LIBBSD_NEED_ERR_H_FUNCS +void +vwarn(const char *format, va_list ap) +{ + vwarnc(errno, format, ap); +} + +void +warn(const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + vwarnc(errno, format, ap); + va_end(ap); +} + +void +vwarnx(const char *format, va_list ap) +{ + fprintf(stderr, "%s: ", getprogname()); + if (format) + vfprintf(stderr, format, ap); + fprintf(stderr, "\n"); +} + +void +warnx(const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + vwarnx(format, ap); + va_end(ap); +} + +void +verr(int status, const char *format, va_list ap) +{ + verrc(status, errno, format, ap); +} + +void +err(int status, const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + verrc(status, errno, format, ap); + va_end(ap); +} + +void +verrx(int eval, const char *format, va_list ap) +{ + fprintf(stderr, "%s: ", getprogname()); + if (format) + vfprintf(stderr, format, ap); + fprintf(stderr, "\n"); + exit(eval); +} + +void +errx(int eval, const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + verrx(eval, format, ap); + va_end(ap); +} +#endif diff --git a/src/libbsd.map b/src/libbsd.map index ce36040..caa5cd1 100644 --- a/src/libbsd.map +++ b/src/libbsd.map @@ -168,3 +168,16 @@ LIBBSD_0.9.1 { strnvis_netbsd; strnunvis_netbsd; } LIBBSD_0.9; + +LIBBSD_0.10.0 { + /* These BSD extensions are available on GNU systems, but not on other + * systems such as Windows or musl libc based ones. */ + vwarn; + vwarnx; + warn; + warnx; + verr; + verrx; + err; + errx; +} LIBBSD_0.9.1;