summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorHiltjo Posthuma <hiltjo@codemadness.org>2021-06-01 18:21:08 +0200
committerHiltjo Posthuma <hiltjo@codemadness.org>2021-06-01 18:21:08 +0200
commit55ac2338fcf5c3f2f3f812fd53063ce58aa38a49 (patch)
tree034020ab2e64a27b98a7bb87296fd24675ddf9d2 /util.c
parentcbb82666e00815aa2dbcc3f144460f3003b46b70 (diff)
portability and standards: add BSD-like err() and errx() functions
These are BSD functions. - HaikuOS now compiles without having to use libbsd. - Tested on SerenityOS (for fun), which doesn't have these functions (yet). With a small change to support wcwidth() sfeed works on SerenityOS.
Diffstat (limited to 'util.c')
-rw-r--r--util.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/util.c b/util.c
index e1ff9bd..c43bdfc 100644
--- a/util.c
+++ b/util.c
@@ -1,5 +1,6 @@
#include <ctype.h>
#include <errno.h>
+#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -7,6 +8,44 @@
#include "util.h"
+/* print to stderr, print error message of errno and exit().
+ Unlike BSD err() it does not prefix __progname */
+__dead void
+err(int exitstatus, const char *fmt, ...)
+{
+ va_list ap;
+ int saved_errno;
+
+ saved_errno = errno;
+
+ if (fmt) {
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ fprintf(stderr, ": ");
+ }
+ fprintf(stderr, "%s\n", strerror(saved_errno));
+
+ exit(exitstatus);
+}
+
+/* print to stderr and exit().
+ Unlike BSD errx() it does not prefix __progname */
+__dead void
+errx(int exitstatus, const char *fmt, ...)
+{
+ va_list ap;
+
+ if (fmt) {
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ }
+ fputs("\n", stderr);
+
+ exit(exitstatus);
+}
+
/* check if string has a non-empty scheme / protocol part */
int
uri_hasscheme(const char *s)