[PATCH 02/13] libnetworking: Add minimal getnameinfo().
Christian Mauderer
christian.mauderer at embedded-brains.de
Thu Apr 21 08:49:42 UTC 2016
From: Christian Mauderer <Christian.Mauderer at 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
+ * <rtems at 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
More information about the devel
mailing list