X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fnetwork%2Fgetservbyport_r.c;h=b7f21c6b398a52c4eeb61ea9a94f12a1e88e7b71;hb=f9827fc7da55c7b03ea5f36598ce8782c03e9d6e;hp=f119abc8d17fb8ed1503413ed1b0e3badc99555f;hpb=28af39fe427ffec8b836f4f30450ffc30b03e5c4;p=musl diff --git a/src/network/getservbyport_r.c b/src/network/getservbyport_r.c index f119abc8..b7f21c6b 100644 --- a/src/network/getservbyport_r.c +++ b/src/network/getservbyport_r.c @@ -5,6 +5,7 @@ #include #include #include +#include int getservbyport_r(int port, const char *prots, struct servent *se, char *buf, size_t buflen, struct servent **res) @@ -15,17 +16,22 @@ int getservbyport_r(int port, const char *prots, .sin_port = port, }; + if (!prots) { + int r = getservbyport_r(port, "tcp", se, buf, buflen, res); + if (r) r = getservbyport_r(port, "udp", se, buf, buflen, res); + return r; + } + *res = 0; + /* Align buffer */ i = (uintptr_t)buf & sizeof(char *)-1; if (!i) i = sizeof(char *); - if (buflen < 3*sizeof(char *)-i) { - errno = ERANGE; - return -1; - } + if (buflen < 3*sizeof(char *)-i) + return ERANGE; buf += sizeof(char *)-i; buflen -= sizeof(char *)-i; - if (strcmp(prots, "tcp") && strcmp(prots, "udp")) return -1; + if (strcmp(prots, "tcp") && strcmp(prots, "udp")) return EINVAL; se->s_port = port; se->s_proto = (char *)prots; @@ -35,8 +41,19 @@ int getservbyport_r(int port, const char *prots, se->s_aliases[1] = 0; se->s_aliases[0] = se->s_name = buf; - if (getnameinfo((void *)&sin, sizeof sin, 0, 0, buf, buflen, - strcmp(prots, "udp") ? 0 : NI_DGRAM) < 0) return -1; + switch (getnameinfo((void *)&sin, sizeof sin, 0, 0, buf, buflen, + strcmp(prots, "udp") ? 0 : NI_DGRAM)) { + case EAI_MEMORY: + case EAI_SYSTEM: + return ENOMEM; + default: + return ENOENT; + case 0: + break; + } + + /* A numeric port string is not a service record. */ + if (strtol(buf, 0, 10)==ntohs(port)) return ENOENT; *res = se; return 0;