diff --git a/Makefile.common b/Makefile.common index 1f429ce..522fad7 100644 --- a/Makefile.common +++ b/Makefile.common @@ -12,7 +12,8 @@ LIBTELNET_SRCS = \ libtelnet/rsaencpwd.c \ libtelnet/sra.c \ libtelnet/getaddrinfo.c \ - libtelnet/strlcpy.c + libtelnet/strlcpy.c \ + libtelnet/vasprintf.c # libtelnet/pk.c TELNET_SRCS = \ diff --git a/libtelnet/vasprintf.c b/libtelnet/vasprintf.c new file mode 100644 index 0000000..87e22cc --- /dev/null +++ b/libtelnet/vasprintf.c @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 2006 Verdens Gang AS + * Copyright (c) 2006-2007 Linpro AS + * All rights reserved. + * + * Author: Dag-Erling Smørgrav + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id$ + * + */ + +#ifdef __GNO__ + +#define va_copy(a,b) memcpy((&a),(&b),sizeof(b)) + +#include +#include +#include +#include + +int +vasprintf(char **strp, const char *fmt, va_list ap) +{ + va_list aq; + int ret; + + va_copy(aq, ap); + ret = vsnprintf(NULL, 0, fmt, ap); + /* va_end(ap); -- Don't do this on ORCA/C; it messes up the stack */ + if ((*strp = malloc(ret + 1)) == NULL) + return (-1); + ret = vsnprintf(*strp, ret + 1, fmt, aq); + return (ret); +} + +#endif diff --git a/libtelnet/vasprintf.h b/libtelnet/vasprintf.h new file mode 100644 index 0000000..706a4d6 --- /dev/null +++ b/libtelnet/vasprintf.h @@ -0,0 +1,3 @@ +#include + +int vasprintf(char **strp, const char *fmt, va_list ap); \ No newline at end of file diff --git a/telnetd/defs.h b/telnetd/defs.h index 55cbc22..56c9ad2 100644 --- a/telnetd/defs.h +++ b/telnetd/defs.h @@ -98,6 +98,7 @@ #endif #ifdef __GNO__ # include "libtelnet/strlcpy.h" +# include "libtelnet/vasprintf.h" #endif #ifndef USE_TERMIO