1 #define _GNU_SOURCE
2 #include <stdio.h>
3 #include <stdarg.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <errno.h>
7 #include <unistd.h>
8 #include <fcntl.h>
9 #include <sys/types.h>
10 #include <signal.h>
11 #include "utils.h"
12
default_xprintf(const char * fmt,...)13 static void default_xprintf(const char *fmt, ...)
14 {
15 va_list args;
16
17 va_start(args, fmt);
18 vfprintf(stderr, fmt, args);
19 va_end(args);
20 fflush(stderr);
21 }
22
23 void (*xprintf)(const char *fmt, ...) = default_xprintf;
24
barf(const char * fmt,...)25 void barf(const char *fmt, ...)
26 {
27 char *str;
28 int bytes;
29 va_list arglist;
30
31 xprintf("FATAL: ");
32
33 va_start(arglist, fmt);
34 bytes = vasprintf(&str, fmt, arglist);
35 va_end(arglist);
36
37 if (bytes >= 0) {
38 xprintf("%s\n", str);
39 free(str);
40 }
41 exit(1);
42 }
43
barf_perror(const char * fmt,...)44 void barf_perror(const char *fmt, ...)
45 {
46 char *str;
47 int bytes, err = errno;
48 va_list arglist;
49
50 xprintf("FATAL: ");
51
52 va_start(arglist, fmt);
53 bytes = vasprintf(&str, fmt, arglist);
54 va_end(arglist);
55
56 if (bytes >= 0) {
57 xprintf("%s: %s\n", str, strerror(err));
58 free(str);
59 }
60 exit(1);
61 }
62