| OLD | NEW |
| 1 #define _GNU_SOURCE | 1 #define _GNU_SOURCE |
| 2 #include <sys/socket.h> | 2 #include <sys/socket.h> |
| 3 #include <netinet/in.h> | 3 #include <netinet/in.h> |
| 4 #include <netdb.h> | 4 #include <netdb.h> |
| 5 #include <inttypes.h> | 5 #include <inttypes.h> |
| 6 #include <errno.h> | 6 #include <errno.h> |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 int getservbyport_r(int port, const char *prots, | 9 int getservbyport_r(int port, |
| 10 » struct servent *se, char *buf, size_t buflen, struct servent **res) | 10 const char* prots, |
| 11 { | 11 struct servent* se, |
| 12 » int i; | 12 char* buf, |
| 13 » struct sockaddr_in sin = { | 13 size_t buflen, |
| 14 » » .sin_family = AF_INET, | 14 struct servent** res) { |
| 15 » » .sin_port = port, | 15 int i; |
| 16 » }; | 16 struct sockaddr_in sin = { |
| 17 .sin_family = AF_INET, .sin_port = port, |
| 18 }; |
| 17 | 19 |
| 18 » if (!prots) { | 20 if (!prots) { |
| 19 » » int r = getservbyport_r(port, "tcp", se, buf, buflen, res); | 21 int r = getservbyport_r(port, "tcp", se, buf, buflen, res); |
| 20 » » if (r) r = getservbyport_r(port, "udp", se, buf, buflen, res); | 22 if (r) |
| 21 » » return r; | 23 r = getservbyport_r(port, "udp", se, buf, buflen, res); |
| 22 » } | 24 return r; |
| 25 } |
| 23 | 26 |
| 24 » /* Align buffer */ | 27 /* Align buffer */ |
| 25 » i = (uintptr_t)buf & sizeof(char *)-1; | 28 i = (uintptr_t)buf & sizeof(char*) - 1; |
| 26 » if (!i) i = sizeof(char *); | 29 if (!i) |
| 27 » if (buflen < 3*sizeof(char *)-i) | 30 i = sizeof(char*); |
| 28 » » return ERANGE; | 31 if (buflen < 3 * sizeof(char*) - i) |
| 29 » buf += sizeof(char *)-i; | 32 return ERANGE; |
| 30 » buflen -= sizeof(char *)-i; | 33 buf += sizeof(char*) - i; |
| 34 buflen -= sizeof(char*) - i; |
| 31 | 35 |
| 32 » if (strcmp(prots, "tcp") && strcmp(prots, "udp")) return EINVAL; | 36 if (strcmp(prots, "tcp") && strcmp(prots, "udp")) |
| 37 return EINVAL; |
| 33 | 38 |
| 34 » se->s_port = port; | 39 se->s_port = port; |
| 35 » se->s_proto = (char *)prots; | 40 se->s_proto = (char*)prots; |
| 36 » se->s_aliases = (void *)buf; | 41 se->s_aliases = (void*)buf; |
| 37 » buf += 2*sizeof(char *); | 42 buf += 2 * sizeof(char*); |
| 38 » buflen -= 2*sizeof(char *); | 43 buflen -= 2 * sizeof(char*); |
| 39 » se->s_aliases[1] = 0; | 44 se->s_aliases[1] = 0; |
| 40 » se->s_aliases[0] = se->s_name = buf; | 45 se->s_aliases[0] = se->s_name = buf; |
| 41 | 46 |
| 42 » switch (getnameinfo((void *)&sin, sizeof sin, 0, 0, buf, buflen, | 47 switch (getnameinfo((void*)&sin, sizeof sin, 0, 0, buf, buflen, |
| 43 » » strcmp(prots, "udp") ? 0 : NI_DGRAM)) { | 48 strcmp(prots, "udp") ? 0 : NI_DGRAM)) { |
| 44 » case EAI_MEMORY: | 49 case EAI_MEMORY: |
| 45 » case EAI_SYSTEM: | 50 case EAI_SYSTEM: |
| 46 » » return ENOMEM; | 51 return ENOMEM; |
| 47 » default: | 52 default: |
| 48 » » return ENOENT; | 53 return ENOENT; |
| 49 » case 0: | 54 case 0: |
| 50 » » break; | 55 break; |
| 51 » } | 56 } |
| 52 | 57 |
| 53 » *res = se; | 58 *res = se; |
| 54 » return 0; | 59 return 0; |
| 55 } | 60 } |
| OLD | NEW |