|
|
|
@ -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); |
|
|
|
} |
|
|
|
|