- *res = &buf->ai;
- return 0;
- }
-
- if (!*host) return EAI_NONAME;
-
- /* Try as a numeric address */
- if (__ipparse(&sa, family, host) >= 0) {
- buf = calloc(sizeof *buf, 1+EXTRA);
- if (!buf) return EAI_MEMORY;
- family = sa.sin.sin_family;
- 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->ai.ai_canonname = (char *)host;
- buf->sa = sa;
- buf->sa.sin.sin_port = port;
- *res = &buf->ai;
- return 0;
- }
-
- if (flags & AI_NUMERICHOST) return EAI_NONAME;
-
- f = __fopen_rb_ca("/etc/hosts", &_f, _buf, sizeof _buf);
- if (f) while (fgets(line, sizeof line, f)) {
- char *p;
- size_t l = strlen(host);
-
- if ((p=strchr(line, '#'))) *p++='\n', *p=0;
- for(p=line+1; (p=strstr(p, host)) &&
- (!isspace(p[-1]) || !isspace(p[l])); p++);
- if (!p) continue;
- __fclose_ca(f);
-
- /* Isolate IP address to parse */
- for (p=line; *p && !isspace(*p); p++);
- *p++ = 0;
- if (__ipparse(&sa, family, line) < 0) return EAI_NONAME;
-
- /* Allocate and fill result buffer */
- buf = calloc(sizeof *buf, 1+EXTRA);
- if (!buf) return EAI_MEMORY;
- family = sa.sin.sin_family;
- 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 = sa;
- buf->sa.sin.sin_port = port;
-
- /* Extract first name as canonical name */
- for (; *p && isspace(*p); p++);
- buf->ai.ai_canonname = (void *)(buf+1);
- snprintf(buf->ai.ai_canonname, 256, "%s", p);
- for (p=buf->ai.ai_canonname; *p && !isspace(*p); p++);
- *p = 0;
- if (!is_valid(buf->ai.ai_canonname))
- buf->ai.ai_canonname = 0;
-
- *res = &buf->ai;
- return 0;