getaddrinfo /etc/services lookup support
This commit is contained in:
parent
b4f632bb27
commit
efe72c5619
1 changed files with 16 additions and 3 deletions
|
|
@ -58,7 +58,6 @@ int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint,
|
||||||
union sa sa = {{0}};
|
union sa sa = {{0}};
|
||||||
unsigned char reply[1024];
|
unsigned char reply[1024];
|
||||||
int i, j;
|
int i, j;
|
||||||
//char hostbuf[256];
|
|
||||||
char line[512];
|
char line[512];
|
||||||
FILE *f, _f;
|
FILE *f, _f;
|
||||||
unsigned char _buf[1024];
|
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);
|
port = strtoul(serv, &z, 10);
|
||||||
if (!*z && port > 65535) return EAI_SERVICE;
|
if (!*z && port > 65535) return EAI_SERVICE;
|
||||||
if (!port) {
|
if (!port) {
|
||||||
|
size_t servlen = strlen(serv);
|
||||||
|
char protname[4];
|
||||||
|
|
||||||
if (flags & AI_NUMERICSERV) return EAI_SERVICE;
|
if (flags & AI_NUMERICSERV) return EAI_SERVICE;
|
||||||
|
|
||||||
//f = fopen("/etc/services", "rb");
|
f = __fopen_rb_ca("/etc/services", &_f, _buf, sizeof _buf);
|
||||||
return EAI_SERVICE;
|
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);
|
port = htons(port);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue