diff options
Diffstat (limited to 'rpmio/rpmmalloc.c')
-rw-r--r-- | rpmio/rpmmalloc.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/rpmio/rpmmalloc.c b/rpmio/rpmmalloc.c new file mode 100644 index 0000000..c38ab96 --- /dev/null +++ b/rpmio/rpmmalloc.c @@ -0,0 +1,85 @@ +/** \ingroup rpmio + * \file rpmio/rpmmalloc.c + */ + +#include "system.h" + +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +#include "debug.h" + +static rpmMemFailFunc failfunc = NULL; +static void *failfunc_data = NULL; + +/* + * Give memfail callback a chance to try to give us memory or perform + * it's own cleanup. If we dont get memory we die anyway as rpm doesn't + * check for NULL returns from allocations. + */ +static void *vmefail(size_t size) +{ + void *val = failfunc ? (*failfunc)(size, failfunc_data) : NULL; + if (val == NULL) { + fprintf(stderr, _("memory alloc (%u bytes) returned NULL.\n"), + (unsigned)size); + exit(EXIT_FAILURE); + } + return val; +} + +rpmMemFailFunc rpmSetMemFail(rpmMemFailFunc func, void *data) +{ + rpmMemFailFunc ofunc = failfunc; + failfunc = func; + failfunc_data = data; + return ofunc; +} + +void * rmalloc (size_t size) +{ + register void *value; + if (size == 0) size++; + value = malloc (size); + if (value == NULL) + value = vmefail(size); + return value; +} + +void * rcalloc (size_t nmemb, size_t size) +{ + register void *value; + if (size == 0) size++; + if (nmemb == 0) nmemb++; + value = calloc (nmemb, size); + if (value == NULL) + value = vmefail(size); + return value; +} + +void * rrealloc (void *ptr, size_t size) +{ + register void *value; + if (size == 0) size++; + value = realloc (ptr, size); + if (value == NULL) + value = vmefail(size); + return value; +} + +char * rstrdup (const char *str) +{ + size_t size = strlen(str) + 1; + char *newstr = (char *) malloc (size); + if (newstr == NULL) + newstr = (char *) vmefail(size); + strcpy (newstr, str); + return newstr; +} + +void * rfree (void *ptr) +{ + free(ptr); + return NULL; +} |