diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-11-26 05:36:18 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-11-26 05:36:18 +0000 |
commit | ba8b2066cba86e67f73ba5554669e7d0563408ac (patch) | |
tree | dfa2f71e4ba78885c0ac3fba3cd02c9a60bf17de /pjlib/src/pj/addr_resolv_sock.c | |
parent | 105f3b267a6fd6ea2059fe0d84ec92821a62c7af (diff) |
Fixed pj_gethostip() returns 0.0.0.0. Also how it returns the first interface if else fails
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1599 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib/src/pj/addr_resolv_sock.c')
-rw-r--r-- | pjlib/src/pj/addr_resolv_sock.c | 84 |
1 files changed, 55 insertions, 29 deletions
diff --git a/pjlib/src/pj/addr_resolv_sock.c b/pjlib/src/pj/addr_resolv_sock.c index 5e8cde59..a4599ef7 100644 --- a/pjlib/src/pj/addr_resolv_sock.c +++ b/pjlib/src/pj/addr_resolv_sock.c @@ -20,6 +20,7 @@ #include <pj/assert.h> #include <pj/string.h> #include <pj/errno.h> +#include <pj/ip_helper.h> #include <pj/compat/socket.h> @@ -54,6 +55,45 @@ PJ_DEF(pj_status_t) pj_gethostbyname(const pj_str_t *hostname, pj_hostent *phe) return PJ_SUCCESS; } +/* Get the default IP interface */ +PJ_DEF(pj_status_t) pj_getdefaultipinterface(pj_in_addr *addr) +{ + pj_sock_t fd; + pj_str_t cp; + pj_sockaddr_in a; + int len; + pj_status_t status; + + status = pj_sock_socket(pj_AF_INET(), pj_SOCK_DGRAM(), 0, &fd); + if (status != PJ_SUCCESS) { + return status; + } + + cp = pj_str("1.1.1.1"); + pj_sockaddr_in_init(&a, &cp, 53); + + status = pj_sock_connect(fd, &a, sizeof(a)); + if (status != PJ_SUCCESS) { + pj_sock_close(fd); + return status; + } + + len = sizeof(a); + status = pj_sock_getsockname(fd, &a, &len); + if (status != PJ_SUCCESS) { + pj_sock_close(fd); + return status; + } + + pj_sock_close(fd); + + *addr = a.sin_addr; + + /* Success */ + return PJ_SUCCESS; +} + + /* Resolve the IP address of local machine */ PJ_DEF(pj_status_t) pj_gethostip(pj_in_addr *addr) { @@ -80,37 +120,23 @@ PJ_DEF(pj_status_t) pj_gethostip(pj_in_addr *addr) if (status != PJ_SUCCESS || (pj_ntohl(addr->s_addr) >> 24)==127 || addr->s_addr == 0) { - pj_sock_t fd; - pj_str_t cp; - pj_sockaddr_in a; - int len; - - status = pj_sock_socket(pj_AF_INET(), pj_SOCK_DGRAM(), 0, &fd); - if (status != PJ_SUCCESS) { - return status; - } - - cp = pj_str("1.1.1.1"); - pj_sockaddr_in_init(&a, &cp, 53); - - status = pj_sock_connect(fd, &a, sizeof(a)); - if (status != PJ_SUCCESS) { - pj_sock_close(fd); - /* Return 127.0.0.1 as the address */ - return PJ_SUCCESS; - } + status = pj_getdefaultipinterface(addr); + } - len = sizeof(a); - status = pj_sock_getsockname(fd, &a, &len); - if (status != PJ_SUCCESS) { - pj_sock_close(fd); - /* Return 127.0.0.1 as the address */ - return PJ_SUCCESS; + /* As the last resort, get the first available interface */ + if (status != PJ_SUCCESS) { + pj_in_addr addrs[2]; + unsigned count = PJ_ARRAY_SIZE(addrs); + + status = pj_enum_ip_interface(&count, addrs); + if (status == PJ_SUCCESS) { + if (count != 0) { + *addr = addrs[0]; + } else { + /* Just return 127.0.0.1 */ + addr->s_addr = pj_htonl (0x7f000001); + } } - - pj_sock_close(fd); - - *addr = a.sin_addr; } return status; |