Stefan Schuermans commited on 2017-10-28 22:53:55
Showing 1 changed files, with 18 additions and 8 deletions.
| ... | ... |
@@ -58,19 +58,29 @@ const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) |
| 58 | 58 |
|
| 59 | 59 |
int inet_pton(int af, const char *src, void *dst) |
| 60 | 60 |
{
|
| 61 |
- struct addrinfo hints, *res, *ressave; |
|
| 61 |
+ struct addrinfo hints, *res; |
|
| 62 | 62 |
memset(&hints, 0, sizeof(struct addrinfo)); |
| 63 | 63 |
hints.ai_family = af; |
| 64 | 64 |
if (getaddrinfo(src, NULL, &hints, &res) != 0) {
|
| 65 |
- return -1; |
|
| 65 |
+ return 0; // error |
|
| 66 | 66 |
} |
| 67 |
- ressave = res; |
|
| 68 |
- while (res) {
|
|
| 69 |
- memcpy(dst, res->ai_addr, res->ai_addrlen); |
|
| 70 |
- res = res->ai_next; |
|
| 67 |
+ if (!res) {
|
|
| 68 |
+ return 0; // error |
|
| 71 | 69 |
} |
| 72 |
- freeaddrinfo(ressave); |
|
| 73 |
- return 0; |
|
| 70 |
+ int ret; |
|
| 71 |
+ if (af == AF_INET) {
|
|
| 72 |
+ struct sockaddr_in * psa = (struct sockaddr_in *)res->ai_addr; |
|
| 73 |
+ memcpy(dst, &psa->sin_addr, sizeof(psa->sin_addr)); |
|
| 74 |
+ ret = 1; // success |
|
| 75 |
+ } else if (af == AF_INET6) {
|
|
| 76 |
+ struct sockaddr_in6 * psa = (struct sockaddr_in6 *)res->ai_addr; |
|
| 77 |
+ memcpy(dst, &psa->sin6_addr, sizeof(psa->sin6_addr)); |
|
| 78 |
+ ret = 1; // success |
|
| 79 |
+ } else {
|
|
| 80 |
+ ret = 0; // error |
|
| 81 |
+ } |
|
| 82 |
+ freeaddrinfo(res); |
|
| 83 |
+ return ret; |
|
| 74 | 84 |
} |
| 75 | 85 |
|
| 76 | 86 |
} // namespace Blinker |
| 77 | 87 |