r3227 - in trunk/libmnetutil: . include/libmnetutil source
mikma at minisip.org
mikma at minisip.org
Wed Mar 7 10:32:20 CET 2007
Author: mikma
Date: 2007-03-07 10:32:19 +0100 (Wed, 07 Mar 2007)
New Revision: 3227
Added:
trunk/libmnetutil/source/NetworkFunctionsWin32.cxx
trunk/libmnetutil/source/NetworkFunctionsWin32.h
Modified:
trunk/libmnetutil/Makefile.am
trunk/libmnetutil/configure.ac
trunk/libmnetutil/include/libmnetutil/NetworkFunctions.h
trunk/libmnetutil/source/IP6Address.cxx
trunk/libmnetutil/source/NetUtil.cxx
trunk/libmnetutil/source/NetworkFunctions.cxx
Log:
Fix WIN32 IPv6 support
Modified: trunk/libmnetutil/Makefile.am
===================================================================
--- trunk/libmnetutil/Makefile.am 2007-03-06 21:18:52 UTC (rev 3226)
+++ trunk/libmnetutil/Makefile.am 2007-03-07 09:32:19 UTC (rev 3227)
@@ -20,6 +20,9 @@
res_obj = win32/libmnetutil-res.o
libmnetutil_la_LDFLAGS += -Wl,$(res_obj)
libmnetutil_la_DEPENDENCIES += $(res_obj)
+win32_src = \
+ source/NetworkFunctionsWin32.h \
+ source/NetworkFunctionsWin32.cxx
endif OS_WIN
srp_src =
@@ -51,6 +54,7 @@
source/NetUtil.cxx \
source/UDPSocket.cxx \
source/DatagramSocket.cxx \
+ $(win32_src) \
source/StreamSocket.cxx
# maintainer rules
Modified: trunk/libmnetutil/configure.ac
===================================================================
--- trunk/libmnetutil/configure.ac 2007-03-06 21:18:52 UTC (rev 3226)
+++ trunk/libmnetutil/configure.ac 2007-03-07 09:32:19 UTC (rev 3227)
@@ -69,7 +69,7 @@
#include<ws2tcpip.h>
])
else
-AC_CHECK_FUNCS([getifaddrs getnameinfo])
+AC_CHECK_FUNCS([getifaddrs getnameinfo getaddrinfo freeaddrinfo])
fi
AM_MINISIP_CHECK_LIBMUTIL([0.3.1])
Modified: trunk/libmnetutil/include/libmnetutil/NetworkFunctions.h
===================================================================
--- trunk/libmnetutil/include/libmnetutil/NetworkFunctions.h 2007-03-06 21:18:52 UTC (rev 3226)
+++ trunk/libmnetutil/include/libmnetutil/NetworkFunctions.h 2007-03-07 09:32:19 UTC (rev 3227)
@@ -54,6 +54,9 @@
*/
class LIBMNETUTIL_API NetworkFunctions{
public:
+
+ static void init();
+
/**
@return a string vector with all available network interfaces
*/
Modified: trunk/libmnetutil/source/IP6Address.cxx
===================================================================
--- trunk/libmnetutil/source/IP6Address.cxx 2007-03-06 21:18:52 UTC (rev 3226)
+++ trunk/libmnetutil/source/IP6Address.cxx 2007-03-07 09:32:19 UTC (rev 3227)
@@ -1,5 +1,6 @@
/*
Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien
+ Copyright (C) 2006-2007 Mikael Magnusson
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -19,6 +20,7 @@
/*
* Authors: Erik Eliasson <eliasson at it.kth.se>
* Johan Bilien <jobi at via.ecp.fr>
+ * Mikael Magnusson <mikma at users.sourceforge.net>
*/
#include<config.h>
@@ -32,6 +34,12 @@
#include<libmnetutil/IP6Address.h>
#ifdef WIN32
+# define _WIN32_WINNT 0x0501
+#endif
+
+#include<libmnetutil/IP6Address.h>
+
+#ifdef WIN32
#include<winsock2.h>
#include<ws2tcpip.h>
const struct in6_addr in6addr_any = {{IN6ADDR_ANY_INIT}};
@@ -59,9 +67,57 @@
#ifndef HAVE_INET_NTOP
# include<inet_ntop.h>
#endif
+#ifdef WIN32
+#include"NetworkFunctionsWin32.h"
+#endif
using namespace std;
+#define MAKE_UINT16(x,y) ((x)<<8+(y))
+
+#ifdef HAVE_GETADDRINFO
+void initIp6Address( const string &ipaddr, struct sockaddr_in6 *sockaddress,
+ unsigned short num_ip[8] ){
+ struct addrinfo hints;
+ struct addrinfo *ai = NULL;
+
+ memset( &hints, 0, sizeof(hints) );
+ hints.ai_family = AF_INET6;
+
+ if( getaddrinfo( ipaddr.c_str(), NULL, &hints, &ai ) || !ai )
+ throw HostNotFound( ipaddr );
+
+ struct addrinfo *cur;
+ bool found=false;
+
+ for( cur = ai; cur; cur=cur->ai_next ){
+ if( cur->ai_family != AF_INET6 )
+ continue;
+
+ if( cur->ai_addrlen != sizeof(*sockaddress) )
+ continue;
+
+ memset(sockaddress, '\0', sizeof(*sockaddress));
+ memcpy(sockaddress, cur->ai_addr, cur->ai_addrlen);
+
+ for (int32_t i=0; i<8; i++){
+ uint8_t x = sockaddress->sin6_addr.s6_addr[2 * i];
+ uint8_t y = sockaddress->sin6_addr.s6_addr[2 * i + 1];
+
+ num_ip[i] = MAKE_UINT16(x, y);
+ }
+
+ found=true;
+ break;
+ }
+
+ freeaddrinfo( ai );
+
+ if( !found )
+ throw HostNotFound( ipaddr );
+}
+#endif // HAVE_GETADDRINFO
+
#ifdef HAVE_GETNAMEINFO
string buildAddressString(const struct sockaddr *sa, socklen_t salen)
{
@@ -113,6 +169,19 @@
setAddressFamily(AF_INET6);
setProtocolFamily(PF_INET6);
+
+#ifdef HAVE_GETADDRINFO
+ bool use_getaddrinfo = true;
+#ifdef WIN32
+ if( !(hgetaddrinfo && hfreeaddrinfo ) )
+ use_getaddrinfo = false;
+#endif
+ if( use_getaddrinfo ){
+ initIp6Address( addr, sockaddress, num_ip );
+ return;
+ }
+
+#endif // !HAVE_GETADDRINFO
#ifndef WIN32
hostent *hp= gethostbyname2(addr.c_str(), AF_INET6);
#else
Modified: trunk/libmnetutil/source/NetUtil.cxx
===================================================================
--- trunk/libmnetutil/source/NetUtil.cxx 2007-03-06 21:18:52 UTC (rev 3226)
+++ trunk/libmnetutil/source/NetUtil.cxx 2007-03-07 09:32:19 UTC (rev 3227)
@@ -25,6 +25,7 @@
#include<config.h>
#include<libmnetutil/NetUtil.h>
+#include<libmnetutil/NetworkFunctions.h>
#ifdef WIN32
#include<winsock2.h>
@@ -60,6 +61,8 @@
return false;
}
#endif
+
+ NetworkFunctions::init();
return true;
}
Modified: trunk/libmnetutil/source/NetworkFunctions.cxx
===================================================================
--- trunk/libmnetutil/source/NetworkFunctions.cxx 2007-03-06 21:18:52 UTC (rev 3226)
+++ trunk/libmnetutil/source/NetworkFunctions.cxx 2007-03-07 09:32:19 UTC (rev 3227)
@@ -1,5 +1,6 @@
/*
Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien
+ Copyright (C) 2006-2007 Mikael Magnusson
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -19,6 +20,7 @@
/*
* Authors: Erik Eliasson <eliasson at it.kth.se>
* Johan Bilien <jobi at via.ecp.fr>
+ * Mikael Magnusson <mikma at users.sourceforge.net>
*/
@@ -55,6 +57,7 @@
#include<map>
#include<udns.h>
+#define _WIN32_WINNT 0x0501
/**
libresolv is only for linux ...
@@ -95,6 +98,11 @@
using namespace std;
+#ifdef USE_WIN32_API
+#include"NetworkFunctionsWin32.h"
+#endif
+
+
//Linux: Thanks to linuxgazette tips, http://www.linuxgazette.com/issue84/misc/tips/interfaces.c.txt,
//seems to be public domain.
//W32: Thanks to MSDN documentation:
@@ -131,7 +139,7 @@
return m_ip4Strs.push_back(ip);
}
-#ifdef HAVE_GETIFADDRS
+#ifdef HAVE_GETNAMEINFO
static bool sa_get_addr(struct sockaddr *sa, bool &ipv6, string &ip)
{
#ifdef HAVE_IPV6
@@ -153,7 +161,7 @@
}
#endif
else{
- // Unsupported address family
+ cerr << "sa_get_addr: unsupported address family: " << sa->sa_family << endl;
return false;
}
@@ -166,7 +174,13 @@
ip = addr;
return true;
}
+#endif
+#if HAVE_GETIFADDRS && HAVE_GETNAMEINFO
+//
+// Implementation 1. getifaddrs
+//
+
vector<string> NetworkFunctions::getAllInterfaces(){
vector<string >res;
struct ifaddrs *ifs = NULL;
@@ -294,10 +308,195 @@
}
#else // HAVE_GETIFADDRS
+#ifdef USE_WIN32_API
+
+#ifdef HAVE_GETADAPTERSADDRESSES
+IP_ADAPTER_ADDRESSES *WINXP_getAdaptersAddresses(){
+ IP_ADAPTER_ADDRESSES *pAdapters = NULL;
+ DWORD flags = GAA_FLAG_SKIP_ANYCAST|GAA_FLAG_SKIP_FRIENDLY_NAME|GAA_FLAG_SKIP_MULTICAST|GAA_FLAG_SKIP_DNS_SERVER;
+ ULONG bufLen = 0;
+
+ //cerr << "getAllInterfaces " << endl;
+ if( GetAdaptersAddresses( AF_UNSPEC, flags, NULL, NULL, &bufLen ) != ERROR_BUFFER_OVERFLOW ){
+// cerr << "getAllInterfaces 1" << endl;
+ return NULL;
+ }
+
+ pAdapters = (IP_ADAPTER_ADDRESSES*)malloc( bufLen );
+ memset( pAdapters, 0, bufLen );
+
+ if( GetAdaptersAddresses( AF_UNSPEC, flags, NULL, pAdapters, &bufLen ) != ERROR_SUCCESS ){
+// cerr << "getAllInterfaces 2" << endl;
+ return NULL;
+ }
+
+ return pAdapters;
+}
+
+
+
+vector<string> WINXP_getAllInterfaces(){
+ vector<string> res;
+ IP_ADAPTER_ADDRESSES *pAdapters = WINXP_getAdaptersAddresses();
+
+ if( !pAdapters ){
+ return res;
+ }
+
+ IP_ADAPTER_ADDRESSES *adapt;
+ for( adapt = pAdapters; adapt; adapt = adapt->Next ){
+ if( adapt->OperStatus != IfOperStatusUp ){
+// cerr << "Not up" << adapt->AdapterName << endl;
+ continue;
+ }
+
+ IP_ADAPTER_UNICAST_ADDRESS *addr;
+ for( addr = adapt->FirstUnicastAddress; addr; addr=addr->Next ){
+
+ if( !addr ){
+// cerr << "No unicast address" << endl;
+ break;
+ }
+
+ struct sockaddr *sa = addr->Address.lpSockaddr;
+
+ if( !sa ){
+// cerr << "No socket" << endl;
+ continue;
+ }
+
+ if( sa->sa_family != AF_INET ){
+ continue;
+ }
+
+ res.push_back( adapt->AdapterName );
+ break;
+ }
+ }
+
+ return res;
+}
+
+string WINXP_getInterfaceIPStr(string iface){
+ string ret;
+
+ IP_ADAPTER_ADDRESSES *pAdapters = WINXP_getAdaptersAddresses();
+
+ if( !pAdapters ){
+ return ret;
+ }
+
+ //cerr << "WINXP_getAdaptersAddresses" << endl;
+
+ IP_ADAPTER_ADDRESSES *adapt;
+ for( adapt = pAdapters; adapt; adapt=adapt->Next ){
+ //cerr << "Adapt: " << adapt->AdapterName << endl;
+
+ if( iface != string(adapt->AdapterName) ){
+ continue;
+ }
+
+ if( adapt->OperStatus != IfOperStatusUp ){
+// cerr << "Not up" << adapt->AdapterName << endl;
+ return false;
+ }
+
+ IP_ADAPTER_UNICAST_ADDRESS *addr;
+ for( addr = adapt->FirstUnicastAddress; addr; addr=addr->Next ){
+
+ if( !addr ){
+ cerr << "No unicast address" << endl;
+ break;
+ }
+
+ struct sockaddr *sa = addr->Address.lpSockaddr;
+
+ if( !sa ){
+ cerr << "No socket" << endl;
+ continue;
+ }
+
+ if( sa->sa_family != AF_INET ){
+ cerr << "Not IPv4 addr: " << adapt->AdapterName << endl;
+ return ret;
+ }
+
+ bool isIpv6;
+ if( sa_get_addr(sa, isIpv6, ret) ){
+ //cerr << "WINXP_getAdaptersAddresses: " << ret << endl;
+ return ret;
+ }
+ else{
+ cerr << "WINXP_getAdaptersAddresses error" << adapt->AdapterName << endl;
+ }
+ }
+
+ //cerr << "Not found: " << iface << endl;
+ return ret;
+ }
+
+ //cerr << "Not found: " << iface << endl;
+ return ret;
+}
+
+vector<MRef<NetworkInterface*> > WINXP_getInterfaces()
+{
+ vector<MRef<NetworkInterface*> > interfaces;
+
+ IP_ADAPTER_ADDRESSES *pAdapters = WINXP_getAdaptersAddresses();
+
+ if( !pAdapters ){
+ cerr << "WINXP_getInterfaces no adapters" << endl;
+ return interfaces;
+ }
+
+ IP_ADAPTER_ADDRESSES *adapt;
+ for( adapt = pAdapters; adapt; adapt = adapt->Next ){
+ if( adapt->OperStatus != IfOperStatusUp ){
+ cerr << "Not up" << adapt->AdapterName << endl;
+ continue;
+ }
+
+ IP_ADAPTER_UNICAST_ADDRESS *addr;
+ for( addr = adapt->FirstUnicastAddress; addr; addr=addr->Next ){
+ //cerr << "Unicast address" << endl;
+ struct sockaddr *sa = addr->Address.lpSockaddr;
+
+ bool isIpv6 = false;
+ string ip;
+ if( !sa_get_addr(sa, isIpv6, ip) ){
+ cerr << "sa_get_addr failed" << endl;
+ continue;
+ }
+
+ MRef<NetworkInterface*> iface;
+
+ iface = new NetworkInterface( adapt->AdapterName );
+ iface->addIPString( ip, isIpv6 );
+ interfaces.push_back( iface );
+
+ cerr << "Add: " << ip << "," << isIpv6 << endl;
+ }
+ }
+
+ return interfaces;
+}
+
+
+#endif // HAVE_GETADAPTERSADDRESSES
+
+//
+// Implementation 2. WIN32
+//
+
vector<string> NetworkFunctions::getAllInterfaces(){
+#ifdef HAVE_GETADAPTERSADDRESSES
+ if( hGetAdaptersAddresses )
+ return WINXP_getAllInterfaces();
+#endif
+
vector<string >res;
-#ifdef USE_WIN32_API
ULONG ulOutBufLen;
DWORD dwRetVal;
@@ -330,7 +529,18 @@
}
free(pAdapterInfo);
-#else
+ return res;
+}
+
+#else // !USE_WIN32_API
+
+//
+// Implementation 2. !WIN32
+//
+
+vector<string> NetworkFunctions::getAllInterfaces(){
+ vector<string >res;
+
int32_t sockfd;
char *buf, *ptr;
struct ifconf ifc;
@@ -375,10 +585,10 @@
/* release resources */
free(buf);
close(sockfd);
-#endif //USE_WIN32_API
return res;
}
+#endif //USE_WIN32_API
#ifndef IF_NAMESIZE
#define IF_NAMESIZE 16
@@ -388,6 +598,12 @@
string ret;
#ifdef USE_WIN32_API
+
+#if defined (HAVE_GETADAPTERSADDRESSES) && defined (HAVE_GETNAMEINFO)
+ if( hGetAdaptersAddresses && hgetnameinfo )
+ return WINXP_getInterfaceIPStr( iface );
+#endif
+
ULONG ulOutBufLen;
DWORD dwRetVal;
@@ -452,6 +668,11 @@
vector<MRef<NetworkInterface*> > NetworkFunctions::getInterfaces()
{
+#if defined(USE_WIN32_API) && defined(HAVE_GETADAPTERSADDRESSES) && defined (HAVE_GETNAMEINFO)
+ if( hGetAdaptersAddresses && hgetnameinfo )
+ return WINXP_getInterfaces();
+#endif
+
vector<string> names = getAllInterfaces();
vector<string>::iterator i;
@@ -575,3 +796,10 @@
return false;
}
+
+
+void NetworkFunctions::init(){
+#if defined(WIN32) && HAVE_GETADAPTERSADDRESSES
+ WINXP_init();
+#endif
+}
Added: trunk/libmnetutil/source/NetworkFunctionsWin32.cxx
===================================================================
--- trunk/libmnetutil/source/NetworkFunctionsWin32.cxx 2007-03-06 21:18:52 UTC (rev 3226)
+++ trunk/libmnetutil/source/NetworkFunctionsWin32.cxx 2007-03-07 09:32:19 UTC (rev 3227)
@@ -0,0 +1,110 @@
+/*
+ Copyright (C) 2006-2007 Mikael Magnusson
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+/*
+ * Authors: Mikael Magnusson <mikma at users.sourceforge.net>
+*/
+
+#define _WIN32_WINNT 0x0501
+#include<config.h>
+#include<libmutil/dbg.h>
+#include"NetworkFunctionsWin32.h"
+
+#include<iostream>
+
+using namespace std;
+
+HINSTANCE hiphlpapi;
+HINSTANCE hws2tcpip;
+
+#ifdef HAVE_GETADAPTERSADDRESSES
+PGETADAPTERSADDRESSES hGetAdaptersAddresses;
+#endif
+
+PGETADDRINFO hgetaddrinfo;
+PFREEADDRINFO hfreeaddrinfo;
+PGETNAMEINFO hgetnameinfo;
+
+void WINXP_exit(){
+#ifdef HAVE_GETADAPTERSADDRESSES
+ hGetAdaptersAddresses = NULL;
+#endif
+ hgetaddrinfo = NULL;
+ hfreeaddrinfo = NULL;
+ hgetnameinfo = NULL;
+ if( hiphlpapi )
+ FreeLibrary( hiphlpapi );
+ hiphlpapi = NULL;
+ if( hws2tcpip )
+ FreeLibrary( hws2tcpip );
+ hws2tcpip = NULL;
+}
+
+bool WINXP_init(){
+ hiphlpapi = LoadLibrary("iphlpapi");
+
+ if( !hiphlpapi ){
+ mdbg << "NetworkFunctionsWin32: no hiphlpapi" << end;
+ WINXP_exit();
+ return false;
+ }
+
+#ifdef HAVE_GETADAPTERSADDRESSES
+ hGetAdaptersAddresses = (PGETADAPTERSADDRESSES)GetProcAddress(hiphlpapi, "GetAdaptersAddresses");
+
+ if( !hGetAdaptersAddresses ){
+ mdbg << "NetworkFunctionsWin32: no GetAdaptersAddresses" << end;
+ WINXP_exit();
+ return false;
+ }
+#endif // HAVE_GETADAPTERSADDRESSES
+
+ hws2tcpip = LoadLibrary("ws2_32");
+ if( !hws2tcpip ){
+ mdbg << "NetworkFunctionsWin32: no ws2tcpip" << end;
+ WINXP_exit();
+ return false;
+ }
+
+ hgetaddrinfo = (PGETADDRINFO)GetProcAddress(hws2tcpip, "getaddrinfo");
+
+ if( !hgetaddrinfo ){
+ mdbg << "NetworkFunctionsWin32: no getaddrinfo" << end;
+ WINXP_exit();
+ return false;
+ }
+
+ hfreeaddrinfo = (PFREEADDRINFO)GetProcAddress(hws2tcpip, "freeaddrinfo");
+
+ if( !hfreeaddrinfo ){
+ mdbg << "NetworkFunctionsWin32: no freeaddrinfo" << end;
+ WINXP_exit();
+ return false;
+ }
+
+ hgetnameinfo = (PGETNAMEINFO)GetProcAddress(hws2tcpip, "getnameinfo");
+
+ if( !hgetnameinfo ){
+ mdbg << "NetworkFunctionsWin32: no getnameinfo" << end;
+ WINXP_exit();
+ return false;
+ }
+
+ mdbg << "NetworkFunctionsWin32: functions loaded ok" << end;
+ return true;
+}
Property changes on: trunk/libmnetutil/source/NetworkFunctionsWin32.cxx
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:eol-style
+ native
Added: trunk/libmnetutil/source/NetworkFunctionsWin32.h
===================================================================
--- trunk/libmnetutil/source/NetworkFunctionsWin32.h 2007-03-06 21:18:52 UTC (rev 3226)
+++ trunk/libmnetutil/source/NetworkFunctionsWin32.h 2007-03-07 09:32:19 UTC (rev 3227)
@@ -0,0 +1,64 @@
+/*
+ Copyright (C) 2006-2007 Mikael Magnusson
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+/*
+ * Authors: Mikael Magnusson <mikma at users.sourceforge.net>
+*/
+
+#ifndef NETWORKFUNCTIONSWIN32_H
+#define NETWORKFUNCTIONSWIN32_H
+
+#include<libmnetutil/libmnetutil_config.h>
+#include<windows.h>
+#ifdef HAVE_IPHLPAPI_H
+# include<iphlpapi.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+# include<ws2tcpip.h>
+#endif
+
+extern HINSTANCE hiphlpapi;
+extern HINSTANCE hws2tcpip;
+
+#ifdef HAVE_GETADAPTERSADDRESSES
+typedef ULONG WINAPI (*PGETADAPTERSADDRESSES)(ULONG,ULONG,PVOID,PIP_ADAPTER_ADDRESSES,PULONG);
+
+extern PGETADAPTERSADDRESSES hGetAdaptersAddresses;
+#define GetAdaptersAddresses hGetAdaptersAddresses
+#endif // HAVE_GETADAPTERSADDRESSES
+
+typedef int WSAAPI (*PGETNAMEINFO)(const struct sockaddr*,socklen_t,char*,
+ DWORD,char*,DWORD,int);
+extern PGETNAMEINFO hgetnameinfo;
+#define getnameinfo hgetnameinfo
+#define HAVE_GETNAMEINFO 1
+
+typedef int WSAAPI (*PGETADDRINFO)(const char*,const char*,const struct addrinfo*, struct addrinfo**);
+extern PGETADDRINFO hgetaddrinfo;
+#define getaddrinfo hgetaddrinfo
+#define HAVE_GETADDRINFO 1
+
+typedef void WSAAPI (*PFREEADDRINFO)(struct addrinfo*);
+extern PFREEADDRINFO hfreeaddrinfo;
+#define freeaddrinfo hfreeaddrinfo
+#define HAVE_FREEADDRINFO 1
+
+bool WINXP_init();
+void WINXP_exit();
+
+#endif // NETWORKFUNCTIONSWIN32_H
Property changes on: trunk/libmnetutil/source/NetworkFunctionsWin32.h
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:eol-style
+ native
More information about the Minisip-devel
mailing list