summaryrefslogtreecommitdiff
blob: ecb6abba8e1276ad916dcb39847348c6690c2116 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
From 8c5744bca705a0895bd51c966a30171ee2bab43a Mon Sep 17 00:00:00 2001
From: Marisa Kirisame <marisa@sayachan.org>
Date: Tue, 29 Sep 2015 23:10:31 +0200
Subject: [PATCH] miniupnpc API version 14 changed the upnpDiscover functions,
 adding an argument for TTL (should default to 2) this enables support for
 that should the build system have that specific version installed, the
 miniupnpc bundled in the project is unchanged

---
 CMakeLists.txt                     |  5 ++++-
 CMakeTests/FindMiniupnpc.cmake     | 39 +++++++++++++++++++++++++++++++++-----
 Source/Core/Core/NetPlayServer.cpp |  4 ++++
 3 files changed, 42 insertions(+), 6 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 291efee..7ac0679 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -690,9 +690,12 @@ if(USE_UPNP)
 	if(NOT APPLE AND NOT ANDROID)
 		include(FindMiniupnpc)
 	endif()
-	if(MINIUPNP_FOUND AND MINIUPNPC_VERSION_1_7_OR_HIGHER)
+	if(MINIUPNP_FOUND AND (MINIUPNPC_VERSION_1_7_OR_HIGHER OR MINIUPNPC_VERSION_API14_OR_HIGHER))
 		message("Using shared miniupnpc")
 		include_directories(${MINIUPNP_INCLUDE_DIR})
+		if (MINIUPNPC_VERSION_API14_OR_HIGHER)
+			add_definitions(-DUPNPDISCOVER_HAS_TTL)
+		endif()
 	else()
 		message("Using static miniupnpc from Externals")
 		add_subdirectory(Externals/miniupnpc)
diff --git a/CMakeTests/FindMiniupnpc.cmake b/CMakeTests/FindMiniupnpc.cmake
index bb1048c..5301d40 100644
--- a/CMakeTests/FindMiniupnpc.cmake
+++ b/CMakeTests/FindMiniupnpc.cmake
@@ -58,6 +58,30 @@ if (MINIUPNP_FOUND)
 	#include <stdio.h>
 	int main()
 	{
+	struct UPNPDev *devlist = NULL;
+	int upnp_delay = 5000;
+	const char *upnp_multicastif = NULL;
+	const char *upnp_minissdpdsock = NULL;
+	int upnp_sameport = 0;
+	int upnp_ipv6 = 0;
+	unsigned char upnp_ttl = 2;
+	int upnp_error = 0;
+	devlist = upnpDiscover(upnp_delay, upnp_multicastif, upnp_minissdpdsock, upnp_sameport, upnp_ipv6, upnp_ttl, &upnp_error);
+
+	return 0;
+	}"
+	MINIUPNPC_VERSION_API14_OR_HIGHER)
+
+IF (NOT MINIUPNPC_VERSION_API14_OR_HIGHER)
+	set(CMAKE_REQUIRED_INCLUDES ${MINIUPNP_INCLUDE_DIR})
+	set(CMAKE_REQUIRED_LIBRARIES ${MINIUPNP_LIBRARY})
+	check_cxx_source_runs("
+	#include <miniwget.h>
+	#include <miniupnpc.h>
+	#include <upnpcommands.h>
+	#include <stdio.h>
+	int main()
+	{
 	static struct UPNPUrls urls;
 	static struct IGDdatas data;
 
@@ -66,8 +90,9 @@ if (MINIUPNP_FOUND)
 	return 0;
 	}"
 	MINIUPNPC_VERSION_1_7_OR_HIGHER)
+   ENDIF()
 
-IF (NOT MINIUPNPC_VERSION_1_7_OR_HIGHER)
+IF (NOT MINIUPNPC_VERSION_1_7_OR_HIGHER AND NOT MINIUPNPC_VERSION_API14_OR_HIGHER)
 	set(CMAKE_REQUIRED_INCLUDES ${MINIUPNP_INCLUDE_DIR})
 	set(CMAKE_REQUIRED_LIBRARIES ${MINIUPNP_LIBRARY})
 	check_cxx_source_runs("
@@ -91,7 +116,7 @@ IF (NOT MINIUPNPC_VERSION_1_7_OR_HIGHER)
 	MINIUPNPC_VERSION_PRE1_7)
    ENDIF()
 
-   IF (NOT MINIUPNPC_VERSION_PRE1_7 AND NOT MINIUPNPC_VERSION_1_7_OR_HIGHER)
+   IF (NOT MINIUPNPC_VERSION_PRE1_7 AND NOT MINIUPNPC_VERSION_1_7_OR_HIGHER AND NOT MINIUPNPC_VERSION_API14_OR_HIGHER)
 	   set(CMAKE_REQUIRED_INCLUDES ${MINIUPNP_INCLUDE_DIR})
 	   set(CMAKE_REQUIRED_LIBRARIES ${MINIUPNP_LIBRARY})
 	   check_cxx_source_runs("
@@ -116,7 +141,7 @@ IF (NOT MINIUPNPC_VERSION_1_7_OR_HIGHER)
 
    ENDIF()
 
-   IF (NOT MINIUPNPC_VERSION_PRE1_6 AND NOT MINIUPNPC_VERSION_PRE1_7 AND NOT MINIUPNPC_VERSION_1_7_OR_HIGHER)
+   IF (NOT MINIUPNPC_VERSION_PRE1_6 AND NOT MINIUPNPC_VERSION_PRE1_7 AND NOT MINIUPNPC_VERSION_1_7_OR_HIGHER AND NOT MINIUPNPC_VERSION_API14_OR_HIGHER)
 	   set(CMAKE_REQUIRED_INCLUDES ${MINIUPNP_INCLUDE_DIR})
 	   set(CMAKE_REQUIRED_LIBRARIES ${MINIUPNP_LIBRARY})
 	   check_cxx_source_runs("
@@ -136,7 +161,7 @@ IF (NOT MINIUPNPC_VERSION_1_7_OR_HIGHER)
 	   MINIUPNPC_VERSION_1_5_OR_HIGHER)
 	ENDIF()
 
-	IF (NOT MINIUPNPC_VERSION_1_5_OR_HIGHER AND NOT MINIUPNPC_VERSION_PRE1_6 AND NOT MINIUPNPC_VERSION_PRE1_7 AND NOT MINIUPNPC_VERSION_1_7_OR_HIGHER)
+	IF (NOT MINIUPNPC_VERSION_1_5_OR_HIGHER AND NOT MINIUPNPC_VERSION_PRE1_6 AND NOT MINIUPNPC_VERSION_PRE1_7 AND NOT MINIUPNPC_VERSION_1_7_OR_HIGHER AND NOT MINIUPNPC_VERSION_API14_OR_HIGHER)
 		set(CMAKE_REQUIRED_INCLUDES ${MINIUPNP_INCLUDE_DIR})
 		set(CMAKE_REQUIRED_LIBRARIES ${MINIUPNP_LIBRARY})
 		check_cxx_source_runs("
@@ -167,10 +192,14 @@ IF(MINIUPNPC_VERSION_PRE1_7)
 	message(STATUS "Found miniupnpc version is pre v1.7")
 ENDIF()
 
-IF(NOT MINIUPNPC_VERSION_PRE1_5 AND NOT MINIUPNPC_VERSION_PRE1_6 AND NOT MINIUPNPC_VERSION_PRE1_7)
+IF(NOT MINIUPNPC_VERSION_PRE1_5 AND NOT MINIUPNPC_VERSION_PRE1_6 AND NOT MINIUPNPC_VERSION_PRE1_7 AND NOT MINIUPNPC_VERSION_API14_OR_HIGHER)
 	message(STATUS "Found miniupnpc version is v1.7 or higher")
 ENDIF()
 
+IF(NOT MINIUPNPC_VERSION_PRE1_5 AND NOT MINIUPNPC_VERSION_PRE1_6 AND NOT MINIUPNPC_VERSION_PRE1_7 AND NOT MINIUPNPC_VERSION_1_7_OR_HIGHER)
+	message(STATUS "Found miniupnpc version is v1.9 API version 14 or higher")
+ENDIF()
+
 else ()
 	message (STATUS "Could not find miniupnp")
 endif ()
diff --git a/Source/Core/Core/NetPlayServer.cpp b/Source/Core/Core/NetPlayServer.cpp
index 7ed283a..27b46c9 100644
--- a/Source/Core/Core/NetPlayServer.cpp
+++ b/Source/Core/Core/NetPlayServer.cpp
@@ -904,7 +904,11 @@ bool NetPlayServer::initUPnP()
 	memset(&m_upnp_data, 0, sizeof(IGDdatas));
 
 	// Find all UPnP devices
+#ifdef UPNPDISCOVER_HAS_TTL
+	UPNPDev *devlist = upnpDiscover(2000, nullptr, nullptr, 0, 0, 2, &upnperror);
+#else
 	UPNPDev *devlist = upnpDiscover(2000, nullptr, nullptr, 0, 0, &upnperror);
+#endif
 	if (!devlist)
 	{
 		WARN_LOG(NETPLAY, "An error occured trying to discover UPnP devices.");