etc/inet: add inet_ntop implementation
authorshefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Thu, 23 Apr 2009 20:01:10 +0000 (20:01 +0000)
committershefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Thu, 23 Apr 2009 20:01:10 +0000 (20:01 +0000)
Someday windows will decide to support networking...  sigh...

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@2131 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

etc/user/inet.c
inc/user/linux/arpa/inet.h

index 28e3d5b..47ff212 100644 (file)
@@ -32,6 +32,8 @@
  */\r
 \r
 #include <arpa/inet.h>\r
+#include <stdlib.h>\r
+#include <stdio.h>\r
 \r
 static int inet_pton4(const char *src, struct in_addr *addr)\r
 {\r
@@ -149,10 +151,66 @@ int inet_pton(int af, const char *src, void *dst)
 {\r
        switch (af) {\r
        case AF_INET:\r
-               return inet_pton4(src, dst);\r
+               return inet_pton4(src, (struct in_addr *) dst);\r
        case AF_INET6:\r
-               return inet_pton6(src, dst);\r
+               return inet_pton6(src, (struct in6_addr *) dst);\r
        default:\r
                return -1;\r
        }\r
 }\r
+\r
+static const char *inet_ntop4(const void *src, char *dst, socklen_t cnt)\r
+{\r
+       struct sockaddr_in in;\r
+\r
+       in.sin_family = AF_INET;\r
+       memcpy(&in.sin_addr, src, 4);\r
+       if (getnameinfo((struct sockaddr *) &in,\r
+                                       (socklen_t) sizeof(struct sockaddr_in),\r
+                                       dst, cnt, NULL, 0, NI_NUMERICHOST))\r
+               return NULL;\r
+\r
+       return dst;\r
+}\r
+\r
+static const char *inet_ntop6(const void *src, char *dst, socklen_t cnt)\r
+{\r
+       struct sockaddr_in6 in6;\r
+       char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"];\r
+       int i, n = 0;\r
+\r
+       memset(&in6, 0, sizeof in6);\r
+       in6.sin6_family = AF_INET6;\r
+       memcpy(&in6.sin6_addr, src, sizeof(struct in_addr6));\r
+\r
+       /*\r
+        * If no ipv6 support return simple IPv6 format rule:\r
+        * A series of "0's in a 16bit block can be represented by "0" \r
+        */\r
+       if (getnameinfo((struct sockaddr *) &in6, (socklen_t) (sizeof in6),\r
+                                       dst, cnt, NULL, 0, NI_NUMERICHOST)) \r
+       {\r
+                               \r
+               if (cnt < sizeof(tmp))\r
+                       return NULL;\r
+\r
+               for (i = 0; i < 8; i++) \r
+                       n += sprintf(tmp+n, "%s%x", i ? ":" : "",\r
+                                                ntohs(((unsigned short*) src)[i]));\r
+               tmp[n] = '\0';\r
+               strcpy(dst, tmp);\r
+       }\r
+       return dst;\r
+}\r
+\r
+const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)\r
+{\r
+       switch (af) {\r
+       case AF_INET:\r
+               return inet_ntop4(src, dst, cnt);\r
+       case AF_INET6:\r
+               return inet_ntop6(src, dst, cnt);\r
+       default:\r
+               return NULL;\r
+       }\r
+}\r
index 2c7b53c..18c13a0 100644 (file)
 \r
 #include <ws2tcpip.h>\r
 \r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
 #if WINVER < 0x600\r
 int inet_pton(int af, const char *src, void *dst);\r
+const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);\r
+#endif\r
+\r
+#ifdef __cplusplus\r
+}\r
 #endif\r
 \r
 #endif /* _INET_H_ */\r