5a7183470d239763cf23a25f8ca419197bd604d9
[platform/upstream/rpm.git] / rpmio / rpmmalloc.c
1 /** \ingroup rpmio
2  * \file rpmio/rpmmalloc.c
3  */
4
5 #include "system.h"
6 #include "debug.h"
7
8 static rpmMemFailFunc failfunc = NULL;
9 static void *failfunc_data = NULL;
10
11 /*
12  * Give memfail callback a chance to try to give us memory or perform
13  * it's own cleanup. If we dont get memory we die anyway as rpm doesn't 
14  * check for NULL returns from allocations.
15  */
16 static void *vmefail(size_t size)
17 {
18     void *val = failfunc ? (*failfunc)(size, failfunc_data) : NULL;
19     if (val == NULL) {
20         fprintf(stderr, _("memory alloc (%u bytes) returned NULL.\n"),
21                 (unsigned)size);
22         exit(EXIT_FAILURE);
23     }
24     return val; 
25 }
26
27 void * rpmSetMemFail(rpmMemFailFunc func, void *data)
28 {
29     void *ofunc = failfunc;
30     failfunc = func;
31     failfunc_data = data;
32     return ofunc;
33 }
34
35 void * rmalloc (size_t size)
36 {
37     register void *value;
38     if (size == 0) size++;
39     value = malloc (size);
40     if (value == NULL)
41         value = vmefail(size);
42     return value;
43 }
44
45 void * rcalloc (size_t nmemb, size_t size)
46 {
47     register void *value;
48     if (size == 0) size++;
49     if (nmemb == 0) nmemb++;
50     value = calloc (nmemb, size);
51     if (value == NULL)
52         value = vmefail(size);
53     return value;
54 }
55
56 void * rrealloc (void *ptr, size_t size)
57 {
58     register void *value;
59     if (size == 0) size++;
60     value = realloc (ptr, size);
61     if (value == NULL)
62         value = vmefail(size);
63     return value;
64 }
65
66 char * rstrdup (const char *str)
67 {
68     size_t size = strlen(str) + 1;
69     char *newstr = (char *) malloc (size);
70     if (newstr == NULL)
71         newstr = (char *) vmefail(size);
72     strcpy (newstr, str);
73     return newstr;
74 }
75
76 void * rfree (void *ptr)
77 {
78     free(ptr);
79     return NULL;
80 }