You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/09/13 00:57:52 UTC

[incubator-nuttx] 01/02: getaddrinfo: support AF_LOCAL

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit 352f636b3831fbd97d97d0bb4b658788b92306a9
Author: Jiuzhu Dong <do...@xiaomi.com>
AuthorDate: Sun Sep 5 15:58:03 2021 +0800

    getaddrinfo: support AF_LOCAL
    
    the hostname is as sun_path.
    
    Signed-off-by: Jiuzhu Dong <do...@xiaomi.com>
---
 libs/libc/netdb/lib_getaddrinfo.c | 49 +++++++++++++++++++++++++++++----------
 1 file changed, 37 insertions(+), 12 deletions(-)

diff --git a/libs/libc/netdb/lib_getaddrinfo.c b/libs/libc/netdb/lib_getaddrinfo.c
index 786c9b1..87068ef 100644
--- a/libs/libc/netdb/lib_getaddrinfo.c
+++ b/libs/libc/netdb/lib_getaddrinfo.c
@@ -29,6 +29,7 @@
 #include <arpa/inet.h>
 #include <nuttx/net/loopback.h>
 #include <netdb.h>
+#include <sys/un.h>
 
 #include "libc.h"
 #include "lib_netdb.h"
@@ -42,6 +43,7 @@ struct ai_s
   struct addrinfo ai;
   union
   {
+    struct sockaddr_un sun;
     struct sockaddr_in sin;
     struct sockaddr_in6 sin6;
   } sa;
@@ -52,13 +54,9 @@ struct ai_s
  ****************************************************************************/
 
 FAR static struct ai_s *alloc_ai(int family, int socktype, int protocol,
-                                 int port, FAR void *addr)
+                                 int port, FAR const void *addr)
 {
   FAR struct ai_s *ai;
-  socklen_t addrlen;
-
-  addrlen = (family == AF_INET) ? sizeof(struct sockaddr_in)
-                                : sizeof(struct sockaddr_in6);
 
   ai = lib_zalloc(sizeof(struct ai_s));
   if (ai == NULL)
@@ -67,22 +65,30 @@ FAR static struct ai_s *alloc_ai(int family, int socktype, int protocol,
     }
 
   ai->ai.ai_addr     = (FAR struct sockaddr *)&ai->sa;
-  ai->ai.ai_addrlen  = addrlen;
   ai->ai.ai_family   = family;
   ai->ai.ai_socktype = socktype;
   ai->ai.ai_protocol = protocol;
 
   switch (family)
     {
+#ifdef CONFIG_NET_LOCAL
+      case AF_LOCAL:
+        ai->ai.ai_addrlen       = sizeof(struct sockaddr_un);
+        ai->sa.sun.sun_family   = AF_LOCAL;
+        strncpy(ai->sa.sun.sun_path, addr, sizeof(ai->sa.sun.sun_path));
+        break;
+#endif
 #ifdef CONFIG_NET_IPv4
       case AF_INET:
-        ai->sa.sin.sin_family = AF_INET;
-        ai->sa.sin.sin_port   = port;  /* Already network order */
+        ai->ai.ai_addrlen       = sizeof(struct sockaddr_in);
+        ai->sa.sin.sin_family   = AF_INET;
+        ai->sa.sin.sin_port     = port;  /* Already network order */
         memcpy(&ai->sa.sin.sin_addr, addr, sizeof(ai->sa.sin.sin_addr));
         break;
 #endif
 #ifdef CONFIG_NET_IPv6
       case AF_INET6:
+        ai->ai.ai_addrlen       = sizeof(struct sockaddr_in6);
         ai->sa.sin6.sin6_family = AF_INET6;
         ai->sa.sin6.sin6_port   = port;  /* Already network order */
         memcpy(&ai->sa.sin6.sin6_addr, addr, sizeof(ai->sa.sin6.sin6_addr));
@@ -138,6 +144,7 @@ int getaddrinfo(FAR const char *hostname, FAR const char *servname,
 
       if (family != AF_INET &&
           family != AF_INET6 &&
+          family != AF_LOCAL &&
           family != AF_UNSPEC)
         {
           return EAI_FAMILY;
@@ -188,7 +195,7 @@ int getaddrinfo(FAR const char *hostname, FAR const char *servname,
 #ifdef CONFIG_NET_IPv4
       if (family == AF_INET || family == AF_UNSPEC)
         {
-          ai = alloc_ai(AF_INET, socktype, proto, port, (FAR void *)&addr);
+          ai = alloc_ai(AF_INET, socktype, proto, port, &addr);
           if (ai != NULL)
             {
               *res = (FAR struct addrinfo *)ai;
@@ -199,7 +206,7 @@ int getaddrinfo(FAR const char *hostname, FAR const char *servname,
 #ifdef CONFIG_NET_IPv6
       if (family == AF_INET6 || family == AF_UNSPEC)
         {
-          ai = alloc_ai(AF_INET6, socktype, proto, port, (FAR void *)&addr);
+          ai = alloc_ai(AF_INET6, socktype, proto, port, &addr);
           if (ai != NULL)
             {
               /* Can return both IPv4 and IPv6 loopback. */
@@ -228,7 +235,7 @@ int getaddrinfo(FAR const char *hostname, FAR const char *servname,
       if (family == AF_INET || family == AF_UNSPEC)
         {
           ai = alloc_ai(AF_INET, socktype, proto, port,
-                        (FAR void *)&g_lo_ipv4addr);
+                        &g_lo_ipv4addr);
           if (ai != NULL)
             {
               *res = (FAR struct addrinfo *)ai;
@@ -240,7 +247,7 @@ int getaddrinfo(FAR const char *hostname, FAR const char *servname,
       if (family == AF_INET6 || family == AF_UNSPEC)
         {
           ai = alloc_ai(AF_INET6, socktype, proto, port,
-                        (FAR void *)&g_lo_ipv6addr);
+                        &g_lo_ipv6addr);
           if (ai != NULL)
             {
               /* Can return both IPv4 and IPv6 loopback. */
@@ -265,6 +272,24 @@ int getaddrinfo(FAR const char *hostname, FAR const char *servname,
 #endif /* CONFIG_NET_LOOPBACK */
     }
 
+#ifdef CONFIG_NET_LOCAL
+  if (family == AF_LOCAL)
+    {
+      ai = alloc_ai(AF_LOCAL, socktype, proto, port, hostname);
+      if (ai != NULL)
+        {
+          *res = (FAR struct addrinfo *)ai;
+        }
+
+      if (flags & AI_CANONNAME)
+        {
+          ai->ai.ai_canonname = (FAR char *)hostname;
+        }
+
+      return (*res != NULL) ? OK : EAI_MEMORY;
+    }
+#endif
+
   hostbuffer = lib_malloc(CONFIG_NETDB_BUFSIZE);
   if (hostbuffer == NULL)
     {