From: Rich Felker Date: Wed, 24 Jul 2013 20:49:17 +0000 (-0400) Subject: make getaddrinfo with AF_UNSPEC and null host return both IPv4 and v6 X-Git-Tag: v0.9.12~32 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=f5dfb45f78872b2574b911af2e0a372c1dac1590;p=oweals%2Fmusl.git make getaddrinfo with AF_UNSPEC and null host return both IPv4 and v6 based on a patch by orc, with indexing and flow control cleaned up a little bit. this code is all going to be replaced at some point in the near future. --- diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c index 3d7b9ecd..4c1fe277 100644 --- a/src/network/getaddrinfo.c +++ b/src/network/getaddrinfo.c @@ -100,21 +100,30 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru } if (!host) { - if (family == AF_UNSPEC) family = AF_INET; - buf = calloc(sizeof *buf, 1+EXTRA); + if (family == AF_UNSPEC) { + cnt = 2; family = AF_INET; + } else { + cnt = 1; + } + buf = calloc(sizeof *buf, cnt); if (!buf) return EAI_MEMORY; - buf->ai.ai_protocol = proto; - buf->ai.ai_socktype = type; - buf->ai.ai_addr = (void *)&buf->sa; - buf->ai.ai_addrlen = family==AF_INET6 ? sizeof sa.sin6 : sizeof sa.sin; - buf->ai.ai_family = family; - buf->sa.sin.sin_family = family; - buf->sa.sin.sin_port = port; - if (!(flags & AI_PASSIVE)) { - if (family == AF_INET) { - 0[(uint8_t*)&buf->sa.sin.sin_addr.s_addr]=127; - 3[(uint8_t*)&buf->sa.sin.sin_addr.s_addr]=1; - } else buf[0].sa.sin6.sin6_addr.s6_addr[15] = 1; + for (i=0; iai; return 0;