summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/bsd/err.h24
-rw-r--r--src/err.c76
-rw-r--r--src/libbsd.map13
3 files changed, 113 insertions, 0 deletions
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 <sys/cdefs.h>
#if __has_include_next(<err.h>)
#include_next <err.h>
+#else
+#define LIBBSD_NEED_ERR_H_FUNCS
#endif
#else
#include <bsd/sys/cdefs.h>
#if __has_include(<err.h>)
#include <err.h>
+#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 <err.h>
+#ifdef LIBBSD_NEED_ERR_H_FUNCS
+#include <errno.h>
+#endif
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
@@ -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;