summaryrefslogtreecommitdiff
path: root/pjlib/src/pj/ip_helper_win32.c
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-07-28 01:58:36 +0000
committerBenny Prijono <bennylp@teluu.com>2007-07-28 01:58:36 +0000
commit13ffcf20b82f3170f6edeba19d710dad49dbce2d (patch)
treef9766c4432b2a6e90f731b8cd992dcefe71e642b /pjlib/src/pj/ip_helper_win32.c
parent25f8577f91ecc81f7c8f5c7d5f08b3c51beb21f0 (diff)
Ticket #358: link dynamically with IPHLPAPI.DLL
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1409 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib/src/pj/ip_helper_win32.c')
-rw-r--r--pjlib/src/pj/ip_helper_win32.c80
1 files changed, 73 insertions, 7 deletions
diff --git a/pjlib/src/pj/ip_helper_win32.c b/pjlib/src/pj/ip_helper_win32.c
index 6256e59c..1d0ef98a 100644
--- a/pjlib/src/pj/ip_helper_win32.c
+++ b/pjlib/src/pj/ip_helper_win32.c
@@ -34,6 +34,72 @@
#include <pj/errno.h>
#include <pj/string.h>
+typedef DWORD (WINAPI *PFN_GetIpAddrTable)(PMIB_IPADDRTABLE pIpAddrTable,
+ PULONG pdwSize,
+ BOOL bOrder);
+typedef DWORD (WINAPI *PFN_GetIpForwardTable)(PMIB_IPFORWARDTABLE pIpForwardTable,
+ PULONG pdwSize,
+ BOOL bOrder);
+
+static HANDLE s_hDLL;
+static PFN_GetIpAddrTable s_pfnGetIpAddrTable;
+static PFN_GetIpForwardTable s_pfnGetIpForwardTable;
+
+static unload_iphlp_module(void)
+{
+ FreeLibrary(s_hDLL);
+ s_hDLL = NULL;
+ s_pfnGetIpAddrTable = NULL;
+ s_pfnGetIpForwardTable = NULL;
+}
+
+static FARPROC GetIpHlpApiProc(pj_char_t *lpProcName)
+{
+ if(NULL == s_hDLL) {
+ s_hDLL = LoadLibrary(PJ_T("IpHlpApi"));
+ if(NULL != s_hDLL) {
+ pj_atexit(&unload_iphlp_module);
+ }
+ }
+
+ if(NULL != s_hDLL)
+ return GetProcAddress(s_hDLL, lpProcName);
+
+ return NULL;
+}
+
+static DWORD MyGetIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable,
+ PULONG pdwSize,
+ BOOL bOrder)
+{
+ if(NULL == s_pfnGetIpAddrTable) {
+ s_pfnGetIpAddrTable = (PFN_GetIpAddrTable)
+ GetIpHlpApiProc(PJ_T("GetIpAddrTable"));
+ }
+
+ if(NULL != s_pfnGetIpAddrTable) {
+ return s_pfnGetIpAddrTable(pIpAddrTable, pdwSize, bOrder);
+ }
+
+ return ERROR_NOT_SUPPORTED;
+}
+
+
+static DWORD MyGetIpForwardTable(PMIB_IPFORWARDTABLE pIpForwardTable,
+ PULONG pdwSize,
+ BOOL bOrder)
+{
+ if(NULL == s_pfnGetIpForwardTable) {
+ s_pfnGetIpForwardTable = (PFN_GetIpForwardTable)
+ GetIpHlpApiProc(PJ_T("GetIpForwardTable"));
+ }
+
+ if(NULL != s_pfnGetIpForwardTable) {
+ return s_pfnGetIpForwardTable(pIpForwardTable, pdwSize, bOrder);
+ }
+
+ return ERROR_NOT_SUPPORTED;
+}
/*
* Enumerate the local IP interface currently active in the host.
@@ -48,7 +114,7 @@ PJ_DEF(pj_status_t) pj_enum_ip_interface(unsigned *p_cnt,
MIB_IPADDRTABLE *pTab;
ULONG tabSize;
unsigned i, count;
- DWORD rc;
+ DWORD rc = NO_ERROR;
PJ_ASSERT_RETURN(p_cnt && ifs, PJ_EINVAL);
@@ -56,7 +122,8 @@ PJ_DEF(pj_status_t) pj_enum_ip_interface(unsigned *p_cnt,
/* Get IP address table */
tabSize = sizeof(ipTabBuff);
- rc = GetIpAddrTable(pTab, &tabSize, FALSE);
+
+ rc = MyGetIpAddrTable(pTab, &tabSize, FALSE);
if (rc != NO_ERROR)
return PJ_RETURN_OS_ERROR(rc);
@@ -91,7 +158,7 @@ PJ_DEF(pj_status_t) pj_enum_ip_route(unsigned *p_cnt,
MIB_IPFORWARDTABLE *prTab;
ULONG tabSize;
unsigned i, count;
- DWORD rc;
+ DWORD rc = NO_ERROR;
PJ_ASSERT_RETURN(p_cnt && routes, PJ_EINVAL);
@@ -100,13 +167,14 @@ PJ_DEF(pj_status_t) pj_enum_ip_route(unsigned *p_cnt,
/* First get IP address table */
tabSize = sizeof(ipTabBuff);
- rc = GetIpAddrTable(pIpTab, &tabSize, FALSE);
+ rc = MyGetIpAddrTable(pIpTab, &tabSize, FALSE);
if (rc != NO_ERROR)
return PJ_RETURN_OS_ERROR(rc);
/* Next get IP route table */
tabSize = sizeof(rtabBuff);
- rc = GetIpForwardTable(prTab, &tabSize, 1);
+
+ rc = MyGetIpForwardTable(prTab, &tabSize, 1);
if (rc != NO_ERROR)
return PJ_RETURN_OS_ERROR(rc);
@@ -138,5 +206,3 @@ PJ_DEF(pj_status_t) pj_enum_ip_route(unsigned *p_cnt,
return PJ_SUCCESS;
}
-
-