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