aboutsummaryrefslogtreecommitdiff
path: root/compat/err.c
diff options
context:
space:
mode:
authorOmar Polo <op@omarpolo.com>2021-01-21 11:57:46 +0000
committerOmar Polo <op@omarpolo.com>2021-01-21 11:57:46 +0000
commit12042ad7003375b746b4e2bccbf33ae7a90cbb98 (patch)
treec5d093736027b6f6ee9f7034c9604d924027a080 /compat/err.c
parent338f06f4e569807582f005f5804ca3abc412b255 (diff)
add a configure script and some compat
tested on openbsd, alpine and void
Diffstat (limited to 'compat/err.c')
-rw-r--r--compat/err.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/compat/err.c b/compat/err.c
new file mode 100644
index 0000000..840acd0
--- /dev/null
+++ b/compat/err.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+/* cheat: if we don't have getprogname in stdlib, will link against
+ * compat/getprogname.c anyway. */
+const char *getprogname(void);
+
+static void vwarn_impl(const char*, va_list);
+static void vwarnx_impl(const char*, va_list);
+
+static void
+vwarn_impl(const char *fmt, va_list ap)
+{
+ fprintf(stderr, "%s: ", getprogname());
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, ": %s\n", strerror(errno));
+}
+
+static void
+vwarnx_impl(const char *fmt, va_list ap)
+{
+ fprintf(stderr, "%s: ", getprogname());
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, "\n");
+}
+
+void
+err(int ret, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vwarn_impl(fmt, va);
+ va_end(ap, fmt);
+ exit(ret);
+}
+
+void
+errx(int ret, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vwarnx_impl(fmt, va);
+ va_end(ap, fmt);
+ exit(ret);
+}
+
+void
+warn(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vwarn_impl(fmt, va);
+ va_end(ap, fmt);
+}
+
+void
+warnx(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vwarnx_impl(fmt, va);
+ va_end(ap, fmt);
+}