]> git.tuebingen.mpg.de Git - adu.git/blobdiff - string.c
Replace systemlinux.org URL and email address.
[adu.git] / string.c
index 13555550efb6e1e567f66ca6f03158b79645ed7e..e5670f8c66e932f1a617301d0fe6fe7b793fa795 100644 (file)
--- a/string.c
+++ b/string.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2004-2008 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2004-2008 Andre Noll <maan@tuebingen.mpg.de>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -123,10 +123,28 @@ __must_check __malloc char *adu_strdup(const char *s)
  */
 __must_check __printf_1_2 __malloc char *make_message(const char *fmt, ...)
 {
-       char *msg;
+       char *p;
+       int n;
+       size_t size = 100;
 
-       VSPRINTF(fmt, msg);
-       return msg;
+       p = adu_malloc(size);
+       while (1) {
+               va_list ap;
+               /* Try to print in the allocated space. */
+               va_start(ap, fmt);
+               n = vsnprintf(p, size, fmt, ap);
+               va_end(ap);
+               /* If that worked, return the string. */
+               if (n > -1 && n < size)
+                       break;
+               /* Else try again with more space. */
+               if (n > -1) /* glibc 2.1 */
+                       size = n + 1; /* precisely what is needed */
+               else /* glibc 2.0 */
+                       size *= 2; /* twice the old size */
+               p = adu_realloc(p, size);
+       }
+       return p;
 }
 
 /**
@@ -209,7 +227,7 @@ __must_check int atoi64(const char *str, int64_t *result)
  *
  * \return The number of substrings found in \a args.
  */
-__must_check unsigned split_args(char *args, char *** const argv_ptr, const char *delim)
+unsigned split_args(char *args, char *** const argv_ptr, const char *delim)
 {
        char *p = args;
        char **argv;