From: Christian Mauderer <christian.maude...@embedded-brains.de> This implementation just falls back to giving a string representation of the IP. It supports IPv4 only. --- cpukit/libnetworking/Makefile.am | 2 +- cpukit/libnetworking/libc/getnameinfo.c | 61 +++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 cpukit/libnetworking/libc/getnameinfo.c
diff --git a/cpukit/libnetworking/Makefile.am b/cpukit/libnetworking/Makefile.am index 2a8e06a..1dff40c 100644 --- a/cpukit/libnetworking/Makefile.am +++ b/cpukit/libnetworking/Makefile.am @@ -213,7 +213,7 @@ include_HEADERS += ifaddrs.h libc_a_SOURCES = libc/base64.c \ libc/gethostbydns.c libc/gethostbyht.c libc/gethostbynis.c \ libc/gethostnamadr.c libc/getnetbydns.c libc/getnetbyht.c \ - libc/getnetbynis.c libc/getnetnamadr.c libc/getproto.c \ + libc/getnetbynis.c libc/getnetnamadr.c libc/getnameinfo.c libc/getproto.c \ libc/getprotoent.c libc/getprotoname.c libc/getservbyname.c \ libc/getservbyport.c libc/getservent.c libc/herror.c libc/inet_addr.c \ libc/inet_lnaof.c libc/inet_makeaddr.c libc/inet_netof.c \ diff --git a/cpukit/libnetworking/libc/getnameinfo.c b/cpukit/libnetworking/libc/getnameinfo.c new file mode 100644 index 0000000..415f150 --- /dev/null +++ b/cpukit/libnetworking/libc/getnameinfo.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2016 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * <rt...@embedded-brains.de> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#include <netdb.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <stdio.h> + +int +getnameinfo(const struct sockaddr *sa, socklen_t salen, char *node, + size_t nodelen, char *service, size_t servicelen, int flags) +{ + int af; + const struct sockaddr_in *sa_in = (const struct sockaddr_in *)sa; + + (void) salen; + + af = sa->sa_family; + if (af != AF_INET) { + return EAI_FAMILY; + } + + if ((flags & NI_NAMEREQD) != 0) { + return EAI_NONAME; + } + + /* FIXME: This return just the address value. Try resolving instead. */ + if (node != NULL && nodelen > 0) { + const void *addr = &sa_in->sin_addr; + + if(inet_ntop(af, addr, node, nodelen) == NULL) { + return EAI_FAIL; + } + } + + if (service != NULL && servicelen > 0) { + in_port_t port = sa_in->sin_port; + int rv; + + rv = snprintf(service, servicelen, "%u", port); + if (rv <= 0) { + return EAI_FAIL; + } else if ((unsigned)rv >= servicelen) { + return EAI_OVERFLOW; + } + } + + return 0; +} -- 1.8.4.5 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel