summaryrefslogtreecommitdiff
path: root/src/common/mempattern.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/mempattern.c')
-rw-r--r--src/common/mempattern.c73
1 files changed, 64 insertions, 9 deletions
diff --git a/src/common/mempattern.c b/src/common/mempattern.c
index acf6eac..2ea7e50 100644
--- a/src/common/mempattern.c
+++ b/src/common/mempattern.c
@@ -14,15 +14,51 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <config.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/resource.h>
-#include <config.h>
#include <stdarg.h>
+#include "mempattern.h"
+#include "common/log.h"
#include "common/slab/alloc-common.h"
+static void *mm_malloc(void *ctx, size_t n)
+{
+ UNUSED(ctx);
+ return malloc(n);
+}
+
+void mm_ctx_init(mm_ctx_t *mm)
+{
+ mm->ctx = NULL;
+ mm->alloc = mm_malloc;
+ mm->free = free;
+}
+
+void* xmalloc(size_t l)
+{
+ void *p = malloc(l);
+ if (p == NULL) {
+ log_server_fatal("Failed to allocate %zu bytes.\n", l);
+ abort();
+ }
+ return p;
+}
+
+void *xrealloc(void *p, size_t l)
+{
+ p = realloc(p, l);
+ if (p == NULL) {
+ log_server_fatal("Failed to reallocate to %zu bytes from %p.\n",
+ l, p);
+ abort();
+ }
+ return p;
+}
+
int mreserve(char **p, size_t tlen, size_t min, size_t allow, size_t *reserved)
{
@@ -31,7 +67,7 @@ int mreserve(char **p, size_t tlen, size_t min, size_t allow, size_t *reserved)
if (maxlen < min) {
return -2; /* size_t overflow */
}
-
+
/* Meet target size but trim excessive amounts. */
if (*reserved < min || *reserved > maxlen) {
void *trimmed = realloc(*p, maxlen * tlen);
@@ -42,7 +78,7 @@ int mreserve(char **p, size_t tlen, size_t min, size_t allow, size_t *reserved)
return -1;
}
}
-
+
return 0;
}
@@ -51,21 +87,21 @@ char* sprintf_alloc(const char *fmt, ...)
int size = 100;
char *p = NULL, *np = NULL;
va_list ap;
-
+
if ((p = malloc(size)) == NULL)
return NULL;
-
+
while (1) {
-
+
/* Try to print in the allocated space. */
va_start(ap, fmt);
int n = vsnprintf(p, size, fmt, ap);
va_end(ap);
-
+
/* If that worked, return the string. */
if (n > -1 && n < size)
return p;
-
+
/* Else try again with more space. */
if (n > -1) { /* glibc 2.1 */
size = n+1; /* precisely what is needed */
@@ -79,11 +115,30 @@ char* sprintf_alloc(const char *fmt, ...)
p = np;
}
}
-
+
/* Should never get here. */
return p;
}
+char* strcdup(const char *s1, const char *s2)
+{
+ if (!s1 || !s2) {
+ return NULL;
+ }
+
+ size_t slen = strlen(s1);
+ size_t s2len = strlen(s2);
+ size_t nlen = slen + s2len + 1;
+ char* dst = malloc(nlen);
+ if (dst == NULL) {
+ return NULL;
+ }
+
+ memcpy(dst, s1, slen);
+ strncpy(dst + slen, s2, s2len + 1); // With trailing '\0'
+ return dst;
+}
+
#ifdef MEM_DEBUG
/*
* ((destructor)) attribute executes this function after main().