diff options
-rw-r--r-- | source4/heimdal/lib/roken/getnameinfo.c | 127 | ||||
-rw-r--r-- | source4/heimdal/lib/roken/inet_ntop.c | 133 | ||||
-rw-r--r-- | source4/heimdal/lib/roken/inet_pton.c | 49 | ||||
-rw-r--r-- | source4/heimdal_build/config.m4 | 25 | ||||
-rw-r--r-- | source4/heimdal_build/config.mk | 17 |
5 files changed, 347 insertions, 4 deletions
diff --git a/source4/heimdal/lib/roken/getnameinfo.c b/source4/heimdal/lib/roken/getnameinfo.c new file mode 100644 index 0000000000..2cf81897f8 --- /dev/null +++ b/source4/heimdal/lib/roken/getnameinfo.c @@ -0,0 +1,127 @@ +/* + * Copyright (c) 1999 - 2001 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * 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. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE 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 THE INSTITUTE 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. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +RCSID("$Id: getnameinfo.c,v 1.6 2005/06/16 16:53:09 lha Exp $"); +#endif + +#include "roken.h" + +static int +doit (int af, + const void *addr, + size_t addrlen, + int port, + char *host, size_t hostlen, + char *serv, size_t servlen, + int flags) +{ + if (host != NULL) { + if (flags & NI_NUMERICHOST) { + if (inet_ntop (af, addr, host, hostlen) == NULL) + return EAI_SYSTEM; + } else { + struct hostent *he = gethostbyaddr (addr, + addrlen, + af); + if (he != NULL) { + strlcpy (host, hostent_find_fqdn(he), hostlen); + if (flags & NI_NOFQDN) { + char *dot = strchr (host, '.'); + if (dot != NULL) + *dot = '\0'; + } + } else if (flags & NI_NAMEREQD) { + return EAI_NONAME; + } else if (inet_ntop (af, addr, host, hostlen) == NULL) + return EAI_SYSTEM; + } + } + + if (serv != NULL) { + if (flags & NI_NUMERICSERV) { + snprintf (serv, servlen, "%u", ntohs(port)); + } else { + const char *proto = "tcp"; + struct servent *se; + + if (flags & NI_DGRAM) + proto = "udp"; + + se = getservbyport (port, proto); + if (se == NULL) { + snprintf (serv, servlen, "%u", ntohs(port)); + } else { + strlcpy (serv, se->s_name, servlen); + } + } + } + return 0; +} + +/* + * + */ + +int ROKEN_LIB_FUNCTION +getnameinfo(const struct sockaddr *sa, socklen_t salen, + char *host, size_t hostlen, + char *serv, size_t servlen, + int flags) +{ + switch (sa->sa_family) { +#ifdef HAVE_IPV6 + case AF_INET6 : { + const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)sa; + + return doit (AF_INET6, &sin6->sin6_addr, sizeof(sin6->sin6_addr), + sin6->sin6_port, + host, hostlen, + serv, servlen, + flags); + } +#endif + case AF_INET : { + const struct sockaddr_in *sin4 = (const struct sockaddr_in *)sa; + + return doit (AF_INET, &sin4->sin_addr, sizeof(sin4->sin_addr), + sin4->sin_port, + host, hostlen, + serv, servlen, + flags); + } + default : + return EAI_FAMILY; + } +} diff --git a/source4/heimdal/lib/roken/inet_ntop.c b/source4/heimdal/lib/roken/inet_ntop.c new file mode 100644 index 0000000000..35e96eb49b --- /dev/null +++ b/source4/heimdal/lib/roken/inet_ntop.c @@ -0,0 +1,133 @@ +/* + * Copyright (c) 1999 - 2001 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * 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. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE 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 THE INSTITUTE 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. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +RCSID("$Id: inet_ntop.c,v 1.6 2005/04/12 11:28:52 lha Exp $"); +#endif + +#include <roken.h> + +/* + * + */ + +static const char * +inet_ntop_v4 (const void *src, char *dst, size_t size) +{ + const char digits[] = "0123456789"; + int i; + struct in_addr *addr = (struct in_addr *)src; + u_long a = ntohl(addr->s_addr); + const char *orig_dst = dst; + + if (size < INET_ADDRSTRLEN) { + errno = ENOSPC; + return NULL; + } + for (i = 0; i < 4; ++i) { + int n = (a >> (24 - i * 8)) & 0xFF; + int non_zerop = 0; + + if (non_zerop || n / 100 > 0) { + *dst++ = digits[n / 100]; + n %= 100; + non_zerop = 1; + } + if (non_zerop || n / 10 > 0) { + *dst++ = digits[n / 10]; + n %= 10; + non_zerop = 1; + } + *dst++ = digits[n]; + if (i != 3) + *dst++ = '.'; + } + *dst++ = '\0'; + return orig_dst; +} + +#ifdef HAVE_IPV6 +static const char * +inet_ntop_v6 (const void *src, char *dst, size_t size) +{ + const char xdigits[] = "0123456789abcdef"; + int i; + const struct in6_addr *addr = (struct in6_addr *)src; + const u_char *ptr = addr->s6_addr; + const char *orig_dst = dst; + + if (size < INET6_ADDRSTRLEN) { + errno = ENOSPC; + return NULL; + } + for (i = 0; i < 8; ++i) { + int non_zerop = 0; + + if (non_zerop || (ptr[0] >> 4)) { + *dst++ = xdigits[ptr[0] >> 4]; + non_zerop = 1; + } + if (non_zerop || (ptr[0] & 0x0F)) { + *dst++ = xdigits[ptr[0] & 0x0F]; + non_zerop = 1; + } + if (non_zerop || (ptr[1] >> 4)) { + *dst++ = xdigits[ptr[1] >> 4]; + non_zerop = 1; + } + *dst++ = xdigits[ptr[1] & 0x0F]; + if (i != 7) + *dst++ = ':'; + ptr += 2; + } + *dst++ = '\0'; + return orig_dst; +} +#endif /* HAVE_IPV6 */ + +const char * ROKEN_LIB_FUNCTION +inet_ntop(int af, const void *src, char *dst, size_t size) +{ + switch (af) { + case AF_INET : + return inet_ntop_v4 (src, dst, size); +#ifdef HAVE_IPV6 + case AF_INET6 : + return inet_ntop_v6 (src, dst, size); +#endif + default : + errno = EAFNOSUPPORT; + return NULL; + } +} diff --git a/source4/heimdal/lib/roken/inet_pton.c b/source4/heimdal/lib/roken/inet_pton.c new file mode 100644 index 0000000000..21606accb1 --- /dev/null +++ b/source4/heimdal/lib/roken/inet_pton.c @@ -0,0 +1,49 @@ +/* + * Copyright (c) 1999 - 2000 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * 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. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE 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 THE INSTITUTE 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. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +RCSID("$Id: inet_pton.c,v 1.4 2005/04/12 11:28:52 lha Exp $"); +#endif + +#include <roken.h> + +int ROKEN_LIB_FUNCTION +inet_pton(int af, const char *src, void *dst) +{ + if (af != AF_INET) { + errno = EAFNOSUPPORT; + return -1; + } + return inet_aton (src, dst); +} diff --git a/source4/heimdal_build/config.m4 b/source4/heimdal_build/config.m4 index 462521d6b6..01a620c1c5 100644 --- a/source4/heimdal_build/config.m4 +++ b/source4/heimdal_build/config.m4 @@ -70,8 +70,8 @@ AC_CHECK_FUNCS([ \ atexit \ cgetent \ getprogname \ - inet_ntop \ inet_aton \ + inet_ntop \ inet_pton \ gethostname \ getnameinfo \ @@ -235,19 +235,38 @@ if test t$ac_cv_func_getaddrinfo != tyes; then SMB_ENABLE(HEIMDAL_ROKEN_ADDRINFO, YES) fi +SMB_ENABLE(HEIMDAL_ROKEN_GETNAMEINFO, NO) +if test t$ac_cv_func_getnameinfo != tyes; then + SMB_ENABLE(HEIMDAL_ROKEN_GETNAMEINFO, YES) +fi + # only add inet_aton if needed SMB_ENABLE(HEIMDAL_ROKEN_INET_ATON, NO) if test t$ac_cv_func_inet_aton != tyes; then SMB_ENABLE(HEIMDAL_ROKEN_INET_ATON, YES) fi +SMB_ENABLE(HEIMDAL_ROKEN_INET_NTOP, NO) +if test x"$ac_cv_func_inet_ntop" = x"no"; then + AC_CHECK_LIB_EXT(nsl_s, NSL_LIBS, inet_ntop) + AC_CHECK_LIB_EXT(nsl, NSL_LIBS, inet_ntop) + if test x"$ac_cv_lib_ext_nsl_s_inet_ntop" != x"yes" && + test x"$ac_cv_lib_ext_nsl_inet_ntop" != x"yes"; then + SMB_ENABLE(HEIMDAL_ROKEN_INET_NTOP, YES) + else + SMB_ENABLE(NSL,YES) + fi +fi + +SMB_ENABLE(HEIMDAL_ROKEN_INET_PTON, NO) if test x"$ac_cv_func_inet_pton" = x"no"; then AC_CHECK_LIB_EXT(nsl_s, NSL_LIBS, inet_pton) AC_CHECK_LIB_EXT(nsl, NSL_LIBS, inet_pton) - SMB_ENABLE(NSL,YES) if test x"$ac_cv_lib_ext_nsl_s_inet_pton" != x"yes" && test x"$ac_cv_lib_ext_nsl_inet_pton" != x"yes"; then - AC_MSG_ERROR([no inet_pton() function available!]) + SMB_ENABLE(HEIMDAL_ROKEN_INET_PTON, YES) + else + SMB_ENABLE(NSL,YES) fi fi diff --git a/source4/heimdal_build/config.mk b/source4/heimdal_build/config.mk index 39722d8cf2..93152fc868 100644 --- a/source4/heimdal_build/config.mk +++ b/source4/heimdal_build/config.mk @@ -373,6 +373,14 @@ OBJ_FILES = ../heimdal/lib/roken/gai_strerror.o CFLAGS = -Iheimdal_build -Iheimdal/lib/roken -Ilib/socket_wrapper OBJ_FILES = ../heimdal/lib/roken/inet_aton.o +[SUBSYSTEM::HEIMDAL_ROKEN_INET_NTOP] +CFLAGS = -Iheimdal_build -Iheimdal/lib/roken -Ilib/socket_wrapper +OBJ_FILES = ../heimdal/lib/roken/inet_ntop.o + +[SUBSYSTEM::HEIMDAL_ROKEN_INET_PTON] +CFLAGS = -Iheimdal_build -Iheimdal/lib/roken -Ilib/socket_wrapper +OBJ_FILES = ../heimdal/lib/roken/inet_pton.o + [SUBSYSTEM::HEIMDAL_ROKEN_GETPROGNAME] CFLAGS = -Iheimdal_build -Iheimdal/lib/roken -Ilib/socket_wrapper OBJ_FILES = ../heimdal/lib/roken/getprogname.o @@ -385,6 +393,10 @@ OBJ_FILES = ../heimdal/lib/roken/closefrom.o CFLAGS = -Iheimdal_build -Iheimdal/lib/roken -Ilib/socket_wrapper OBJ_FILES = ../heimdal/lib/roken/getprogname.ho +[SUBSYSTEM::HEIMDAL_ROKEN_GETNAMEINFO] +CFLAGS = -Iheimdal_build -Iheimdal/lib/roken -Ilib/socket_wrapper +OBJ_FILES = ../heimdal/lib/roken/getnameinfo.o + ####################### # Start SUBSYSTEM HEIMDAL_ROKEN_ADDRINFO [SUBSYSTEM::HEIMDAL_ROKEN_ADDRINFO] @@ -397,7 +409,7 @@ OBJ_FILES = \ ../heimdal/lib/roken/freehostent.o \ ../heimdal/lib/roken/copyhostent.o \ ../heimdal/lib/roken/hostent_find_fqdn.o -PRIVATE_DEPENDENCIES = EXT_SOCKET +PRIVATE_DEPENDENCIES = HEIMDAL_ROKEN_INET_PTON EXT_SOCKET ####################### # Start SUBSYSTEM HEIMDAL_ROKEN @@ -436,8 +448,11 @@ PUBLIC_DEPENDENCIES = \ HEIMDAL_ROKEN_ADDRINFO \ HEIMDAL_ROKEN_GAI_STRERROR \ HEIMDAL_ROKEN_INET_ATON \ + HEIMDAL_ROKEN_INET_NTOP \ + HEIMDAL_ROKEN_INET_PTON \ HEIMDAL_ROKEN_GETPROGNAME \ HEIMDAL_ROKEN_CLOSEFROM \ + HEIMDAL_ROKEN_GETNAMEINFO \ GAI \ NSL \ RESOLV \ |