diff options
Diffstat (limited to 'pjlib/src/pj')
-rw-r--r-- | pjlib/src/pj/addr_resolv_sock.c | 62 | ||||
-rw-r--r-- | pjlib/src/pj/ip_helper_generic.c | 3 |
2 files changed, 45 insertions, 20 deletions
diff --git a/pjlib/src/pj/addr_resolv_sock.c b/pjlib/src/pj/addr_resolv_sock.c index c88cc8f5..57bcd8f1 100644 --- a/pjlib/src/pj/addr_resolv_sock.c +++ b/pjlib/src/pj/addr_resolv_sock.c @@ -73,18 +73,28 @@ PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename, /* Check if nodename is IP address */ pj_bzero(&ai[0], sizeof(ai[0])); - ai[0].ai_addr.addr.sa_family = (pj_uint16_t)af; - if (pj_inet_pton(af, nodename, pj_sockaddr_get_addr(&ai[0].ai_addr)) - == PJ_SUCCESS) - { - pj_str_t tmp; + if (af == PJ_AF_UNSPEC) { + if (pj_inet_pton(PJ_AF_INET, nodename, + &ai[0].ai_addr.ipv4.sin_addr) == PJ_SUCCESS) + { + af = PJ_AF_INET; + } + else if (pj_inet_pton(PJ_AF_INET6, nodename, + &ai[0].ai_addr.ipv6.sin6_addr) == PJ_SUCCESS) + { + af = PJ_AF_INET6; + } - tmp.ptr = ai[0].ai_canonname; - pj_strncpy_with_null(&tmp, nodename, PJ_MAX_HOSTNAME); - ai[0].ai_addr.addr.sa_family = (pj_uint16_t)af; - *count = 1; + if (af != PJ_AF_UNSPEC) { + pj_str_t tmp; - return PJ_SUCCESS; + tmp.ptr = ai[0].ai_canonname; + pj_strncpy_with_null(&tmp, nodename, PJ_MAX_HOSTNAME); + ai[0].ai_addr.addr.sa_family = (pj_uint16_t)af; + *count = 1; + + return PJ_SUCCESS; + } } /* Copy node name to null terminated string. */ @@ -121,6 +131,7 @@ PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename, /* Store address */ PJ_ASSERT_ON_FAIL(res->ai_addrlen <= sizeof(pj_sockaddr), continue); pj_memcpy(&ai[i].ai_addr, res->ai_addr, res->ai_addrlen); + PJ_SOCKADDR_RESET_LEN(&ai[i].ai_addr); /* Next slot */ ++i; @@ -139,18 +150,28 @@ PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename, /* Check if nodename is IP address */ pj_bzero(&ai[0], sizeof(ai[0])); - ai[0].ai_addr.addr.sa_family = (pj_uint16_t)af; - if (pj_inet_pton(af, nodename, pj_sockaddr_get_addr(&ai[0].ai_addr)) - == PJ_SUCCESS) - { - pj_str_t tmp; + if (af == PJ_AF_UNSPEC) { + if (pj_inet_pton(PJ_AF_INET, nodename, + &ai[0].ai_addr.ipv4.sin_addr) == PJ_SUCCESS) + { + af = PJ_AF_INET; + } + else if (pj_inet_pton(PJ_AF_INET6, nodename, + &ai[0].ai_addr.ipv6.sin6_addr) == PJ_SUCCESS) + { + af = PJ_AF_INET6; + } - tmp.ptr = ai[0].ai_canonname; - pj_strncpy_with_null(&tmp, nodename, PJ_MAX_HOSTNAME); - ai[0].ai_addr.addr.sa_family = (pj_uint16_t)af; - *count = 1; + if (af != PJ_AF_UNSPEC) { + pj_str_t tmp; - return PJ_SUCCESS; + tmp.ptr = ai[0].ai_canonname; + pj_strncpy_with_null(&tmp, nodename, PJ_MAX_HOSTNAME); + ai[0].ai_addr.addr.sa_family = (pj_uint16_t)af; + *count = 1; + + return PJ_SUCCESS; + } } if (af == PJ_AF_INET || af == PJ_AF_UNSPEC) { @@ -180,6 +201,7 @@ PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename, ai[*count].ai_addr.ipv4.sin_family = PJ_AF_INET; pj_memcpy(&ai[*count].ai_addr.ipv4.sin_addr, he.h_addr_list[i], he.h_length); + PJ_SOCKADDR_RESET_LEN(&ai[*count].ai_addr); (*count)++; } diff --git a/pjlib/src/pj/ip_helper_generic.c b/pjlib/src/pj/ip_helper_generic.c index 79c2edaa..331579c0 100644 --- a/pjlib/src/pj/ip_helper_generic.c +++ b/pjlib/src/pj/ip_helper_generic.c @@ -121,6 +121,7 @@ static pj_status_t if_enum_by_af(int af, pj_bzero(&ifs[*p_cnt], sizeof(ifs[0])); pj_memcpy(&ifs[*p_cnt], ad, pj_sockaddr_get_len(ad)); + PJ_SOCKADDR_RESET_LEN(&ifs[*p_cnt]); (*p_cnt)++; } @@ -215,6 +216,7 @@ static pj_status_t if_enum_by_af(int af, pj_bzero(&ifs[*p_cnt], sizeof(ifs[0])); pj_memcpy(&ifs[*p_cnt], ad, pj_sockaddr_get_len(ad)); + PJ_SOCKADDR_RESET_LEN(&ifs[*p_cnt]); (*p_cnt)++; } @@ -305,6 +307,7 @@ static pj_status_t if_enum_by_af(int af, unsigned *p_cnt, pj_sockaddr ifs[]) pj_bzero(&ifs[*p_cnt], sizeof(ifs[0])); pj_memcpy(&ifs[*p_cnt], ad, pj_sockaddr_get_len(ad)); + PJ_SOCKADDR_RESET_LEN(&ifs[*p_cnt]); (*p_cnt)++; } |