getaddrinfo /etc/services lookup support

This commit is contained in:
Rich Felker 2012-07-22 19:42:44 -04:00
parent b4f632bb27
commit efe72c5619

View file

@ -58,7 +58,6 @@ int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint,
union sa sa = {{0}};
unsigned char reply[1024];
int i, j;
//char hostbuf[256];
char line[512];
FILE *f, _f;
unsigned char _buf[1024];
@ -79,10 +78,24 @@ int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint,
port = strtoul(serv, &z, 10);
if (!*z && port > 65535) return EAI_SERVICE;
if (!port) {
size_t servlen = strlen(serv);
char protname[4];
if (flags & AI_NUMERICSERV) return EAI_SERVICE;
//f = fopen("/etc/services", "rb");
return EAI_SERVICE;
f = __fopen_rb_ca("/etc/services", &_f, _buf, sizeof _buf);
if (!f) return EAI_SERVICE;
while (fgets(line, sizeof line, f)) {
if (strncmp(line, serv, servlen))
continue;
if (sscanf(line+servlen, "%lu/%3s", &port, protname) < 2)
continue;
if (strcmp(protname, proto==IPPROTO_UDP ? "udp" : "tcp"))
continue;
break;
}
__fclose_ca(f);
if (feof(f)) return EAI_SERVICE;
}
port = htons(port);
}