summaryrefslogtreecommitdiff
path: root/portable/asprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'portable/asprintf.c')
-rw-r--r--portable/asprintf.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/portable/asprintf.c b/portable/asprintf.c
index 0093070..eb2b713 100644
--- a/portable/asprintf.c
+++ b/portable/asprintf.c
@@ -7,7 +7,7 @@
* The canonical version of this file is maintained in the rra-c-util package,
* which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>.
*
- * Written by Russ Allbery <rra@stanford.edu>
+ * Written by Russ Allbery <eagle@eyrie.org>
*
* The authors hereby relinquish any claim to any copyright that they may have
* in this work, whether granted under contract or by operation of law or
@@ -21,6 +21,8 @@
#include <config.h>
#include <portable/system.h>
+#include <errno.h>
+
/*
* If we're running the test suite, rename the functions to avoid conflicts
* with the system versions.
@@ -33,6 +35,7 @@ int test_asprintf(char **, const char *, ...)
int test_vasprintf(char **, const char *, va_list);
#endif
+
int
asprintf(char **strp, const char *fmt, ...)
{
@@ -45,11 +48,12 @@ asprintf(char **strp, const char *fmt, ...)
return status;
}
+
int
vasprintf(char **strp, const char *fmt, va_list args)
{
va_list args_copy;
- int status, needed;
+ int status, needed, oerrno;
va_copy(args_copy, args);
needed = vsnprintf(NULL, 0, fmt, args_copy);
@@ -65,8 +69,10 @@ vasprintf(char **strp, const char *fmt, va_list args)
if (status >= 0)
return status;
else {
+ oerrno = errno;
free(*strp);
*strp = NULL;
+ errno = oerrno;
return status;
}
}