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