remove scanf dependency from getaddrinfo /etc/services support
This commit is contained in:
parent
efe72c5619
commit
845a5e69fa
1 changed files with 4 additions and 5 deletions
|
|
@ -79,18 +79,17 @@ int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint,
|
||||||
if (!*z && port > 65535) return EAI_SERVICE;
|
if (!*z && port > 65535) return EAI_SERVICE;
|
||||||
if (!port) {
|
if (!port) {
|
||||||
size_t servlen = strlen(serv);
|
size_t servlen = strlen(serv);
|
||||||
char protname[4];
|
char *end = line;
|
||||||
|
|
||||||
if (flags & AI_NUMERICSERV) return EAI_SERVICE;
|
if (flags & AI_NUMERICSERV) return EAI_SERVICE;
|
||||||
|
|
||||||
f = __fopen_rb_ca("/etc/services", &_f, _buf, sizeof _buf);
|
f = __fopen_rb_ca("/etc/services", &_f, _buf, sizeof _buf);
|
||||||
if (!f) return EAI_SERVICE;
|
if (!f) return EAI_SERVICE;
|
||||||
while (fgets(line, sizeof line, f)) {
|
while (fgets(line, sizeof line, f)) {
|
||||||
if (strncmp(line, serv, servlen))
|
if (strncmp(line, serv, servlen) || !isspace(line[servlen]))
|
||||||
continue;
|
continue;
|
||||||
if (sscanf(line+servlen, "%lu/%3s", &port, protname) < 2)
|
port = strtoul(line+servlen, &end, 10);
|
||||||
continue;
|
if (strncmp(end, proto==IPPROTO_UDP ? "/udp" : "/tcp", 4))
|
||||||
if (strcmp(protname, proto==IPPROTO_UDP ? "udp" : "tcp"))
|
|
||||||
continue;
|
continue;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue