summaryrefslogtreecommitdiff
path: root/pjlib/src/pj/addr_resolv_sock.c
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-11-26 05:36:18 +0000
committerBenny Prijono <bennylp@teluu.com>2007-11-26 05:36:18 +0000
commitba8b2066cba86e67f73ba5554669e7d0563408ac (patch)
treedfa2f71e4ba78885c0ac3fba3cd02c9a60bf17de /pjlib/src/pj/addr_resolv_sock.c
parent105f3b267a6fd6ea2059fe0d84ec92821a62c7af (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.c84
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;