X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=lib%2Fxmalloc.c;h=58f2bcee3e950e0958d240afe8501de876d64e6d;hp=e7541bddeefb4f40f72eae67da7670a735470a1e;hb=cfa738d3185980ff8532a35192a9113b0e9a937c;hpb=912e7e968f4888d62b3c620893a70e825599973b diff --git a/lib/xmalloc.c b/lib/xmalloc.c index e7541bdd..58f2bcee 100644 --- a/lib/xmalloc.c +++ b/lib/xmalloc.c @@ -11,9 +11,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., Foundation, + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #if HAVE_CONFIG_H # include @@ -22,6 +22,8 @@ #include #include #include +#include +#include #if STDC_HEADERS # include @@ -32,7 +34,7 @@ void *realloc (); void free (); #endif -#include "gettext.h" +#include "dropin.h" #include "xalloc.h" #ifndef EXIT_FAILURE @@ -46,23 +48,15 @@ void *xcalloc (size_t n, size_t s); void *xrealloc (void *p, size_t n); #endif -#ifndef HAVE_DONE_WORKING_MALLOC_CHECK -#error you must run the autoconf test for a properly working malloc -- see malloc.m4 -#endif - -#ifndef HAVE_DONE_WORKING_REALLOC_CHECK -#error you must run the autoconf test for a properly working realloc -- see realloc.m4 -#endif - /* Exit value when the requested amount of memory is not available. The caller may set it to some other value. */ int xalloc_exit_failure = EXIT_FAILURE; /* FIXME: describe */ -char *const xalloc_msg_memory_exhausted = N_("Memory exhausted"); +char *const xalloc_msg_memory_exhausted = "Memory exhausted"; /* FIXME: describe */ -void (*xalloc_fail_func) (int) = 0; +void (*xalloc_fail_func) (int) = NULL; static void xalloc_fail (int size) @@ -76,13 +70,12 @@ xalloc_fail (int size) /* Allocate N bytes of memory dynamically, with error checking. */ void * -xmalloc (n) - size_t n; +xmalloc (size_t n) { void *p; p = malloc (n); - if (p == 0) + if (p == NULL) xalloc_fail ((int)n); return p; } @@ -90,13 +83,12 @@ xmalloc (n) /* Allocate N bytes of memory dynamically, and set it all to zero. */ void * -xmalloc_and_zero (n) - size_t n; +xmalloc_and_zero (size_t n) { void *p; p = malloc (n); - if (p == 0) + if (p == NULL) xalloc_fail ((int)n); memset (p, '\0', n); return p; @@ -107,12 +99,10 @@ xmalloc_and_zero (n) If P is NULL, run xmalloc. */ void * -xrealloc (p, n) - void *p; - size_t n; +xrealloc (void *p, size_t n) { p = realloc (p, n); - if (p == 0) + if (p == NULL) xalloc_fail (n); return p; } @@ -140,9 +130,35 @@ xcalloc (n, s) void *p; p = calloc (n, s); - if (p == 0) + if (p == NULL) xalloc_fail (); return p; } #endif /* NOT_USED */ + +int xasprintf(char **strp, const char *fmt, ...) { + int result; + va_list ap; + va_start(ap, fmt); + result = xvasprintf(strp, fmt, ap); + va_end(ap); + return result; +} + +int xvasprintf(char **strp, const char *fmt, va_list ap) { +#ifdef HAVE_MINGW + char buf[1024]; + int result = vsnprintf(buf, sizeof buf, fmt, ap); + if(result < 0) + exit(xalloc_exit_failure); + *strp = xstrdup(buf); +#else + int result = vasprintf(strp, fmt, ap); + if(result < 0) { + fprintf(stderr, "vasprintf() failed: %s\n", strerror(errno)); + exit(xalloc_exit_failure); + } +#endif + return result; +}