From cf41cc2ec21d67fefb0a0e362312b7f0dd18f720 Mon Sep 17 00:00:00 2001
From: Jeremy McNamara <jj@nufone.net>
Date: Wed, 14 Jan 2004 06:35:01 +0000
Subject: [PATCH] add a vasprintf replacement. Bug #839

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@2030 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 astmm.c                  | 20 ++++++++++++++++++++
 include/asterisk/astmm.h |  6 ++++++
 2 files changed, 26 insertions(+)

diff --git a/astmm.c b/astmm.c
index 4d6d3023f7..6e507aaacf 100755
--- a/astmm.c
+++ b/astmm.c
@@ -32,6 +32,7 @@
 #define FUNC_REALLOC	3
 #define FUNC_STRDUP		4
 #define FUNC_STRNDUP	5
+#define FUNC_VASPRINTF	6
 
 /* Undefine all our macros */
 #undef malloc
@@ -40,6 +41,7 @@
 #undef strdup
 #undef strndup
 #undef free
+#undef vasprintf
 
 static FILE *mmlog;
 
@@ -217,6 +219,24 @@ char *__ast_strndup(const char *s, size_t n, const char *file, int lineno, const
 	return ptr;
 }
 
+int __ast_vasprintf(char **strp, const char *fmt, va_list ap, const char *file, int lineno, const char *func) 
+{
+	int n, size = strlen(fmt) + 1;
+	if ((*strp = __ast_alloc_region(size, FUNC_VASPRINTF, file, lineno, func)) == NULL)
+		return -1; 
+	for (;;) {
+		n = vsnprintf(*strp, size, fmt, ap);
+		if (n > -1 && n < size)
+			return n;
+		if (n > -1)	/* glibc 2.1 */
+			size = n+1;
+		else		/* glibc 2.0 */
+			size *= 2;
+		if ((*strp = __ast_realloc(*strp, size, file, lineno, func)) == NULL)
+			return -1;
+	}
+}
+
 static int handle_show_memory(int fd, int argc, char *argv[])
 {
 	char *fn = NULL;
diff --git a/include/asterisk/astmm.h b/include/asterisk/astmm.h
index 83f7861217..88dd5486b3 100755
--- a/include/asterisk/astmm.h
+++ b/include/asterisk/astmm.h
@@ -21,6 +21,7 @@
 #include <sys/types.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdio.h>
 
 /* Undefine any macros */
 #undef malloc
@@ -28,6 +29,7 @@
 #undef realloc
 #undef strdup
 #undef strndup
+#undef vasprintf
 
 void *__ast_calloc(size_t nmemb, size_t size, const char *file, int lineno, const char *func);
 void *__ast_malloc(size_t size, const char *file, int lineno, const char *func);
@@ -35,6 +37,7 @@ void __ast_free(void *ptr, const char *file, int lineno, const char *func);
 void *__ast_realloc(void *ptr, size_t size, const char *file, int lineno, const char *func);
 char *__ast_strdup(const char *s, const char *file, int lineno, const char *func);
 char *__ast_strndup(const char *s, size_t n, const char *file, int lineno, const char *func);
+int __ast_vasprintf(char **strp, const char *format, va_list ap, const char *file, int lineno, const char *func);
 
 void __ast_mm_init(void);
 
@@ -58,6 +61,9 @@ void __ast_mm_init(void);
 #define strndup(a,b) \
 	__ast_strndup(a,b,__FILE__, __LINE__, __PRETTY_FUNCTION__)
 
+#define vasprintf(a,b,c) \
+	__ast_vasprintf(a,b,c,__FILE__, __LINE__, __PRETTY_FUNCTION__)
+
 #else
 #error "NEVER INCLUDE astmm.h DIRECTLY!!"
 #endif
-- 
GitLab