xref: /kvmtool/util/util.c (revision 0b322d9635196147295807a190d07fde072cc70c)
1ad054a21SCyrill Gorcunov /*
2ad054a21SCyrill Gorcunov  * Taken from perf which in turn take it from GIT
3ad054a21SCyrill Gorcunov  */
4ad054a21SCyrill Gorcunov 
5f3150089SPekka Enberg #include "kvm/util.h"
6ad054a21SCyrill Gorcunov 
7ad054a21SCyrill Gorcunov static void report(const char *prefix, const char *err, va_list params)
8ad054a21SCyrill Gorcunov {
9ad054a21SCyrill Gorcunov 	char msg[1024];
10ad054a21SCyrill Gorcunov 	vsnprintf(msg, sizeof(msg), err, params);
11ad054a21SCyrill Gorcunov 	fprintf(stderr, " %s%s\n", prefix, msg);
12ad054a21SCyrill Gorcunov }
13ad054a21SCyrill Gorcunov 
14ad054a21SCyrill Gorcunov static NORETURN void die_builtin(const char *err, va_list params)
15ad054a21SCyrill Gorcunov {
16ad054a21SCyrill Gorcunov 	report(" Fatal: ", err, params);
17ad054a21SCyrill Gorcunov 	exit(128);
18ad054a21SCyrill Gorcunov }
19ad054a21SCyrill Gorcunov 
20ad054a21SCyrill Gorcunov static void error_builtin(const char *err, va_list params)
21ad054a21SCyrill Gorcunov {
22ad054a21SCyrill Gorcunov 	report(" Error: ", err, params);
23ad054a21SCyrill Gorcunov }
24ad054a21SCyrill Gorcunov 
25ad054a21SCyrill Gorcunov static void warn_builtin(const char *warn, va_list params)
26ad054a21SCyrill Gorcunov {
27ad054a21SCyrill Gorcunov 	report(" Warning: ", warn, params);
28ad054a21SCyrill Gorcunov }
29ad054a21SCyrill Gorcunov 
3007f9d0dbSCyrill Gorcunov static void info_builtin(const char *info, va_list params)
3107f9d0dbSCyrill Gorcunov {
3207f9d0dbSCyrill Gorcunov 	report(" Info: ", info, params);
3307f9d0dbSCyrill Gorcunov }
3407f9d0dbSCyrill Gorcunov 
35ad054a21SCyrill Gorcunov void die(const char *err, ...)
36ad054a21SCyrill Gorcunov {
37ad054a21SCyrill Gorcunov 	va_list params;
38ad054a21SCyrill Gorcunov 
39ad054a21SCyrill Gorcunov 	va_start(params, err);
40ad054a21SCyrill Gorcunov 	die_builtin(err, params);
41ad054a21SCyrill Gorcunov 	va_end(params);
42ad054a21SCyrill Gorcunov }
43ad054a21SCyrill Gorcunov 
44ad054a21SCyrill Gorcunov int error(const char *err, ...)
45ad054a21SCyrill Gorcunov {
46ad054a21SCyrill Gorcunov 	va_list params;
47ad054a21SCyrill Gorcunov 
48ad054a21SCyrill Gorcunov 	va_start(params, err);
49ad054a21SCyrill Gorcunov 	error_builtin(err, params);
50ad054a21SCyrill Gorcunov 	va_end(params);
51ad054a21SCyrill Gorcunov 	return -1;
52ad054a21SCyrill Gorcunov }
53ad054a21SCyrill Gorcunov 
54ad054a21SCyrill Gorcunov void warning(const char *warn, ...)
55ad054a21SCyrill Gorcunov {
56ad054a21SCyrill Gorcunov 	va_list params;
57ad054a21SCyrill Gorcunov 
58ad054a21SCyrill Gorcunov 	va_start(params, warn);
59ad054a21SCyrill Gorcunov 	warn_builtin(warn, params);
60ad054a21SCyrill Gorcunov 	va_end(params);
61ad054a21SCyrill Gorcunov }
62ad054a21SCyrill Gorcunov 
6307f9d0dbSCyrill Gorcunov void info(const char *info, ...)
6407f9d0dbSCyrill Gorcunov {
6507f9d0dbSCyrill Gorcunov 	va_list params;
6607f9d0dbSCyrill Gorcunov 
6707f9d0dbSCyrill Gorcunov 	va_start(params, info);
6807f9d0dbSCyrill Gorcunov 	info_builtin(info, params);
6907f9d0dbSCyrill Gorcunov 	va_end(params);
7007f9d0dbSCyrill Gorcunov }
7107f9d0dbSCyrill Gorcunov 
72ad054a21SCyrill Gorcunov void die_perror(const char *s)
73ad054a21SCyrill Gorcunov {
74ad054a21SCyrill Gorcunov 	perror(s);
75ad054a21SCyrill Gorcunov 	exit(1);
76ad054a21SCyrill Gorcunov }
77*0b322d96SCyrill Gorcunov 
78*0b322d96SCyrill Gorcunov /**
79*0b322d96SCyrill Gorcunov  * strlcat - Append a length-limited, %NUL-terminated string to another
80*0b322d96SCyrill Gorcunov  * @dest: The string to be appended to
81*0b322d96SCyrill Gorcunov  * @src: The string to append to it
82*0b322d96SCyrill Gorcunov  * @count: The size of the destination buffer.
83*0b322d96SCyrill Gorcunov  */
84*0b322d96SCyrill Gorcunov size_t strlcat(char *dest, const char *src, size_t count)
85*0b322d96SCyrill Gorcunov {
86*0b322d96SCyrill Gorcunov 	size_t dsize = strlen(dest);
87*0b322d96SCyrill Gorcunov 	size_t len = strlen(src);
88*0b322d96SCyrill Gorcunov 	size_t res = dsize + len;
89*0b322d96SCyrill Gorcunov 
90*0b322d96SCyrill Gorcunov 	DIE_IF(dsize >= count);
91*0b322d96SCyrill Gorcunov 
92*0b322d96SCyrill Gorcunov 	dest += dsize;
93*0b322d96SCyrill Gorcunov 	count -= dsize;
94*0b322d96SCyrill Gorcunov 	if (len >= count)
95*0b322d96SCyrill Gorcunov 		len = count - 1;
96*0b322d96SCyrill Gorcunov 
97*0b322d96SCyrill Gorcunov 	memcpy(dest, src, len);
98*0b322d96SCyrill Gorcunov 	dest[len] = 0;
99*0b322d96SCyrill Gorcunov 
100*0b322d96SCyrill Gorcunov 	return res;
101*0b322d96SCyrill Gorcunov }
102