OSDN Git Service

allow freeaddrinfo of arbitrary sublists of addrinfo list
[android-x86/external-musl-libc.git] / src / network / getaddrinfo.c
index e33bfa2..5ae8cbf 100644 (file)
@@ -16,13 +16,7 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru
        char canon[256], *outcanon;
        int nservs, naddrs, nais, canon_len, i, j, k;
        int family = AF_UNSPEC, flags = 0, proto = 0, socktype = 0;
-       struct aibuf {
-               struct addrinfo ai;
-               union sa {
-                       struct sockaddr_in sin;
-                       struct sockaddr_in6 sin6;
-               } sa;
-       } *out;
+       struct aibuf *out;
 
        if (!host && !serv) return EAI_NONAME;
 
@@ -110,6 +104,7 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru
        }
 
        for (k=i=0; i<naddrs; i++) for (j=0; j<nservs; j++, k++) {
+               out[k].slot = i;
                out[k].ai = (struct addrinfo){
                        .ai_family = addrs[i].family,
                        .ai_socktype = ports[j].socktype,
@@ -134,6 +129,7 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru
                        break;                  
                }
        }
+       out[0].ref = nais;
        out[nais-1].ai.ai_next = 0;
        *res = &out->ai;
        return 0;