|
|
|
|
@ -566,13 +566,41 @@ int endpoint_parse_any(endpoint_t *d, const char *s) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int sockaddr_getaddrinfo(sockaddr_t *a, const char *s) {
|
|
|
|
|
struct addrinfo hints, *res;
|
|
|
|
|
int status;
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
memset(&hints, 0, sizeof hints);
|
|
|
|
|
hints.ai_family = AF_UNSPEC;
|
|
|
|
|
|
|
|
|
|
if ((status = getaddrinfo(s, NULL, &hints, &res)) != 0) {
|
|
|
|
|
__C_DBG("getaddrinfo failed for %s, status is \"%s\"\n", s, gai_strerror(status));
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
if (res->ai_family == AF_INET) { // IPv4
|
|
|
|
|
struct sockaddr_in *ipv4 = (struct sockaddr_in *) res->ai_addr;
|
|
|
|
|
a->u.ipv4 = ipv4->sin_addr;
|
|
|
|
|
a->family = &__socket_families[SF_IP4];
|
|
|
|
|
}
|
|
|
|
|
else if (res->ai_family == AF_INET6) {
|
|
|
|
|
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *) res->ai_addr;
|
|
|
|
|
a->u.ipv6 = ipv6->sin6_addr;
|
|
|
|
|
a->family = &__socket_families[SF_IP6];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
ret = -1;
|
|
|
|
|
|
|
|
|
|
freeaddrinfo(res);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int endpoint_parse_any_getaddrinfo(endpoint_t *d, const char *s) {
|
|
|
|
|
unsigned int len;
|
|
|
|
|
const char *ep;
|
|
|
|
|
char buf[64];
|
|
|
|
|
void *addr;
|
|
|
|
|
struct addrinfo hints, *res;
|
|
|
|
|
int status;
|
|
|
|
|
|
|
|
|
|
ep = strrchr(s, ':');
|
|
|
|
|
if (!ep) {
|
|
|
|
|
@ -598,27 +626,9 @@ int endpoint_parse_any_getaddrinfo(endpoint_t *d, const char *s) {
|
|
|
|
|
sprintf(buf, "%.*s", len, s);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memset(&hints, 0, sizeof hints);
|
|
|
|
|
hints.ai_family = AF_UNSPEC;
|
|
|
|
|
|
|
|
|
|
if ((status = getaddrinfo(buf, NULL, &hints, &res)) != 0) {
|
|
|
|
|
__C_DBG("getaddrinfo failed for %s, status is \"%s\"\n", s, gai_strerror(status));
|
|
|
|
|
if (sockaddr_getaddrinfo(&d->address, buf))
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (res->ai_family == AF_INET) { // IPv4
|
|
|
|
|
struct sockaddr_in *ipv4 = (struct sockaddr_in *) res->ai_addr;
|
|
|
|
|
addr = &(ipv4->sin_addr);
|
|
|
|
|
memcpy(&d->address.u, addr, sizeof(struct in_addr));
|
|
|
|
|
d->address.family = &__socket_families[SF_IP4];
|
|
|
|
|
} else { // IPv6
|
|
|
|
|
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *) res->ai_addr;
|
|
|
|
|
addr = &(ipv6->sin6_addr);
|
|
|
|
|
memcpy(&d->address.u, addr, sizeof(struct in6_addr));
|
|
|
|
|
d->address.family = &__socket_families[SF_IP6];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
freeaddrinfo(res);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|