diff --git a/UPnP.cpp b/UPnP.cpp index a87d34600c2..e5b8ff79549 100644 --- a/UPnP.cpp +++ b/UPnP.cpp @@ -2,6 +2,10 @@ #include #include +#ifdef _WIN32 +#include +#endif + #include #include #include @@ -66,11 +70,21 @@ namespace UPnP { #ifdef MAC_OSX m_Module = dlopen ("libminiupnpc.dylib", RTLD_LAZY); -#elif WIN32 - m_Module = dlopen ("libminiupnpc.dll", RTLD_LAZY); +#elif _WIN32 + m_Module = LoadLibrary ("libminiupnpc.dll"); + if (m_Module == NULL) + { + LogPrint ("Error loading UPNP library. This often happens if there is version mismatch!"); + return; + } + else + { + m_IsModuleLoaded = true; + } #else m_Module = dlopen ("libminiupnpc.so", RTLD_LAZY); #endif +#ifndef _WIN32 if (!m_Module) { LogPrint ("no UPnP module available (", dlerror (), ")"); @@ -80,6 +94,7 @@ namespace UPnP { m_IsModuleLoaded = true; } +#endif for (auto& address : context.GetRouterInfo ().GetAddresses ()) { if (!address.host.is_v6 ()) @@ -101,6 +116,9 @@ namespace UPnP void UPnP::Discover () { const char *error; +#ifdef _WIN32 + upnp_upnpDiscoverFunc upnpDiscoverFunc = (upnp_upnpDiscoverFunc) GetProcAddress (m_Module, "upnpDiscover"); +#else upnp_upnpDiscoverFunc upnpDiscoverFunc = (upnp_upnpDiscoverFunc) dlsym (m_Module, "upnpDiscover"); // reinterpret_cast (dlsym(...)); if ( (error = dlerror ())) @@ -108,6 +126,7 @@ namespace UPnP LogPrint ("Error loading UPNP library. This often happens if there is version mismatch!"); return; } +#endif // _WIN32 #ifndef UPNPDISCOVER_SUCCESS /* miniupnpc 1.5 */ m_Devlist = upnpDiscoverFunc (2000, m_MulticastIf, m_Minissdpdpath, 0); @@ -116,8 +135,13 @@ namespace UPnP int nerror = 0; m_Devlist = upnpDiscoverFunc (2000, m_MulticastIf, m_Minissdpdpath, 0, 0, &nerror); #endif + int r; +#ifdef _WIN32 + upnp_UPNP_GetValidIGDFunc UPNP_GetValidIGDFunc = (upnp_UPNP_GetValidIGDFunc) GetProcAddress (m_Module, "UPNP_GetValidIGD"); +#else upnp_UPNP_GetValidIGDFunc UPNP_GetValidIGDFunc = (upnp_UPNP_GetValidIGDFunc) dlsym (m_Module, "UPNP_GetValidIGD"); +#endif r = (*UPNP_GetValidIGDFunc) (m_Devlist, &m_upnpUrls, &m_upnpData, m_NetworkAddr, sizeof (m_NetworkAddr)); if (r == 1) { @@ -161,7 +185,11 @@ namespace UPnP std::string strDesc = "I2Pd"; try { for (;;) { - upnp_UPNP_AddPortMappingFunc UPNP_AddPortMappingFunc = (upnp_UPNP_AddPortMappingFunc) dlsym(m_Module, "UPNP_AddPortMapping"); +#ifdef _WIN32 + upnp_UPNP_AddPortMappingFunc UPNP_AddPortMappingFunc = (upnp_UPNP_AddPortMappingFunc) GetProcAddress (m_Module, "UPNP_AddPortMapping"); +#else + upnp_UPNP_AddPortMappingFunc UPNP_AddPortMappingFunc = (upnp_UPNP_AddPortMappingFunc) dlsym (m_Module, "UPNP_AddPortMapping"); +#endif #ifndef UPNPDISCOVER_SUCCESS /* miniupnpc 1.5 */ r = UPNP_AddPortMappingFunc (m_upnpUrls.controlURL, m_upnpData.first.servicetype, m_Port.c_str (), m_Port.c_str (), m_NetworkAddr, strDesc.c_str (), strType.c_str (), 0); @@ -203,19 +231,35 @@ namespace UPnP strType = "UDP"; } int r = 0; +#ifdef _WIN32 + upnp_UPNP_DeletePortMappingFunc UPNP_DeletePortMappingFunc = (upnp_UPNP_DeletePortMappingFunc) GetProcAddress (m_Module, "UPNP_DeletePortMapping"); +#else upnp_UPNP_DeletePortMappingFunc UPNP_DeletePortMappingFunc = (upnp_UPNP_DeletePortMappingFunc) dlsym (m_Module, "UPNP_DeletePortMapping"); +#endif r = UPNP_DeletePortMappingFunc (m_upnpUrls.controlURL, m_upnpData.first.servicetype, m_Port.c_str (), strType.c_str (), 0); LogPrint ("UPNP_DeletePortMapping() returned : ", r, "\n"); } void UPnP::Close () { +#ifdef _WIN32 + upnp_freeUPNPDevlistFunc freeUPNPDevlistFunc = (upnp_freeUPNPDevlistFunc) GetProcAddress (m_Module, "freeUPNPDevlist"); +#else upnp_freeUPNPDevlistFunc freeUPNPDevlistFunc = (upnp_freeUPNPDevlistFunc) dlsym (m_Module, "freeUPNPDevlist"); +#endif freeUPNPDevlistFunc (m_Devlist); m_Devlist = 0; +#ifdef _WIN32 + upnp_FreeUPNPUrlsFunc FreeUPNPUrlsFunc = (upnp_FreeUPNPUrlsFunc) GetProcAddress (m_Module, "FreeUPNPUrlsFunc"); +#else upnp_FreeUPNPUrlsFunc FreeUPNPUrlsFunc = (upnp_FreeUPNPUrlsFunc) dlsym (m_Module, "FreeUPNPUrlsFunc"); +#endif FreeUPNPUrlsFunc (&m_upnpUrls); +#ifndef _WIN32 dlclose (m_Module); +#else + FreeLibrary (m_Module); +#endif } } diff --git a/UPnP.h b/UPnP.h index e5daea27132..8dc62b8d087 100644 --- a/UPnP.h +++ b/UPnP.h @@ -50,7 +50,11 @@ namespace UPnP char m_externalIPAddress[40]; bool m_IsModuleLoaded; std::string m_Port = std::to_string (util::config::GetArg ("-port", 17070)); +#ifndef _WIN32 void *m_Module; +#else + HINSTANCE *m_Module; +#endif }; extern UPnP upnpc; }