1 #define _GNU_SOURCE
2 #include <stdio.h>
3 #include <stdarg.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <syslog.h>
7 #include <errno.h>
8 #include <unistd.h>
9 #include <fcntl.h>
10 #include <sys/types.h>
11 #include <signal.h>
12 #include "utils.h"
13 
default_xprintf(const char * fmt,...)14 static void default_xprintf(const char *fmt, ...)
15 {
16 	va_list args;
17 
18 	va_start(args, fmt);
19 	vfprintf(stderr, fmt, args);
20 	va_end(args);
21 	fflush(stderr);
22 }
23 
24 void (*xprintf)(const char *fmt, ...) = default_xprintf;
25 
barf(const char * fmt,...)26 void barf(const char *fmt, ...)
27 {
28 	char *str;
29 	int bytes;
30 	va_list arglist;
31 
32 	xprintf("FATAL: ");
33 
34 	va_start(arglist, fmt);
35 	bytes = vasprintf(&str, fmt, arglist);
36 	va_end(arglist);
37 
38  	if (bytes >= 0) {
39 		syslog(LOG_CRIT, "%s\n", str);
40 		xprintf("%s\n", str);
41 		free(str);
42 	}
43 	exit(1);
44 }
45 
barf_perror(const char * fmt,...)46 void barf_perror(const char *fmt, ...)
47 {
48 	char *str;
49 	int bytes, err = errno;
50 	va_list arglist;
51 
52 	xprintf("FATAL: ");
53 
54 	va_start(arglist, fmt);
55 	bytes = vasprintf(&str, fmt, arglist);
56 	va_end(arglist);
57 
58  	if (bytes >= 0) {
59 		syslog(LOG_CRIT, "%s: %s\n", str, strerror(err));
60 		xprintf("%s: %s\n", str, strerror(err));
61 		free(str);
62 	}
63 	exit(1);
64 }
65 
dump_state_align(FILE * fp)66 const char *dump_state_align(FILE *fp)
67 {
68 	long len;
69 	static char nul[8] = {};
70 
71 	len = ftell(fp);
72 	if (len < 0)
73 		return "Dump state align error";
74 	len &= 7;
75 	if (!len)
76 		return NULL;
77 
78 	if (fwrite(nul, 8 - len, 1, fp) != 1)
79 		return "Dump state align error";
80 	return NULL;
81 }
82