-#if 0
- f = __fopen_rb_ca("/etc/resolv.conf", &_f, _buf, sizeof _buf);
- if (f) while (fgets(line, sizeof line, f)) {
- if (!isspace(line[10]) || (strncmp(line, "search", 6)
- && strncmp(line, "domain", 6))) continue;
- }
- if (f) __fclose_ca(f);
-#endif
-
- /* Perform one or more DNS queries for host */
- memset(reply, 0, sizeof reply);
- result = __dns_query(reply, host, family, 0);
- if (result < 0) return result;
-
- cnt = __dns_count_addrs(reply, result);
- if (cnt <= 0) return EAI_NONAME;
-
- buf = calloc(sizeof *buf, cnt+EXTRA);
- if (!buf) return EAI_MEMORY;
-
- i = 0;
- if (family != AF_INET6) {
- j = __dns_get_rr(&buf[i].sa.sin.sin_addr, sizeof *buf, 4, cnt-i, reply, RR_A, 0);
- while (j--) buf[i++].sa.sin.sin_family = AF_INET;
- }
- if (family != AF_INET) {
- j = __dns_get_rr(&buf[i].sa.sin6.sin6_addr, sizeof *buf, 16, cnt-i, reply, RR_AAAA, 0);
- while (j--) buf[i++].sa.sin.sin_family = AF_INET6;
- }
- if (result>1) {
- j = __dns_get_rr(&buf[i].sa.sin.sin_addr, sizeof *buf, 4, cnt-i, reply+512, RR_A, 0);
- while (j--) buf[i++].sa.sin.sin_family = AF_INET;
- j = __dns_get_rr(&buf[i].sa.sin6.sin6_addr, sizeof *buf, 16, cnt-i, reply+512, RR_AAAA, 0);
- while (j--) buf[i++].sa.sin.sin_family = AF_INET6;
- }
-
- if (__dns_get_rr((void *)&buf[cnt], 0, 256, 1, reply, RR_CNAME, 1) <= 0)
- strcpy((void *)&buf[cnt], host);
-
- for (i=0; i<cnt; i++) {
- buf[i].ai.ai_protocol = proto;
- buf[i].ai.ai_socktype = type;
- buf[i].ai.ai_addr = (void *)&buf[i].sa;
- buf[i].ai.ai_addrlen = buf[i].sa.sin.sin_family==AF_INET6
- ? sizeof sa.sin6 : sizeof sa.sin;
- buf[i].ai.ai_family = buf[i].sa.sin.sin_family;
- buf[i].sa.sin.sin_port = port;
- buf[i].ai.ai_next = &buf[i+1].ai;
- buf[i].ai.ai_canonname = (void *)&buf[cnt];
+ for (k=i=0; i<naddrs; i++) for (j=0; j<nservs; j++, k++) {
+ out[k].slot = k;
+ out[k].ai = (struct addrinfo){
+ .ai_family = addrs[i].family,
+ .ai_socktype = ports[j].socktype,
+ .ai_protocol = ports[j].proto,
+ .ai_addrlen = addrs[i].family == AF_INET
+ ? sizeof(struct sockaddr_in)
+ : sizeof(struct sockaddr_in6),
+ .ai_addr = (void *)&out[k].sa,
+ .ai_canonname = outcanon };
+ if (k) out[k-1].ai.ai_next = &out[k].ai;
+ switch (addrs[i].family) {
+ case AF_INET:
+ out[k].sa.sin.sin_family = AF_INET;
+ out[k].sa.sin.sin_port = htons(ports[j].port);
+ memcpy(&out[k].sa.sin.sin_addr, &addrs[i].addr, 4);
+ break;
+ case AF_INET6:
+ out[k].sa.sin6.sin6_family = AF_INET6;
+ out[k].sa.sin6.sin6_port = htons(ports[j].port);
+ out[k].sa.sin6.sin6_scope_id = addrs[i].scopeid;
+ memcpy(&out[k].sa.sin6.sin6_addr, &addrs[i].addr, 16);
+ break;
+ }