[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