diff options
author | merakor <cem@ckyln.com> | 2020-08-20 10:59:40 +0000 |
---|---|---|
committer | merakor <cem@ckyln.com> | 2020-08-20 10:59:40 +0000 |
commit | 9624232b837be04bfc9658b3ab82ac3f1aafc704 (patch) | |
tree | 0345f1cb3477cd78554187122d790e77f2807858 /getopt-ul/xalloc.h | |
parent | 5287d503590a87e06207457f27059fc941275cf4 (diff) | |
download | cpt-9624232b837be04bfc9658b3ab82ac3f1aafc704.tar.gz |
cpt: provide getopt from util-linux
FossilOrigin-Name: 625f8a954bc9650126ce37cea8a1b7407c7b893e37d777f57f4a316b1ce17044
Diffstat (limited to 'getopt-ul/xalloc.h')
-rw-r--r-- | getopt-ul/xalloc.h | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/getopt-ul/xalloc.h b/getopt-ul/xalloc.h new file mode 100644 index 0000000..c4124cb --- /dev/null +++ b/getopt-ul/xalloc.h @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2010 Davidlohr Bueso <dave@gnu.org> + * + * This file may be redistributed under the terms of the + * GNU Lesser General Public License. + * + * General memory allocation wrappers for malloc, realloc, calloc and strdup + */ + +#ifndef UTIL_LINUX_XALLOC_H +#define UTIL_LINUX_XALLOC_H + +#include <stdlib.h> +#include <string.h> + +#include "c.h" + +#ifndef XALLOC_EXIT_CODE +# define XALLOC_EXIT_CODE EXIT_FAILURE +#endif + +static inline +__attribute__((__noreturn__)) +void __err_oom(const char *file, unsigned int line) +{ + err(XALLOC_EXIT_CODE, "%s: %u: cannot allocate memory", file, line); +} + +#define err_oom() __err_oom(__FILE__, __LINE__) + +static inline +__ul_alloc_size(1) +__ul_returns_nonnull +void *xmalloc(const size_t size) +{ + void *ret = malloc(size); + + if (!ret && size) + err(XALLOC_EXIT_CODE, "cannot allocate %zu bytes", size); + return ret; +} + +static inline +__ul_alloc_size(2) +__ul_returns_nonnull +void *xrealloc(void *ptr, const size_t size) +{ + void *ret = realloc(ptr, size); + + if (!ret && size) + err(XALLOC_EXIT_CODE, "cannot allocate %zu bytes", size); + return ret; +} + +static inline +__ul_calloc_size(1, 2) +__ul_returns_nonnull +void *xcalloc(const size_t nelems, const size_t size) +{ + void *ret = calloc(nelems, size); + + if (!ret && size && nelems) + err(XALLOC_EXIT_CODE, "cannot allocate %zu bytes", size); + return ret; +} + +static inline +__attribute__((warn_unused_result)) +__ul_returns_nonnull +char *xstrdup(const char *str) +{ + char *ret; + + assert(str); + ret = strdup(str); + if (!ret) + err(XALLOC_EXIT_CODE, "cannot duplicate string"); + return ret; +} + +static inline +__attribute__((warn_unused_result)) +__ul_returns_nonnull +char *xstrndup(const char *str, size_t size) +{ + char *ret; + + assert(str); + ret = strndup(str, size); + if (!ret) + err(XALLOC_EXIT_CODE, "cannot duplicate string"); + return ret; +} + + +static inline +__attribute__((__format__(printf, 2, 3))) +int xasprintf(char **strp, const char *fmt, ...) +{ + int ret; + va_list args; + + va_start(args, fmt); + ret = vasprintf(&(*strp), fmt, args); + va_end(args); + if (ret < 0) + err(XALLOC_EXIT_CODE, "cannot allocate string"); + return ret; +} + +static inline +__attribute__((__format__(printf, 2, 0))) +int xvasprintf(char **strp, const char *fmt, va_list ap) +{ + int ret = vasprintf(&(*strp), fmt, ap); + + if (ret < 0) + err(XALLOC_EXIT_CODE, "cannot allocate string"); + return ret; +} + + +static inline +__attribute__((warn_unused_result)) +char *xgethostname(void) +{ + char *name; + size_t sz = get_hostname_max() + 1; + + name = xmalloc(sizeof(char) * sz); + if (gethostname(name, sz) != 0) { + free(name); + return NULL; + } + name[sz - 1] = '\0'; + return name; +} + +#endif |