1 /*
2  * Copyright (c) 2011 Tim van der Molen <tim@kariliq.nl>
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /* Let glibc expose vasprintf(). */
18 #define _GNU_SOURCE
19 
20 /* Let NetBSD expose reallocarray(). */
21 #define _OPENBSD_SOURCE
22 
23 #include <stdarg.h>
24 #include <stdint.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 
29 #include "siren.h"
30 
31 int
32 xasprintf(char **buf, const char *fmt, ...)
33 {
34 	va_list	ap;
35 	int	ret;
36 
37 	va_start(ap, fmt);
38 	ret = xvasprintf(buf, fmt, ap);
39 	va_end(ap);
40 
41 	return ret;
42 }
43 
44 void *
45 xmalloc(size_t size)
46 {
47 	void *p;
48 
49 	if (size == 0)
50 		LOG_FATALX("zero-size allocation");
51 	if ((p = malloc(size)) == NULL)
52 		LOG_FATAL("malloc");
53 	return p;
54 }
55 
56 void *
57 xrealloc(void *p, size_t size)
58 {
59 	if (size == 0)
60 		LOG_FATALX("zero-size allocation");
61 	if ((p = realloc(p, size)) == NULL)
62 		LOG_FATAL("realloc");
63 	return p;
64 }
65 
66 void *
67 xreallocarray(void *p, size_t nmemb, size_t size)
68 {
69 	if (nmemb == 0 || size == 0)
70 		LOG_FATALX("zero-size allocation");
71 	if ((p = reallocarray(p, nmemb, size)) == NULL)
72 		LOG_FATAL("reallocarray");
73 	return p;
74 }
75 
76 int
77 xsnprintf(char *buf, size_t size, const char *fmt, ...)
78 {
79 	va_list	ap;
80 	int	ret;
81 
82 	va_start(ap, fmt);
83 	ret = xvsnprintf(buf, size, fmt, ap);
84 	va_end(ap);
85 
86 	return ret;
87 }
88 
89 char *
90 xstrdup(const char *s)
91 {
92 	char *t;
93 
94 	if ((t = strdup(s)) == NULL)
95 		LOG_FATAL("strdup");
96 	return t;
97 }
98 
99 char *
100 xstrndup(const char *s, size_t maxlen)
101 {
102 	char *t;
103 
104 	if ((t = strndup(s, maxlen)) == NULL)
105 		LOG_FATAL("strndup");
106 	return t;
107 }
108 
109 int
110 xvasprintf(char **buf, const char *fmt, va_list ap)
111 {
112 	int ret;
113 
114 	if ((ret = vasprintf(buf, fmt, ap)) < 0)
115 		LOG_FATALX("vasprintf() failed");
116 	return ret;
117 }
118 
119 int
120 xvsnprintf(char *buf, size_t size, const char *fmt, va_list ap)
121 {
122 	int ret;
123 
124 	if ((ret = vsnprintf(buf, size, fmt, ap)) < 0)
125 		LOG_FATALX("vsnprintf() failed");
126 	return ret;
127 }
128