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 4f3dd0c..ba3c233 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

Reply via email to