summaryrefslogtreecommitdiff
path: root/usr/src/cmd/ssh/libopenbsd-compat/common/bsd-asprintf.c
diff options
context:
space:
mode:
authorjp161948 <none@none>2007-09-19 05:03:12 -0700
committerjp161948 <none@none>2007-09-19 05:03:12 -0700
commit90685d2c52744c6540828f16cdd2db815d467e37 (patch)
treed0b643cf07d9886649691973b48b865d32a93f19 /usr/src/cmd/ssh/libopenbsd-compat/common/bsd-asprintf.c
parent1fceb383a3f0b59711832b9dc4e8329d7f216604 (diff)
downloadillumos-gate-90685d2c52744c6540828f16cdd2db815d467e37.tar.gz
PSARC/2007/033 sftp resync with OpenSSH
6481668 sftp(1)/sftp-server(1m) needs a resync with OpenSSH --HG-- rename : usr/src/cmd/ssh/include/sftp-glob.h => deleted_files/usr/src/cmd/ssh/include/sftp-glob.h rename : usr/src/cmd/ssh/include/sftp-int.h => deleted_files/usr/src/cmd/ssh/include/sftp-int.h rename : usr/src/cmd/ssh/sftp/sftp-int.c => deleted_files/usr/src/cmd/ssh/sftp/sftp-int.c
Diffstat (limited to 'usr/src/cmd/ssh/libopenbsd-compat/common/bsd-asprintf.c')
-rw-r--r--usr/src/cmd/ssh/libopenbsd-compat/common/bsd-asprintf.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/usr/src/cmd/ssh/libopenbsd-compat/common/bsd-asprintf.c b/usr/src/cmd/ssh/libopenbsd-compat/common/bsd-asprintf.c
new file mode 100644
index 0000000000..f06e7415de
--- /dev/null
+++ b/usr/src/cmd/ssh/libopenbsd-compat/common/bsd-asprintf.c
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2004 Darren Tucker.
+ *
+ * Based originally on asprintf.c from OpenBSD:
+ * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "includes.h"
+
+#ifndef HAVE_VASPRINTF
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#ifndef VA_COPY
+#ifdef HAVE_VA_COPY
+#define VA_COPY(dest, src) va_copy(dest, src)
+#else
+#ifdef HAVE___VA_COPY
+#define VA_COPY(dest, src) __va_copy(dest, src)
+#else
+#define VA_COPY(dest, src) (dest) = (src)
+#endif
+#endif
+#endif
+
+#define INIT_SZ 128
+
+int
+vasprintf(char **str, const char *fmt, va_list ap)
+{
+ int ret = -1;
+ va_list ap2;
+ char *string, *newstr;
+ size_t len;
+
+ VA_COPY(ap2, ap);
+ if ((string = malloc(INIT_SZ)) == NULL)
+ goto fail;
+
+ ret = vsnprintf(string, INIT_SZ, fmt, ap2);
+ if (ret >= 0 && ret < INIT_SZ) { /* succeeded with initial alloc */
+ *str = string;
+ } else if (ret == INT_MAX || ret < 0) { /* Bad length */
+ free(string);
+ goto fail;
+ } else { /* bigger than initial, realloc allowing for nul */
+ len = (size_t)ret + 1;
+ if ((newstr = realloc(string, len)) == NULL) {
+ free(string);
+ goto fail;
+ } else {
+ va_end(ap2);
+ VA_COPY(ap2, ap);
+ ret = vsnprintf(newstr, len, fmt, ap2);
+ if (ret >= 0 && (size_t)ret < len) {
+ *str = newstr;
+ } else { /* failed with realloc'ed string, give up */
+ free(newstr);
+ goto fail;
+ }
+ }
+ }
+ va_end(ap2);
+ return (ret);
+
+fail:
+ *str = NULL;
+ errno = ENOMEM;
+ va_end(ap2);
+ return (-1);
+}
+#endif
+
+#ifndef HAVE_ASPRINTF
+int
+asprintf(char **str, const char *fmt, ...)
+{
+ va_list ap;
+ int ret;
+
+ *str = NULL;
+ va_start(ap, fmt);
+ ret = vasprintf(str, fmt, ap);
+ va_end(ap);
+
+ return (ret);
+}
+#endif