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 |