summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2016-07-05 12:53:20 +0000
committerNanang Izzuddin <nanang@teluu.com>2016-07-05 12:53:20 +0000
commit03f43da1e9af282cb616993d2ebec889ae386784 (patch)
tree25db378e3d0a67267939635ca679787b412c0ac0
parent2c7d7baea1e3029c46d21d5ede820ccd17789a45 (diff)
Misc (re #1928): pj_getaddrinfo() is better to return error when no address is found, some codes in the library seem to expect pj_getaddrinfo() to behave this way.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5376 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjlib/src/pj/addr_resolv_sock.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/pjlib/src/pj/addr_resolv_sock.c b/pjlib/src/pj/addr_resolv_sock.c
index 03735e9b..0af107e7 100644
--- a/pjlib/src/pj/addr_resolv_sock.c
+++ b/pjlib/src/pj/addr_resolv_sock.c
@@ -154,7 +154,7 @@ PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename,
if (addr->sa_family == PJ_AF_INET6) {
addr_size = addr->sa_len;
}
- PJ_ASSERT_ON_FAIL(addr_size <= sizeof(pj_sockaddr), continue);
+ PJ_ASSERT_ON_FAIL(addr_size <= sizeof(pj_sockaddr), continue);
pj_memcpy(&ai[i].ai_addr, addr, addr_size);
PJ_SOCKADDR_RESET_LEN(&ai[i].ai_addr);
@@ -163,6 +163,9 @@ PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename,
}
*count = i;
+ if (*count == 0)
+ status = PJ_ERESOLVE;
+
} else {
status = PJ_ERESOLVE;
}
@@ -183,6 +186,7 @@ PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename,
orig_res = res;
/* Enumerate each item in the result */
+ rc = 0;
for (i=0; i<*count && res; res=res->ai_next) {
/* Ignore unwanted address families */
if (af!=PJ_AF_UNSPEC && res->ai_family != af)
@@ -190,28 +194,28 @@ PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename,
/* Store canonical name (possibly truncating the name) */
if (res->ai_canonname) {
- pj_ansi_strncpy(ai[i].ai_canonname, res->ai_canonname,
- sizeof(ai[i].ai_canonname));
- ai[i].ai_canonname[sizeof(ai[i].ai_canonname)-1] = '\0';
+ pj_ansi_strncpy(ai[rc].ai_canonname, res->ai_canonname,
+ sizeof(ai[rc].ai_canonname));
+ ai[rc].ai_canonname[sizeof(ai[rc].ai_canonname)-1] = '\0';
} else {
- pj_ansi_strcpy(ai[i].ai_canonname, nodecopy);
+ pj_ansi_strcpy(ai[rc].ai_canonname, nodecopy);
}
/* 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);
+ pj_memcpy(&ai[rc].ai_addr, res->ai_addr, res->ai_addrlen);
+ PJ_SOCKADDR_RESET_LEN(&ai[rc].ai_addr);
/* Next slot */
- ++i;
+ ++rc;
}
- *count = i;
+ *count = rc;
freeaddrinfo(orig_res);
/* Done */
- return PJ_SUCCESS;
+ return (*count > 0? PJ_SUCCESS : PJ_ERESOLVE);
#endif
#else /* PJ_SOCK_HAS_GETADDRINFO */
@@ -285,7 +289,7 @@ PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename,
(*count)++;
}
- return PJ_SUCCESS;
+ return (*count > 0? PJ_SUCCESS : PJ_ERESOLVE);
} else {
/* IPv6 is not supported */