X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fnetwork%2Fgetaddrinfo.c;h=b9e562f7cdaae41287847d942cc18e59acd8269f;hb=780aede41913528781bbc8ff0d0e27505595f7c0;hp=93c75160d649a5f1cf141eea3cb45bb5a44a2b3a;hpb=4f346b08b33c9265c36fe8a14f5f908b1a9f296a;p=musl diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c index 93c75160..b9e562f7 100644 --- a/src/network/getaddrinfo.c +++ b/src/network/getaddrinfo.c @@ -47,7 +47,7 @@ struct aibuf { /* Extra slots needed for storing canonical name */ #define EXTRA ((256+sizeof(struct aibuf)-1)/sizeof(struct aibuf)) -int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint, struct addrinfo **res) +int getaddrinfo(const char *restrict host, const char *restrict serv, const struct addrinfo *restrict hint, struct addrinfo **restrict res) { int flags = hint ? hint->ai_flags : 0; int family = hint ? hint->ai_family : AF_UNSPEC; @@ -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,23 @@ 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 *end = line; + 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) || !isspace(line[servlen])) + continue; + port = strtoul(line+servlen, &end, 10); + if (strncmp(end, proto==IPPROTO_UDP ? "/udp" : "/tcp", 4)) + continue; + break; + } + __fclose_ca(f); + if (feof(f)) return EAI_SERVICE; } port = htons(port); }