mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-08-01 18:48:56 -06:00
Compare commits
320 Commits
release-pr
...
master
Author | SHA1 | Date | |
---|---|---|---|
6ca486ffb2 | |||
38accd7fc3 | |||
cc3a13d4e4 | |||
c880210ec1 | |||
bec5624287 | |||
3fb80bec9b | |||
9e271c3f67 | |||
03b709019d | |||
06e05e0f90 | |||
36aa7b6f3f | |||
63064591e8 | |||
5439a345a7 | |||
6b82389f45 | |||
c63d74e6c0 | |||
f7e7b0f6b0 | |||
812c6c2ea4 | |||
9224d2f827 | |||
f26af63c6d | |||
62bc93473f | |||
56f04b5406 | |||
6cb7868286 | |||
d6a4421386 | |||
cc71401e29 | |||
131ca1ba9b | |||
cd142aa18d | |||
6105d025ca | |||
0d87f835e2 | |||
59e9267e3d | |||
4e0d41627e | |||
4d0cf1315e | |||
9f32562e36 | |||
fef77a5f20 | |||
803e6b017b | |||
59d126d215 | |||
d62e21e7b6 | |||
288da38dc3 | |||
e2ecafcaf3 | |||
c3be049571 | |||
0fa15342ec | |||
a6642d5f79 | |||
57b145990d | |||
36627f55bb | |||
dcb289be8f | |||
64d4c4020c | |||
027c78ee4f | |||
1aadd01038 | |||
9d9b6d8705 | |||
e2a8e7da48 | |||
7871b24b59 | |||
45ba6ed6b1 | |||
10cedc90af | |||
f4a86931a4 | |||
69f331e989 | |||
4ae195ee60 | |||
74814b3203 | |||
8e84943e37 | |||
79a3af2e6e | |||
c6de692d01 | |||
b80e178403 | |||
0ace5f5d3d | |||
c39c8277b7 | |||
dccd8709d8 | |||
3700eddf0c | |||
68713e08b4 | |||
5cc0a5a3be | |||
6a55a1bf68 | |||
2da774b2f7 | |||
3bd110a210 | |||
b2b2808d01 | |||
4868970504 | |||
4788af92bc | |||
0019256707 | |||
0611880c56 | |||
47b74c0e74 | |||
b25e293cc8 | |||
575b6a9cd8 | |||
c29b3e098d | |||
43ab79ae23 | |||
b6be5ee5d3 | |||
9e05063929 | |||
295ae819f5 | |||
9f076d4707 | |||
291c410e8e | |||
d3336d1129 | |||
81a9809525 | |||
4a520c62a0 | |||
ebcca270cc | |||
5c7743e617 | |||
12482c8c3b | |||
c2bace5967 | |||
79230c38f1 | |||
d53e766d65 | |||
5674afa63d | |||
2e26c03378 | |||
1dbb9a193e | |||
8a28b95480 | |||
9e57447fd3 | |||
2bbd1fcf6b | |||
633fd5df70 | |||
d92f7f194c | |||
30bd7e18f0 | |||
06882bd2dc | |||
3f314c81e9 | |||
f76ab86326 | |||
8d2a15be3f | |||
29964ff55e | |||
72ea7a2128 | |||
f2392e4048 | |||
d55012f8d0 | |||
57cbd98f42 | |||
b23da4f15c | |||
c37882de77 | |||
13784f842e | |||
fe6fd2279c | |||
a5e85caf0a | |||
b03a7821f2 | |||
a84fa387de | |||
74eeeebfde | |||
4126b4e904 | |||
2871fe08c9 | |||
0093ed1ac8 | |||
8b2d569932 | |||
8f4a0b0e77 | |||
c597c70316 | |||
9a0d4501f8 | |||
626315d50a | |||
936887838a | |||
7fe4a6e4f3 | |||
25583658d2 | |||
0e25979449 | |||
350ec54779 | |||
541dbdfead | |||
b3e349b4df | |||
f8e22f448d | |||
c613d3ca10 | |||
60156f4f94 | |||
8d7bb0a44a | |||
3a32013740 | |||
bc1d8ffcbb | |||
48a209d76e | |||
99be5eb6c8 | |||
4af2e27821 | |||
9395238159 | |||
fe121e4c6e | |||
609d91156a | |||
8f0ef62a71 | |||
43aa7e9b96 | |||
43c156084b | |||
71fa08813a | |||
e9b57393a6 | |||
97febd9477 | |||
0946814711 | |||
3627cfb7b1 | |||
2e8da29ca2 | |||
f7fa59e05d | |||
fbced5d0f5 | |||
59d2611a94 | |||
6a0963908d | |||
fa9f71e482 | |||
5836ca133c | |||
c2aaca2b16 | |||
19f3b7e61f | |||
ac84ea17a6 | |||
10c3b0b4e4 | |||
e002fcdf2f | |||
8c643693a9 | |||
c9b815526c | |||
78065359bb | |||
040d9a4336 | |||
e21ae90073 | |||
413b7475ec | |||
e8c9c7a403 | |||
c488545091 | |||
2fd74990b7 | |||
ab25632992 | |||
6a0d8ca3f8 | |||
ca004e35f7 | |||
c39b067479 | |||
58b86074ae | |||
cc5933a6ce | |||
5f6cc197ce | |||
28a6eb26cc | |||
3a94289ad6 | |||
2fb66e9708 | |||
83beebaf8b | |||
6591fa3751 | |||
0780458069 | |||
11c3f7ea8d | |||
344080b7a9 | |||
89b8edea03 | |||
2047eaf1d8 | |||
ca8f9b672b | |||
95f6c76713 | |||
46ce355d93 | |||
d93245cc7a | |||
a163877413 | |||
417badc55c | |||
6ab83bdd05 | |||
5800b874d7 | |||
1526c06133 | |||
7ad85e875d | |||
42d5f2b705 | |||
5064b615ba | |||
33b529a510 | |||
8c3ca46988 | |||
944dd711b7 | |||
1b7d42f775 | |||
24b0bf01d5 | |||
19fbbf0dba | |||
1786e34bd3 | |||
65f3ba70f5 | |||
ec52a74967 | |||
8b7669550f | |||
46e66fe945 | |||
056ece6f29 | |||
a07a2fe398 | |||
61e8fa060b | |||
b6ff1b5573 | |||
6da3f5f26a | |||
5906512847 | |||
52fcdde485 | |||
5eb61024c6 | |||
a27b845514 | |||
1b1ca019a4 | |||
241834709b | |||
c68549e9ef | |||
5545a386cf | |||
185b080f03 | |||
43b254aaad | |||
1002f29691 | |||
0dd601577d | |||
cf7b141eb9 | |||
22fd0472ed | |||
4b4a775d5a | |||
5d7cba8cd9 | |||
4214cb6eb8 | |||
c3d3b81533 | |||
774a84a953 | |||
b3f50c969e | |||
3b83907b88 | |||
d940d62cae | |||
7afa9e6c6f | |||
12d178a8df | |||
f910c1d934 | |||
70abcb2030 | |||
d8ea31ca46 | |||
2ae43324cb | |||
7d59c2743d | |||
8113399b68 | |||
bafe78203d | |||
15f125ebee | |||
316740daed | |||
903eafcf65 | |||
2a7e8a4003 | |||
9ec69b5925 | |||
d7de49ccf6 | |||
5ec5db9240 | |||
974c56d3c5 | |||
977f2da6a7 | |||
b1d114f7f7 | |||
be3d48ec5f | |||
d766c527c7 | |||
a0611b512b | |||
fadc2ac223 | |||
ea959f2651 | |||
a43fc68452 | |||
ae26b38fc0 | |||
b9bea58f0f | |||
b7fb2fa737 | |||
2de9122b5f | |||
8665b22822 | |||
bae0e5f67a | |||
2ae928ca79 | |||
f04f659710 | |||
ec1d659363 | |||
c37933932d | |||
23af1e025b | |||
135b6840e5 | |||
e3df00b7f4 | |||
71da0f2d24 | |||
5d2518d490 | |||
3f090dd474 | |||
8def02072b | |||
84f2af73e6 | |||
19a3f25a71 | |||
4b65cc9a4c | |||
5309c440d2 | |||
61ccdb0a3c | |||
8192d9d2a9 | |||
a6b04f53e0 | |||
a8eafa4ccd | |||
a5b4a0b9e4 | |||
fd285f6348 | |||
3dc1605569 | |||
a6a5e201b6 | |||
aafe961177 | |||
eed7843d4a | |||
1e4dfc0956 | |||
5bc661aeca | |||
fcff7a3a49 | |||
543b85a451 | |||
e796e82e8c | |||
2b9935e6f4 | |||
f99d3dbd5c | |||
34e8fb068f | |||
7c237bbd7c | |||
b23dddea4e | |||
2ed5f16600 | |||
67f73d95e3 | |||
c23b4e1020 | |||
d4afa1ebfa | |||
8b228503d9 | |||
1554e4ab6c | |||
e7f22515d3 | |||
ec29d120b5 | |||
f240e20e3f | |||
303366b1ce | |||
649e49c9e2 | |||
d48e6e25ad | |||
096ab8c026 |
38
.gitmodules
vendored
38
.gitmodules
vendored
@ -1,32 +1,26 @@
|
|||||||
[submodule "Externals/Qt"]
|
[submodule "Externals/Qt"]
|
||||||
path = Externals/Qt
|
path = Externals/Qt
|
||||||
url = https://github.com/dolphin-emu/ext-win-qt.git
|
url = https://github.com/dolphin-emu/ext-win-qt.git
|
||||||
branch = master
|
|
||||||
shallow = true
|
shallow = true
|
||||||
[submodule "Externals/mGBA/mgba"]
|
[submodule "Externals/mGBA/mgba"]
|
||||||
path = Externals/mGBA/mgba
|
path = Externals/mGBA/mgba
|
||||||
url = https://github.com/mgba-emu/mgba.git
|
url = https://github.com/mgba-emu/mgba.git
|
||||||
branch = master
|
|
||||||
shallow = true
|
shallow = true
|
||||||
[submodule "Externals/FFmpeg-bin"]
|
[submodule "Externals/FFmpeg-bin"]
|
||||||
path = Externals/FFmpeg-bin
|
path = Externals/FFmpeg-bin
|
||||||
url = https://github.com/dolphin-emu/ext-win-ffmpeg.git
|
url = https://github.com/dolphin-emu/ext-win-ffmpeg.git
|
||||||
branch = master
|
|
||||||
shallow = true
|
shallow = true
|
||||||
[submodule "libusb"]
|
[submodule "libusb"]
|
||||||
path = Externals/libusb/libusb
|
path = Externals/libusb/libusb
|
||||||
url = https://github.com/libusb/libusb.git
|
url = https://github.com/libusb/libusb.git
|
||||||
branch = master
|
|
||||||
shallow = true
|
shallow = true
|
||||||
[submodule "Externals/spirv_cross/SPIRV-Cross"]
|
[submodule "Externals/spirv_cross/SPIRV-Cross"]
|
||||||
path = Externals/spirv_cross/SPIRV-Cross
|
path = Externals/spirv_cross/SPIRV-Cross
|
||||||
url = https://github.com/KhronosGroup/SPIRV-Cross.git
|
url = https://github.com/KhronosGroup/SPIRV-Cross.git
|
||||||
branch = main
|
|
||||||
shallow = true
|
shallow = true
|
||||||
[submodule "SDL"]
|
[submodule "SDL"]
|
||||||
path = Externals/SDL/SDL
|
path = Externals/SDL/SDL
|
||||||
url = https://github.com/libsdl-org/SDL.git
|
url = https://github.com/libsdl-org/SDL.git
|
||||||
branch = SDL2
|
|
||||||
shallow = true
|
shallow = true
|
||||||
[submodule "Externals/zlib-ng/zlib-ng"]
|
[submodule "Externals/zlib-ng/zlib-ng"]
|
||||||
path = Externals/zlib-ng/zlib-ng
|
path = Externals/zlib-ng/zlib-ng
|
||||||
@ -35,58 +29,80 @@
|
|||||||
[submodule "Externals/libspng/libspng"]
|
[submodule "Externals/libspng/libspng"]
|
||||||
path = Externals/libspng/libspng
|
path = Externals/libspng/libspng
|
||||||
url = https://github.com/randy408/libspng.git
|
url = https://github.com/randy408/libspng.git
|
||||||
branch = v0.7.2
|
|
||||||
shallow = true
|
shallow = true
|
||||||
[submodule "Externals/VulkanMemoryAllocator"]
|
[submodule "Externals/VulkanMemoryAllocator"]
|
||||||
path = Externals/VulkanMemoryAllocator
|
path = Externals/VulkanMemoryAllocator
|
||||||
url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git
|
url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git
|
||||||
|
shallow = true
|
||||||
[submodule "Externals/cubeb/cubeb"]
|
[submodule "Externals/cubeb/cubeb"]
|
||||||
path = Externals/cubeb/cubeb
|
path = Externals/cubeb/cubeb
|
||||||
url = https://github.com/mozilla/cubeb.git
|
url = https://github.com/mozilla/cubeb.git
|
||||||
branch = master
|
|
||||||
shallow = true
|
shallow = true
|
||||||
[submodule "Externals/implot/implot"]
|
[submodule "Externals/implot/implot"]
|
||||||
path = Externals/implot/implot
|
path = Externals/implot/implot
|
||||||
url = https://github.com/epezent/implot.git
|
url = https://github.com/epezent/implot.git
|
||||||
|
shallow = true
|
||||||
[submodule "Externals/gtest"]
|
[submodule "Externals/gtest"]
|
||||||
path = Externals/gtest
|
path = Externals/gtest
|
||||||
url = https://github.com/google/googletest.git
|
url = https://github.com/google/googletest.git
|
||||||
|
shallow = true
|
||||||
[submodule "Externals/rcheevos/rcheevos"]
|
[submodule "Externals/rcheevos/rcheevos"]
|
||||||
path = Externals/rcheevos/rcheevos
|
path = Externals/rcheevos/rcheevos
|
||||||
url = https://github.com/RetroAchievements/rcheevos.git
|
url = https://github.com/RetroAchievements/rcheevos.git
|
||||||
|
shallow = true
|
||||||
[submodule "Externals/libadrenotools"]
|
[submodule "Externals/libadrenotools"]
|
||||||
path = Externals/libadrenotools
|
path = Externals/libadrenotools
|
||||||
url = https://github.com/bylaws/libadrenotools.git
|
url = https://github.com/bylaws/libadrenotools.git
|
||||||
|
shallow = true
|
||||||
[submodule "Externals/curl/curl"]
|
[submodule "Externals/curl/curl"]
|
||||||
path = Externals/curl/curl
|
path = Externals/curl/curl
|
||||||
url = https://github.com/curl/curl.git
|
url = https://github.com/curl/curl.git
|
||||||
|
shallow = true
|
||||||
[submodule "Externals/fmt/fmt"]
|
[submodule "Externals/fmt/fmt"]
|
||||||
path = Externals/fmt/fmt
|
path = Externals/fmt/fmt
|
||||||
url = https://github.com/fmtlib/fmt.git
|
url = https://github.com/fmtlib/fmt.git
|
||||||
|
shallow = true
|
||||||
[submodule "Externals/lz4/lz4"]
|
[submodule "Externals/lz4/lz4"]
|
||||||
path = Externals/lz4/lz4
|
path = Externals/lz4/lz4
|
||||||
url = https://github.com/lz4/lz4
|
url = https://github.com/lz4/lz4.git
|
||||||
|
shallow = true
|
||||||
[submodule "Externals/xxhash/xxHash"]
|
[submodule "Externals/xxhash/xxHash"]
|
||||||
path = Externals/xxhash/xxHash
|
path = Externals/xxhash/xxHash
|
||||||
url = https://github.com/Cyan4973/xxHash.git
|
url = https://github.com/Cyan4973/xxHash.git
|
||||||
|
shallow = true
|
||||||
[submodule "Externals/enet/enet"]
|
[submodule "Externals/enet/enet"]
|
||||||
path = Externals/enet/enet
|
path = Externals/enet/enet
|
||||||
url = https://github.com/lsalzman/enet.git
|
url = https://github.com/lsalzman/enet.git
|
||||||
|
shallow = true
|
||||||
[submodule "hidapi-src"]
|
[submodule "hidapi-src"]
|
||||||
path = Externals/hidapi/hidapi-src
|
path = Externals/hidapi/hidapi-src
|
||||||
url = https://github.com/libusb/hidapi
|
url = https://github.com/libusb/hidapi.git
|
||||||
|
shallow = true
|
||||||
[submodule "Externals/tinygltf/tinygltf"]
|
[submodule "Externals/tinygltf/tinygltf"]
|
||||||
path = Externals/tinygltf/tinygltf
|
path = Externals/tinygltf/tinygltf
|
||||||
url = https://github.com/syoyo/tinygltf.git
|
url = https://github.com/syoyo/tinygltf.git
|
||||||
|
shallow = true
|
||||||
[submodule "Externals/minizip-ng/minizip-ng"]
|
[submodule "Externals/minizip-ng/minizip-ng"]
|
||||||
path = Externals/minizip-ng/minizip-ng
|
path = Externals/minizip-ng/minizip-ng
|
||||||
url = https://github.com/zlib-ng/minizip-ng
|
url = https://github.com/zlib-ng/minizip-ng.git
|
||||||
|
shallow = true
|
||||||
[submodule "Externals/Vulkan-Headers"]
|
[submodule "Externals/Vulkan-Headers"]
|
||||||
path = Externals/Vulkan-Headers
|
path = Externals/Vulkan-Headers
|
||||||
url = https://github.com/KhronosGroup/Vulkan-Headers.git
|
url = https://github.com/KhronosGroup/Vulkan-Headers.git
|
||||||
|
shallow = true
|
||||||
|
[submodule "Externals/watcher/watcher"]
|
||||||
|
path = Externals/watcher/watcher
|
||||||
|
url = https://github.com/e-dant/watcher.git
|
||||||
|
shallow = true
|
||||||
[submodule "Externals/SFML/SFML"]
|
[submodule "Externals/SFML/SFML"]
|
||||||
path = Externals/SFML/SFML
|
path = Externals/SFML/SFML
|
||||||
url = https://github.com/SFML/SFML.git
|
url = https://github.com/SFML/SFML.git
|
||||||
|
shallow = true
|
||||||
[submodule "Externals/zstd/zstd"]
|
[submodule "Externals/zstd/zstd"]
|
||||||
path = Externals/zstd/zstd
|
path = Externals/zstd/zstd
|
||||||
url = https://github.com/facebook/zstd.git
|
url = https://github.com/facebook/zstd.git
|
||||||
|
shallow = true
|
||||||
|
[submodule "Externals/miniupnpc/miniupnp"]
|
||||||
|
path = Externals/miniupnpc/miniupnp
|
||||||
|
url = https://github.com/miniupnp/miniupnp.git
|
||||||
|
shallow = true
|
||||||
|
@ -137,6 +137,8 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
|
enable_language(OBJC)
|
||||||
|
enable_language(OBJCXX)
|
||||||
option(MACOS_USE_DEFAULT_SEARCH_PATH "Don't prioritize system library paths" OFF)
|
option(MACOS_USE_DEFAULT_SEARCH_PATH "Don't prioritize system library paths" OFF)
|
||||||
option(SKIP_POSTPROCESS_BUNDLE "Skip postprocessing bundle for redistributability" OFF)
|
option(SKIP_POSTPROCESS_BUNDLE "Skip postprocessing bundle for redistributability" OFF)
|
||||||
# Enable adhoc code signing by default (otherwise makefile builds on ARM will not work)
|
# Enable adhoc code signing by default (otherwise makefile builds on ARM will not work)
|
||||||
@ -602,7 +604,7 @@ if(UNIX)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(ENABLE_SDL)
|
if(ENABLE_SDL)
|
||||||
dolphin_find_optional_system_library(SDL2 Externals/SDL 2.30.9)
|
dolphin_find_optional_system_library(SDL3 Externals/SDL 3.2.0)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(ENABLE_ANALYTICS)
|
if(ENABLE_ANALYTICS)
|
||||||
@ -691,8 +693,8 @@ dolphin_find_optional_system_library_pkgconfig(ZSTD libzstd>=1.4.0 zstd::zstd Ex
|
|||||||
|
|
||||||
dolphin_find_optional_system_library_pkgconfig(ZLIB zlib>=1.3.1 ZLIB::ZLIB Externals/zlib-ng)
|
dolphin_find_optional_system_library_pkgconfig(ZLIB zlib>=1.3.1 ZLIB::ZLIB Externals/zlib-ng)
|
||||||
|
|
||||||
dolphin_find_optional_system_library_pkgconfig(MINIZIP
|
dolphin_find_optional_system_library_pkgconfig(minizip-ng
|
||||||
"minizip>=4.0.4" minizip::minizip Externals/minizip-ng
|
"minizip-ng>=4.0.4" minizip-ng::minizip-ng Externals/minizip-ng
|
||||||
)
|
)
|
||||||
|
|
||||||
dolphin_find_optional_system_library(LZO Externals/LZO)
|
dolphin_find_optional_system_library(LZO Externals/LZO)
|
||||||
@ -784,6 +786,8 @@ if (USE_RETRO_ACHIEVEMENTS)
|
|||||||
add_subdirectory(Externals/rcheevos)
|
add_subdirectory(Externals/rcheevos)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_subdirectory(Externals/watcher)
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
# Pre-build events: Define configuration variables and write SCM info header
|
# Pre-build events: Define configuration variables and write SCM info header
|
||||||
#
|
#
|
||||||
|
File diff suppressed because one or more lines are too long
@ -59,9 +59,12 @@ C202F310 00000003
|
|||||||
$16:9 Aspect Ratio Fix - Centered HUD with letterboxing
|
$16:9 Aspect Ratio Fix - Centered HUD with letterboxing
|
||||||
04199598 4E800020
|
04199598 4E800020
|
||||||
0441F6D8 3FE38E39
|
0441F6D8 3FE38E39
|
||||||
|
$No Letterbox [Ralf]
|
||||||
|
0400E3D4 48000070
|
||||||
|
|
||||||
[Gecko_RetroAchievements_Verified]
|
[Gecko_RetroAchievements_Verified]
|
||||||
$16:9 Aspect Ratio Fix - Normal HUD
|
$16:9 Aspect Ratio Fix - Normal HUD
|
||||||
$16:9 Aspect Ratio Fix - Centered HUD
|
$16:9 Aspect Ratio Fix - Centered HUD
|
||||||
$16:9 Aspect Ratio Fix - Stretched HUD
|
$16:9 Aspect Ratio Fix - Stretched HUD
|
||||||
$16:9 Aspect Ratio Fix - Centered HUD with letterboxing
|
$16:9 Aspect Ratio Fix - Centered HUD with letterboxing
|
||||||
|
$No Letterbox
|
||||||
|
@ -32,9 +32,12 @@ C202F3F8 00000003
|
|||||||
$16:9 Aspect Ratio Fix - Centered HUD with letterboxing
|
$16:9 Aspect Ratio Fix - Centered HUD with letterboxing
|
||||||
0419B274 4E800020
|
0419B274 4E800020
|
||||||
0442C158 3FE38E39
|
0442C158 3FE38E39
|
||||||
|
$No Letterbox [Ralf]
|
||||||
|
0400E598 48000070
|
||||||
|
|
||||||
[Gecko_RetroAchievements_Verified]
|
[Gecko_RetroAchievements_Verified]
|
||||||
$16:9 Aspect Ratio Fix - Normal HUD
|
$16:9 Aspect Ratio Fix - Normal HUD
|
||||||
$16:9 Aspect Ratio Fix - Centered HUD
|
$16:9 Aspect Ratio Fix - Centered HUD
|
||||||
$16:9 Aspect Ratio Fix - Stretched HUD
|
$16:9 Aspect Ratio Fix - Stretched HUD
|
||||||
$16:9 Aspect Ratio Fix - Centered HUD with letterboxing
|
$16:9 Aspect Ratio Fix - Centered HUD with letterboxing
|
||||||
|
$No Letterbox
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# GC6E01, GC6P01 - Pokemon Colosseum
|
# GC6E01, GC6P01, GC6J01 - Pokemon Colosseum
|
||||||
|
|
||||||
[Core]
|
[Core]
|
||||||
# Values set here will override the main Dolphin settings.
|
# Values set here will override the main Dolphin settings.
|
||||||
@ -13,5 +13,5 @@
|
|||||||
SafeTextureCacheColorSamples = 0
|
SafeTextureCacheColorSamples = 0
|
||||||
# Many areas of the game have unused vertexes, especially with cutscenes
|
# Many areas of the game have unused vertexes, especially with cutscenes
|
||||||
# involving Shadow Pokémon, such as the purification cutscene.
|
# involving Shadow Pokémon, such as the purification cutscene.
|
||||||
# CPU Cull ends up greatly boosting performance for these cases.
|
# CPU Cull ends up greatly boosting performance for these cases.
|
||||||
CPUCull = True
|
CPUCull = True
|
||||||
|
@ -36,9 +36,12 @@ $16:9 Widescreen
|
|||||||
04005308 4809E62C
|
04005308 4809E62C
|
||||||
040A3930 4BF619D0
|
040A3930 4BF619D0
|
||||||
0447E724 3FAAAAAB
|
0447E724 3FAAAAAB
|
||||||
|
$60 FPS [Nerdzilla]
|
||||||
|
04005D98 38600000
|
||||||
|
|
||||||
[Patches_RetroAchievements_Verified]
|
[Patches_RetroAchievements_Verified]
|
||||||
$Allow Memory Card saving with Savestates
|
$Allow Memory Card saving with Savestates
|
||||||
|
|
||||||
[AR_RetroAchievements_Verified]
|
[AR_RetroAchievements_Verified]
|
||||||
$16:9 Widescreen
|
$16:9 Widescreen
|
||||||
|
$60 FPS [Nerdzilla]
|
||||||
|
@ -30,27 +30,11 @@ $Allow Memory Card saving with Savestates
|
|||||||
$Allow Memory Card saving with Savestates
|
$Allow Memory Card saving with Savestates
|
||||||
|
|
||||||
[ActionReplay]
|
[ActionReplay]
|
||||||
$16:9 Widescreen
|
$60 FPS [Nerdzilla]
|
||||||
04261AC0 000034E0
|
04005CFC 38600000
|
||||||
04261AC4 000034E4
|
|
||||||
F6000001 80008180
|
|
||||||
FFA01090 93E10024
|
|
||||||
D2000000 00000003
|
|
||||||
3DC03FAA 61CEAAAB
|
|
||||||
91C20000 C2620000
|
|
||||||
EFB300B2 00000000
|
|
||||||
E0000000 80008000
|
|
||||||
F6000001 80008180
|
|
||||||
FF601090 7C7F1B78
|
|
||||||
D2000000 00000004
|
|
||||||
3DC03FAA 61CEAAAB
|
|
||||||
91C20004 C2220004
|
|
||||||
EF7100B2 39C00000
|
|
||||||
60000000 00000000
|
|
||||||
E0000000 80008000
|
|
||||||
|
|
||||||
[Patches_RetroAchievements_Verified]
|
[Patches_RetroAchievements_Verified]
|
||||||
$Allow Memory Card saving with Savestates
|
$Allow Memory Card saving with Savestates
|
||||||
|
|
||||||
[AR_RetroAchievements_Verified]
|
[AR_RetroAchievements_Verified]
|
||||||
$16:9 Widescreen
|
$60 FPS [Nerdzilla]
|
||||||
|
@ -36,9 +36,12 @@ $16:9 Widescreen [Ralf]
|
|||||||
04005308 480A1C68
|
04005308 480A1C68
|
||||||
040A6F6C 4BF5E394
|
040A6F6C 4BF5E394
|
||||||
044CBCA4 3FAAAAAB
|
044CBCA4 3FAAAAAB
|
||||||
|
$60 FPS [Nerdzilla]
|
||||||
|
04005E90 38600000
|
||||||
|
|
||||||
[Patches_RetroAchievements_Verified]
|
[Patches_RetroAchievements_Verified]
|
||||||
$Allow Memory Card saving with Savestates
|
$Allow Memory Card saving with Savestates
|
||||||
|
|
||||||
[AR_RetroAchievements_Verified]
|
[AR_RetroAchievements_Verified]
|
||||||
$16:9 Widescreen [Ralf]
|
$16:9 Widescreen [Ralf]
|
||||||
|
$60 FPS [Nerdzilla]
|
||||||
|
5
Data/Sys/GameSettings/GD7.ini
Normal file
5
Data/Sys/GameSettings/GD7.ini
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# GD7JB2, GD7E70, GD7PB2 - Dragon Ball Z: Budokai
|
||||||
|
|
||||||
|
[Video_Hacks]
|
||||||
|
# Frame pacing
|
||||||
|
ImmediateXFBEnable = False
|
17
Data/Sys/GameSettings/GD7PB2.ini
Normal file
17
Data/Sys/GameSettings/GD7PB2.ini
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# GD7PB2 - Dragon Ball Z: Budokai
|
||||||
|
|
||||||
|
[Core]
|
||||||
|
# Values set here will override the main Dolphin settings.
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
# Add memory patches to be applied every frame here.
|
||||||
|
|
||||||
|
[ActionReplay]
|
||||||
|
# Add action replay cheats here.
|
||||||
|
|
||||||
|
[Gecko]
|
||||||
|
$Deinterlacing Fix
|
||||||
|
0044E9A8 00000000
|
||||||
|
|
||||||
|
[Gecko_RetroAchievements_Verified]
|
||||||
|
$Deinterlacing Fix
|
5
Data/Sys/GameSettings/GIHP78.ini
Normal file
5
Data/Sys/GameSettings/GIHP78.ini
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# GIHP78 - Scooby-Doo! Night of 100 Frights
|
||||||
|
|
||||||
|
[Video_Settings]
|
||||||
|
# Fixes video stuttering on FMVs encoded at 25 FPS
|
||||||
|
SafeTextureCacheColorSamples = 512
|
@ -12,4 +12,7 @@
|
|||||||
[Video_Settings]
|
[Video_Settings]
|
||||||
|
|
||||||
[Video_Hacks]
|
[Video_Hacks]
|
||||||
|
# Fixes FMVs tearing.
|
||||||
|
EarlyXFBOutput = False
|
||||||
|
# Fixes FMVs not showing.
|
||||||
ImmediateXFBEnable = False
|
ImmediateXFBEnable = False
|
||||||
|
@ -101,23 +101,28 @@ C2434EBC 00000002
|
|||||||
3DC03F36 91DC00CC
|
3DC03F36 91DC00CC
|
||||||
60000000 00000000
|
60000000 00000000
|
||||||
$60 FPS
|
$60 FPS
|
||||||
04423540 3BC00001 # `setFramerate`: force 60 FPS
|
C242DF28 00000004 # Set to 30 FPS when cutscene starts
|
||||||
0451D804 40100000 # Map translation speed 1
|
3C608042 6063352C
|
||||||
C2312B04 00000002 # Map translation speed 2
|
7C6903A6 806D9AEC
|
||||||
3C003F80 9001FFFC
|
38800002 4E800421
|
||||||
C121FFFC 00000000
|
801F01F0 00000000
|
||||||
|
C242E040 00000004 # Set to 60 FPS when cutscene ends
|
||||||
|
3C608042 6063352C
|
||||||
|
7C6903A6 806D9AEC
|
||||||
|
38800001 4E800421
|
||||||
|
801F01F0 00000000
|
||||||
|
0414B778 38800001 # `BaseGameSection::init`, force `setFramerate` argument to 60 FPS (2P mode doesn't start with a cutscene)
|
||||||
|
04513C5C 40100000 # Map translation speed 1
|
||||||
|
04513C60 3F800000 # Map translation speed 2
|
||||||
0451D7B0 3C75C28F # Map scale speed
|
0451D7B0 3C75C28F # Map scale speed
|
||||||
04520628 3F911111 # Cutscene delta time
|
04514128 3ECCCCCD # Final floor animation
|
||||||
0452062C 20000000
|
04516140 3F000000 # Pay dept animation
|
||||||
C2010654 00000002 # Double cutscene sections' "frame duration"
|
04520078 3EB33333 # Ready-go animation
|
||||||
5484083C 909F002C
|
04410FA4 388000C8 # Win/Lose reason duration 1
|
||||||
60000000 00000000
|
04410FAC 386000FA # Win/Lose reason duration 2
|
||||||
C242ED28 00000002 # Cutscene: objects spawn/despawn timing
|
04520224 3F000000 # Win/Lose animation
|
||||||
3C003F00 9001FFFC
|
044106DC 38800078 # Win/Lose duration 1
|
||||||
C001FFFC 00000000
|
044106E4 38600168 # Win/Lose duration 2
|
||||||
C24374DC 00000002 # Cutscene: trigger `startFadeblack` a frame earlier (fixes black screen in Day 1 cutscene)
|
|
||||||
806D9AEC C0230054
|
|
||||||
FC020840 00000000
|
|
||||||
|
|
||||||
[Gecko_RetroAchievements_Verified]
|
[Gecko_RetroAchievements_Verified]
|
||||||
$16:9 Widescreen
|
$16:9 Widescreen
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,14 +1,11 @@
|
|||||||
# GFBE5D - FireBlade
|
# GRAE5Z, GRAP75 - Rally Championship
|
||||||
|
|
||||||
[Core]
|
[Core]
|
||||||
# Values set here will override the main Dolphin settings.
|
# Values set here will override the main Dolphin settings.
|
||||||
|
CPUThread = False
|
||||||
|
|
||||||
[OnFrame]
|
[OnFrame]
|
||||||
# Add memory patches to be applied every frame here.
|
# Add memory patches to be applied every frame here.
|
||||||
|
|
||||||
[ActionReplay]
|
[ActionReplay]
|
||||||
# Add action replay cheats here.
|
# Add action replay cheats here.
|
||||||
|
|
||||||
[Video_Hacks]
|
|
||||||
EFBToTextureEnable = True
|
|
||||||
|
|
@ -1,8 +1,16 @@
|
|||||||
# GTRE78, GTRP78 - Tetris Worlds
|
# GTRE78, GTRJ8N, GTRP78 - Tetris Worlds
|
||||||
|
|
||||||
[Core]
|
[Core]
|
||||||
|
# Values set here will override the main Dolphin settings.
|
||||||
|
|
||||||
[OnFrame]
|
[OnFrame]
|
||||||
|
# Add memory patches to be applied every frame here.
|
||||||
|
|
||||||
[ActionReplay]
|
[ActionReplay]
|
||||||
[Video_Settings]
|
# Add action replay cheats here.
|
||||||
|
|
||||||
[Video_Hacks]
|
[Video_Hacks]
|
||||||
|
# Fixes FMVs tearing.
|
||||||
|
EarlyXFBOutput = False
|
||||||
|
# Fixes FMVs not showing.
|
||||||
ImmediateXFBEnable = False
|
ImmediateXFBEnable = False
|
||||||
[Gecko]
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
$16:9 Widescreen
|
$16:9 Widescreen
|
||||||
043438A8 3FAF0000
|
043438A8 3FAF0000
|
||||||
043486A8 406CB800
|
043486A8 406CB800
|
||||||
$60Hz
|
$60 FPS
|
||||||
040B66F8 60000000
|
040B66F8 60000000
|
||||||
0402F0E4 38600002
|
0402F0E4 38600002
|
||||||
0402F1CC 60000000
|
0402F1CC 60000000
|
||||||
@ -16,4 +16,4 @@ $60Hz
|
|||||||
|
|
||||||
[AR_RetroAchievements_Verified]
|
[AR_RetroAchievements_Verified]
|
||||||
$16:9 Widescreen
|
$16:9 Widescreen
|
||||||
$60Hz
|
$60 FPS
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
$16:9 Widescreen
|
$16:9 Widescreen
|
||||||
04343EC8 3FAF0000
|
04343EC8 3FAF0000
|
||||||
04348D30 406CB800
|
04348D30 406CB800
|
||||||
$60Hz
|
$60 FPS
|
||||||
040B6F08 60000000
|
040B6F08 60000000
|
||||||
0402F130 38600002
|
0402F130 38600002
|
||||||
0402F218 60000000
|
0402F218 60000000
|
||||||
@ -16,4 +16,4 @@ $60Hz
|
|||||||
|
|
||||||
[AR_RetroAchievements_Verified]
|
[AR_RetroAchievements_Verified]
|
||||||
$16:9 Widescreen
|
$16:9 Widescreen
|
||||||
$60Hz
|
$60 FPS
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
$16:9 Widescreen
|
$16:9 Widescreen
|
||||||
04336CE8 3FABA000
|
04336CE8 3FABA000
|
||||||
0433B920 406C4F00
|
0433B920 406C4F00
|
||||||
$50Hz
|
$50 FPS
|
||||||
040B6408 60000000
|
040B6408 60000000
|
||||||
0402F214 38600001
|
0402F214 38600001
|
||||||
0402F300 60000000
|
0402F300 60000000
|
||||||
@ -16,4 +16,4 @@ $50Hz
|
|||||||
|
|
||||||
[AR_RetroAchievements_Verified]
|
[AR_RetroAchievements_Verified]
|
||||||
$16:9 Widescreen
|
$16:9 Widescreen
|
||||||
$50Hz
|
$50 FPS
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# GXXE01, GXXP01, GXXJ01 - POKeMON XD
|
# GXXE01, GXXP01, GXXJ01 - Pokemon XD: Gale of Darkness
|
||||||
|
|
||||||
[Core]
|
[Core]
|
||||||
# Prevents crash when Greevil's henchman and Zook show up
|
# Prevents crash when Greevil's henchman and Zook show up
|
||||||
@ -18,5 +18,5 @@ MMU = True
|
|||||||
SafeTextureCacheColorSamples = 0
|
SafeTextureCacheColorSamples = 0
|
||||||
# Many areas of the game have unused vertexes, especially with cutscenes
|
# Many areas of the game have unused vertexes, especially with cutscenes
|
||||||
# involving Shadow Pokémon, such as the purification cutscene.
|
# involving Shadow Pokémon, such as the purification cutscene.
|
||||||
# CPU Cull ends up greatly boosting performance for these cases.
|
# CPU Cull ends up greatly boosting performance for these cases.
|
||||||
CPUCull = True
|
CPUCull = True
|
||||||
|
@ -12,17 +12,13 @@ $Allow Memory Card saving with Savestates
|
|||||||
[Patches_RetroAchievements_Verified]
|
[Patches_RetroAchievements_Verified]
|
||||||
$Allow Memory Card saving with Savestates
|
$Allow Memory Card saving with Savestates
|
||||||
|
|
||||||
[Gecko]
|
[ActionReplay]
|
||||||
$16:9 Widescreen
|
$16:9 Widescreen
|
||||||
042EB168 00001783
|
|
||||||
042EB16C 000017EA
|
|
||||||
0400F614 60000000
|
|
||||||
0405C984 60000000
|
|
||||||
040875BC 60000000
|
|
||||||
0405C8AC 60000000
|
|
||||||
04086A34 60000000
|
|
||||||
04086930 60000000
|
|
||||||
044ED860 3FC962F9
|
044ED860 3FC962F9
|
||||||
|
$60 FPS
|
||||||
|
042AF894 38000000
|
||||||
|
042AEBEC 38000000
|
||||||
|
|
||||||
[Gecko_RetroAchievements_Verified]
|
[AR_RetroAchievements_Verified]
|
||||||
$16:9 Widescreen
|
$16:9 Widescreen
|
||||||
|
$60 FPS
|
||||||
|
@ -11,3 +11,14 @@ $Allow Memory Card saving with Savestates
|
|||||||
|
|
||||||
[Patches_RetroAchievements_Verified]
|
[Patches_RetroAchievements_Verified]
|
||||||
$Allow Memory Card saving with Savestates
|
$Allow Memory Card saving with Savestates
|
||||||
|
|
||||||
|
[ActionReplay]
|
||||||
|
$16:9 Widescreen
|
||||||
|
044CACE8 3FC962F9
|
||||||
|
$60 FPS
|
||||||
|
042AA2BC 38000000
|
||||||
|
042A9614 38000000
|
||||||
|
|
||||||
|
[AR_RetroAchievements_Verified]
|
||||||
|
$16:9 Widescreen
|
||||||
|
$60 FPS
|
||||||
|
@ -12,13 +12,17 @@ $Allow Memory Card saving with Savestates
|
|||||||
[Patches_RetroAchievements_Verified]
|
[Patches_RetroAchievements_Verified]
|
||||||
$Allow Memory Card saving with Savestates
|
$Allow Memory Card saving with Savestates
|
||||||
|
|
||||||
[Gecko]
|
[ActionReplay]
|
||||||
$16:9 Widescreen
|
$16:9 Widescreen
|
||||||
04005300 C3A2BFBC
|
04005300 C3A2BFBC
|
||||||
04005304 EFBD00B2
|
04005304 EFBD00B2
|
||||||
04005308 480AF7A8
|
04005308 480AF7A8
|
||||||
040B4AAC 4BF50854
|
040B4AAC 4BF50854
|
||||||
0452A35C 3FAAAAAB
|
0452A35C 3FAAAAAB
|
||||||
|
$60 FPS
|
||||||
|
042B17F8 38000000
|
||||||
|
042B0B50 38000000
|
||||||
|
|
||||||
[Gecko_RetroAchievements_Verified]
|
[AR_RetroAchievements_Verified]
|
||||||
$16:9 Widescreen
|
$16:9 Widescreen
|
||||||
|
$60 FPS
|
||||||
|
5
Data/Sys/GameSettings/GZ3.ini
Normal file
5
Data/Sys/GameSettings/GZ3.ini
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# GZ3E70, GZ3PB2 - Dragon Ball Z: Budokai 2
|
||||||
|
|
||||||
|
[Video_Hacks]
|
||||||
|
# Frame pacing
|
||||||
|
ImmediateXFBEnable = False
|
@ -11,7 +11,3 @@
|
|||||||
|
|
||||||
[Video_Settings]
|
[Video_Settings]
|
||||||
SafeTextureCacheColorSamples = 512
|
SafeTextureCacheColorSamples = 512
|
||||||
|
|
||||||
[Video_Hacks]
|
|
||||||
EFBEmulateFormatChanges = True
|
|
||||||
|
|
||||||
|
8
Data/Sys/GameSettings/R6APPU.ini
Normal file
8
Data/Sys/GameSettings/R6APPU.ini
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# R6APPU - Baby and Me
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
# The game busyloops for frame pacing but not in a way Dolphin can
|
||||||
|
# currently optimize, so lots of CPU time is wasted.
|
||||||
|
# This patch adds a call to VIWaitForRetrace to avoid this.
|
||||||
|
$Performance hack
|
||||||
|
0x80016E28:dword:0x4807BD89
|
@ -10,8 +10,11 @@
|
|||||||
# Add action replay cheats here.
|
# Add action replay cheats here.
|
||||||
|
|
||||||
[Video_Settings]
|
[Video_Settings]
|
||||||
|
# Responsive car painting.
|
||||||
SafeTextureCacheColorSamples = 512
|
SafeTextureCacheColorSamples = 512
|
||||||
|
|
||||||
[Video_Hacks]
|
[Video_Hacks]
|
||||||
|
# Functional pointing while car painting.
|
||||||
|
EFBAccessEnable = True
|
||||||
|
# Customizable cars load as completely black otherwise (even in their default state), sun bloom.
|
||||||
EFBToTextureEnable = False
|
EFBToTextureEnable = False
|
||||||
|
|
||||||
|
@ -13,4 +13,7 @@
|
|||||||
SuggestedAspectRatio = 2
|
SuggestedAspectRatio = 2
|
||||||
|
|
||||||
[Video_Hacks]
|
[Video_Hacks]
|
||||||
|
# Avoid purple screen.
|
||||||
|
XFBToTextureEnable = False
|
||||||
|
# Make Wiimote pointer visible.
|
||||||
ImmediateXFBEnable = False
|
ImmediateXFBEnable = False
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
[Core]
|
[Core]
|
||||||
# Values set here will override the main Dolphin settings.
|
# Values set here will override the main Dolphin settings.
|
||||||
|
CPUThread = False
|
||||||
|
|
||||||
[OnFrame]
|
[OnFrame]
|
||||||
# Add memory patches to be applied every frame here.
|
# Add memory patches to be applied every frame here.
|
||||||
|
5
Data/Sys/GameSettings/S7B.ini
Normal file
5
Data/Sys/GameSettings/S7B.ini
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# S7BE69, S7BP69 - Trivial Pursuit: Bet You Know It
|
||||||
|
|
||||||
|
[Video_Hacks]
|
||||||
|
# Avoid purple flickering.
|
||||||
|
XFBToTextureEnable = False
|
8
Data/Sys/GameSettings/SBLE5G.ini
Normal file
8
Data/Sys/GameSettings/SBLE5G.ini
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# SBLE5G - A Boy and His Blob
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
$Fix selecting right-most bean
|
||||||
|
0x800BD308:dword:0x4181000C
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$Fix selecting right-most bean
|
8
Data/Sys/GameSettings/SBLP5G.ini
Normal file
8
Data/Sys/GameSettings/SBLP5G.ini
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# SBLP5G - A Boy and His Blob
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
$Fix selecting right-most bean
|
||||||
|
0x800BE268:dword:0x4181000C
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$Fix selecting right-most bean
|
@ -11,7 +11,3 @@
|
|||||||
|
|
||||||
[Video_Settings]
|
[Video_Settings]
|
||||||
SafeTextureCacheColorSamples = 512
|
SafeTextureCacheColorSamples = 512
|
||||||
|
|
||||||
[Video_Hacks]
|
|
||||||
EFBEmulateFormatChanges = True
|
|
||||||
|
|
||||||
|
9
Data/Sys/GameSettings/SCYE4Q.ini
Normal file
9
Data/Sys/GameSettings/SCYE4Q.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# SCYE4Q - Cars 2
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x8019CB1C:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
9
Data/Sys/GameSettings/SCYP4Q.ini
Normal file
9
Data/Sys/GameSettings/SCYP4Q.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# SCYP4Q - Cars 2
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x8019CB1C:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
9
Data/Sys/GameSettings/SCYR4Q.ini
Normal file
9
Data/Sys/GameSettings/SCYR4Q.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# SCYR4Q - Cars 2
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x8019B4EC:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
9
Data/Sys/GameSettings/SCYX4Q.ini
Normal file
9
Data/Sys/GameSettings/SCYX4Q.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# SCYX4Q - Cars 2
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x8019CBBC:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
9
Data/Sys/GameSettings/SCYY4Q.ini
Normal file
9
Data/Sys/GameSettings/SCYY4Q.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# SCYY4Q - Cars 2
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x8019B55C:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
9
Data/Sys/GameSettings/SCYZ4Q.ini
Normal file
9
Data/Sys/GameSettings/SCYZ4Q.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# SCYZ4Q - Cars 2
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x8019B55C:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
@ -8,7 +8,3 @@
|
|||||||
|
|
||||||
[ActionReplay]
|
[ActionReplay]
|
||||||
# Add action replay cheats here.
|
# Add action replay cheats here.
|
||||||
|
|
||||||
[Video_Hacks]
|
|
||||||
EFBToTextureEnable = False
|
|
||||||
|
|
||||||
|
@ -10,5 +10,7 @@
|
|||||||
# Add action replay cheats here.
|
# Add action replay cheats here.
|
||||||
|
|
||||||
[Video_Hacks]
|
[Video_Hacks]
|
||||||
|
# Properly emulate the blur in the backgrounds.
|
||||||
EFBEmulateFormatChanges = True
|
EFBEmulateFormatChanges = True
|
||||||
|
# Prevent epilepsy-inducing FMVs.
|
||||||
ImmediateXFBEnable = False
|
ImmediateXFBEnable = False
|
||||||
|
@ -10,5 +10,7 @@
|
|||||||
# Add action replay cheats here.
|
# Add action replay cheats here.
|
||||||
|
|
||||||
[Video_Hacks]
|
[Video_Hacks]
|
||||||
|
# Properly emulates the blur in the pause screen.
|
||||||
EFBEmulateFormatChanges = True
|
EFBEmulateFormatChanges = True
|
||||||
|
# Prevent epilepsy-inducing FMVs and menus.
|
||||||
ImmediateXFBEnable = False
|
ImmediateXFBEnable = False
|
||||||
|
@ -2,9 +2,6 @@
|
|||||||
|
|
||||||
[OnFrame]
|
[OnFrame]
|
||||||
# Add memory patches to be applied every frame here.
|
# Add memory patches to be applied every frame here.
|
||||||
$Speed hack
|
|
||||||
0x801D5B10:dword:0x60000000
|
|
||||||
0x801D5B14:dword:0x60000000
|
|
||||||
|
|
||||||
[ActionReplay]
|
[ActionReplay]
|
||||||
# Add action replay cheats here.
|
# Add action replay cheats here.
|
||||||
|
5
Data/Sys/GameSettings/SP4.ini
Normal file
5
Data/Sys/GameSettings/SP4.ini
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# SP4PJW - Pétanque Master
|
||||||
|
|
||||||
|
[Video_Hacks]
|
||||||
|
# Immediate XFB causes seizure-inducing flickering
|
||||||
|
ImmediateXFBEnable = False
|
@ -1,4 +1,4 @@
|
|||||||
# SQIE4Q, SQIP4Q - Disney Infinity
|
# SQIE4Q, SQIP4Q, SQIY4Q - Disney Infinity
|
||||||
|
|
||||||
[Core]
|
[Core]
|
||||||
# Values set here will override the main Dolphin settings.
|
# Values set here will override the main Dolphin settings.
|
||||||
|
9
Data/Sys/GameSettings/SQIE4Q.ini
Normal file
9
Data/Sys/GameSettings/SQIE4Q.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# SQIE4Q - Disney Infinity
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x8008E60C:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
9
Data/Sys/GameSettings/SQIP4Q.ini
Normal file
9
Data/Sys/GameSettings/SQIP4Q.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# SQIP4Q - Disney Infinity
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x8008E60C:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
9
Data/Sys/GameSettings/SQIY4Q.ini
Normal file
9
Data/Sys/GameSettings/SQIY4Q.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# SQIY4Q - Disney Infinity
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x8008E60C:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
@ -10,5 +10,7 @@
|
|||||||
# Add action replay cheats here.
|
# Add action replay cheats here.
|
||||||
|
|
||||||
[Video_Hacks]
|
[Video_Hacks]
|
||||||
|
# Properly emulates the blur in the pause screen.
|
||||||
EFBEmulateFormatChanges = True
|
EFBEmulateFormatChanges = True
|
||||||
|
# Prevent epilepsy-inducing FMVs and menus.
|
||||||
ImmediateXFBEnable = False
|
ImmediateXFBEnable = False
|
||||||
|
9
Data/Sys/GameSettings/STSE4Q.ini
Normal file
9
Data/Sys/GameSettings/STSE4Q.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# STSE4Q - Toy Story 3
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x801FA2E4:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
9
Data/Sys/GameSettings/STSP4Qr1.ini
Normal file
9
Data/Sys/GameSettings/STSP4Qr1.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# STSP4Q - Toy Story 3
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x801FA2E4:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
9
Data/Sys/GameSettings/STSP4Qr2.ini
Normal file
9
Data/Sys/GameSettings/STSP4Qr2.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# STSP4Q - Toy Story 3
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x801FA354:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
9
Data/Sys/GameSettings/STSX4Q.ini
Normal file
9
Data/Sys/GameSettings/STSX4Q.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# STSX4Q - Toy Story 3
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x801FA354:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
9
Data/Sys/GameSettings/STSY4Qr0.ini
Normal file
9
Data/Sys/GameSettings/STSY4Qr0.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# STSY4Q - Toy Story 3
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x801FA2E4:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
9
Data/Sys/GameSettings/STSY4Qr1.ini
Normal file
9
Data/Sys/GameSettings/STSY4Qr1.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# STSY4Q - Toy Story 3
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x801FA354:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
9
Data/Sys/GameSettings/STSZ4Q.ini
Normal file
9
Data/Sys/GameSettings/STSZ4Q.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# STSZ4Q - Toy Story 3 Toy Box Special Edition
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
#This speedhack modifies the way the game manages memory to run faster in Dolphin.
|
||||||
|
$BAT Speedhack
|
||||||
|
0x801FA2E4:dword:0x48000180
|
||||||
|
|
||||||
|
[OnFrame_Enabled]
|
||||||
|
$BAT Speedhack
|
@ -10,4 +10,5 @@
|
|||||||
# Add action replay cheats here.
|
# Add action replay cheats here.
|
||||||
|
|
||||||
[Video_Hacks]
|
[Video_Hacks]
|
||||||
|
# Prevent epilepsy-inducing FMVs.
|
||||||
ImmediateXFBEnable = False
|
ImmediateXFBEnable = False
|
||||||
|
42
Externals/SDL/CMakeLists.txt
vendored
42
Externals/SDL/CMakeLists.txt
vendored
@ -1,34 +1,16 @@
|
|||||||
option(SDL2_DISABLE_SDL2MAIN "" ON)
|
set(SDL_SHARED OFF)
|
||||||
option(SDL2_DISABLE_INSTALL "" ON)
|
set(SDL_STATIC ON)
|
||||||
option(SDL2_DISABLE_UNINSTALL "" ON)
|
set(SDL_TEST_LIBRARY OFF)
|
||||||
option(SDL_SHARED "Build a shared version of the library" OFF)
|
set(SDL_TESTS OFF)
|
||||||
option(SDL_SHARED_ENABLED_BY_DEFAULT "" OFF)
|
set(SDL_DISABLE_INSTALL ON)
|
||||||
option(SDL_STATIC "Build a static version of the library" ON)
|
set(SDL_DISABLE_INSTALL_DOCS ON)
|
||||||
option(SDL_STATIC_ENABLED_BY_DEFAULT "" ON)
|
set(SDL_INSTALL_TESTS OFF)
|
||||||
option(SDL_TEST "Build the SDL2_test library" OFF)
|
|
||||||
option(SDL_TEST_ENABLED_BY_DEFAULT "" OFF)
|
|
||||||
|
|
||||||
# SDL fails to clean up old headers after version upgrades, so do that manually
|
|
||||||
set(EXPECTED_SDL_REVISION "SDL-release-2.30.9-0")
|
|
||||||
if (EXISTS "${CMAKE_CURRENT_BINARY_DIR}/SDL/include/SDL2/SDL_revision.h")
|
|
||||||
file(READ "${CMAKE_CURRENT_BINARY_DIR}/SDL/include/SDL2/SDL_revision.h" ACTUAL_SDL_REVISION)
|
|
||||||
if (NOT "${ACTUAL_SDL_REVISION}" MATCHES "${EXPECTED_SDL_REVISION}")
|
|
||||||
message(STATUS "Found unexpected SDL2/SDL_revision.h, removing generated includes.")
|
|
||||||
file(REMOVE_RECURSE "${CMAKE_CURRENT_BINARY_DIR}/SDL/include/")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
if (EXISTS "${CMAKE_CURRENT_BINARY_DIR}/SDL/include/SDL_revision.h")
|
|
||||||
file(READ "${CMAKE_CURRENT_BINARY_DIR}/SDL/include/SDL_revision.h" ACTUAL_SDL_REVISION)
|
|
||||||
if (NOT "${ACTUAL_SDL_REVISION}" MATCHES "${EXPECTED_SDL_REVISION}")
|
|
||||||
message(STATUS "Found unexpected SDL_revision.h, removing generated includes.")
|
|
||||||
file(REMOVE_RECURSE "${CMAKE_CURRENT_BINARY_DIR}/SDL/include/")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_subdirectory(SDL)
|
add_subdirectory(SDL)
|
||||||
if (TARGET SDL2)
|
|
||||||
dolphin_disable_warnings(SDL2)
|
if (TARGET SDL3)
|
||||||
|
dolphin_disable_warnings(SDL3)
|
||||||
endif()
|
endif()
|
||||||
if (TARGET SDL2-static)
|
if (TARGET SDL3-static)
|
||||||
dolphin_disable_warnings(SDL2-static)
|
dolphin_disable_warnings(SDL3-static)
|
||||||
endif()
|
endif()
|
||||||
|
2
Externals/SDL/SDL
vendored
2
Externals/SDL/SDL
vendored
Submodule Externals/SDL/SDL updated: c98c4fbff6...c9a6709bd2
@ -17,147 +17,165 @@
|
|||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<ItemDefinitionGroup>
|
<ItemDefinitionGroup>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<AdditionalIncludeDirectories>SDL\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>SDL\src;SDL\include;SDL\include\build_config;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions>HAVE_LIBC=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>HAVE_LIBC=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="SDL\include\begin_code.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_begin_code.h" />
|
||||||
<ClInclude Include="SDL\include\close_code.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_camera.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_assert.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_close_code.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_atomic.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_audio.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_assert.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_bits.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_atomic.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_blendmode.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_audio.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_clipboard.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_bits.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_config_windows.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_blendmode.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_config.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_clipboard.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_copying.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_copying.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_cpuinfo.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_cpuinfo.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_egl.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_egl.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_endian.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_endian.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_error.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_error.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_events.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_events.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_filesystem.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_filesystem.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_gamecontroller.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_gamepad.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_gesture.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_gpu.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_guid.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_guid.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_haptic.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_haptic.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_hidapi.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_hints.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_hints.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_hidapi.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_joystick.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_asyncio.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_keyboard.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_joystick.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_keycode.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_keyboard.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_loadso.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_keycode.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_locale.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_loadso.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_log.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_locale.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_main.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_log.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_messagebox.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_main.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_metal.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_messagebox.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_misc.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_metal.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_mouse.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_misc.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_mutex.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_mouse.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_name.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_mutex.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_opengl_glext.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_opengl.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_opengl.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_opengl_glext.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_opengles.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_opengles.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_opengles2_gl2.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_opengles2.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_opengles2_gl2ext.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_opengles2_gl2.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_opengles2_gl2platform.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_opengles2_gl2ext.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_opengles2_khrplatform.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_opengles2_gl2platform.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_opengles2.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_opengles2_khrplatform.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_pixels.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_pen.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_platform.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_pixels.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_power.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_platform.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_quit.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_platform_defines.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_rect.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_power.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_render.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_process.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_revision.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_properties.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_rwops.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_rect.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_scancode.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_render.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_sensor.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_revision.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_shape.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_iostream.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_stdinc.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_scancode.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_surface.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_sensor.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_system.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_stdinc.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_syswm.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_storage.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_thread.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_surface.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_timer.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_system.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_touch.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_test.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_types.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_test_assert.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_version.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_test_common.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_video.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_test_compare.h" />
|
||||||
<ClInclude Include="SDL\include\SDL_vulkan.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_test_crc32.h" />
|
||||||
<ClInclude Include="SDL\include\SDL.h" />
|
<ClInclude Include="SDL\include\SDL3\SDL_test_font.h" />
|
||||||
|
<ClInclude Include="SDL\include\SDL3\SDL_test_fuzzer.h" />
|
||||||
|
<ClInclude Include="SDL\include\SDL3\SDL_test_harness.h" />
|
||||||
|
<ClInclude Include="SDL\include\SDL3\SDL_test_log.h" />
|
||||||
|
<ClInclude Include="SDL\include\SDL3\SDL_test_md5.h" />
|
||||||
|
<ClInclude Include="SDL\include\SDL3\SDL_test_memory.h" />
|
||||||
|
<ClInclude Include="SDL\include\SDL3\SDL_thread.h" />
|
||||||
|
<ClInclude Include="SDL\include\SDL3\SDL_time.h" />
|
||||||
|
<ClInclude Include="SDL\include\SDL3\SDL_timer.h" />
|
||||||
|
<ClInclude Include="SDL\include\SDL3\SDL_touch.h" />
|
||||||
|
<ClInclude Include="SDL\include\SDL3\SDL_version.h" />
|
||||||
|
<ClInclude Include="SDL\include\SDL3\SDL_video.h" />
|
||||||
|
<ClInclude Include="SDL\include\SDL3\SDL_vulkan.h" />
|
||||||
<ClInclude Include="SDL\src\audio\directsound\SDL_directsound.h" />
|
<ClInclude Include="SDL\src\audio\directsound\SDL_directsound.h" />
|
||||||
<ClInclude Include="SDL\src\audio\disk\SDL_diskaudio.h" />
|
<ClInclude Include="SDL\src\audio\disk\SDL_diskaudio.h" />
|
||||||
<ClInclude Include="SDL\src\audio\dummy\SDL_dummyaudio.h" />
|
<ClInclude Include="SDL\src\audio\dummy\SDL_dummyaudio.h" />
|
||||||
<ClInclude Include="SDL\src\audio\SDL_audio_c.h" />
|
<ClInclude Include="SDL\src\audio\SDL_audio_c.h" />
|
||||||
<ClInclude Include="SDL\src\audio\SDL_audio_channel_converters.h" />
|
|
||||||
<ClInclude Include="SDL\src\audio\SDL_audio_resampler_filter.h" />
|
|
||||||
<ClInclude Include="SDL\src\audio\SDL_audiodev_c.h" />
|
<ClInclude Include="SDL\src\audio\SDL_audiodev_c.h" />
|
||||||
<ClInclude Include="SDL\src\audio\SDL_sysaudio.h" />
|
<ClInclude Include="SDL\src\audio\SDL_sysaudio.h" />
|
||||||
|
<ClInclude Include="SDL\src\audio\SDL_audioqueue.h" />
|
||||||
|
<ClInclude Include="SDL\src\audio\SDL_audioresample.h" />
|
||||||
<ClInclude Include="SDL\src\audio\SDL_wave.h" />
|
<ClInclude Include="SDL\src\audio\SDL_wave.h" />
|
||||||
<ClInclude Include="SDL\src\audio\wasapi\SDL_wasapi.h" />
|
<ClInclude Include="SDL\src\audio\wasapi\SDL_wasapi.h" />
|
||||||
<ClInclude Include="SDL\src\audio\winmm\SDL_winmm.h" />
|
<ClInclude Include="SDL\src\camera\SDL_camera_c.h" />
|
||||||
|
<ClInclude Include="SDL\src\camera\SDL_syscamera.h" />
|
||||||
<ClInclude Include="SDL\src\core\windows\SDL_directx.h" />
|
<ClInclude Include="SDL\src\core\windows\SDL_directx.h" />
|
||||||
|
<ClInclude Include="SDL\src\core\windows\SDL_gameinput.h" />
|
||||||
<ClInclude Include="SDL\src\core\windows\SDL_hid.h" />
|
<ClInclude Include="SDL\src\core\windows\SDL_hid.h" />
|
||||||
<ClInclude Include="SDL\src\core\windows\SDL_immdevice.h" />
|
<ClInclude Include="SDL\src\core\windows\SDL_immdevice.h" />
|
||||||
<ClInclude Include="SDL\src\core\windows\SDL_windows.h" />
|
<ClInclude Include="SDL\src\core\windows\SDL_windows.h" />
|
||||||
<ClInclude Include="SDL\src\core\windows\SDL_xinput.h" />
|
<ClInclude Include="SDL\src\core\windows\SDL_xinput.h" />
|
||||||
|
<ClInclude Include="SDL\src\cpuinfo\SDL_cpuinfo_c.h" />
|
||||||
|
<ClInclude Include="SDL\src\dynapi\SDL_dynapi.h" />
|
||||||
<ClInclude Include="SDL\src\dynapi\SDL_dynapi_overrides.h" />
|
<ClInclude Include="SDL\src\dynapi\SDL_dynapi_overrides.h" />
|
||||||
<ClInclude Include="SDL\src\dynapi\SDL_dynapi_procs.h" />
|
<ClInclude Include="SDL\src\dynapi\SDL_dynapi_procs.h" />
|
||||||
<ClInclude Include="SDL\src\dynapi\SDL_dynapi.h" />
|
<ClInclude Include="SDL\src\dynapi\SDL_dynapi_unsupported.h" />
|
||||||
<ClInclude Include="SDL\src\events\blank_cursor.h" />
|
<ClInclude Include="SDL\src\events\blank_cursor.h" />
|
||||||
<ClInclude Include="SDL\src\events\default_cursor.h" />
|
<ClInclude Include="SDL\src\events\default_cursor.h" />
|
||||||
<ClInclude Include="SDL\src\events\scancodes_ascii.h" />
|
|
||||||
<ClInclude Include="SDL\src\events\scancodes_windows.h" />
|
<ClInclude Include="SDL\src\events\scancodes_windows.h" />
|
||||||
|
<ClInclude Include="SDL\src\events\SDL_categories_c.h" />
|
||||||
<ClInclude Include="SDL\src\events\SDL_clipboardevents_c.h" />
|
<ClInclude Include="SDL\src\events\SDL_clipboardevents_c.h" />
|
||||||
<ClInclude Include="SDL\src\events\SDL_displayevents_c.h" />
|
<ClInclude Include="SDL\src\events\SDL_displayevents_c.h" />
|
||||||
<ClInclude Include="SDL\src\events\SDL_dropevents_c.h" />
|
<ClInclude Include="SDL\src\events\SDL_dropevents_c.h" />
|
||||||
<ClInclude Include="SDL\src\events\SDL_events_c.h" />
|
<ClInclude Include="SDL\src\events\SDL_events_c.h" />
|
||||||
<ClInclude Include="SDL\src\events\SDL_gesture_c.h" />
|
<ClInclude Include="SDL\src\events\SDL_eventwatch_c.h" />
|
||||||
<ClInclude Include="SDL\src\events\SDL_keyboard_c.h" />
|
<ClInclude Include="SDL\src\events\SDL_keyboard_c.h" />
|
||||||
<ClInclude Include="SDL\src\events\SDL_log.h" />
|
<ClInclude Include="SDL\src\events\SDL_keymap_c.h" />
|
||||||
<ClInclude Include="SDL\src\events\SDL_mouse_c.h" />
|
<ClInclude Include="SDL\src\events\SDL_mouse_c.h" />
|
||||||
<ClInclude Include="SDL\src\events\SDL_touch_c.h" />
|
<ClInclude Include="SDL\src\events\SDL_touch_c.h" />
|
||||||
<ClInclude Include="SDL\src\events\SDL_windowevents_c.h" />
|
<ClInclude Include="SDL\src\events\SDL_windowevents_c.h" />
|
||||||
|
<ClInclude Include="SDL\src\filesystem\SDL_sysfilesystem.h" />
|
||||||
|
<ClInclude Include="SDL\src\gpu\SDL_sysgpu.h" />
|
||||||
|
<ClInclude Include="SDL\src\gpu\vulkan\SDL_gpu_vulkan_vkfuncs.h" />
|
||||||
|
<ClInclude Include="SDL\src\io\SDL_asyncio_c.h" />
|
||||||
|
<ClInclude Include="SDL\src\io\SDL_sysasyncio.h" />
|
||||||
<ClInclude Include="SDL\src\haptic\SDL_haptic_c.h" />
|
<ClInclude Include="SDL\src\haptic\SDL_haptic_c.h" />
|
||||||
<ClInclude Include="SDL\src\haptic\SDL_syshaptic.h" />
|
<ClInclude Include="SDL\src\haptic\SDL_syshaptic.h" />
|
||||||
<ClInclude Include="SDL\src\haptic\windows\SDL_dinputhaptic_c.h" />
|
<ClInclude Include="SDL\src\haptic\windows\SDL_dinputhaptic_c.h" />
|
||||||
<ClInclude Include="SDL\src\haptic\windows\SDL_windowshaptic_c.h" />
|
<ClInclude Include="SDL\src\haptic\windows\SDL_windowshaptic_c.h" />
|
||||||
<ClInclude Include="SDL\src\haptic\windows\SDL_xinputhaptic_c.h" />
|
|
||||||
<ClInclude Include="SDL\src\hidapi\hidapi\hidapi.h" />
|
<ClInclude Include="SDL\src\hidapi\hidapi\hidapi.h" />
|
||||||
<ClInclude Include="SDL\src\hidapi\SDL_hidapi_c.h" />
|
<ClInclude Include="SDL\src\hidapi\SDL_hidapi_c.h" />
|
||||||
<ClInclude Include="SDL\src\joystick\controller_type.h" />
|
<ClInclude Include="SDL\src\joystick\controller_type.h" />
|
||||||
<ClInclude Include="SDL\src\joystick\hidapi\steam\controller_constants.h" />
|
|
||||||
<ClInclude Include="SDL\src\joystick\hidapi\steam\controller_structs.h" />
|
|
||||||
<ClInclude Include="SDL\src\joystick\hidapi\SDL_hidapi_nintendo.h" />
|
|
||||||
<ClInclude Include="SDL\src\joystick\hidapi\SDL_hidapi_rumble.h" />
|
|
||||||
<ClInclude Include="SDL\src\joystick\hidapi\SDL_hidapijoystick_c.h" />
|
<ClInclude Include="SDL\src\joystick\hidapi\SDL_hidapijoystick_c.h" />
|
||||||
<ClInclude Include="SDL\src\joystick\steam\SDL_steamcontroller.h" />
|
<ClInclude Include="SDL\src\joystick\hidapi\SDL_hidapi_rumble.h" />
|
||||||
<ClInclude Include="SDL\src\joystick\SDL_gamecontrollerdb.h" />
|
<ClInclude Include="SDL\src\joystick\SDL_gamepad_c.h" />
|
||||||
|
<ClInclude Include="SDL\src\joystick\SDL_gamepad_db.h" />
|
||||||
<ClInclude Include="SDL\src\joystick\SDL_joystick_c.h" />
|
<ClInclude Include="SDL\src\joystick\SDL_joystick_c.h" />
|
||||||
<ClInclude Include="SDL\src\joystick\SDL_steam_virtual_gamepad.h" />
|
<ClInclude Include="SDL\src\joystick\SDL_steam_virtual_gamepad.h" />
|
||||||
<ClInclude Include="SDL\src\joystick\SDL_sysjoystick.h" />
|
<ClInclude Include="SDL\src\joystick\SDL_sysjoystick.h" />
|
||||||
<ClInclude Include="SDL\src\joystick\controller_list.h" />
|
|
||||||
<ClInclude Include="SDL\src\joystick\usb_ids.h" />
|
<ClInclude Include="SDL\src\joystick\usb_ids.h" />
|
||||||
<ClInclude Include="SDL\src\joystick\virtual\SDL_virtualjoystick_c.h" />
|
<ClInclude Include="SDL\src\joystick\virtual\SDL_virtualjoystick_c.h" />
|
||||||
<ClInclude Include="SDL\src\joystick\windows\SDL_dinputjoystick_c.h" />
|
<ClInclude Include="SDL\src\joystick\windows\SDL_dinputjoystick_c.h" />
|
||||||
<ClInclude Include="SDL\src\joystick\windows\SDL_rawinputjoystick_c.h" />
|
<ClInclude Include="SDL\src\joystick\windows\SDL_rawinputjoystick_c.h" />
|
||||||
<ClInclude Include="SDL\src\joystick\windows\SDL_windowsjoystick_c.h" />
|
<ClInclude Include="SDL\src\joystick\windows\SDL_windowsjoystick_c.h" />
|
||||||
<ClInclude Include="SDL\src\joystick\windows\SDL_xinputjoystick_c.h" />
|
<ClInclude Include="SDL\src\joystick\windows\SDL_xinputjoystick_c.h" />
|
||||||
|
<ClInclude Include="SDL\src\libm\math_libm.h" />
|
||||||
|
<ClInclude Include="SDL\src\libm\math_private.h" />
|
||||||
<ClInclude Include="SDL\src\locale\SDL_syslocale.h" />
|
<ClInclude Include="SDL\src\locale\SDL_syslocale.h" />
|
||||||
|
<ClInclude Include="SDL\src\main\SDL_main_callbacks.h" />
|
||||||
<ClInclude Include="SDL\src\misc\SDL_sysurl.h" />
|
<ClInclude Include="SDL\src\misc\SDL_sysurl.h" />
|
||||||
<ClInclude Include="SDL\src\power\SDL_syspower.h" />
|
<ClInclude Include="SDL\src\power\SDL_syspower.h" />
|
||||||
<ClInclude Include="SDL\src\render\direct3d\SDL_shaders_d3d.h" />
|
|
||||||
<ClInclude Include="SDL\src\render\direct3d11\SDL_shaders_d3d11.h" />
|
<ClInclude Include="SDL\src\render\direct3d11\SDL_shaders_d3d11.h" />
|
||||||
<ClInclude Include="SDL\src\render\direct3d12\SDL_render_d3d12_xbox.h" />
|
|
||||||
<ClInclude Include="SDL\src\render\direct3d12\SDL_shaders_d3d12.h" />
|
<ClInclude Include="SDL\src\render\direct3d12\SDL_shaders_d3d12.h" />
|
||||||
<ClInclude Include="SDL\src\render\opengl\SDL_glfuncs.h" />
|
<ClInclude Include="SDL\src\render\direct3d\SDL_shaders_d3d.h" />
|
||||||
<ClInclude Include="SDL\src\render\opengl\SDL_shaders_gl.h" />
|
|
||||||
<ClInclude Include="SDL\src\render\opengles2\SDL_gles2funcs.h" />
|
<ClInclude Include="SDL\src\render\opengles2\SDL_gles2funcs.h" />
|
||||||
<ClInclude Include="SDL\src\render\opengles2\SDL_shaders_gles2.h" />
|
<ClInclude Include="SDL\src\render\opengles2\SDL_shaders_gles2.h" />
|
||||||
|
<ClInclude Include="SDL\src\render\opengl\SDL_glfuncs.h" />
|
||||||
|
<ClInclude Include="SDL\src\render\opengl\SDL_shaders_gl.h" />
|
||||||
<ClInclude Include="SDL\src\render\SDL_d3dmath.h" />
|
<ClInclude Include="SDL\src\render\SDL_d3dmath.h" />
|
||||||
<ClInclude Include="SDL\src\render\SDL_sysrender.h" />
|
<ClInclude Include="SDL\src\render\SDL_sysrender.h" />
|
||||||
<ClInclude Include="SDL\src\render\SDL_yuv_sw_c.h" />
|
<ClInclude Include="SDL\src\render\SDL_yuv_sw_c.h" />
|
||||||
@ -170,38 +188,54 @@
|
|||||||
<ClInclude Include="SDL\src\render\software\SDL_render_sw_c.h" />
|
<ClInclude Include="SDL\src\render\software\SDL_render_sw_c.h" />
|
||||||
<ClInclude Include="SDL\src\render\software\SDL_rotate.h" />
|
<ClInclude Include="SDL\src\render\software\SDL_rotate.h" />
|
||||||
<ClInclude Include="SDL\src\render\software\SDL_triangle.h" />
|
<ClInclude Include="SDL\src\render\software\SDL_triangle.h" />
|
||||||
|
<ClInclude Include="SDL\src\render\vulkan\SDL_shaders_vulkan.h" />
|
||||||
<ClInclude Include="SDL\src\SDL_assert_c.h" />
|
<ClInclude Include="SDL\src\SDL_assert_c.h" />
|
||||||
<ClInclude Include="SDL\src\SDL_dataqueue.h" />
|
|
||||||
<ClInclude Include="SDL\src\SDL_error_c.h" />
|
<ClInclude Include="SDL\src\SDL_error_c.h" />
|
||||||
|
<ClCompile Include="SDL\src\camera\dummy\SDL_camera_dummy.c" />
|
||||||
|
<ClCompile Include="SDL\src\camera\mediafoundation\SDL_camera_mediafoundation.c" />
|
||||||
|
<ClCompile Include="SDL\src\camera\SDL_camera.c" />
|
||||||
|
<ClCompile Include="SDL\src\dialog\SDL_dialog.c" />
|
||||||
|
<ClCompile Include="SDL\src\dialog\SDL_dialog_utils.c" />
|
||||||
|
<ClCompile Include="SDL\src\filesystem\SDL_filesystem.c" />
|
||||||
|
<ClCompile Include="SDL\src\filesystem\windows\SDL_sysfsops.c" />
|
||||||
|
<ClCompile Include="SDL\src\io\windows\SDL_asyncio_windows_ioring.c" />
|
||||||
|
<ClCompile Include="SDL\src\gpu\SDL_gpu.c" />
|
||||||
|
<ClCompile Include="SDL\src\gpu\d3d12\SDL_gpu_d3d12.c" />
|
||||||
|
<ClCompile Include="SDL\src\gpu\vulkan\SDL_gpu_vulkan.c" />
|
||||||
|
<ClCompile Include="SDL\src\io\generic\SDL_asyncio_generic.c" />
|
||||||
|
<ClCompile Include="SDL\src\io\SDL_asyncio.c" />
|
||||||
|
<ClCompile Include="SDL\src\main\generic\SDL_sysmain_callbacks.c" />
|
||||||
|
<ClCompile Include="SDL\src\main\SDL_main_callbacks.c" />
|
||||||
|
<ClCompile Include="SDL\src\main\SDL_runapp.c" />
|
||||||
|
<ClCompile Include="SDL\src\main\windows\SDL_sysmain_runapp.c" />
|
||||||
|
<ClCompile Include="SDL\src\render\vulkan\SDL_render_vulkan.c" />
|
||||||
|
<ClCompile Include="SDL\src\render\vulkan\SDL_shaders_vulkan.c" />
|
||||||
|
<ClCompile Include="SDL\src\SDL_guid.c" />
|
||||||
|
<ClInclude Include="SDL\src\SDL_hashtable.h" />
|
||||||
<ClInclude Include="SDL\src\SDL_hints_c.h" />
|
<ClInclude Include="SDL\src\SDL_hints_c.h" />
|
||||||
<ClInclude Include="SDL\src\SDL_internal.h" />
|
<ClInclude Include="SDL\src\SDL_internal.h" />
|
||||||
<ClInclude Include="SDL\src\SDL_list.h" />
|
<ClInclude Include="SDL\src\SDL_list.h" />
|
||||||
<ClInclude Include="SDL\src\SDL_utils_c.h" />
|
<ClInclude Include="SDL\src\SDL_log_c.h" />
|
||||||
|
<ClInclude Include="SDL\src\SDL_properties_c.h" />
|
||||||
<ClInclude Include="SDL\src\sensor\dummy\SDL_dummysensor.h" />
|
<ClInclude Include="SDL\src\sensor\dummy\SDL_dummysensor.h" />
|
||||||
<ClInclude Include="SDL\src\sensor\SDL_sensor_c.h" />
|
<ClInclude Include="SDL\src\sensor\SDL_sensor_c.h" />
|
||||||
<ClInclude Include="SDL\src\sensor\SDL_syssensor.h" />
|
<ClInclude Include="SDL\src\sensor\SDL_syssensor.h" />
|
||||||
<ClInclude Include="SDL\src\sensor\windows\SDL_windowssensor.h" />
|
<ClInclude Include="SDL\src\sensor\windows\SDL_windowssensor.h" />
|
||||||
<ClInclude Include="SDL\src\stdlib\SDL_vacopy.h" />
|
|
||||||
<ClInclude Include="SDL\src\thread\generic\SDL_syscond_c.h" />
|
|
||||||
<ClInclude Include="SDL\src\thread\SDL_systhread.h" />
|
<ClInclude Include="SDL\src\thread\SDL_systhread.h" />
|
||||||
<ClInclude Include="SDL\src\thread\SDL_thread_c.h" />
|
<ClInclude Include="SDL\src\thread\SDL_thread_c.h" />
|
||||||
|
<ClInclude Include="SDL\src\thread\generic\SDL_syscond_c.h" />
|
||||||
<ClInclude Include="SDL\src\thread\windows\SDL_sysmutex_c.h" />
|
<ClInclude Include="SDL\src\thread\windows\SDL_sysmutex_c.h" />
|
||||||
|
<ClInclude Include="SDL\src\thread\generic\SDL_sysrwlock_c.h" />
|
||||||
<ClInclude Include="SDL\src\thread\windows\SDL_systhread_c.h" />
|
<ClInclude Include="SDL\src\thread\windows\SDL_systhread_c.h" />
|
||||||
<ClInclude Include="SDL\src\timer\SDL_timer_c.h" />
|
<ClInclude Include="SDL\src\timer\SDL_timer_c.h" />
|
||||||
<ClInclude Include="SDL\src\video\dummy\SDL_nullevents_c.h" />
|
<ClInclude Include="SDL\src\video\dummy\SDL_nullevents_c.h" />
|
||||||
<ClInclude Include="SDL\src\video\dummy\SDL_nullframebuffer_c.h" />
|
<ClInclude Include="SDL\src\video\dummy\SDL_nullframebuffer_c.h" />
|
||||||
<ClInclude Include="SDL\src\video\dummy\SDL_nullvideo.h" />
|
<ClInclude Include="SDL\src\video\dummy\SDL_nullvideo.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vk_video\vulkan_video_codec_h264std.h" />
|
|
||||||
<ClInclude Include="SDL\src\video\khronos\vk_video\vulkan_video_codec_h264std_decode.h" />
|
|
||||||
<ClInclude Include="SDL\src\video\khronos\vk_video\vulkan_video_codec_h264std_encode.h" />
|
|
||||||
<ClInclude Include="SDL\src\video\khronos\vk_video\vulkan_video_codec_h265std.h" />
|
|
||||||
<ClInclude Include="SDL\src\video\khronos\vk_video\vulkan_video_codec_h265std_decode.h" />
|
|
||||||
<ClInclude Include="SDL\src\video\khronos\vk_video\vulkan_video_codec_h265std_encode.h" />
|
|
||||||
<ClInclude Include="SDL\src\video\khronos\vk_video\vulkan_video_codecs_common.h" />
|
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vk_icd.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vk_icd.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vk_layer.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vk_layer.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vk_platform.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vk_platform.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vk_sdk_platform.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vk_sdk_platform.h" />
|
||||||
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_android.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_android.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_beta.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_beta.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_core.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_core.h" />
|
||||||
@ -211,38 +245,45 @@
|
|||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_ios.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_ios.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_macos.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_macos.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_metal.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_metal.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_screen.h" />
|
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_vi.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_vi.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_wayland.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_wayland.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_win32.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_win32.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_xcb.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_xcb.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_xlib_xrandr.h" />
|
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_xlib.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_xlib.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan.h" />
|
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan_xlib_xrandr.h" />
|
||||||
<ClInclude Include="SDL\src\video\khronos\vulkan\vulkan.hpp" />
|
<ClInclude Include="SDL\src\video\offscreen\SDL_offscreenevents_c.h" />
|
||||||
|
<ClInclude Include="SDL\src\video\offscreen\SDL_offscreenframebuffer_c.h" />
|
||||||
|
<ClInclude Include="SDL\src\video\offscreen\SDL_offscreenopengles.h" />
|
||||||
|
<ClInclude Include="SDL\src\video\offscreen\SDL_offscreenvideo.h" />
|
||||||
|
<ClInclude Include="SDL\src\video\offscreen\SDL_offscreenvulkan.h" />
|
||||||
|
<ClInclude Include="SDL\src\video\offscreen\SDL_offscreenwindow.h" />
|
||||||
|
<ClInclude Include="SDL\src\video\SDL_blit.h" />
|
||||||
<ClInclude Include="SDL\src\video\SDL_blit_auto.h" />
|
<ClInclude Include="SDL\src\video\SDL_blit_auto.h" />
|
||||||
<ClInclude Include="SDL\src\video\SDL_blit_copy.h" />
|
<ClInclude Include="SDL\src\video\SDL_blit_copy.h" />
|
||||||
<ClInclude Include="SDL\src\video\SDL_blit_slow.h" />
|
<ClInclude Include="SDL\src\video\SDL_blit_slow.h" />
|
||||||
<ClInclude Include="SDL\src\video\SDL_blit.h" />
|
<ClInclude Include="SDL\src\video\SDL_clipboard_c.h" />
|
||||||
<ClInclude Include="SDL\src\video\SDL_egl_c.h" />
|
<ClInclude Include="SDL\src\video\SDL_egl_c.h" />
|
||||||
<ClInclude Include="SDL\src\video\SDL_pixels_c.h" />
|
<ClInclude Include="SDL\src\video\SDL_pixels_c.h" />
|
||||||
<ClInclude Include="SDL\src\video\SDL_rect_c.h" />
|
<ClInclude Include="SDL\src\video\SDL_rect_c.h" />
|
||||||
<ClInclude Include="SDL\src\video\SDL_RLEaccel_c.h" />
|
<ClInclude Include="SDL\src\video\SDL_RLEaccel_c.h" />
|
||||||
<ClInclude Include="SDL\src\video\SDL_shape_internals.h" />
|
<ClInclude Include="SDL\src\video\SDL_stb_c.h" />
|
||||||
|
<ClInclude Include="SDL\src\video\SDL_surface_c.h" />
|
||||||
<ClInclude Include="SDL\src\video\SDL_sysvideo.h" />
|
<ClInclude Include="SDL\src\video\SDL_sysvideo.h" />
|
||||||
<ClInclude Include="SDL\src\video\SDL_vulkan_internal.h" />
|
<ClInclude Include="SDL\src\video\SDL_vulkan_internal.h" />
|
||||||
<ClInclude Include="SDL\src\video\SDL_yuv_c.h" />
|
<ClInclude Include="SDL\src\video\SDL_yuv_c.h" />
|
||||||
<ClInclude Include="SDL\src\video\windows\SDL_msctf.h" />
|
<ClInclude Include="SDL\src\video\windows\SDL_msctf.h" />
|
||||||
<ClInclude Include="SDL\src\video\windows\SDL_vkeys.h" />
|
<ClInclude Include="SDL\src\video\windows\SDL_surface_utils.h" />
|
||||||
<ClInclude Include="SDL\src\video\windows\SDL_windowsclipboard.h" />
|
<ClInclude Include="SDL\src\video\windows\SDL_windowsclipboard.h" />
|
||||||
<ClInclude Include="SDL\src\video\windows\SDL_windowsevents.h" />
|
<ClInclude Include="SDL\src\video\windows\SDL_windowsevents.h" />
|
||||||
<ClInclude Include="SDL\src\video\windows\SDL_windowsframebuffer.h" />
|
<ClInclude Include="SDL\src\video\windows\SDL_windowsframebuffer.h" />
|
||||||
<ClInclude Include="SDL\src\video\windows\SDL_windowskeyboard.h" />
|
<ClInclude Include="SDL\src\video\windows\SDL_windowskeyboard.h" />
|
||||||
|
<ClInclude Include="SDL\src\video\windows\SDL_windowsgameinput.h" />
|
||||||
<ClInclude Include="SDL\src\video\windows\SDL_windowsmessagebox.h" />
|
<ClInclude Include="SDL\src\video\windows\SDL_windowsmessagebox.h" />
|
||||||
<ClInclude Include="SDL\src\video\windows\SDL_windowsmodes.h" />
|
<ClInclude Include="SDL\src\video\windows\SDL_windowsmodes.h" />
|
||||||
<ClInclude Include="SDL\src\video\windows\SDL_windowsmouse.h" />
|
<ClInclude Include="SDL\src\video\windows\SDL_windowsmouse.h" />
|
||||||
<ClInclude Include="SDL\src\video\windows\SDL_windowsopengl.h" />
|
<ClInclude Include="SDL\src\video\windows\SDL_windowsopengl.h" />
|
||||||
<ClInclude Include="SDL\src\video\windows\SDL_windowsopengles.h" />
|
<ClInclude Include="SDL\src\video\windows\SDL_windowsopengles.h" />
|
||||||
|
<ClInclude Include="SDL\src\video\windows\SDL_windowsrawinput.h" />
|
||||||
<ClInclude Include="SDL\src\video\windows\SDL_windowsshape.h" />
|
<ClInclude Include="SDL\src\video\windows\SDL_windowsshape.h" />
|
||||||
<ClInclude Include="SDL\src\video\windows\SDL_windowsvideo.h" />
|
<ClInclude Include="SDL\src\video\windows\SDL_windowsvideo.h" />
|
||||||
<ClInclude Include="SDL\src\video\windows\SDL_windowsvulkan.h" />
|
<ClInclude Include="SDL\src\video\windows\SDL_windowsvulkan.h" />
|
||||||
@ -257,8 +298,6 @@
|
|||||||
<ClInclude Include="SDL\src\video\yuv2rgb\yuv_rgb_sse_func.h" />
|
<ClInclude Include="SDL\src\video\yuv2rgb\yuv_rgb_sse_func.h" />
|
||||||
<ClInclude Include="SDL\src\video\yuv2rgb\yuv_rgb_std.h" />
|
<ClInclude Include="SDL\src\video\yuv2rgb\yuv_rgb_std.h" />
|
||||||
<ClInclude Include="SDL\src\video\yuv2rgb\yuv_rgb_std_func.h" />
|
<ClInclude Include="SDL\src\video\yuv2rgb\yuv_rgb_std_func.h" />
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="SDL\src\atomic\SDL_atomic.c" />
|
<ClCompile Include="SDL\src\atomic\SDL_atomic.c" />
|
||||||
<ClCompile Include="SDL\src\atomic\SDL_spinlock.c" />
|
<ClCompile Include="SDL\src\atomic\SDL_spinlock.c" />
|
||||||
<ClCompile Include="SDL\src\audio\directsound\SDL_directsound.c" />
|
<ClCompile Include="SDL\src\audio\directsound\SDL_directsound.c" />
|
||||||
@ -268,37 +307,49 @@
|
|||||||
<ClCompile Include="SDL\src\audio\SDL_audiocvt.c" />
|
<ClCompile Include="SDL\src\audio\SDL_audiocvt.c" />
|
||||||
<ClCompile Include="SDL\src\audio\SDL_audiodev.c" />
|
<ClCompile Include="SDL\src\audio\SDL_audiodev.c" />
|
||||||
<ClCompile Include="SDL\src\audio\SDL_audiotypecvt.c" />
|
<ClCompile Include="SDL\src\audio\SDL_audiotypecvt.c" />
|
||||||
|
<ClCompile Include="SDL\src\audio\SDL_audioqueue.c" />
|
||||||
|
<ClCompile Include="SDL\src\audio\SDL_audioresample.c" />
|
||||||
<ClCompile Include="SDL\src\audio\SDL_mixer.c" />
|
<ClCompile Include="SDL\src\audio\SDL_mixer.c" />
|
||||||
<ClCompile Include="SDL\src\audio\SDL_wave.c" />
|
<ClCompile Include="SDL\src\audio\SDL_wave.c" />
|
||||||
<ClCompile Include="SDL\src\audio\wasapi\SDL_wasapi_win32.c" />
|
|
||||||
<ClCompile Include="SDL\src\audio\wasapi\SDL_wasapi.c" />
|
<ClCompile Include="SDL\src\audio\wasapi\SDL_wasapi.c" />
|
||||||
<ClCompile Include="SDL\src\audio\winmm\SDL_winmm.c" />
|
<ClCompile Include="SDL\src\core\SDL_core_unsupported.c" />
|
||||||
|
<ClCompile Include="SDL\src\core\windows\SDL_gameinput.c" />
|
||||||
<ClCompile Include="SDL\src\core\windows\SDL_hid.c" />
|
<ClCompile Include="SDL\src\core\windows\SDL_hid.c" />
|
||||||
<ClCompile Include="SDL\src\core\windows\SDL_immdevice.c" />
|
<ClCompile Include="SDL\src\core\windows\SDL_immdevice.c" />
|
||||||
<ClCompile Include="SDL\src\core\windows\SDL_windows.c" />
|
<ClCompile Include="SDL\src\core\windows\SDL_windows.c" />
|
||||||
<ClCompile Include="SDL\src\core\windows\SDL_xinput.c" />
|
<ClCompile Include="SDL\src\core\windows\SDL_xinput.c" />
|
||||||
<ClCompile Include="SDL\src\cpuinfo\SDL_cpuinfo.c" />
|
<ClCompile Include="SDL\src\cpuinfo\SDL_cpuinfo.c" />
|
||||||
<ClCompile Include="SDL\src\dynapi\SDL_dynapi.c" />
|
<ClCompile Include="SDL\src\dialog\windows\SDL_windowsdialog.c" />
|
||||||
|
<ClCompile Include="SDL\src\dynapi\SDL_dynapi.c">
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="SDL\src\events\SDL_categories.c" />
|
||||||
<ClCompile Include="SDL\src\events\SDL_clipboardevents.c" />
|
<ClCompile Include="SDL\src\events\SDL_clipboardevents.c" />
|
||||||
<ClCompile Include="SDL\src\events\SDL_displayevents.c" />
|
<ClCompile Include="SDL\src\events\SDL_displayevents.c" />
|
||||||
<ClCompile Include="SDL\src\events\SDL_dropevents.c" />
|
<ClCompile Include="SDL\src\events\SDL_dropevents.c" />
|
||||||
<ClCompile Include="SDL\src\events\SDL_events.c" />
|
<ClCompile Include="SDL\src\events\SDL_events.c" />
|
||||||
<ClCompile Include="SDL\src\events\SDL_gesture.c" />
|
<ClCompile Include="SDL\src\events\SDL_eventwatch.c" />
|
||||||
<ClCompile Include="SDL\src\events\SDL_keyboard.c" />
|
<ClCompile Include="SDL\src\events\SDL_keyboard.c" />
|
||||||
|
<ClCompile Include="SDL\src\events\SDL_keymap.c" />
|
||||||
<ClCompile Include="SDL\src\events\SDL_mouse.c" />
|
<ClCompile Include="SDL\src\events\SDL_mouse.c" />
|
||||||
|
<ClCompile Include="SDL\src\events\SDL_pen.c" />
|
||||||
<ClCompile Include="SDL\src\events\SDL_quit.c" />
|
<ClCompile Include="SDL\src\events\SDL_quit.c" />
|
||||||
<ClCompile Include="SDL\src\events\SDL_touch.c" />
|
<ClCompile Include="SDL\src\events\SDL_touch.c" />
|
||||||
<ClCompile Include="SDL\src\events\SDL_windowevents.c" />
|
<ClCompile Include="SDL\src\events\SDL_windowevents.c" />
|
||||||
<ClCompile Include="SDL\src\file\SDL_rwops.c" />
|
<ClCompile Include="SDL\src\io\SDL_iostream.c" />
|
||||||
<ClCompile Include="SDL\src\filesystem\windows\SDL_sysfilesystem.c" />
|
<ClCompile Include="SDL\src\filesystem\windows\SDL_sysfilesystem.c" />
|
||||||
<ClCompile Include="SDL\src\haptic\dummy\SDL_syshaptic.c" />
|
<ClCompile Include="SDL\src\haptic\dummy\SDL_syshaptic.c" />
|
||||||
<ClCompile Include="SDL\src\haptic\SDL_haptic.c" />
|
<ClCompile Include="SDL\src\haptic\SDL_haptic.c" />
|
||||||
<ClCompile Include="SDL\src\haptic\windows\SDL_dinputhaptic.c" />
|
<ClCompile Include="SDL\src\haptic\windows\SDL_dinputhaptic.c" />
|
||||||
<ClCompile Include="SDL\src\haptic\windows\SDL_windowshaptic.c" />
|
<ClCompile Include="SDL\src\haptic\windows\SDL_windowshaptic.c" />
|
||||||
<ClCompile Include="SDL\src\haptic\windows\SDL_xinputhaptic.c" />
|
|
||||||
<ClCompile Include="SDL\src\hidapi\SDL_hidapi.c" />
|
<ClCompile Include="SDL\src\hidapi\SDL_hidapi.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\controller_type.c" />
|
<ClCompile Include="SDL\src\joystick\controller_type.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\dummy\SDL_sysjoystick.c" />
|
<ClCompile Include="SDL\src\joystick\dummy\SDL_sysjoystick.c" />
|
||||||
|
<ClCompile Include="SDL\src\joystick\gdk\SDL_gameinputjoystick.c" />
|
||||||
|
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapijoystick.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_combined.c" />
|
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_combined.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_gamecube.c" />
|
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_gamecube.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_luna.c" />
|
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_luna.c" />
|
||||||
@ -309,23 +360,23 @@
|
|||||||
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_shield.c" />
|
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_shield.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_stadia.c" />
|
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_stadia.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_steam.c" />
|
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_steam.c" />
|
||||||
|
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_steam_hori.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_steamdeck.c" />
|
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_steamdeck.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_switch.c" />
|
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_switch.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_wii.c" />
|
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_wii.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_xbox360.c" />
|
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_xbox360.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_xbox360w.c" />
|
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_xbox360w.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_xboxone.c" />
|
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapi_xboxone.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\hidapi\SDL_hidapijoystick.c" />
|
<ClCompile Include="SDL\src\joystick\SDL_gamepad.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\steam\SDL_steamcontroller.c" />
|
|
||||||
<ClCompile Include="SDL\src\joystick\SDL_gamecontroller.c" />
|
|
||||||
<ClCompile Include="SDL\src\joystick\SDL_joystick.c" />
|
<ClCompile Include="SDL\src\joystick\SDL_joystick.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\SDL_steam_virtual_gamepad.c" />
|
<ClCompile Include="SDL\src\joystick\SDL_steam_virtual_gamepad.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\virtual\SDL_virtualjoystick.c" />
|
<ClCompile Include="SDL\src\joystick\virtual\SDL_virtualjoystick.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\windows\SDL_dinputjoystick.c" />
|
<ClCompile Include="SDL\src\joystick\windows\SDL_dinputjoystick.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\windows\SDL_rawinputjoystick.c" />
|
<ClCompile Include="SDL\src\joystick\windows\SDL_rawinputjoystick.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\windows\SDL_windows_gaming_input.c" />
|
|
||||||
<ClCompile Include="SDL\src\joystick\windows\SDL_windowsjoystick.c" />
|
<ClCompile Include="SDL\src\joystick\windows\SDL_windowsjoystick.c" />
|
||||||
|
<ClCompile Include="SDL\src\joystick\windows\SDL_windows_gaming_input.c" />
|
||||||
<ClCompile Include="SDL\src\joystick\windows\SDL_xinputjoystick.c" />
|
<ClCompile Include="SDL\src\joystick\windows\SDL_xinputjoystick.c" />
|
||||||
|
<ClCompile Include="SDL\src\libm\s_modf.c" />
|
||||||
<ClCompile Include="SDL\src\loadso\windows\SDL_sysloadso.c" />
|
<ClCompile Include="SDL\src\loadso\windows\SDL_sysloadso.c" />
|
||||||
<ClCompile Include="SDL\src\locale\SDL_locale.c" />
|
<ClCompile Include="SDL\src\locale\SDL_locale.c" />
|
||||||
<ClCompile Include="SDL\src\locale\windows\SDL_syslocale.c" />
|
<ClCompile Include="SDL\src\locale\windows\SDL_syslocale.c" />
|
||||||
@ -333,18 +384,24 @@
|
|||||||
<ClCompile Include="SDL\src\misc\windows\SDL_sysurl.c" />
|
<ClCompile Include="SDL\src\misc\windows\SDL_sysurl.c" />
|
||||||
<ClCompile Include="SDL\src\power\SDL_power.c" />
|
<ClCompile Include="SDL\src\power\SDL_power.c" />
|
||||||
<ClCompile Include="SDL\src\power\windows\SDL_syspower.c" />
|
<ClCompile Include="SDL\src\power\windows\SDL_syspower.c" />
|
||||||
<ClCompile Include="SDL\src\render\direct3d\SDL_render_d3d.c" />
|
<ClCompile Include="SDL\src\process\SDL_process.c" />
|
||||||
<ClCompile Include="SDL\src\render\direct3d\SDL_shaders_d3d.c" />
|
<ClCompile Include="SDL\src\process\windows\SDL_windowsprocess.c" />
|
||||||
<ClCompile Include="SDL\src\render\direct3d11\SDL_render_d3d11.c" />
|
|
||||||
<ClCompile Include="SDL\src\render\direct3d11\SDL_shaders_d3d11.c" />
|
<ClCompile Include="SDL\src\render\direct3d11\SDL_shaders_d3d11.c" />
|
||||||
<ClCompile Include="SDL\src\render\direct3d12\SDL_render_d3d12.c" />
|
<ClCompile Include="SDL\src\render\direct3d12\SDL_render_d3d12.c" />
|
||||||
<ClCompile Include="SDL\src\render\direct3d12\SDL_shaders_d3d12.c" />
|
<ClCompile Include="SDL\src\render\direct3d12\SDL_shaders_d3d12.c" />
|
||||||
|
<ClCompile Include="SDL\src\render\direct3d\SDL_render_d3d.c" />
|
||||||
|
<ClCompile Include="SDL\src\render\direct3d11\SDL_render_d3d11.c" />
|
||||||
|
<ClCompile Include="SDL\src\render\direct3d\SDL_shaders_d3d.c" />
|
||||||
|
<ClCompile Include="SDL\src\render\gpu\SDL_pipeline_gpu.c" />
|
||||||
|
<ClCompile Include="SDL\src\render\gpu\SDL_render_gpu.c" />
|
||||||
|
<ClCompile Include="SDL\src\render\gpu\SDL_shaders_gpu.c" />
|
||||||
<ClCompile Include="SDL\src\render\opengl\SDL_render_gl.c" />
|
<ClCompile Include="SDL\src\render\opengl\SDL_render_gl.c" />
|
||||||
<ClCompile Include="SDL\src\render\opengl\SDL_shaders_gl.c" />
|
<ClCompile Include="SDL\src\render\opengl\SDL_shaders_gl.c" />
|
||||||
<ClCompile Include="SDL\src\render\opengles2\SDL_render_gles2.c" />
|
<ClCompile Include="SDL\src\render\opengles2\SDL_render_gles2.c" />
|
||||||
<ClCompile Include="SDL\src\render\opengles2\SDL_shaders_gles2.c" />
|
<ClCompile Include="SDL\src\render\opengles2\SDL_shaders_gles2.c" />
|
||||||
<ClCompile Include="SDL\src\render\SDL_d3dmath.c" />
|
<ClCompile Include="SDL\src\render\SDL_d3dmath.c" />
|
||||||
<ClCompile Include="SDL\src\render\SDL_render.c" />
|
<ClCompile Include="SDL\src\render\SDL_render.c" />
|
||||||
|
<ClCompile Include="SDL\src\render\SDL_render_unsupported.c" />
|
||||||
<ClCompile Include="SDL\src\render\SDL_yuv_sw.c" />
|
<ClCompile Include="SDL\src\render\SDL_yuv_sw.c" />
|
||||||
<ClCompile Include="SDL\src\render\software\SDL_blendfillrect.c" />
|
<ClCompile Include="SDL\src\render\software\SDL_blendfillrect.c" />
|
||||||
<ClCompile Include="SDL\src\render\software\SDL_blendline.c" />
|
<ClCompile Include="SDL\src\render\software\SDL_blendline.c" />
|
||||||
@ -354,15 +411,15 @@
|
|||||||
<ClCompile Include="SDL\src\render\software\SDL_render_sw.c" />
|
<ClCompile Include="SDL\src\render\software\SDL_render_sw.c" />
|
||||||
<ClCompile Include="SDL\src\render\software\SDL_rotate.c" />
|
<ClCompile Include="SDL\src\render\software\SDL_rotate.c" />
|
||||||
<ClCompile Include="SDL\src\render\software\SDL_triangle.c" />
|
<ClCompile Include="SDL\src\render\software\SDL_triangle.c" />
|
||||||
|
<ClCompile Include="SDL\src\SDL.c" />
|
||||||
<ClCompile Include="SDL\src\SDL_assert.c" />
|
<ClCompile Include="SDL\src\SDL_assert.c" />
|
||||||
<ClCompile Include="SDL\src\SDL_dataqueue.c" />
|
|
||||||
<ClCompile Include="SDL\src\SDL_error.c" />
|
<ClCompile Include="SDL\src\SDL_error.c" />
|
||||||
<ClCompile Include="SDL\src\SDL_guid.c" />
|
<ClCompile Include="SDL\src\SDL_hashtable.c" />
|
||||||
<ClCompile Include="SDL\src\SDL_hints.c" />
|
<ClCompile Include="SDL\src\SDL_hints.c" />
|
||||||
<ClCompile Include="SDL\src\SDL_list.c" />
|
<ClCompile Include="SDL\src\SDL_list.c" />
|
||||||
<ClCompile Include="SDL\src\SDL_log.c" />
|
<ClCompile Include="SDL\src\SDL_log.c" />
|
||||||
|
<ClCompile Include="SDL\src\SDL_properties.c" />
|
||||||
<ClCompile Include="SDL\src\SDL_utils.c" />
|
<ClCompile Include="SDL\src\SDL_utils.c" />
|
||||||
<ClCompile Include="SDL\src\SDL.c" />
|
|
||||||
<ClCompile Include="SDL\src\sensor\dummy\SDL_dummysensor.c" />
|
<ClCompile Include="SDL\src\sensor\dummy\SDL_dummysensor.c" />
|
||||||
<ClCompile Include="SDL\src\sensor\SDL_sensor.c" />
|
<ClCompile Include="SDL\src\sensor\SDL_sensor.c" />
|
||||||
<ClCompile Include="SDL\src\sensor\windows\SDL_windowssensor.c" />
|
<ClCompile Include="SDL\src\sensor\windows\SDL_windowssensor.c" />
|
||||||
@ -371,23 +428,44 @@
|
|||||||
<ClCompile Include="SDL\src\stdlib\SDL_getenv.c" />
|
<ClCompile Include="SDL\src\stdlib\SDL_getenv.c" />
|
||||||
<ClCompile Include="SDL\src\stdlib\SDL_iconv.c" />
|
<ClCompile Include="SDL\src\stdlib\SDL_iconv.c" />
|
||||||
<ClCompile Include="SDL\src\stdlib\SDL_malloc.c" />
|
<ClCompile Include="SDL\src\stdlib\SDL_malloc.c" />
|
||||||
|
<ClCompile Include="SDL\src\stdlib\SDL_memcpy.c" />
|
||||||
|
<ClCompile Include="SDL\src\stdlib\SDL_memmove.c" />
|
||||||
|
<ClCompile Include="SDL\src\stdlib\SDL_memset.c" />
|
||||||
<ClCompile Include="SDL\src\stdlib\SDL_mslibc.c" />
|
<ClCompile Include="SDL\src\stdlib\SDL_mslibc.c" />
|
||||||
|
<ClCompile Include="SDL\src\stdlib\SDL_murmur3.c" />
|
||||||
<ClCompile Include="SDL\src\stdlib\SDL_qsort.c" />
|
<ClCompile Include="SDL\src\stdlib\SDL_qsort.c" />
|
||||||
|
<ClCompile Include="SDL\src\stdlib\SDL_random.c" />
|
||||||
<ClCompile Include="SDL\src\stdlib\SDL_stdlib.c" />
|
<ClCompile Include="SDL\src\stdlib\SDL_stdlib.c" />
|
||||||
<ClCompile Include="SDL\src\stdlib\SDL_string.c" />
|
<ClCompile Include="SDL\src\stdlib\SDL_string.c" />
|
||||||
<ClCompile Include="SDL\src\stdlib\SDL_strtokr.c" />
|
<ClCompile Include="SDL\src\stdlib\SDL_strtokr.c" />
|
||||||
|
<ClCompile Include="SDL\src\storage\generic\SDL_genericstorage.c" />
|
||||||
|
<ClCompile Include="SDL\src\storage\steam\SDL_steamstorage.c" />
|
||||||
|
<ClCompile Include="SDL\src\storage\SDL_storage.c" />
|
||||||
<ClCompile Include="SDL\src\thread\generic\SDL_syscond.c" />
|
<ClCompile Include="SDL\src\thread\generic\SDL_syscond.c" />
|
||||||
|
<ClCompile Include="SDL\src\thread\generic\SDL_sysrwlock.c" />
|
||||||
<ClCompile Include="SDL\src\thread\SDL_thread.c" />
|
<ClCompile Include="SDL\src\thread\SDL_thread.c" />
|
||||||
<ClCompile Include="SDL\src\thread\windows\SDL_syscond_cv.c" />
|
<ClCompile Include="SDL\src\thread\windows\SDL_syscond_cv.c" />
|
||||||
<ClCompile Include="SDL\src\thread\windows\SDL_sysmutex.c" />
|
<ClCompile Include="SDL\src\thread\windows\SDL_sysmutex.c" />
|
||||||
|
<ClCompile Include="SDL\src\thread\windows\SDL_sysrwlock_srw.c" />
|
||||||
<ClCompile Include="SDL\src\thread\windows\SDL_syssem.c" />
|
<ClCompile Include="SDL\src\thread\windows\SDL_syssem.c" />
|
||||||
<ClCompile Include="SDL\src\thread\windows\SDL_systhread.c" />
|
<ClCompile Include="SDL\src\thread\windows\SDL_systhread.c" />
|
||||||
<ClCompile Include="SDL\src\thread\windows\SDL_systls.c" />
|
<ClCompile Include="SDL\src\thread\windows\SDL_systls.c" />
|
||||||
<ClCompile Include="SDL\src\timer\SDL_timer.c" />
|
<ClCompile Include="SDL\src\timer\SDL_timer.c" />
|
||||||
<ClCompile Include="SDL\src\timer\windows\SDL_systimer.c" />
|
<ClCompile Include="SDL\src\timer\windows\SDL_systimer.c" />
|
||||||
|
<ClCompile Include="SDL\src\time\SDL_time.c" />
|
||||||
|
<ClCompile Include="SDL\src\time\windows\SDL_systime.c" />
|
||||||
|
<ClCompile Include="SDL\src\tray\windows\SDL_tray.c" />
|
||||||
|
<ClCompile Include="SDL\src\tray\SDL_tray_utils.c" />
|
||||||
<ClCompile Include="SDL\src\video\dummy\SDL_nullevents.c" />
|
<ClCompile Include="SDL\src\video\dummy\SDL_nullevents.c" />
|
||||||
<ClCompile Include="SDL\src\video\dummy\SDL_nullframebuffer.c" />
|
<ClCompile Include="SDL\src\video\dummy\SDL_nullframebuffer.c" />
|
||||||
<ClCompile Include="SDL\src\video\dummy\SDL_nullvideo.c" />
|
<ClCompile Include="SDL\src\video\dummy\SDL_nullvideo.c" />
|
||||||
|
<ClCompile Include="SDL\src\video\offscreen\SDL_offscreenevents.c" />
|
||||||
|
<ClCompile Include="SDL\src\video\offscreen\SDL_offscreenframebuffer.c" />
|
||||||
|
<ClCompile Include="SDL\src\video\offscreen\SDL_offscreenopengles.c" />
|
||||||
|
<ClCompile Include="SDL\src\video\offscreen\SDL_offscreenvideo.c" />
|
||||||
|
<ClCompile Include="SDL\src\video\offscreen\SDL_offscreenvulkan.c" />
|
||||||
|
<ClCompile Include="SDL\src\video\offscreen\SDL_offscreenwindow.c" />
|
||||||
|
<ClCompile Include="SDL\src\video\SDL_blit.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_blit_0.c" />
|
<ClCompile Include="SDL\src\video\SDL_blit_0.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_blit_1.c" />
|
<ClCompile Include="SDL\src\video\SDL_blit_1.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_blit_A.c" />
|
<ClCompile Include="SDL\src\video\SDL_blit_A.c" />
|
||||||
@ -395,7 +473,6 @@
|
|||||||
<ClCompile Include="SDL\src\video\SDL_blit_copy.c" />
|
<ClCompile Include="SDL\src\video\SDL_blit_copy.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_blit_N.c" />
|
<ClCompile Include="SDL\src\video\SDL_blit_N.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_blit_slow.c" />
|
<ClCompile Include="SDL\src\video\SDL_blit_slow.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_blit.c" />
|
|
||||||
<ClCompile Include="SDL\src\video\SDL_bmp.c" />
|
<ClCompile Include="SDL\src\video\SDL_bmp.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_clipboard.c" />
|
<ClCompile Include="SDL\src\video\SDL_clipboard.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_egl.c" />
|
<ClCompile Include="SDL\src\video\SDL_egl.c" />
|
||||||
@ -403,21 +480,25 @@
|
|||||||
<ClCompile Include="SDL\src\video\SDL_pixels.c" />
|
<ClCompile Include="SDL\src\video\SDL_pixels.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_rect.c" />
|
<ClCompile Include="SDL\src\video\SDL_rect.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_RLEaccel.c" />
|
<ClCompile Include="SDL\src\video\SDL_RLEaccel.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_shape.c" />
|
<ClCompile Include="SDL\src\video\SDL_stb.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_stretch.c" />
|
<ClCompile Include="SDL\src\video\SDL_stretch.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_surface.c" />
|
<ClCompile Include="SDL\src\video\SDL_surface.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_video.c" />
|
<ClCompile Include="SDL\src\video\SDL_video.c" />
|
||||||
|
<ClCompile Include="SDL\src\video\SDL_video_unsupported.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_vulkan_utils.c" />
|
<ClCompile Include="SDL\src\video\SDL_vulkan_utils.c" />
|
||||||
<ClCompile Include="SDL\src\video\SDL_yuv.c" />
|
<ClCompile Include="SDL\src\video\SDL_yuv.c" />
|
||||||
|
<ClCompile Include="SDL\src\video\windows\SDL_surface_utils.c" />
|
||||||
<ClCompile Include="SDL\src\video\windows\SDL_windowsclipboard.c" />
|
<ClCompile Include="SDL\src\video\windows\SDL_windowsclipboard.c" />
|
||||||
<ClCompile Include="SDL\src\video\windows\SDL_windowsevents.c" />
|
<ClCompile Include="SDL\src\video\windows\SDL_windowsevents.c" />
|
||||||
<ClCompile Include="SDL\src\video\windows\SDL_windowsframebuffer.c" />
|
<ClCompile Include="SDL\src\video\windows\SDL_windowsframebuffer.c" />
|
||||||
<ClCompile Include="SDL\src\video\windows\SDL_windowskeyboard.c" />
|
<ClCompile Include="SDL\src\video\windows\SDL_windowskeyboard.c" />
|
||||||
|
<ClCompile Include="SDL\src\video\windows\SDL_windowsgameinput.c" />
|
||||||
<ClCompile Include="SDL\src\video\windows\SDL_windowsmessagebox.c" />
|
<ClCompile Include="SDL\src\video\windows\SDL_windowsmessagebox.c" />
|
||||||
<ClCompile Include="SDL\src\video\windows\SDL_windowsmodes.c" />
|
<ClCompile Include="SDL\src\video\windows\SDL_windowsmodes.c" />
|
||||||
<ClCompile Include="SDL\src\video\windows\SDL_windowsmouse.c" />
|
<ClCompile Include="SDL\src\video\windows\SDL_windowsmouse.c" />
|
||||||
<ClCompile Include="SDL\src\video\windows\SDL_windowsopengl.c" />
|
<ClCompile Include="SDL\src\video\windows\SDL_windowsopengl.c" />
|
||||||
<ClCompile Include="SDL\src\video\windows\SDL_windowsopengles.c" />
|
<ClCompile Include="SDL\src\video\windows\SDL_windowsopengles.c" />
|
||||||
|
<ClCompile Include="SDL\src\video\windows\SDL_windowsrawinput.c" />
|
||||||
<ClCompile Include="SDL\src\video\windows\SDL_windowsshape.c" />
|
<ClCompile Include="SDL\src\video\windows\SDL_windowsshape.c" />
|
||||||
<ClCompile Include="SDL\src\video\windows\SDL_windowsvideo.c" />
|
<ClCompile Include="SDL\src\video\windows\SDL_windowsvideo.c" />
|
||||||
<ClCompile Include="SDL\src\video\windows\SDL_windowsvulkan.c" />
|
<ClCompile Include="SDL\src\video\windows\SDL_windowsvulkan.c" />
|
||||||
@ -426,7 +507,10 @@
|
|||||||
<ClCompile Include="SDL\src\video\yuv2rgb\yuv_rgb_sse.c" />
|
<ClCompile Include="SDL\src\video\yuv2rgb\yuv_rgb_sse.c" />
|
||||||
<ClCompile Include="SDL\src\video\yuv2rgb\yuv_rgb_std.c" />
|
<ClCompile Include="SDL\src\video\yuv2rgb\yuv_rgb_std.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ResourceCompile Include="SDL\src\core\windows\version.rc" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
</Project>
|
</Project>
|
2
Externals/SDL/exports.props
vendored
2
Externals/SDL/exports.props
vendored
@ -6,7 +6,7 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="$(ExternalsDir)SDL\SDL2.vcxproj">
|
<ProjectReference Include="$(ExternalsDir)SDL\SDL3.vcxproj">
|
||||||
<Project>{8DC244EE-A0BD-4038-BAF7-CFAFA5EB2BAA}</Project>
|
<Project>{8DC244EE-A0BD-4038-BAF7-CFAFA5EB2BAA}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
4
Externals/SFML/CMakeLists.txt
vendored
4
Externals/SFML/CMakeLists.txt
vendored
@ -24,8 +24,8 @@ set(SRC_SYSTEM
|
|||||||
|
|
||||||
add_library(sfml-network STATIC ${SRC_NETWORK})
|
add_library(sfml-network STATIC ${SRC_NETWORK})
|
||||||
add_library(sfml-system STATIC ${SRC_SYSTEM})
|
add_library(sfml-system STATIC ${SRC_SYSTEM})
|
||||||
target_compile_features(sfml-network PUBLIC cxx_std_17)
|
target_compile_features(sfml-network PUBLIC cxx_std_20)
|
||||||
target_compile_features(sfml-system PUBLIC cxx_std_17)
|
target_compile_features(sfml-system PUBLIC cxx_std_20)
|
||||||
target_compile_definitions(sfml-system PUBLIC SFML_STATIC)
|
target_compile_definitions(sfml-system PUBLIC SFML_STATIC)
|
||||||
target_include_directories(sfml-system PUBLIC SFML/include PRIVATE SFML/src)
|
target_include_directories(sfml-system PUBLIC SFML/include PRIVATE SFML/src)
|
||||||
target_include_directories(sfml-network PUBLIC SFML/include PRIVATE SFML/src)
|
target_include_directories(sfml-network PUBLIC SFML/include PRIVATE SFML/src)
|
||||||
|
2
Externals/SFML/SFML
vendored
2
Externals/SFML/SFML
vendored
Submodule Externals/SFML/SFML updated: 7f1162dfea...016bea9491
44
Externals/miniupnpc/CMakeLists.txt
vendored
44
Externals/miniupnpc/CMakeLists.txt
vendored
@ -1,39 +1,9 @@
|
|||||||
cmake_minimum_required(VERSION 2.8.12)
|
set(UPNPC_BUILD_STATIC ON)
|
||||||
|
set(UPNPC_BUILD_SHARED OFF)
|
||||||
|
set(UPNPC_BUILD_TESTS OFF)
|
||||||
|
set(UPNPC_BUILD_SAMPLE OFF)
|
||||||
|
set(UPNPC_NO_INSTALL ON)
|
||||||
|
|
||||||
project(miniupnpc C)
|
add_subdirectory(miniupnp/miniupnpc)
|
||||||
set(MINIUPNPC_VERSION 1.9)
|
|
||||||
set(MINIUPNPC_API_VERSION 14)
|
|
||||||
|
|
||||||
if(UNIX)
|
add_library(Miniupnpc::miniupnpc ALIAS libminiupnpc-static)
|
||||||
add_definitions(-DMINIUPNPC_SET_SOCKET_TIMEOUT)
|
|
||||||
add_definitions(-D_BSD_SOURCE -D_POSIX_C_SOURCE=1)
|
|
||||||
elseif(WIN32)
|
|
||||||
add_definitions(-D_WIN32_WINNT=0x0501)
|
|
||||||
find_library(WINSOCK2_LIBRARY NAMES ws2_32 WS2_32 Ws2_32)
|
|
||||||
find_library(IPHLPAPI_LIBRARY NAMES iphlpapi)
|
|
||||||
set(LDLIBS ${WINSOCK2_LIBRARY} ${IPHLPAPI_LIBRARY} ${LDLIBS})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(APPLE)
|
|
||||||
add_definitions(-DMACOSX -D_DARWIN_C_SOURCE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(SRCS src/igd_desc_parse.c
|
|
||||||
src/miniupnpc.c
|
|
||||||
src/minixml.c
|
|
||||||
src/minisoap.c
|
|
||||||
src/minissdpc.c
|
|
||||||
src/miniwget.c
|
|
||||||
src/upnpcommands.c
|
|
||||||
src/upnpdev.c
|
|
||||||
src/upnpreplyparse.c
|
|
||||||
src/upnperrors.c
|
|
||||||
src/connecthostport.c
|
|
||||||
src/portlistingparse.c
|
|
||||||
src/receivedata.c)
|
|
||||||
|
|
||||||
add_library(miniupnpc STATIC ${SRCS})
|
|
||||||
dolphin_disable_warnings(miniupnpc)
|
|
||||||
target_include_directories(miniupnpc PUBLIC src)
|
|
||||||
|
|
||||||
add_library(Miniupnpc::miniupnpc ALIAS miniupnpc)
|
|
||||||
|
654
Externals/miniupnpc/Changelog.txt
vendored
654
Externals/miniupnpc/Changelog.txt
vendored
@ -1,654 +0,0 @@
|
|||||||
$Id: Changelog.txt,v 1.215 2015/10/01 09:26:11 nanard Exp $
|
|
||||||
miniUPnP client Changelog.
|
|
||||||
|
|
||||||
2015/09/15:
|
|
||||||
Fix buffer overflow in igd_desc_parse.c/IGDstartelt()
|
|
||||||
Discovered by Aleksandar Nikolic of Cisco Talos
|
|
||||||
|
|
||||||
2015/08/28:
|
|
||||||
move ssdpDiscoverDevices() to minissdpc.c
|
|
||||||
|
|
||||||
2015/08/27:
|
|
||||||
avoid unix socket leak in getDevicesFromMiniSSDPD()
|
|
||||||
|
|
||||||
2015/08/16:
|
|
||||||
Also accept "Up" as ConnectionStatus value
|
|
||||||
|
|
||||||
2015/07/23:
|
|
||||||
split getDevicesFromMiniSSDPD
|
|
||||||
add ttl argument to upnpDiscover() functions
|
|
||||||
increments API_VERSION to 14
|
|
||||||
|
|
||||||
2015/07/22:
|
|
||||||
Read USN from SSDP messages.
|
|
||||||
|
|
||||||
2015/07/15:
|
|
||||||
Check malloc/calloc
|
|
||||||
|
|
||||||
2015/06/16:
|
|
||||||
update getDevicesFromMiniSSDPD() to process longer minissdpd
|
|
||||||
responses
|
|
||||||
|
|
||||||
2015/05/22:
|
|
||||||
add searchalltypes param to upnpDiscoverDevices()
|
|
||||||
increments API_VERSION to 13
|
|
||||||
|
|
||||||
2015/04/30:
|
|
||||||
upnpc: output version on the terminal
|
|
||||||
|
|
||||||
2015/04/27:
|
|
||||||
_BSD_SOURCE is deprecated in favor of _DEFAULT_SOURCE
|
|
||||||
fix CMakeLists.txt COMPILE_DEFINITIONS
|
|
||||||
fix getDevicesFromMiniSSDPD() not setting scope_id
|
|
||||||
improve -r command of upnpc command line tool
|
|
||||||
|
|
||||||
2014/11/17:
|
|
||||||
search all :
|
|
||||||
upnpDiscoverDevices() / upnpDiscoverAll() functions
|
|
||||||
listdevices executable
|
|
||||||
increment API_VERSION to 12
|
|
||||||
validate igd_desc_parse
|
|
||||||
|
|
||||||
2014/11/13:
|
|
||||||
increment API_VERSION to 11
|
|
||||||
|
|
||||||
2014/11/05:
|
|
||||||
simplified function GetUPNPUrls()
|
|
||||||
|
|
||||||
2014/09/11:
|
|
||||||
use remoteHost arg of DeletePortMapping
|
|
||||||
|
|
||||||
2014/09/06:
|
|
||||||
Fix python3 build
|
|
||||||
|
|
||||||
2014/07/01:
|
|
||||||
Fix parsing of IGD2 root descriptions
|
|
||||||
|
|
||||||
2014/06/10:
|
|
||||||
rename LIBSPEC to MINIUPNP_LIBSPEC
|
|
||||||
|
|
||||||
2014/05/15:
|
|
||||||
Add support for IGD2 AddAnyPortMapping and DeletePortMappingRange
|
|
||||||
|
|
||||||
2014/02/05:
|
|
||||||
handle EINPROGRESS after connect()
|
|
||||||
|
|
||||||
2014/02/03:
|
|
||||||
minixml now handle XML comments
|
|
||||||
|
|
||||||
VERSION 1.9 : released 2014/01/31
|
|
||||||
|
|
||||||
2014/01/31:
|
|
||||||
added argument remoteHost to UPNP_GetSpecificPortMappingEntry()
|
|
||||||
increment API_VERSION to 10
|
|
||||||
|
|
||||||
2013/12/09:
|
|
||||||
--help and -h arguments in upnpc.c
|
|
||||||
|
|
||||||
2013/10/07:
|
|
||||||
fixed potential buffer overrun in miniwget.c
|
|
||||||
Modified UPNP_GetValidIGD() to check for ExternalIpAddress
|
|
||||||
|
|
||||||
2013/08/01:
|
|
||||||
define MAXHOSTNAMELEN if not already done
|
|
||||||
|
|
||||||
2013/06/06:
|
|
||||||
update upnpreplyparse to allow larger values (128 chars instead of 64)
|
|
||||||
|
|
||||||
2013/05/14:
|
|
||||||
Update upnpreplyparse to take into account "empty" elements
|
|
||||||
validate upnpreplyparse.c code with "make check"
|
|
||||||
|
|
||||||
2013/05/03:
|
|
||||||
Fix Solaris build thanks to Maciej Małecki
|
|
||||||
|
|
||||||
2013/04/27:
|
|
||||||
Fix testminiwget.sh for BSD
|
|
||||||
|
|
||||||
2013/03/23:
|
|
||||||
Fixed Makefile for *BSD
|
|
||||||
|
|
||||||
2013/03/11:
|
|
||||||
Update Makefile to use JNAerator version 0.11
|
|
||||||
|
|
||||||
2013/02/11:
|
|
||||||
Fix testminiwget.sh for use with dash
|
|
||||||
Use $(DESTDIR) in Makefile
|
|
||||||
|
|
||||||
VERSION 1.8 : released 2013/02/06
|
|
||||||
|
|
||||||
2012/10/16:
|
|
||||||
fix testminiwget with no IPv6 support
|
|
||||||
|
|
||||||
2012/09/27:
|
|
||||||
Rename all include guards to not clash with C99
|
|
||||||
(7.1.3 Reserved identifiers).
|
|
||||||
|
|
||||||
2012/08/30:
|
|
||||||
Added -e option to upnpc program (set description for port mappings)
|
|
||||||
|
|
||||||
2012/08/29:
|
|
||||||
Python 3 support (thanks to Christopher Foo)
|
|
||||||
|
|
||||||
2012/08/11:
|
|
||||||
Fix a memory link in UPNP_GetValidIGD()
|
|
||||||
Try to handle scope id in link local IPv6 URL under MS Windows
|
|
||||||
|
|
||||||
2012/07/20:
|
|
||||||
Disable HAS_IP_MREQN on DragonFly BSD
|
|
||||||
|
|
||||||
2012/06/28:
|
|
||||||
GetUPNPUrls() now inserts scope into link-local IPv6 addresses
|
|
||||||
|
|
||||||
2012/06/23:
|
|
||||||
More error return checks in upnpc.c
|
|
||||||
#define MINIUPNPC_GET_SRC_ADDR enables receivedata() to get scope_id
|
|
||||||
parseURL() now parses IPv6 addresses scope
|
|
||||||
new parameter for miniwget() : IPv6 address scope
|
|
||||||
increment API_VERSION to 9
|
|
||||||
|
|
||||||
2012/06/20:
|
|
||||||
fixed CMakeLists.txt
|
|
||||||
|
|
||||||
2012/05/29
|
|
||||||
Improvements in testminiwget.sh
|
|
||||||
|
|
||||||
VERSION 1.7 : released 2012/05/24
|
|
||||||
|
|
||||||
2012/05/01:
|
|
||||||
Cleanup settings of CFLAGS in Makefile
|
|
||||||
Fix signed/unsigned integer comparaisons
|
|
||||||
|
|
||||||
2012/04/20:
|
|
||||||
Allow to specify protocol with TCP or UDP for -A option
|
|
||||||
|
|
||||||
2012/04/09:
|
|
||||||
Only try to fetch XML description once in UPNP_GetValidIGD()
|
|
||||||
Added -ansi flag to compilation, and fixed C++ comments to ANSI C comments.
|
|
||||||
|
|
||||||
2012/04/05:
|
|
||||||
minor improvements to minihttptestserver.c
|
|
||||||
|
|
||||||
2012/03/15:
|
|
||||||
upnperrors.c returns valid error string for unrecognized error codes
|
|
||||||
|
|
||||||
2012/03/08:
|
|
||||||
make minihttptestserver listen on loopback interface instead of 0.0.0.0
|
|
||||||
|
|
||||||
2012/01/25:
|
|
||||||
Maven installation thanks to Alexey Kuznetsov
|
|
||||||
|
|
||||||
2012/01/21:
|
|
||||||
Replace WIN32 macro by _WIN32
|
|
||||||
|
|
||||||
2012/01/19:
|
|
||||||
Fixes in java wrappers thanks to Alexey Kuznetsov :
|
|
||||||
https://github.com/axet/miniupnp/tree/fix-javatest/miniupnpc
|
|
||||||
Make and install .deb packages (python) thanks to Alexey Kuznetsov :
|
|
||||||
https://github.com/axet/miniupnp/tree/feature-debbuild/miniupnpc
|
|
||||||
|
|
||||||
2012/01/07:
|
|
||||||
The multicast interface can now be specified by name with IPv4.
|
|
||||||
|
|
||||||
2012/01/02:
|
|
||||||
Install man page
|
|
||||||
|
|
||||||
2011/11/25:
|
|
||||||
added header to Port Mappings list in upnpc.c
|
|
||||||
|
|
||||||
2011/10/09:
|
|
||||||
Makefile : make clean now removes jnaerator generated files.
|
|
||||||
MINIUPNPC_VERSION in miniupnpc.h (updated by make)
|
|
||||||
|
|
||||||
2011/09/12:
|
|
||||||
added rootdescURL to UPNPUrls structure.
|
|
||||||
|
|
||||||
VERSION 1.6 : released 2011/07/25
|
|
||||||
|
|
||||||
2011/07/25:
|
|
||||||
Update doc for version 1.6 release
|
|
||||||
|
|
||||||
2011/06/18:
|
|
||||||
Fix for windows in miniwget.c
|
|
||||||
|
|
||||||
2011/06/04:
|
|
||||||
display remote host in port mapping listing
|
|
||||||
|
|
||||||
2011/06/03:
|
|
||||||
Fix in make install : there were missing headers
|
|
||||||
|
|
||||||
2011/05/26:
|
|
||||||
Fix the socket leak in miniwget thanks to Richard Marsh.
|
|
||||||
Permit to add leaseduration in -a command. Display lease duration.
|
|
||||||
|
|
||||||
2011/05/15:
|
|
||||||
Try both LinkLocal and SiteLocal multicast address for SSDP in IPv6
|
|
||||||
|
|
||||||
2011/05/09:
|
|
||||||
add a test in testminiwget.sh.
|
|
||||||
more error checking in miniwget.c
|
|
||||||
|
|
||||||
2011/05/06:
|
|
||||||
Adding some tool to test and validate miniwget.c
|
|
||||||
simplified and debugged miniwget.c
|
|
||||||
|
|
||||||
2011/04/11:
|
|
||||||
moving ReceiveData() to a receivedata.c file.
|
|
||||||
parsing presentation url
|
|
||||||
adding IGD v2 WANIPv6FirewallControl commands
|
|
||||||
|
|
||||||
2011/04/10:
|
|
||||||
update of miniupnpcmodule.c
|
|
||||||
comments in miniwget.c, update in testminiwget
|
|
||||||
Adding errors codes from IGD v2
|
|
||||||
new functions in upnpc.c for IGD v2
|
|
||||||
|
|
||||||
2011/04/09:
|
|
||||||
Support for litteral ip v6 address in miniwget
|
|
||||||
|
|
||||||
2011/04/08:
|
|
||||||
Adding support for urn:schemas-upnp-org:service:WANIPv6FirewallControl:1
|
|
||||||
Updating APIVERSION
|
|
||||||
Supporting IPV6 in upnpDiscover()
|
|
||||||
Adding a -6 option to upnpc command line tool
|
|
||||||
|
|
||||||
2011/03/18:
|
|
||||||
miniwget/parseURL() : return an error when url param is null.
|
|
||||||
fixing GetListOfPortMappings()
|
|
||||||
|
|
||||||
2011/03/14:
|
|
||||||
upnpDiscover() now reporting an error code.
|
|
||||||
improvements in comments.
|
|
||||||
|
|
||||||
2011/03/11:
|
|
||||||
adding miniupnpcstrings.h.cmake and CMakeLists.txt files.
|
|
||||||
|
|
||||||
2011/02/15:
|
|
||||||
Implementation of GetListOfPortMappings()
|
|
||||||
|
|
||||||
2011/02/07:
|
|
||||||
updates to minixml to support character data starting with spaces
|
|
||||||
minixml now support CDATA
|
|
||||||
upnpreplyparse treats <NewPortListing> specificaly
|
|
||||||
change in simpleUPnPcommand to return the buffer (simplification)
|
|
||||||
|
|
||||||
2011/02/06:
|
|
||||||
Added leaseDuration argument to AddPortMapping()
|
|
||||||
Starting to implement GetListOfPortMappings()
|
|
||||||
|
|
||||||
2011/01/11:
|
|
||||||
updating wingenminiupnpcstrings.c
|
|
||||||
|
|
||||||
2011/01/04:
|
|
||||||
improving updateminiupnpcstrings.sh
|
|
||||||
|
|
||||||
VERSION 1.5 : released 2011/01/01
|
|
||||||
|
|
||||||
2010/12/21:
|
|
||||||
use NO_GETADDRINFO macro to disable the use of getaddrinfo/freeaddrinfo
|
|
||||||
|
|
||||||
2010/12/11:
|
|
||||||
Improvements on getHTTPResponse() code.
|
|
||||||
|
|
||||||
2010/12/09:
|
|
||||||
new code for miniwget that handle Chunked transfer encoding
|
|
||||||
using getHTTPResponse() in SOAP call code
|
|
||||||
Adding MANIFEST.in for 'python setup.py bdist_rpm'
|
|
||||||
|
|
||||||
2010/11/25:
|
|
||||||
changes to minissdpc.c to compile under Win32.
|
|
||||||
see http://miniupnp.tuxfamily.org/forum/viewtopic.php?t=729
|
|
||||||
|
|
||||||
2010/09/17:
|
|
||||||
Various improvement to Makefile from Michał Górny
|
|
||||||
|
|
||||||
2010/08/05:
|
|
||||||
Adding the script "external-ip.sh" from Reuben Hawkins
|
|
||||||
|
|
||||||
2010/06/09:
|
|
||||||
update to python module to match modification made on 2010/04/05
|
|
||||||
update to Java test code to match modification made on 2010/04/05
|
|
||||||
all UPNP_* function now return an error if the SOAP request failed
|
|
||||||
at HTTP level.
|
|
||||||
|
|
||||||
2010/04/17:
|
|
||||||
Using GetBestRoute() under win32 in order to find the
|
|
||||||
right interface to use.
|
|
||||||
|
|
||||||
2010/04/12:
|
|
||||||
Retrying with HTTP/1.1 if HTTP/1.0 failed. see
|
|
||||||
http://miniupnp.tuxfamily.org/forum/viewtopic.php?p=1703
|
|
||||||
|
|
||||||
2010/04/07:
|
|
||||||
avoid returning duplicates in upnpDiscover()
|
|
||||||
|
|
||||||
2010/04/05:
|
|
||||||
Create a connecthostport.h/.c with connecthostport() function
|
|
||||||
and use it in miniwget and miniupnpc.
|
|
||||||
Use getnameinfo() instead of inet_ntop or inet_ntoa
|
|
||||||
Work to make miniupnpc IPV6 compatible...
|
|
||||||
Add java test code.
|
|
||||||
Big changes in order to support device having both WANIPConnection
|
|
||||||
and WANPPPConnection.
|
|
||||||
|
|
||||||
2010/04/04:
|
|
||||||
Use getaddrinfo() instead of gethostbyname() in miniwget.
|
|
||||||
|
|
||||||
2010/01/06:
|
|
||||||
#define _DARWIN_C_SOURCE for Mac OS X
|
|
||||||
|
|
||||||
2009/12/19:
|
|
||||||
Improve MinGW32 build
|
|
||||||
|
|
||||||
2009/12/11:
|
|
||||||
adding a MSVC9 project to build the static library and executable
|
|
||||||
|
|
||||||
2009/12/10:
|
|
||||||
Fixing some compilation stuff for Windows/MinGW
|
|
||||||
|
|
||||||
2009/12/07:
|
|
||||||
adaptations in Makefile and updateminiupnpcstring.sh for AmigaOS
|
|
||||||
some fixes for Windows when using virtual ethernet adapters (it is the
|
|
||||||
case with VMWare installed).
|
|
||||||
|
|
||||||
2009/12/04:
|
|
||||||
some fixes for AmigaOS compilation
|
|
||||||
Changed HTTP version to HTTP/1.0 for Soap too (to prevent chunked
|
|
||||||
transfer encoding)
|
|
||||||
|
|
||||||
2009/12/03:
|
|
||||||
updating printIDG and testigddescparse.c for debug.
|
|
||||||
modifications to compile under AmigaOS
|
|
||||||
adding a testminiwget program
|
|
||||||
Changed miniwget to advertise itself as HTTP/1.0 to prevent chunked
|
|
||||||
transfer encoding
|
|
||||||
|
|
||||||
2009/11/26:
|
|
||||||
fixing updateminiupnpcstrings.sh to take into account
|
|
||||||
which command that does not return an error code.
|
|
||||||
|
|
||||||
VERSION 1.4 : released 2009/10/30
|
|
||||||
|
|
||||||
2009/10/16:
|
|
||||||
using Py_BEGIN_ALLOW_THREADS and Py_END_ALLOW_THREADS in python module.
|
|
||||||
|
|
||||||
2009/10/10:
|
|
||||||
Some fixes for compilation under Solaris
|
|
||||||
compilation fixes : http://miniupnp.tuxfamily.org/forum/viewtopic.php?p=1464
|
|
||||||
|
|
||||||
2009/09/21:
|
|
||||||
fixing the code to ignore EINTR during connect() calls.
|
|
||||||
|
|
||||||
2009/08/07:
|
|
||||||
Set socket timeout for connect()
|
|
||||||
Some cleanup in miniwget.c
|
|
||||||
|
|
||||||
2009/08/04:
|
|
||||||
remove multiple redirections with -d in upnpc.c
|
|
||||||
Print textual error code in upnpc.c
|
|
||||||
Ignore EINTR during the connect() and poll() calls.
|
|
||||||
|
|
||||||
2009/07/29:
|
|
||||||
fix in updateminiupnpcstrings.sh if OS name contains "/"
|
|
||||||
Sending a correct value for MX: field in SSDP request
|
|
||||||
|
|
||||||
2009/07/20:
|
|
||||||
Change the Makefile to compile under Mac OS X
|
|
||||||
Fixed a stackoverflow in getDevicesFromMiniSSDPD()
|
|
||||||
|
|
||||||
2009/07/09:
|
|
||||||
Compile under Haiku
|
|
||||||
generate miniupnpcstrings.h.in from miniupnpcstrings.h
|
|
||||||
|
|
||||||
2009/06/04:
|
|
||||||
patching to compile under CygWin and cross compile for minGW
|
|
||||||
|
|
||||||
VERSION 1.3 :
|
|
||||||
|
|
||||||
2009/04/17:
|
|
||||||
updating python module
|
|
||||||
Use strtoull() when using C99
|
|
||||||
|
|
||||||
2009/02/28:
|
|
||||||
Fixed miniwget.c for compiling under sun
|
|
||||||
|
|
||||||
2008/12/18:
|
|
||||||
cleanup in Makefile (thanks to Paul de Weerd)
|
|
||||||
minissdpc.c : win32 compatibility
|
|
||||||
miniupnpc.c : changed xmlns prefix from 'm' to 'u'
|
|
||||||
Removed NDEBUG (using DEBUG)
|
|
||||||
|
|
||||||
2008/10/14:
|
|
||||||
Added the ExternalHost argument to DeletePortMapping()
|
|
||||||
|
|
||||||
2008/10/11:
|
|
||||||
Added the ExternalHost argument to AddPortMapping()
|
|
||||||
Put a correct User-Agent: header in HTTP requests.
|
|
||||||
|
|
||||||
VERSION 1.2 :
|
|
||||||
|
|
||||||
2008/10/07:
|
|
||||||
Update docs
|
|
||||||
|
|
||||||
2008/09/25:
|
|
||||||
Integrated sameport patch from Dario Meloni : Added a "sameport"
|
|
||||||
argument to upnpDiscover().
|
|
||||||
|
|
||||||
2008/07/18:
|
|
||||||
small modif to make Clang happy :)
|
|
||||||
|
|
||||||
2008/07/17:
|
|
||||||
#define SOAPPREFIX "s" in miniupnpc.c in order to remove SOAP-ENV...
|
|
||||||
|
|
||||||
2008/07/14:
|
|
||||||
include declspec.h in installation (to /usr/include/miniupnpc)
|
|
||||||
|
|
||||||
VERSION 1.1 :
|
|
||||||
|
|
||||||
2008/07/04:
|
|
||||||
standard options for install/ln instead of gnu-specific stuff.
|
|
||||||
|
|
||||||
2008/07/03:
|
|
||||||
now builds a .dll and .lib with win32. (mingw32)
|
|
||||||
|
|
||||||
2008/04/28:
|
|
||||||
make install now install the binary of the upnpc tool
|
|
||||||
|
|
||||||
2008/04/27:
|
|
||||||
added testupnpigd.py
|
|
||||||
added error strings for miniupnpc "internal" errors
|
|
||||||
improved python module error/exception reporting.
|
|
||||||
|
|
||||||
2008/04/23:
|
|
||||||
Completely rewrite igd_desc_parse.c in order to be compatible with
|
|
||||||
Linksys WAG200G
|
|
||||||
Added testigddescparse
|
|
||||||
updated python module
|
|
||||||
|
|
||||||
VERSION 1.0 :
|
|
||||||
|
|
||||||
2008/02/21:
|
|
||||||
put some #ifdef DEBUG around DisplayNameValueList()
|
|
||||||
|
|
||||||
2008/02/18:
|
|
||||||
Improved error reporting in upnpcommands.c
|
|
||||||
UPNP_GetStatusInfo() returns LastConnectionError
|
|
||||||
|
|
||||||
2008/02/16:
|
|
||||||
better error handling in minisoap.c
|
|
||||||
improving display of "valid IGD found" in upnpc.c
|
|
||||||
|
|
||||||
2008/02/03:
|
|
||||||
Fixing UPNP_GetValidIGD()
|
|
||||||
improved make install :)
|
|
||||||
|
|
||||||
2007/12/22:
|
|
||||||
Adding upnperrors.c/h to provide a strupnperror() function
|
|
||||||
used to translate UPnP error codes to string.
|
|
||||||
|
|
||||||
2007/12/19:
|
|
||||||
Fixing getDevicesFromMiniSSDPD()
|
|
||||||
improved error reporting of UPnP functions
|
|
||||||
|
|
||||||
2007/12/18:
|
|
||||||
It is now possible to specify a different location for MiniSSDPd socket.
|
|
||||||
working with MiniSSDPd is now more efficient.
|
|
||||||
python module improved.
|
|
||||||
|
|
||||||
2007/12/16:
|
|
||||||
improving error reporting
|
|
||||||
|
|
||||||
2007/12/13:
|
|
||||||
Try to improve compatibility by using HTTP/1.0 instead of 1.1 and
|
|
||||||
XML a bit different for SOAP.
|
|
||||||
|
|
||||||
2007/11/25:
|
|
||||||
fixed select() call for linux
|
|
||||||
|
|
||||||
2007/11/15:
|
|
||||||
Added -fPIC to CFLAG for better shared library code.
|
|
||||||
|
|
||||||
2007/11/02:
|
|
||||||
Fixed a potential socket leak in miniwget2()
|
|
||||||
|
|
||||||
2007/10/16:
|
|
||||||
added a parameter to upnpDiscover() in order to allow the use of another
|
|
||||||
interface than the default multicast interface.
|
|
||||||
|
|
||||||
2007/10/12:
|
|
||||||
Fixed the creation of symbolic link in Makefile
|
|
||||||
|
|
||||||
2007/10/08:
|
|
||||||
Added man page
|
|
||||||
|
|
||||||
2007/10/02:
|
|
||||||
fixed memory bug in GetUPNPUrls()
|
|
||||||
|
|
||||||
2007/10/01:
|
|
||||||
fixes in the Makefile
|
|
||||||
Added UPNP_GetIGDFromUrl() and adapted the sample program accordingly.
|
|
||||||
Added SONAME in the shared library to please debian :)
|
|
||||||
fixed MS Windows compilation (minissdpd is not available under MS Windows).
|
|
||||||
|
|
||||||
2007/09/25:
|
|
||||||
small change to Makefile to be able to install in a different location
|
|
||||||
(default is /usr)
|
|
||||||
|
|
||||||
2007/09/24:
|
|
||||||
now compiling both shared and static library
|
|
||||||
|
|
||||||
2007/09/19:
|
|
||||||
Cosmetic changes on upnpc.c
|
|
||||||
|
|
||||||
2007/09/02:
|
|
||||||
adapting to new miniSSDPd (release version ?)
|
|
||||||
|
|
||||||
2007/08/31:
|
|
||||||
Usage of miniSSDPd to skip discovery process.
|
|
||||||
|
|
||||||
2007/08/27:
|
|
||||||
fixed python module to allow compilation with Python older than Python 2.4
|
|
||||||
|
|
||||||
2007/06/12:
|
|
||||||
Added a python module.
|
|
||||||
|
|
||||||
2007/05/19:
|
|
||||||
Fixed compilation under MinGW
|
|
||||||
|
|
||||||
2007/05/15:
|
|
||||||
fixed a memory leak in AddPortMapping()
|
|
||||||
Added testupnpreplyparse executable to check the parsing of
|
|
||||||
upnp soap messages
|
|
||||||
minixml now ignore namespace prefixes.
|
|
||||||
|
|
||||||
2007/04/26:
|
|
||||||
upnpc now displays external ip address with -s or -l
|
|
||||||
|
|
||||||
2007/04/11:
|
|
||||||
changed MINIUPNPC_URL_MAXSIZE to 128 to accomodate the "BT Voyager 210"
|
|
||||||
|
|
||||||
2007/03/19:
|
|
||||||
cleanup in miniwget.c
|
|
||||||
|
|
||||||
2007/03/01:
|
|
||||||
Small typo fix...
|
|
||||||
|
|
||||||
2007/01/30:
|
|
||||||
Now parsing the HTTP header from SOAP responses in order to
|
|
||||||
get content-length value.
|
|
||||||
|
|
||||||
2007/01/29:
|
|
||||||
Fixed the Soap Query to speedup the HTTP request.
|
|
||||||
added some Win32 DLL stuff...
|
|
||||||
|
|
||||||
2007/01/27:
|
|
||||||
Fixed some WIN32 compatibility issues
|
|
||||||
|
|
||||||
2006/12/14:
|
|
||||||
Added UPNPIGD_IsConnected() function in miniupnp.c/.h
|
|
||||||
Added UPNP_GetValidIGD() in miniupnp.c/.h
|
|
||||||
cleaned upnpc.c main(). now using UPNP_GetValidIGD()
|
|
||||||
|
|
||||||
2006/12/07:
|
|
||||||
Version 1.0-RC1 released
|
|
||||||
|
|
||||||
2006/12/03:
|
|
||||||
Minor changes to compile under SunOS/Solaris
|
|
||||||
|
|
||||||
2006/11/30:
|
|
||||||
made a minixml parser validator program
|
|
||||||
updated minixml to handle attributes correctly
|
|
||||||
|
|
||||||
2006/11/22:
|
|
||||||
Added a -r option to the upnpc sample thanks to Alexander Hubmann.
|
|
||||||
|
|
||||||
2006/11/19:
|
|
||||||
Cleanup code to make it more ANSI C compliant
|
|
||||||
|
|
||||||
2006/11/10:
|
|
||||||
detect and display local lan address.
|
|
||||||
|
|
||||||
2006/11/04:
|
|
||||||
Packets and Bytes Sent/Received are now unsigned int.
|
|
||||||
|
|
||||||
2006/11/01:
|
|
||||||
Bug fix thanks to Giuseppe D'Angelo
|
|
||||||
|
|
||||||
2006/10/31:
|
|
||||||
C++ compatibility for .h files.
|
|
||||||
Added a way to get ip Address on the LAN used to reach the IGD.
|
|
||||||
|
|
||||||
2006/10/25:
|
|
||||||
Added M-SEARCH to the services in the discovery process.
|
|
||||||
|
|
||||||
2006/10/22:
|
|
||||||
updated the Makefile to use makedepend, added a "make install"
|
|
||||||
update Makefile
|
|
||||||
|
|
||||||
2006/10/20:
|
|
||||||
fixing the description url parsing thanks to patch sent by
|
|
||||||
Wayne Dawe.
|
|
||||||
Fixed/translated some comments.
|
|
||||||
Implemented a better discover process, first looking
|
|
||||||
for IGD then for root devices (as some devices only reply to
|
|
||||||
M-SEARCH for root devices).
|
|
||||||
|
|
||||||
2006/09/02:
|
|
||||||
added freeUPNPDevlist() function.
|
|
||||||
|
|
||||||
2006/08/04:
|
|
||||||
More command line arguments checking
|
|
||||||
|
|
||||||
2006/08/01:
|
|
||||||
Added the .bat file to compile under Win32 with minGW32
|
|
||||||
|
|
||||||
2006/07/31:
|
|
||||||
Fixed the rootdesc parser (igd_desc_parse.c)
|
|
||||||
|
|
||||||
2006/07/20:
|
|
||||||
parseMSEARCHReply() is now returning the ST: line as well
|
|
||||||
starting changes to detect several UPnP devices on the network
|
|
||||||
|
|
||||||
2006/07/19:
|
|
||||||
using GetCommonLinkProperties to get down/upload bitrate
|
|
||||||
|
|
27
Externals/miniupnpc/LICENSE
vendored
27
Externals/miniupnpc/LICENSE
vendored
@ -1,27 +0,0 @@
|
|||||||
MiniUPnPc
|
|
||||||
Copyright (c) 2005-2015, Thomas BERNARD
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
* The name of the author may not be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
66
Externals/miniupnpc/README
vendored
66
Externals/miniupnpc/README
vendored
@ -1,66 +0,0 @@
|
|||||||
Project: miniupnp
|
|
||||||
Project web page: http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
|
|
||||||
github: https://github.com/miniupnp/miniupnp
|
|
||||||
freecode: http://freecode.com/projects/miniupnp
|
|
||||||
Author: Thomas Bernard
|
|
||||||
Copyright (c) 2005-2012 Thomas Bernard
|
|
||||||
This software is subject to the conditions detailed in the
|
|
||||||
LICENSE file provided within this distribution.
|
|
||||||
|
|
||||||
|
|
||||||
For the comfort of Win32 users, bsdqueue.h is included in the distribution.
|
|
||||||
Its licence is included in the header of the file.
|
|
||||||
bsdqueue.h is a copy of the sys/queue.h of an OpenBSD system.
|
|
||||||
|
|
||||||
|
|
||||||
* miniUPnP Client - miniUPnPc *
|
|
||||||
|
|
||||||
To compile, simply run 'gmake' (could be 'make' on your system).
|
|
||||||
Under win32, to compile with MinGW, type "mingw32make.bat".
|
|
||||||
MS Visual C solution and project files are supplied in the msvc/ subdirectory.
|
|
||||||
|
|
||||||
The compilation is known to work under linux, FreeBSD,
|
|
||||||
OpenBSD, MacOS X, AmigaOS and cygwin.
|
|
||||||
The official AmigaOS4.1 SDK was used for AmigaOS4 and GeekGadgets for AmigaOS3.
|
|
||||||
upx (http://upx.sourceforge.net) is used to compress the win32 .exe files.
|
|
||||||
|
|
||||||
To install the library and headers on the system use :
|
|
||||||
> su
|
|
||||||
> make install
|
|
||||||
> exit
|
|
||||||
|
|
||||||
alternatively, to install into a specific location, use :
|
|
||||||
> INSTALLPREFIX=/usr/local make install
|
|
||||||
|
|
||||||
upnpc.c is a sample client using the libminiupnpc.
|
|
||||||
To use the libminiupnpc in your application, link it with
|
|
||||||
libminiupnpc.a (or .so) and use the following functions found in miniupnpc.h,
|
|
||||||
upnpcommands.h and miniwget.h :
|
|
||||||
- upnpDiscover()
|
|
||||||
- miniwget()
|
|
||||||
- parserootdesc()
|
|
||||||
- GetUPNPUrls()
|
|
||||||
- UPNP_* (calling UPNP methods)
|
|
||||||
|
|
||||||
Note : use #include <miniupnpc/miniupnpc.h> etc... for the includes
|
|
||||||
and -lminiupnpc for the link
|
|
||||||
|
|
||||||
Discovery process is speeded up when MiniSSDPd is running on the machine.
|
|
||||||
|
|
||||||
|
|
||||||
* Python module *
|
|
||||||
|
|
||||||
you can build a python module with 'make pythonmodule'
|
|
||||||
and install it with 'make installpythonmodule'.
|
|
||||||
setup.py (and setupmingw32.py) are included in the distribution.
|
|
||||||
|
|
||||||
|
|
||||||
Feel free to contact me if you have any problem :
|
|
||||||
e-mail : miniupnp@free.fr
|
|
||||||
|
|
||||||
If you are using libminiupnpc in your application, please
|
|
||||||
send me an email !
|
|
||||||
|
|
||||||
For any question, you can use the web forum :
|
|
||||||
http://miniupnp.tuxfamily.org/forum/
|
|
||||||
|
|
1
Externals/miniupnpc/VERSION
vendored
1
Externals/miniupnpc/VERSION
vendored
@ -1 +0,0 @@
|
|||||||
1.9
|
|
157
Externals/miniupnpc/apiversions.txt
vendored
157
Externals/miniupnpc/apiversions.txt
vendored
@ -1,157 +0,0 @@
|
|||||||
$Id: apiversions.txt,v 1.7 2015/07/23 20:40:08 nanard Exp $
|
|
||||||
|
|
||||||
Differences in API between miniUPnPc versions
|
|
||||||
|
|
||||||
API version 14
|
|
||||||
miniupnpc.h
|
|
||||||
add ttl argument to upnpDiscover() upnpDiscoverAll() upnpDiscoverDevice()
|
|
||||||
upnpDiscoverDevices()
|
|
||||||
getDevicesFromMiniSSDPD() :
|
|
||||||
connectToMiniSSDPD() / disconnectFromMiniSSDPD()
|
|
||||||
requestDevicesFromMiniSSDPD() / receiveDevicesFromMiniSSDPD()
|
|
||||||
|
|
||||||
API version 13
|
|
||||||
miniupnpc.h:
|
|
||||||
add searchalltype param to upnpDiscoverDevices() function
|
|
||||||
updated macro :
|
|
||||||
#define MINIUPNPC_API_VERSION 13
|
|
||||||
|
|
||||||
API version 12
|
|
||||||
miniupnpc.h :
|
|
||||||
add upnpDiscoverAll() / upnpDiscoverDevice() / upnpDiscoverDevices()
|
|
||||||
functions
|
|
||||||
updated macros :
|
|
||||||
#define MINIUPNPC_API_VERSION 12
|
|
||||||
|
|
||||||
API version 11
|
|
||||||
|
|
||||||
upnpreplyparse.h / portlistingparse.h :
|
|
||||||
removed usage of sys/queue.h / bsdqueue.h
|
|
||||||
|
|
||||||
miniupnpc.h:
|
|
||||||
updated macros :
|
|
||||||
#define MINIUPNPC_API_VERSION 11
|
|
||||||
|
|
||||||
====================== miniUPnPc version 1.9 ======================
|
|
||||||
API version 10
|
|
||||||
|
|
||||||
upnpcommands.h:
|
|
||||||
added argument remoteHost to UPNP_GetSpecificPortMappingEntry()
|
|
||||||
|
|
||||||
miniupnpc.h:
|
|
||||||
updated macros :
|
|
||||||
#define MINIUPNPC_VERSION "1.9"
|
|
||||||
#define MINIUPNPC_API_VERSION 10
|
|
||||||
|
|
||||||
====================== miniUPnPc version 1.8 ======================
|
|
||||||
API version 9
|
|
||||||
|
|
||||||
miniupnpc.h:
|
|
||||||
updated macros :
|
|
||||||
#define MINIUPNPC_VERSION "1.8"
|
|
||||||
#define MINIUPNPC_API_VERSION 9
|
|
||||||
added "unsigned int scope_id;" to struct UPNPDev
|
|
||||||
added scope_id argument to GetUPNPUrls()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
====================== miniUPnPc version 1.7 ======================
|
|
||||||
API version 8
|
|
||||||
|
|
||||||
miniupnpc.h :
|
|
||||||
add new macros :
|
|
||||||
#define MINIUPNPC_VERSION "1.7"
|
|
||||||
#define MINIUPNPC_API_VERSION 8
|
|
||||||
add rootdescURL to struct UPNPUrls
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
====================== miniUPnPc version 1.6 ======================
|
|
||||||
API version 8
|
|
||||||
|
|
||||||
Adding support for IPv6.
|
|
||||||
igd_desc_parse.h :
|
|
||||||
struct IGDdatas_service :
|
|
||||||
add char presentationurl[MINIUPNPC_URL_MAXSIZE];
|
|
||||||
struct IGDdatas :
|
|
||||||
add struct IGDdatas_service IPv6FC;
|
|
||||||
miniupnpc.h :
|
|
||||||
new macros :
|
|
||||||
#define UPNPDISCOVER_SUCCESS (0)
|
|
||||||
#define UPNPDISCOVER_UNKNOWN_ERROR (-1)
|
|
||||||
#define UPNPDISCOVER_SOCKET_ERROR (-101)
|
|
||||||
#define UPNPDISCOVER_MEMORY_ERROR (-102)
|
|
||||||
simpleUPnPcommand() prototype changed (but is normaly not used by API users)
|
|
||||||
add arguments ipv6 and error to upnpDiscover() :
|
|
||||||
struct UPNPDev *
|
|
||||||
upnpDiscover(int delay, const char * multicastif,
|
|
||||||
const char * minissdpdsock, int sameport,
|
|
||||||
int ipv6,
|
|
||||||
int * error);
|
|
||||||
add controlURL_6FC member to struct UPNPUrls :
|
|
||||||
struct UPNPUrls {
|
|
||||||
char * controlURL;
|
|
||||||
char * ipcondescURL;
|
|
||||||
char * controlURL_CIF;
|
|
||||||
char * controlURL_6FC;
|
|
||||||
};
|
|
||||||
|
|
||||||
upnpcommands.h :
|
|
||||||
add leaseDuration argument to UPNP_AddPortMapping()
|
|
||||||
add desc, enabled and leaseDuration arguments to UPNP_GetSpecificPortMappingEntry()
|
|
||||||
add UPNP_GetListOfPortMappings() function (IGDv2)
|
|
||||||
add IGDv2 IPv6 related functions :
|
|
||||||
UPNP_GetFirewallStatus()
|
|
||||||
UPNP_GetOutboundPinholeTimeout()
|
|
||||||
UPNP_AddPinhole()
|
|
||||||
UPNP_UpdatePinhole()
|
|
||||||
UPNP_DeletePinhole()
|
|
||||||
UPNP_CheckPinholeWorking()
|
|
||||||
UPNP_GetPinholePackets()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
====================== miniUPnPc version 1.5 ======================
|
|
||||||
API version 5
|
|
||||||
|
|
||||||
new function :
|
|
||||||
int UPNPIGD_IsConnected(struct UPNPUrls *, struct IGDdatas *);
|
|
||||||
new macro in upnpcommands.h :
|
|
||||||
#define UPNPCOMMAND_HTTP_ERROR
|
|
||||||
|
|
||||||
====================== miniUPnPc version 1.4 ======================
|
|
||||||
Same API as version 1.3
|
|
||||||
|
|
||||||
====================== miniUPnPc version 1.3 ======================
|
|
||||||
API version 4
|
|
||||||
|
|
||||||
Use UNSIGNED_INTEGER type for
|
|
||||||
UPNP_GetTotalBytesSent(), UPNP_GetTotalBytesReceived(),
|
|
||||||
UPNP_GetTotalPacketsSent(), UPNP_GetTotalPacketsReceived()
|
|
||||||
Add remoteHost argument to UPNP_AddPortMapping() and UPNP_DeletePortMapping()
|
|
||||||
|
|
||||||
====================== miniUPnPc version 1.2 ======================
|
|
||||||
API version 3
|
|
||||||
|
|
||||||
added sameport argument to upnpDiscover()
|
|
||||||
struct UPNPDev *
|
|
||||||
upnpDiscover(int delay, const char * multicastif,
|
|
||||||
const char * minissdpdsock, int sameport);
|
|
||||||
|
|
||||||
====================== miniUPnPc Version 1.1 ======================
|
|
||||||
Same API as 1.0
|
|
||||||
|
|
||||||
|
|
||||||
====================== miniUPnPc Version 1.0 ======================
|
|
||||||
API version 2
|
|
||||||
|
|
||||||
|
|
||||||
struct UPNPDev {
|
|
||||||
struct UPNPDev * pNext;
|
|
||||||
char * descURL;
|
|
||||||
char * st;
|
|
||||||
char buffer[2];
|
|
||||||
};
|
|
||||||
struct UPNPDev * upnpDiscover(int delay, const char * multicastif,
|
|
||||||
const char * minissdpdsock);
|
|
||||||
|
|
3
Externals/miniupnpc/exports.props
vendored
3
Externals/miniupnpc/exports.props
vendored
@ -2,7 +2,8 @@
|
|||||||
<Project>
|
<Project>
|
||||||
<ItemDefinitionGroup>
|
<ItemDefinitionGroup>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<AdditionalIncludeDirectories>$(ExternalsDir)miniupnpc\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(ExternalsDir)miniupnpc\miniupnp\miniupnpc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>MINIUPNP_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
1
Externals/miniupnpc/miniupnp
vendored
Submodule
1
Externals/miniupnpc/miniupnp
vendored
Submodule
Submodule Externals/miniupnpc/miniupnp added at bf4215a757
87
Externals/miniupnpc/miniupnpc.vcxproj
vendored
87
Externals/miniupnpc/miniupnpc.vcxproj
vendored
@ -15,48 +15,65 @@
|
|||||||
<Import Project="$(VSPropsDir)ClDisableAllWarnings.props" />
|
<Import Project="$(VSPropsDir)ClDisableAllWarnings.props" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<ItemDefinitionGroup>
|
||||||
|
<ClCompile>
|
||||||
|
<AdditionalIncludeDirectories>miniupnp\miniupnpc;miniupnp\miniupnpc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>MINIUPNP_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<PreBuildEvent>
|
||||||
|
<Command>
|
||||||
|
CD /d "$(ProjectDir)miniupnp\miniupnpc\msvc"
|
||||||
|
cscript //nologo genminiupnpcstrings.vbs
|
||||||
|
</Command>
|
||||||
|
</PreBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="src\codelength.h" />
|
<ClInclude Include="miniupnp\miniupnpc\src\addr_is_reserved.h" />
|
||||||
<ClInclude Include="src\connecthostport.h" />
|
<ClInclude Include="miniupnp\miniupnpc\src\connecthostport.h" />
|
||||||
<ClInclude Include="src\igd_desc_parse.h" />
|
<ClInclude Include="miniupnp\miniupnpc\include\igd_desc_parse.h" />
|
||||||
<ClInclude Include="src\minisoap.h" />
|
<ClInclude Include="miniupnp\miniupnpc\src\minisoap.h" />
|
||||||
<ClInclude Include="src\minissdpc.h" />
|
<ClInclude Include="miniupnp\miniupnpc\src\minissdpc.h" />
|
||||||
<ClInclude Include="src\miniupnpc.h" />
|
<ClInclude Include="miniupnp\miniupnpc\include\miniupnpc.h" />
|
||||||
<ClInclude Include="src\miniupnpc_declspec.h" />
|
<ClInclude Include="miniupnp\miniupnpc\miniupnpcstrings.h" />
|
||||||
<ClInclude Include="src\miniupnpcstrings.h" />
|
<ClInclude Include="miniupnp\miniupnpc\include\miniupnpctypes.h" />
|
||||||
<ClInclude Include="src\miniupnpctypes.h" />
|
<ClInclude Include="miniupnp\miniupnpc\include\miniupnpc_declspec.h" />
|
||||||
<ClInclude Include="src\miniwget.h" />
|
<ClInclude Include="miniupnp\miniupnpc\include\miniwget.h" />
|
||||||
<ClInclude Include="src\minixml.h" />
|
<ClInclude Include="miniupnp\miniupnpc\src\miniwget_private.h" />
|
||||||
<ClInclude Include="src\portlistingparse.h" />
|
<ClInclude Include="miniupnp\miniupnpc\src\minixml.h" />
|
||||||
<ClInclude Include="src\receivedata.h" />
|
<ClInclude Include="miniupnp\miniupnpc\include\portlistingparse.h" />
|
||||||
<ClInclude Include="src\upnpcommands.h" />
|
<ClInclude Include="miniupnp\miniupnpc\src\receivedata.h" />
|
||||||
<ClInclude Include="src\upnpdev.h" />
|
<ClInclude Include="miniupnp\miniupnpc\include\upnpcommands.h" />
|
||||||
<ClInclude Include="src\upnperrors.h" />
|
<ClInclude Include="miniupnp\miniupnpc\include\upnpdev.h" />
|
||||||
<ClInclude Include="src\upnpreplyparse.h" />
|
<ClInclude Include="miniupnp\miniupnpc\include\upnperrors.h" />
|
||||||
|
<ClInclude Include="miniupnp\miniupnpc\include\upnpreplyparse.h" />
|
||||||
|
<ClInclude Include="miniupnp\miniupnpc\src\win32_snprintf.h" />
|
||||||
|
<ClInclude Include="miniupnp\miniupnpc\rc_version.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="src\connecthostport.c" />
|
<ClCompile Include="miniupnp\miniupnpc\src\addr_is_reserved.c" />
|
||||||
<ClCompile Include="src\igd_desc_parse.c" />
|
<ClCompile Include="miniupnp\miniupnpc\src\connecthostport.c" />
|
||||||
<ClCompile Include="src\minisoap.c" />
|
<ClCompile Include="miniupnp\miniupnpc\src\igd_desc_parse.c" />
|
||||||
<ClCompile Include="src\minissdpc.c" />
|
<ClCompile Include="miniupnp\miniupnpc\src\minisoap.c" />
|
||||||
<ClCompile Include="src\miniupnpc.c" />
|
<ClCompile Include="miniupnp\miniupnpc\src\minissdpc.c" />
|
||||||
<ClCompile Include="src\miniwget.c" />
|
<ClCompile Include="miniupnp\miniupnpc\src\miniupnpc.c" />
|
||||||
<ClCompile Include="src\minixml.c" />
|
<ClCompile Include="miniupnp\miniupnpc\src\miniwget.c" />
|
||||||
<ClCompile Include="src\portlistingparse.c" />
|
<ClCompile Include="miniupnp\miniupnpc\src\minixml.c" />
|
||||||
<ClCompile Include="src\receivedata.c" />
|
<ClCompile Include="miniupnp\miniupnpc\src\portlistingparse.c" />
|
||||||
<ClCompile Include="src\upnpcommands.c" />
|
<ClCompile Include="miniupnp\miniupnpc\src\receivedata.c" />
|
||||||
<ClCompile Include="src\upnpdev.c" />
|
<ClCompile Include="miniupnp\miniupnpc\src\upnpc.c" />
|
||||||
<ClCompile Include="src\upnperrors.c" />
|
<ClCompile Include="miniupnp\miniupnpc\src\upnpcommands.c" />
|
||||||
<ClCompile Include="src\upnpreplyparse.c" />
|
<ClCompile Include="miniupnp\miniupnpc\src\upnpdev.c" />
|
||||||
|
<ClCompile Include="miniupnp\miniupnpc\src\upnperrors.c" />
|
||||||
|
<ClCompile Include="miniupnp\miniupnpc\src\upnpreplyparse.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="LICENSE" />
|
<None Include="miniupnp\miniupnpc\LICENSE" />
|
||||||
<None Include="README" />
|
<None Include="miniupnp\miniupnpc\README" />
|
||||||
<None Include="VERSION" />
|
<None Include="miniupnp\miniupnpc\VERSION" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Text Include="apiversions.txt" />
|
<Text Include="miniupnp\miniupnpc\apiversions.txt" />
|
||||||
<Text Include="Changelog.txt" />
|
<Text Include="miniupnp\miniupnpc\Changelog.txt" />
|
||||||
<Text Include="CMakeLists.txt" />
|
<Text Include="CMakeLists.txt" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
54
Externals/miniupnpc/src/codelength.h
vendored
54
Externals/miniupnpc/src/codelength.h
vendored
@ -1,54 +0,0 @@
|
|||||||
/* $Id: codelength.h,v 1.3 2011/07/30 13:10:05 nanard Exp $ */
|
|
||||||
/* Project : miniupnp
|
|
||||||
* Author : Thomas BERNARD
|
|
||||||
* copyright (c) 2005-2015 Thomas Bernard
|
|
||||||
* This software is subjet to the conditions detailed in the
|
|
||||||
* provided LICENCE file. */
|
|
||||||
#ifndef CODELENGTH_H_INCLUDED
|
|
||||||
#define CODELENGTH_H_INCLUDED
|
|
||||||
|
|
||||||
/* Encode length by using 7bit per Byte :
|
|
||||||
* Most significant bit of each byte specifies that the
|
|
||||||
* following byte is part of the code */
|
|
||||||
|
|
||||||
/* n : unsigned
|
|
||||||
* p : unsigned char *
|
|
||||||
*/
|
|
||||||
#define DECODELENGTH(n, p) n = 0; \
|
|
||||||
do { n = (n << 7) | (*p & 0x7f); } \
|
|
||||||
while((*(p++)&0x80) && (n<(1<<25)));
|
|
||||||
|
|
||||||
/* n : unsigned
|
|
||||||
* READ : function/macro to read one byte (unsigned char)
|
|
||||||
*/
|
|
||||||
#define DECODELENGTH_READ(n, READ) \
|
|
||||||
n = 0; \
|
|
||||||
do { \
|
|
||||||
unsigned char c; \
|
|
||||||
READ(c); \
|
|
||||||
n = (n << 7) | (c & 0x07f); \
|
|
||||||
if(!(c&0x80)) break; \
|
|
||||||
} while(n<(1<<25));
|
|
||||||
|
|
||||||
/* n : unsigned
|
|
||||||
* p : unsigned char *
|
|
||||||
* p_limit : unsigned char *
|
|
||||||
*/
|
|
||||||
#define DECODELENGTH_CHECKLIMIT(n, p, p_limit) \
|
|
||||||
n = 0; \
|
|
||||||
do { \
|
|
||||||
if((p) >= (p_limit)) break; \
|
|
||||||
n = (n << 7) | (*(p) & 0x7f); \
|
|
||||||
} while((*((p)++)&0x80) && (n<(1<<25)));
|
|
||||||
|
|
||||||
|
|
||||||
/* n : unsigned
|
|
||||||
* p : unsigned char *
|
|
||||||
*/
|
|
||||||
#define CODELENGTH(n, p) if(n>=268435456) *(p++) = (n >> 28) | 0x80; \
|
|
||||||
if(n>=2097152) *(p++) = (n >> 21) | 0x80; \
|
|
||||||
if(n>=16384) *(p++) = (n >> 14) | 0x80; \
|
|
||||||
if(n>=128) *(p++) = (n >> 7) | 0x80; \
|
|
||||||
*(p++) = n & 0x7f;
|
|
||||||
|
|
||||||
#endif /* CODELENGTH_H_INCLUDED */
|
|
261
Externals/miniupnpc/src/connecthostport.c
vendored
261
Externals/miniupnpc/src/connecthostport.c
vendored
@ -1,261 +0,0 @@
|
|||||||
/* $Id: connecthostport.c,v 1.13 2014/03/31 12:36:36 nanard Exp $ */
|
|
||||||
/* Project : miniupnp
|
|
||||||
* Author : Thomas Bernard
|
|
||||||
* Copyright (c) 2010-2014 Thomas Bernard
|
|
||||||
* This software is subject to the conditions detailed in the
|
|
||||||
* LICENCE file provided in this distribution. */
|
|
||||||
|
|
||||||
/* use getaddrinfo() or gethostbyname()
|
|
||||||
* uncomment the following line in order to use gethostbyname() */
|
|
||||||
#ifdef NO_GETADDRINFO
|
|
||||||
#define USE_GETHOSTBYNAME
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <winsock2.h>
|
|
||||||
#include <ws2tcpip.h>
|
|
||||||
#include <io.h>
|
|
||||||
#define MAXHOSTNAMELEN 64
|
|
||||||
#define snprintf _snprintf
|
|
||||||
#define herror
|
|
||||||
#define socklen_t int
|
|
||||||
#else /* #ifdef _WIN32 */
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/select.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#define closesocket close
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
/* defining MINIUPNPC_IGNORE_EINTR enable the ignore of interruptions
|
|
||||||
* during the connect() call */
|
|
||||||
#define MINIUPNPC_IGNORE_EINTR
|
|
||||||
#ifndef USE_GETHOSTBYNAME
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/select.h>
|
|
||||||
#endif /* #ifndef USE_GETHOSTBYNAME */
|
|
||||||
#endif /* #else _WIN32 */
|
|
||||||
|
|
||||||
/* definition of PRINT_SOCKET_ERROR */
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define PRINT_SOCKET_ERROR(x) printf("Socket error: %s, %d\n", x, WSAGetLastError());
|
|
||||||
#else
|
|
||||||
#define PRINT_SOCKET_ERROR(x) perror(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__amigaos__) || defined(__amigaos4__)
|
|
||||||
#define herror(A) printf("%s\n", A)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "connecthostport.h"
|
|
||||||
|
|
||||||
#ifndef MAXHOSTNAMELEN
|
|
||||||
#define MAXHOSTNAMELEN 64
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* connecthostport()
|
|
||||||
* return a socket connected (TCP) to the host and port
|
|
||||||
* or -1 in case of error */
|
|
||||||
int connecthostport(const char * host, unsigned short port,
|
|
||||||
unsigned int scope_id)
|
|
||||||
{
|
|
||||||
int s, n;
|
|
||||||
#ifdef USE_GETHOSTBYNAME
|
|
||||||
struct sockaddr_in dest;
|
|
||||||
struct hostent *hp;
|
|
||||||
#else /* #ifdef USE_GETHOSTBYNAME */
|
|
||||||
char tmp_host[MAXHOSTNAMELEN+1];
|
|
||||||
char port_str[8];
|
|
||||||
struct addrinfo *ai, *p;
|
|
||||||
struct addrinfo hints;
|
|
||||||
#endif /* #ifdef USE_GETHOSTBYNAME */
|
|
||||||
#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
|
|
||||||
struct timeval timeout;
|
|
||||||
#endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */
|
|
||||||
|
|
||||||
#ifdef USE_GETHOSTBYNAME
|
|
||||||
hp = gethostbyname(host);
|
|
||||||
if(hp == NULL)
|
|
||||||
{
|
|
||||||
herror(host);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
memcpy(&dest.sin_addr, hp->h_addr, sizeof(dest.sin_addr));
|
|
||||||
memset(dest.sin_zero, 0, sizeof(dest.sin_zero));
|
|
||||||
s = socket(PF_INET, SOCK_STREAM, 0);
|
|
||||||
if(s < 0)
|
|
||||||
{
|
|
||||||
PRINT_SOCKET_ERROR("socket");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
|
|
||||||
/* setting a 3 seconds timeout for the connect() call */
|
|
||||||
timeout.tv_sec = 3;
|
|
||||||
timeout.tv_usec = 0;
|
|
||||||
if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)) < 0)
|
|
||||||
{
|
|
||||||
PRINT_SOCKET_ERROR("setsockopt");
|
|
||||||
}
|
|
||||||
timeout.tv_sec = 3;
|
|
||||||
timeout.tv_usec = 0;
|
|
||||||
if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)) < 0)
|
|
||||||
{
|
|
||||||
PRINT_SOCKET_ERROR("setsockopt");
|
|
||||||
}
|
|
||||||
#endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */
|
|
||||||
dest.sin_family = AF_INET;
|
|
||||||
dest.sin_port = htons(port);
|
|
||||||
n = connect(s, (struct sockaddr *)&dest, sizeof(struct sockaddr_in));
|
|
||||||
#ifdef MINIUPNPC_IGNORE_EINTR
|
|
||||||
/* EINTR The system call was interrupted by a signal that was caught
|
|
||||||
* EINPROGRESS The socket is nonblocking and the connection cannot
|
|
||||||
* be completed immediately. */
|
|
||||||
while(n < 0 && (errno == EINTR || errno = EINPROGRESS))
|
|
||||||
{
|
|
||||||
socklen_t len;
|
|
||||||
fd_set wset;
|
|
||||||
int err;
|
|
||||||
FD_ZERO(&wset);
|
|
||||||
FD_SET(s, &wset);
|
|
||||||
if((n = select(s + 1, NULL, &wset, NULL, NULL)) == -1 && errno == EINTR)
|
|
||||||
continue;
|
|
||||||
/*len = 0;*/
|
|
||||||
/*n = getpeername(s, NULL, &len);*/
|
|
||||||
len = sizeof(err);
|
|
||||||
if(getsockopt(s, SOL_SOCKET, SO_ERROR, &err, &len) < 0) {
|
|
||||||
PRINT_SOCKET_ERROR("getsockopt");
|
|
||||||
closesocket(s);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if(err != 0) {
|
|
||||||
errno = err;
|
|
||||||
n = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* #ifdef MINIUPNPC_IGNORE_EINTR */
|
|
||||||
if(n<0)
|
|
||||||
{
|
|
||||||
PRINT_SOCKET_ERROR("connect");
|
|
||||||
closesocket(s);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#else /* #ifdef USE_GETHOSTBYNAME */
|
|
||||||
/* use getaddrinfo() instead of gethostbyname() */
|
|
||||||
memset(&hints, 0, sizeof(hints));
|
|
||||||
/* hints.ai_flags = AI_ADDRCONFIG; */
|
|
||||||
#ifdef AI_NUMERICSERV
|
|
||||||
hints.ai_flags = AI_NUMERICSERV;
|
|
||||||
#endif
|
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
|
||||||
hints.ai_family = AF_UNSPEC; /* AF_INET, AF_INET6 or AF_UNSPEC */
|
|
||||||
/* hints.ai_protocol = IPPROTO_TCP; */
|
|
||||||
snprintf(port_str, sizeof(port_str), "%hu", port);
|
|
||||||
if(host[0] == '[')
|
|
||||||
{
|
|
||||||
/* literal ip v6 address */
|
|
||||||
int i, j;
|
|
||||||
for(i = 0, j = 1; host[j] && (host[j] != ']') && i < MAXHOSTNAMELEN; i++, j++)
|
|
||||||
{
|
|
||||||
tmp_host[i] = host[j];
|
|
||||||
if(0 == memcmp(host+j, "%25", 3)) /* %25 is just url encoding for '%' */
|
|
||||||
j+=2; /* skip "25" */
|
|
||||||
}
|
|
||||||
tmp_host[i] = '\0';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
strncpy(tmp_host, host, MAXHOSTNAMELEN);
|
|
||||||
}
|
|
||||||
tmp_host[MAXHOSTNAMELEN] = '\0';
|
|
||||||
n = getaddrinfo(tmp_host, port_str, &hints, &ai);
|
|
||||||
if(n != 0)
|
|
||||||
{
|
|
||||||
#ifdef _WIN32
|
|
||||||
fprintf(stderr, "getaddrinfo() error : %d\n", n);
|
|
||||||
#else
|
|
||||||
fprintf(stderr, "getaddrinfo() error : %s\n", gai_strerror(n));
|
|
||||||
#endif
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
s = -1;
|
|
||||||
for(p = ai; p; p = p->ai_next)
|
|
||||||
{
|
|
||||||
s = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
|
|
||||||
if(s < 0)
|
|
||||||
continue;
|
|
||||||
if(p->ai_addr->sa_family == AF_INET6 && scope_id > 0) {
|
|
||||||
struct sockaddr_in6 * addr6 = (struct sockaddr_in6 *)p->ai_addr;
|
|
||||||
addr6->sin6_scope_id = scope_id;
|
|
||||||
}
|
|
||||||
#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
|
|
||||||
/* setting a 3 seconds timeout for the connect() call */
|
|
||||||
timeout.tv_sec = 3;
|
|
||||||
timeout.tv_usec = 0;
|
|
||||||
if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)) < 0)
|
|
||||||
{
|
|
||||||
PRINT_SOCKET_ERROR("setsockopt");
|
|
||||||
}
|
|
||||||
timeout.tv_sec = 3;
|
|
||||||
timeout.tv_usec = 0;
|
|
||||||
if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)) < 0)
|
|
||||||
{
|
|
||||||
PRINT_SOCKET_ERROR("setsockopt");
|
|
||||||
}
|
|
||||||
#endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */
|
|
||||||
n = connect(s, p->ai_addr, p->ai_addrlen);
|
|
||||||
#ifdef MINIUPNPC_IGNORE_EINTR
|
|
||||||
/* EINTR The system call was interrupted by a signal that was caught
|
|
||||||
* EINPROGRESS The socket is nonblocking and the connection cannot
|
|
||||||
* be completed immediately. */
|
|
||||||
while(n < 0 && (errno == EINTR || errno == EINPROGRESS))
|
|
||||||
{
|
|
||||||
socklen_t len;
|
|
||||||
fd_set wset;
|
|
||||||
int err;
|
|
||||||
FD_ZERO(&wset);
|
|
||||||
FD_SET(s, &wset);
|
|
||||||
if((n = select(s + 1, NULL, &wset, NULL, NULL)) == -1 && errno == EINTR)
|
|
||||||
continue;
|
|
||||||
/*len = 0;*/
|
|
||||||
/*n = getpeername(s, NULL, &len);*/
|
|
||||||
len = sizeof(err);
|
|
||||||
if(getsockopt(s, SOL_SOCKET, SO_ERROR, &err, &len) < 0) {
|
|
||||||
PRINT_SOCKET_ERROR("getsockopt");
|
|
||||||
closesocket(s);
|
|
||||||
freeaddrinfo(ai);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if(err != 0) {
|
|
||||||
errno = err;
|
|
||||||
n = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* #ifdef MINIUPNPC_IGNORE_EINTR */
|
|
||||||
if(n < 0)
|
|
||||||
{
|
|
||||||
closesocket(s);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
freeaddrinfo(ai);
|
|
||||||
if(s < 0)
|
|
||||||
{
|
|
||||||
PRINT_SOCKET_ERROR("socket");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if(n < 0)
|
|
||||||
{
|
|
||||||
PRINT_SOCKET_ERROR("connect");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#endif /* #ifdef USE_GETHOSTBYNAME */
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
18
Externals/miniupnpc/src/connecthostport.h
vendored
18
Externals/miniupnpc/src/connecthostport.h
vendored
@ -1,18 +0,0 @@
|
|||||||
/* $Id: connecthostport.h,v 1.2 2012/06/23 22:32:33 nanard Exp $ */
|
|
||||||
/* Project: miniupnp
|
|
||||||
* http://miniupnp.free.fr/
|
|
||||||
* Author: Thomas Bernard
|
|
||||||
* Copyright (c) 2010-2012 Thomas Bernard
|
|
||||||
* This software is subjects to the conditions detailed
|
|
||||||
* in the LICENCE file provided within this distribution */
|
|
||||||
#ifndef CONNECTHOSTPORT_H_INCLUDED
|
|
||||||
#define CONNECTHOSTPORT_H_INCLUDED
|
|
||||||
|
|
||||||
/* connecthostport()
|
|
||||||
* return a socket connected (TCP) to the host and port
|
|
||||||
* or -1 in case of error */
|
|
||||||
int connecthostport(const char * host, unsigned short port,
|
|
||||||
unsigned int scope_id);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
123
Externals/miniupnpc/src/igd_desc_parse.c
vendored
123
Externals/miniupnpc/src/igd_desc_parse.c
vendored
@ -1,123 +0,0 @@
|
|||||||
/* $Id: igd_desc_parse.c,v 1.17 2015/09/15 13:30:04 nanard Exp $ */
|
|
||||||
/* Project : miniupnp
|
|
||||||
* http://miniupnp.free.fr/
|
|
||||||
* Author : Thomas Bernard
|
|
||||||
* Copyright (c) 2005-2015 Thomas Bernard
|
|
||||||
* This software is subject to the conditions detailed in the
|
|
||||||
* LICENCE file provided in this distribution. */
|
|
||||||
|
|
||||||
#include "igd_desc_parse.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/* Start element handler :
|
|
||||||
* update nesting level counter and copy element name */
|
|
||||||
void IGDstartelt(void * d, const char * name, int l)
|
|
||||||
{
|
|
||||||
struct IGDdatas * datas = (struct IGDdatas *)d;
|
|
||||||
if(l >= MINIUPNPC_URL_MAXSIZE)
|
|
||||||
l = MINIUPNPC_URL_MAXSIZE-1;
|
|
||||||
memcpy(datas->cureltname, name, l);
|
|
||||||
datas->cureltname[l] = '\0';
|
|
||||||
datas->level++;
|
|
||||||
if( (l==7) && !memcmp(name, "service", l) ) {
|
|
||||||
datas->tmp.controlurl[0] = '\0';
|
|
||||||
datas->tmp.eventsuburl[0] = '\0';
|
|
||||||
datas->tmp.scpdurl[0] = '\0';
|
|
||||||
datas->tmp.servicetype[0] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define COMPARE(str, cstr) (0==memcmp(str, cstr, sizeof(cstr) - 1))
|
|
||||||
|
|
||||||
/* End element handler :
|
|
||||||
* update nesting level counter and update parser state if
|
|
||||||
* service element is parsed */
|
|
||||||
void IGDendelt(void * d, const char * name, int l)
|
|
||||||
{
|
|
||||||
struct IGDdatas * datas = (struct IGDdatas *)d;
|
|
||||||
datas->level--;
|
|
||||||
/*printf("endelt %2d %.*s\n", datas->level, l, name);*/
|
|
||||||
if( (l==7) && !memcmp(name, "service", l) )
|
|
||||||
{
|
|
||||||
if(COMPARE(datas->tmp.servicetype,
|
|
||||||
"urn:schemas-upnp-org:service:WANCommonInterfaceConfig:")) {
|
|
||||||
memcpy(&datas->CIF, &datas->tmp, sizeof(struct IGDdatas_service));
|
|
||||||
} else if(COMPARE(datas->tmp.servicetype,
|
|
||||||
"urn:schemas-upnp-org:service:WANIPv6FirewallControl:")) {
|
|
||||||
memcpy(&datas->IPv6FC, &datas->tmp, sizeof(struct IGDdatas_service));
|
|
||||||
} else if(COMPARE(datas->tmp.servicetype,
|
|
||||||
"urn:schemas-upnp-org:service:WANIPConnection:")
|
|
||||||
|| COMPARE(datas->tmp.servicetype,
|
|
||||||
"urn:schemas-upnp-org:service:WANPPPConnection:") ) {
|
|
||||||
if(datas->first.servicetype[0] == '\0') {
|
|
||||||
memcpy(&datas->first, &datas->tmp, sizeof(struct IGDdatas_service));
|
|
||||||
} else {
|
|
||||||
memcpy(&datas->second, &datas->tmp, sizeof(struct IGDdatas_service));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Data handler :
|
|
||||||
* copy data depending on the current element name and state */
|
|
||||||
void IGDdata(void * d, const char * data, int l)
|
|
||||||
{
|
|
||||||
struct IGDdatas * datas = (struct IGDdatas *)d;
|
|
||||||
char * dstmember = 0;
|
|
||||||
/*printf("%2d %s : %.*s\n",
|
|
||||||
datas->level, datas->cureltname, l, data); */
|
|
||||||
if( !strcmp(datas->cureltname, "URLBase") )
|
|
||||||
dstmember = datas->urlbase;
|
|
||||||
else if( !strcmp(datas->cureltname, "presentationURL") )
|
|
||||||
dstmember = datas->presentationurl;
|
|
||||||
else if( !strcmp(datas->cureltname, "serviceType") )
|
|
||||||
dstmember = datas->tmp.servicetype;
|
|
||||||
else if( !strcmp(datas->cureltname, "controlURL") )
|
|
||||||
dstmember = datas->tmp.controlurl;
|
|
||||||
else if( !strcmp(datas->cureltname, "eventSubURL") )
|
|
||||||
dstmember = datas->tmp.eventsuburl;
|
|
||||||
else if( !strcmp(datas->cureltname, "SCPDURL") )
|
|
||||||
dstmember = datas->tmp.scpdurl;
|
|
||||||
/* else if( !strcmp(datas->cureltname, "deviceType") )
|
|
||||||
dstmember = datas->devicetype_tmp;*/
|
|
||||||
if(dstmember)
|
|
||||||
{
|
|
||||||
if(l>=MINIUPNPC_URL_MAXSIZE)
|
|
||||||
l = MINIUPNPC_URL_MAXSIZE-1;
|
|
||||||
memcpy(dstmember, data, l);
|
|
||||||
dstmember[l] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
void printIGD(struct IGDdatas * d)
|
|
||||||
{
|
|
||||||
printf("urlbase = '%s'\n", d->urlbase);
|
|
||||||
printf("WAN Device (Common interface config) :\n");
|
|
||||||
/*printf(" deviceType = '%s'\n", d->CIF.devicetype);*/
|
|
||||||
printf(" serviceType = '%s'\n", d->CIF.servicetype);
|
|
||||||
printf(" controlURL = '%s'\n", d->CIF.controlurl);
|
|
||||||
printf(" eventSubURL = '%s'\n", d->CIF.eventsuburl);
|
|
||||||
printf(" SCPDURL = '%s'\n", d->CIF.scpdurl);
|
|
||||||
printf("primary WAN Connection Device (IP or PPP Connection):\n");
|
|
||||||
/*printf(" deviceType = '%s'\n", d->first.devicetype);*/
|
|
||||||
printf(" servicetype = '%s'\n", d->first.servicetype);
|
|
||||||
printf(" controlURL = '%s'\n", d->first.controlurl);
|
|
||||||
printf(" eventSubURL = '%s'\n", d->first.eventsuburl);
|
|
||||||
printf(" SCPDURL = '%s'\n", d->first.scpdurl);
|
|
||||||
printf("secondary WAN Connection Device (IP or PPP Connection):\n");
|
|
||||||
/*printf(" deviceType = '%s'\n", d->second.devicetype);*/
|
|
||||||
printf(" servicetype = '%s'\n", d->second.servicetype);
|
|
||||||
printf(" controlURL = '%s'\n", d->second.controlurl);
|
|
||||||
printf(" eventSubURL = '%s'\n", d->second.eventsuburl);
|
|
||||||
printf(" SCPDURL = '%s'\n", d->second.scpdurl);
|
|
||||||
printf("WAN IPv6 Firewall Control :\n");
|
|
||||||
/*printf(" deviceType = '%s'\n", d->IPv6FC.devicetype);*/
|
|
||||||
printf(" servicetype = '%s'\n", d->IPv6FC.servicetype);
|
|
||||||
printf(" controlURL = '%s'\n", d->IPv6FC.controlurl);
|
|
||||||
printf(" eventSubURL = '%s'\n", d->IPv6FC.eventsuburl);
|
|
||||||
printf(" SCPDURL = '%s'\n", d->IPv6FC.scpdurl);
|
|
||||||
}
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
49
Externals/miniupnpc/src/igd_desc_parse.h
vendored
49
Externals/miniupnpc/src/igd_desc_parse.h
vendored
@ -1,49 +0,0 @@
|
|||||||
/* $Id: igd_desc_parse.h,v 1.12 2014/11/17 17:19:13 nanard Exp $ */
|
|
||||||
/* Project : miniupnp
|
|
||||||
* http://miniupnp.free.fr/
|
|
||||||
* Author : Thomas Bernard
|
|
||||||
* Copyright (c) 2005-2014 Thomas Bernard
|
|
||||||
* This software is subject to the conditions detailed in the
|
|
||||||
* LICENCE file provided in this distribution.
|
|
||||||
* */
|
|
||||||
#ifndef IGD_DESC_PARSE_H_INCLUDED
|
|
||||||
#define IGD_DESC_PARSE_H_INCLUDED
|
|
||||||
|
|
||||||
/* Structure to store the result of the parsing of UPnP
|
|
||||||
* descriptions of Internet Gateway Devices */
|
|
||||||
#define MINIUPNPC_URL_MAXSIZE (128)
|
|
||||||
struct IGDdatas_service {
|
|
||||||
char controlurl[MINIUPNPC_URL_MAXSIZE];
|
|
||||||
char eventsuburl[MINIUPNPC_URL_MAXSIZE];
|
|
||||||
char scpdurl[MINIUPNPC_URL_MAXSIZE];
|
|
||||||
char servicetype[MINIUPNPC_URL_MAXSIZE];
|
|
||||||
/*char devicetype[MINIUPNPC_URL_MAXSIZE];*/
|
|
||||||
};
|
|
||||||
|
|
||||||
struct IGDdatas {
|
|
||||||
char cureltname[MINIUPNPC_URL_MAXSIZE];
|
|
||||||
char urlbase[MINIUPNPC_URL_MAXSIZE];
|
|
||||||
char presentationurl[MINIUPNPC_URL_MAXSIZE];
|
|
||||||
int level;
|
|
||||||
/*int state;*/
|
|
||||||
/* "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1" */
|
|
||||||
struct IGDdatas_service CIF;
|
|
||||||
/* "urn:schemas-upnp-org:service:WANIPConnection:1"
|
|
||||||
* "urn:schemas-upnp-org:service:WANPPPConnection:1" */
|
|
||||||
struct IGDdatas_service first;
|
|
||||||
/* if both WANIPConnection and WANPPPConnection are present */
|
|
||||||
struct IGDdatas_service second;
|
|
||||||
/* "urn:schemas-upnp-org:service:WANIPv6FirewallControl:1" */
|
|
||||||
struct IGDdatas_service IPv6FC;
|
|
||||||
/* tmp */
|
|
||||||
struct IGDdatas_service tmp;
|
|
||||||
};
|
|
||||||
|
|
||||||
void IGDstartelt(void *, const char *, int);
|
|
||||||
void IGDendelt(void *, const char *, int);
|
|
||||||
void IGDdata(void *, const char *, int);
|
|
||||||
#ifdef DEBUG
|
|
||||||
void printIGD(struct IGDdatas *);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
#endif /* IGD_DESC_PARSE_H_INCLUDED */
|
|
121
Externals/miniupnpc/src/minisoap.c
vendored
121
Externals/miniupnpc/src/minisoap.c
vendored
@ -1,121 +0,0 @@
|
|||||||
/* $Id: minisoap.c,v 1.23 2014/11/04 22:31:55 nanard Exp $ */
|
|
||||||
/* Project : miniupnp
|
|
||||||
* Author : Thomas Bernard
|
|
||||||
* Copyright (c) 2005-2014 Thomas Bernard
|
|
||||||
* This software is subject to the conditions detailed in the
|
|
||||||
* LICENCE file provided in this distribution.
|
|
||||||
*
|
|
||||||
* Minimal SOAP implementation for UPnP protocol.
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <io.h>
|
|
||||||
#include <winsock2.h>
|
|
||||||
#define snprintf _snprintf
|
|
||||||
#else
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#endif
|
|
||||||
#include "minisoap.h"
|
|
||||||
#include "miniupnpcstrings.h"
|
|
||||||
|
|
||||||
/* only for malloc */
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define PRINT_SOCKET_ERROR(x) printf("Socket error: %s, %d\n", x, WSAGetLastError());
|
|
||||||
#else
|
|
||||||
#define PRINT_SOCKET_ERROR(x) perror(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* httpWrite sends the headers and the body to the socket
|
|
||||||
* and returns the number of bytes sent */
|
|
||||||
static int
|
|
||||||
httpWrite(int fd, const char * body, int bodysize,
|
|
||||||
const char * headers, int headerssize)
|
|
||||||
{
|
|
||||||
int n = 0;
|
|
||||||
/*n = write(fd, headers, headerssize);*/
|
|
||||||
/*if(bodysize>0)
|
|
||||||
n += write(fd, body, bodysize);*/
|
|
||||||
/* Note : my old linksys router only took into account
|
|
||||||
* soap request that are sent into only one packet */
|
|
||||||
char * p;
|
|
||||||
/* TODO: AVOID MALLOC */
|
|
||||||
p = malloc(headerssize+bodysize);
|
|
||||||
if(!p)
|
|
||||||
return 0;
|
|
||||||
memcpy(p, headers, headerssize);
|
|
||||||
memcpy(p+headerssize, body, bodysize);
|
|
||||||
/*n = write(fd, p, headerssize+bodysize);*/
|
|
||||||
n = send(fd, p, headerssize+bodysize, 0);
|
|
||||||
if(n<0) {
|
|
||||||
PRINT_SOCKET_ERROR("send");
|
|
||||||
}
|
|
||||||
/* disable send on the socket */
|
|
||||||
/* draytek routers dont seems to like that... */
|
|
||||||
#if 0
|
|
||||||
#ifdef _WIN32
|
|
||||||
if(shutdown(fd, SD_SEND)<0) {
|
|
||||||
#else
|
|
||||||
if(shutdown(fd, SHUT_WR)<0) { /*SD_SEND*/
|
|
||||||
#endif
|
|
||||||
PRINT_SOCKET_ERROR("shutdown");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
free(p);
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* self explanatory */
|
|
||||||
int soapPostSubmit(int fd,
|
|
||||||
const char * url,
|
|
||||||
const char * host,
|
|
||||||
unsigned short port,
|
|
||||||
const char * action,
|
|
||||||
const char * body,
|
|
||||||
const char * httpversion)
|
|
||||||
{
|
|
||||||
int bodysize;
|
|
||||||
char headerbuf[512];
|
|
||||||
int headerssize;
|
|
||||||
char portstr[8];
|
|
||||||
bodysize = (int)strlen(body);
|
|
||||||
/* We are not using keep-alive HTTP connections.
|
|
||||||
* HTTP/1.1 needs the header Connection: close to do that.
|
|
||||||
* This is the default with HTTP/1.0
|
|
||||||
* Using HTTP/1.1 means we need to support chunked transfer-encoding :
|
|
||||||
* When using HTTP/1.1, the router "BiPAC 7404VNOX" always use chunked
|
|
||||||
* transfer encoding. */
|
|
||||||
/* Connection: Close is normally there only in HTTP/1.1 but who knows */
|
|
||||||
portstr[0] = '\0';
|
|
||||||
if(port != 80)
|
|
||||||
snprintf(portstr, sizeof(portstr), ":%hu", port);
|
|
||||||
headerssize = snprintf(headerbuf, sizeof(headerbuf),
|
|
||||||
"POST %s HTTP/%s\r\n"
|
|
||||||
"Host: %s%s\r\n"
|
|
||||||
"User-Agent: " OS_STRING ", " UPNP_VERSION_STRING ", MiniUPnPc/" MINIUPNPC_VERSION_STRING "\r\n"
|
|
||||||
"Content-Length: %d\r\n"
|
|
||||||
"Content-Type: text/xml\r\n"
|
|
||||||
"SOAPAction: \"%s\"\r\n"
|
|
||||||
"Connection: Close\r\n"
|
|
||||||
"Cache-Control: no-cache\r\n" /* ??? */
|
|
||||||
"Pragma: no-cache\r\n"
|
|
||||||
"\r\n",
|
|
||||||
url, httpversion, host, portstr, bodysize, action);
|
|
||||||
#ifdef DEBUG
|
|
||||||
/*printf("SOAP request : headersize=%d bodysize=%d\n",
|
|
||||||
headerssize, bodysize);
|
|
||||||
*/
|
|
||||||
printf("SOAP request : POST %s HTTP/%s - Host: %s%s\n",
|
|
||||||
url, httpversion, host, portstr);
|
|
||||||
printf("SOAPAction: \"%s\" - Content-Length: %d\n", action, bodysize);
|
|
||||||
printf("Headers :\n%s", headerbuf);
|
|
||||||
printf("Body :\n%s\n", body);
|
|
||||||
#endif
|
|
||||||
return httpWrite(fd, body, bodysize, headerbuf, headerssize);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
15
Externals/miniupnpc/src/minisoap.h
vendored
15
Externals/miniupnpc/src/minisoap.h
vendored
@ -1,15 +0,0 @@
|
|||||||
/* $Id: minisoap.h,v 1.4 2010/04/12 20:39:41 nanard Exp $ */
|
|
||||||
/* Project : miniupnp
|
|
||||||
* Author : Thomas Bernard
|
|
||||||
* Copyright (c) 2005 Thomas Bernard
|
|
||||||
* This software is subject to the conditions detailed in the
|
|
||||||
* LICENCE file provided in this distribution. */
|
|
||||||
#ifndef MINISOAP_H_INCLUDED
|
|
||||||
#define MINISOAP_H_INCLUDED
|
|
||||||
|
|
||||||
/*int httpWrite(int, const char *, int, const char *);*/
|
|
||||||
int soapPostSubmit(int, const char *, const char *, unsigned short,
|
|
||||||
const char *, const char *, const char *);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
840
Externals/miniupnpc/src/minissdpc.c
vendored
840
Externals/miniupnpc/src/minissdpc.c
vendored
@ -1,840 +0,0 @@
|
|||||||
/* $Id: minissdpc.c,v 1.28 2015/09/18 13:05:39 nanard Exp $ */
|
|
||||||
/* Project : miniupnp
|
|
||||||
* Web : http://miniupnp.free.fr/
|
|
||||||
* Author : Thomas BERNARD
|
|
||||||
* copyright (c) 2005-2015 Thomas Bernard
|
|
||||||
* This software is subjet to the conditions detailed in the
|
|
||||||
* provided LICENCE file. */
|
|
||||||
/*#include <syslog.h>*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#if defined(_WIN32) || defined(__amigaos__) || defined(__amigaos4__)
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <winsock2.h>
|
|
||||||
#include <ws2tcpip.h>
|
|
||||||
#include <io.h>
|
|
||||||
#include <iphlpapi.h>
|
|
||||||
#include <winsock.h>
|
|
||||||
#define snprintf _snprintf
|
|
||||||
#if !defined(_MSC_VER)
|
|
||||||
#include <stdint.h>
|
|
||||||
#else /* !defined(_MSC_VER) */
|
|
||||||
typedef unsigned short uint16_t;
|
|
||||||
#endif /* !defined(_MSC_VER) */
|
|
||||||
#ifndef strncasecmp
|
|
||||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
|
||||||
#define strncasecmp _memicmp
|
|
||||||
#else /* defined(_MSC_VER) && (_MSC_VER >= 1400) */
|
|
||||||
#define strncasecmp memicmp
|
|
||||||
#endif /* defined(_MSC_VER) && (_MSC_VER >= 1400) */
|
|
||||||
#endif /* #ifndef strncasecmp */
|
|
||||||
#endif /* _WIN32 */
|
|
||||||
#if defined(__amigaos__) || defined(__amigaos4__)
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#endif /* defined(__amigaos__) || defined(__amigaos4__) */
|
|
||||||
#if defined(__amigaos__)
|
|
||||||
#define uint16_t unsigned short
|
|
||||||
#endif /* defined(__amigaos__) */
|
|
||||||
/* Hack */
|
|
||||||
#define UNIX_PATH_LEN 108
|
|
||||||
struct sockaddr_un {
|
|
||||||
uint16_t sun_family;
|
|
||||||
char sun_path[UNIX_PATH_LEN];
|
|
||||||
};
|
|
||||||
#else /* defined(_WIN32) || defined(__amigaos__) || defined(__amigaos4__) */
|
|
||||||
#include <strings.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/un.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#define closesocket close
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define PRINT_SOCKET_ERROR(x) printf("Socket error: %s, %d\n", x, WSAGetLastError());
|
|
||||||
#else
|
|
||||||
#define PRINT_SOCKET_ERROR(x) perror(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__DragonFly__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__APPLE__) && !defined(_WIN32) && !defined(__CYGWIN__) && !defined(__sun) && !defined(__GNU__) && !defined(__FreeBSD_kernel__)
|
|
||||||
#define HAS_IP_MREQN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(HAS_IP_MREQN) && defined(NEED_STRUCT_IP_MREQN)
|
|
||||||
/* Several versions of glibc don't define this structure,
|
|
||||||
* define it here and compile with CFLAGS NEED_STRUCT_IP_MREQN */
|
|
||||||
struct ip_mreqn
|
|
||||||
{
|
|
||||||
struct in_addr imr_multiaddr; /* IP multicast address of group */
|
|
||||||
struct in_addr imr_address; /* local IP address of interface */
|
|
||||||
int imr_ifindex; /* Interface index */
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__amigaos__) || defined(__amigaos4__)
|
|
||||||
/* Amiga OS specific stuff */
|
|
||||||
#define TIMEVAL struct timeval
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "minissdpc.h"
|
|
||||||
#include "receivedata.h"
|
|
||||||
|
|
||||||
#if !(defined(_WIN32) || defined(__amigaos__) || defined(__amigaos4__))
|
|
||||||
|
|
||||||
#include "codelength.h"
|
|
||||||
|
|
||||||
struct UPNPDev *
|
|
||||||
getDevicesFromMiniSSDPD(const char * devtype, const char * socketpath, int * error)
|
|
||||||
{
|
|
||||||
struct UPNPDev * devlist = NULL;
|
|
||||||
int s;
|
|
||||||
int res;
|
|
||||||
|
|
||||||
s = connectToMiniSSDPD(socketpath);
|
|
||||||
if (s < 0) {
|
|
||||||
if (error)
|
|
||||||
*error = s;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
res = requestDevicesFromMiniSSDPD(s, devtype);
|
|
||||||
if (res < 0) {
|
|
||||||
if (error)
|
|
||||||
*error = res;
|
|
||||||
} else {
|
|
||||||
devlist = receiveDevicesFromMiniSSDPD(s, error);
|
|
||||||
}
|
|
||||||
disconnectFromMiniSSDPD(s);
|
|
||||||
return devlist;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* macros used to read from unix socket */
|
|
||||||
#define READ_BYTE_BUFFER(c) \
|
|
||||||
if((int)bufferindex >= n) { \
|
|
||||||
n = read(s, buffer, sizeof(buffer)); \
|
|
||||||
if(n<=0) break; \
|
|
||||||
bufferindex = 0; \
|
|
||||||
} \
|
|
||||||
c = buffer[bufferindex++];
|
|
||||||
|
|
||||||
#ifndef MIN
|
|
||||||
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
|
||||||
#endif /* MIN */
|
|
||||||
|
|
||||||
#define READ_COPY_BUFFER(dst, len) \
|
|
||||||
for(l = len, p = (unsigned char *)dst; l > 0; ) { \
|
|
||||||
unsigned int lcopy; \
|
|
||||||
if((int)bufferindex >= n) { \
|
|
||||||
n = read(s, buffer, sizeof(buffer)); \
|
|
||||||
if(n<=0) break; \
|
|
||||||
bufferindex = 0; \
|
|
||||||
} \
|
|
||||||
lcopy = MIN(l, (n - bufferindex)); \
|
|
||||||
memcpy(p, buffer + bufferindex, lcopy); \
|
|
||||||
l -= lcopy; \
|
|
||||||
p += lcopy; \
|
|
||||||
bufferindex += lcopy; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define READ_DISCARD_BUFFER(len) \
|
|
||||||
for(l = len; l > 0; ) { \
|
|
||||||
unsigned int lcopy; \
|
|
||||||
if(bufferindex >= n) { \
|
|
||||||
n = read(s, buffer, sizeof(buffer)); \
|
|
||||||
if(n<=0) break; \
|
|
||||||
bufferindex = 0; \
|
|
||||||
} \
|
|
||||||
lcopy = MIN(l, (n - bufferindex)); \
|
|
||||||
l -= lcopy; \
|
|
||||||
bufferindex += lcopy; \
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
connectToMiniSSDPD(const char * socketpath)
|
|
||||||
{
|
|
||||||
int s;
|
|
||||||
struct sockaddr_un addr;
|
|
||||||
#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
|
|
||||||
struct timeval timeout;
|
|
||||||
#endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */
|
|
||||||
|
|
||||||
s = socket(AF_UNIX, SOCK_STREAM, 0);
|
|
||||||
if(s < 0)
|
|
||||||
{
|
|
||||||
/*syslog(LOG_ERR, "socket(unix): %m");*/
|
|
||||||
perror("socket(unix)");
|
|
||||||
return MINISSDPC_SOCKET_ERROR;
|
|
||||||
}
|
|
||||||
#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
|
|
||||||
/* setting a 3 seconds timeout */
|
|
||||||
timeout.tv_sec = 3;
|
|
||||||
timeout.tv_usec = 0;
|
|
||||||
if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)) < 0)
|
|
||||||
{
|
|
||||||
perror("setsockopt");
|
|
||||||
}
|
|
||||||
timeout.tv_sec = 3;
|
|
||||||
timeout.tv_usec = 0;
|
|
||||||
if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)) < 0)
|
|
||||||
{
|
|
||||||
perror("setsockopt");
|
|
||||||
}
|
|
||||||
#endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */
|
|
||||||
if(!socketpath)
|
|
||||||
socketpath = "/var/run/minissdpd.sock";
|
|
||||||
addr.sun_family = AF_UNIX;
|
|
||||||
strncpy(addr.sun_path, socketpath, sizeof(addr.sun_path));
|
|
||||||
/* TODO : check if we need to handle the EINTR */
|
|
||||||
if(connect(s, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0)
|
|
||||||
{
|
|
||||||
/*syslog(LOG_WARNING, "connect(\"%s\"): %m", socketpath);*/
|
|
||||||
close(s);
|
|
||||||
return MINISSDPC_SOCKET_ERROR;
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
disconnectFromMiniSSDPD(int s)
|
|
||||||
{
|
|
||||||
if (close(s) < 0)
|
|
||||||
return MINISSDPC_SOCKET_ERROR;
|
|
||||||
return MINISSDPC_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
requestDevicesFromMiniSSDPD(int s, const char * devtype)
|
|
||||||
{
|
|
||||||
unsigned char buffer[256];
|
|
||||||
unsigned char * p;
|
|
||||||
unsigned int stsize, l;
|
|
||||||
|
|
||||||
stsize = strlen(devtype);
|
|
||||||
if(stsize == 8 && 0 == memcmp(devtype, "ssdp:all", 8))
|
|
||||||
{
|
|
||||||
buffer[0] = 3; /* request type 3 : everything */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
buffer[0] = 1; /* request type 1 : request devices/services by type */
|
|
||||||
}
|
|
||||||
p = buffer + 1;
|
|
||||||
l = stsize; CODELENGTH(l, p);
|
|
||||||
if(p + stsize > buffer + sizeof(buffer))
|
|
||||||
{
|
|
||||||
/* devtype is too long ! */
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "devtype is too long ! stsize=%u sizeof(buffer)=%u\n",
|
|
||||||
stsize, (unsigned)sizeof(buffer));
|
|
||||||
#endif /* DEBUG */
|
|
||||||
return MINISSDPC_INVALID_INPUT;
|
|
||||||
}
|
|
||||||
memcpy(p, devtype, stsize);
|
|
||||||
p += stsize;
|
|
||||||
if(write(s, buffer, p - buffer) < 0)
|
|
||||||
{
|
|
||||||
/*syslog(LOG_ERR, "write(): %m");*/
|
|
||||||
perror("minissdpc.c: write()");
|
|
||||||
return MINISSDPC_SOCKET_ERROR;
|
|
||||||
}
|
|
||||||
return MINISSDPC_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct UPNPDev *
|
|
||||||
receiveDevicesFromMiniSSDPD(int s, int * error)
|
|
||||||
{
|
|
||||||
struct UPNPDev * tmp;
|
|
||||||
struct UPNPDev * devlist = NULL;
|
|
||||||
unsigned char buffer[256];
|
|
||||||
ssize_t n;
|
|
||||||
unsigned char * p;
|
|
||||||
unsigned char * url;
|
|
||||||
unsigned char * st;
|
|
||||||
unsigned int bufferindex;
|
|
||||||
unsigned int i, ndev;
|
|
||||||
unsigned int urlsize, stsize, usnsize, l;
|
|
||||||
|
|
||||||
n = read(s, buffer, sizeof(buffer));
|
|
||||||
if(n<=0)
|
|
||||||
{
|
|
||||||
perror("minissdpc.c: read()");
|
|
||||||
if (error)
|
|
||||||
*error = MINISSDPC_SOCKET_ERROR;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
ndev = buffer[0];
|
|
||||||
bufferindex = 1;
|
|
||||||
for(i = 0; i < ndev; i++)
|
|
||||||
{
|
|
||||||
DECODELENGTH_READ(urlsize, READ_BYTE_BUFFER);
|
|
||||||
if(n<=0) {
|
|
||||||
if (error)
|
|
||||||
*error = MINISSDPC_INVALID_SERVER_REPLY;
|
|
||||||
return devlist;
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf(" urlsize=%u", urlsize);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
url = malloc(urlsize);
|
|
||||||
if(url == NULL) {
|
|
||||||
if (error)
|
|
||||||
*error = MINISSDPC_MEMORY_ERROR;
|
|
||||||
return devlist;
|
|
||||||
}
|
|
||||||
READ_COPY_BUFFER(url, urlsize);
|
|
||||||
if(n<=0) {
|
|
||||||
if (error)
|
|
||||||
*error = MINISSDPC_INVALID_SERVER_REPLY;
|
|
||||||
goto free_url_and_return;
|
|
||||||
}
|
|
||||||
DECODELENGTH_READ(stsize, READ_BYTE_BUFFER);
|
|
||||||
if(n<=0) {
|
|
||||||
if (error)
|
|
||||||
*error = MINISSDPC_INVALID_SERVER_REPLY;
|
|
||||||
goto free_url_and_return;
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf(" stsize=%u", stsize);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
st = malloc(stsize);
|
|
||||||
if (st == NULL) {
|
|
||||||
if (error)
|
|
||||||
*error = MINISSDPC_MEMORY_ERROR;
|
|
||||||
goto free_url_and_return;
|
|
||||||
}
|
|
||||||
READ_COPY_BUFFER(st, stsize);
|
|
||||||
if(n<=0) {
|
|
||||||
if (error)
|
|
||||||
*error = MINISSDPC_INVALID_SERVER_REPLY;
|
|
||||||
goto free_url_and_st_and_return;
|
|
||||||
}
|
|
||||||
DECODELENGTH_READ(usnsize, READ_BYTE_BUFFER);
|
|
||||||
if(n<=0) {
|
|
||||||
if (error)
|
|
||||||
*error = MINISSDPC_INVALID_SERVER_REPLY;
|
|
||||||
goto free_url_and_st_and_return;
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf(" usnsize=%u\n", usnsize);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
tmp = (struct UPNPDev *)malloc(sizeof(struct UPNPDev)+urlsize+stsize+usnsize);
|
|
||||||
if(tmp == NULL) {
|
|
||||||
if (error)
|
|
||||||
*error = MINISSDPC_MEMORY_ERROR;
|
|
||||||
goto free_url_and_st_and_return;
|
|
||||||
}
|
|
||||||
tmp->pNext = devlist;
|
|
||||||
tmp->descURL = tmp->buffer;
|
|
||||||
tmp->st = tmp->buffer + 1 + urlsize;
|
|
||||||
memcpy(tmp->buffer, url, urlsize);
|
|
||||||
tmp->buffer[urlsize] = '\0';
|
|
||||||
memcpy(tmp->st, st, stsize);
|
|
||||||
tmp->buffer[urlsize+1+stsize] = '\0';
|
|
||||||
free(url);
|
|
||||||
free(st);
|
|
||||||
url = NULL;
|
|
||||||
st = NULL;
|
|
||||||
tmp->usn = tmp->buffer + 1 + urlsize + 1 + stsize;
|
|
||||||
READ_COPY_BUFFER(tmp->usn, usnsize);
|
|
||||||
if(n<=0) {
|
|
||||||
if (error)
|
|
||||||
*error = MINISSDPC_INVALID_SERVER_REPLY;
|
|
||||||
goto free_tmp_and_return;
|
|
||||||
}
|
|
||||||
tmp->buffer[urlsize+1+stsize+1+usnsize] = '\0';
|
|
||||||
tmp->scope_id = 0; /* default value. scope_id is not available with MiniSSDPd */
|
|
||||||
devlist = tmp;
|
|
||||||
}
|
|
||||||
if (error)
|
|
||||||
*error = MINISSDPC_SUCCESS;
|
|
||||||
return devlist;
|
|
||||||
|
|
||||||
free_url_and_st_and_return:
|
|
||||||
free(st);
|
|
||||||
free_url_and_return:
|
|
||||||
free(url);
|
|
||||||
return devlist;
|
|
||||||
|
|
||||||
free_tmp_and_return:
|
|
||||||
free(tmp);
|
|
||||||
return devlist;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* !(defined(_WIN32) || defined(__amigaos__) || defined(__amigaos4__)) */
|
|
||||||
|
|
||||||
/* parseMSEARCHReply()
|
|
||||||
* the last 4 arguments are filled during the parsing :
|
|
||||||
* - location/locationsize : "location:" field of the SSDP reply packet
|
|
||||||
* - st/stsize : "st:" field of the SSDP reply packet.
|
|
||||||
* The strings are NOT null terminated */
|
|
||||||
static void
|
|
||||||
parseMSEARCHReply(const char * reply, int size,
|
|
||||||
const char * * location, int * locationsize,
|
|
||||||
const char * * st, int * stsize,
|
|
||||||
const char * * usn, int * usnsize)
|
|
||||||
{
|
|
||||||
int a, b, i;
|
|
||||||
i = 0;
|
|
||||||
a = i; /* start of the line */
|
|
||||||
b = 0; /* end of the "header" (position of the colon) */
|
|
||||||
while(i<size)
|
|
||||||
{
|
|
||||||
switch(reply[i])
|
|
||||||
{
|
|
||||||
case ':':
|
|
||||||
if(b==0)
|
|
||||||
{
|
|
||||||
b = i; /* end of the "header" */
|
|
||||||
/*for(j=a; j<b; j++)
|
|
||||||
{
|
|
||||||
putchar(reply[j]);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case '\x0a':
|
|
||||||
case '\x0d':
|
|
||||||
if(b!=0)
|
|
||||||
{
|
|
||||||
/*for(j=b+1; j<i; j++)
|
|
||||||
{
|
|
||||||
putchar(reply[j]);
|
|
||||||
}
|
|
||||||
putchar('\n');*/
|
|
||||||
/* skip the colon and white spaces */
|
|
||||||
do { b++; } while(reply[b]==' ');
|
|
||||||
if(0==strncasecmp(reply+a, "location", 8))
|
|
||||||
{
|
|
||||||
*location = reply+b;
|
|
||||||
*locationsize = i-b;
|
|
||||||
}
|
|
||||||
else if(0==strncasecmp(reply+a, "st", 2))
|
|
||||||
{
|
|
||||||
*st = reply+b;
|
|
||||||
*stsize = i-b;
|
|
||||||
}
|
|
||||||
else if(0==strncasecmp(reply+a, "usn", 3))
|
|
||||||
{
|
|
||||||
*usn = reply+b;
|
|
||||||
*usnsize = i-b;
|
|
||||||
}
|
|
||||||
b = 0;
|
|
||||||
}
|
|
||||||
a = i+1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* port upnp discover : SSDP protocol */
|
|
||||||
#define PORT 1900
|
|
||||||
#define XSTR(s) STR(s)
|
|
||||||
#define STR(s) #s
|
|
||||||
#define UPNP_MCAST_ADDR "239.255.255.250"
|
|
||||||
/* for IPv6 */
|
|
||||||
#define UPNP_MCAST_LL_ADDR "FF02::C" /* link-local */
|
|
||||||
#define UPNP_MCAST_SL_ADDR "FF05::C" /* site-local */
|
|
||||||
|
|
||||||
/* direct discovery if minissdpd responses are not sufficient */
|
|
||||||
/* ssdpDiscoverDevices() :
|
|
||||||
* return a chained list of all devices found or NULL if
|
|
||||||
* no devices was found.
|
|
||||||
* It is up to the caller to free the chained list
|
|
||||||
* delay is in millisecond (poll).
|
|
||||||
* UDA v1.1 says :
|
|
||||||
* The TTL for the IP packet SHOULD default to 2 and
|
|
||||||
* SHOULD be configurable. */
|
|
||||||
struct UPNPDev *
|
|
||||||
ssdpDiscoverDevices(const char * const deviceTypes[],
|
|
||||||
int delay, const char * multicastif,
|
|
||||||
int sameport,
|
|
||||||
int ipv6, unsigned char ttl,
|
|
||||||
int * error,
|
|
||||||
int searchalltypes)
|
|
||||||
{
|
|
||||||
struct UPNPDev * tmp;
|
|
||||||
struct UPNPDev * devlist = 0;
|
|
||||||
unsigned int scope_id = 0;
|
|
||||||
int opt = 1;
|
|
||||||
static const char MSearchMsgFmt[] =
|
|
||||||
"M-SEARCH * HTTP/1.1\r\n"
|
|
||||||
"HOST: %s:" XSTR(PORT) "\r\n"
|
|
||||||
"ST: %s\r\n"
|
|
||||||
"MAN: \"ssdp:discover\"\r\n"
|
|
||||||
"MX: %u\r\n"
|
|
||||||
"\r\n";
|
|
||||||
int deviceIndex;
|
|
||||||
char bufr[1536]; /* reception and emission buffer */
|
|
||||||
int sudp;
|
|
||||||
int n;
|
|
||||||
struct sockaddr_storage sockudp_r;
|
|
||||||
unsigned int mx;
|
|
||||||
#ifdef NO_GETADDRINFO
|
|
||||||
struct sockaddr_storage sockudp_w;
|
|
||||||
#else
|
|
||||||
int rv;
|
|
||||||
struct addrinfo hints, *servinfo, *p;
|
|
||||||
#endif
|
|
||||||
#ifdef _WIN32
|
|
||||||
MIB_IPFORWARDROW ip_forward;
|
|
||||||
unsigned long _ttl = (unsigned long)ttl;
|
|
||||||
#endif
|
|
||||||
int linklocal = 1;
|
|
||||||
|
|
||||||
if(error)
|
|
||||||
*error = MINISSDPC_UNKNOWN_ERROR;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
sudp = socket(ipv6 ? PF_INET6 : PF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
|
||||||
#else
|
|
||||||
sudp = socket(ipv6 ? PF_INET6 : PF_INET, SOCK_DGRAM, 0);
|
|
||||||
#endif
|
|
||||||
if(sudp < 0)
|
|
||||||
{
|
|
||||||
if(error)
|
|
||||||
*error = MINISSDPC_SOCKET_ERROR;
|
|
||||||
PRINT_SOCKET_ERROR("socket");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/* reception */
|
|
||||||
memset(&sockudp_r, 0, sizeof(struct sockaddr_storage));
|
|
||||||
if(ipv6) {
|
|
||||||
struct sockaddr_in6 * p = (struct sockaddr_in6 *)&sockudp_r;
|
|
||||||
p->sin6_family = AF_INET6;
|
|
||||||
if(sameport)
|
|
||||||
p->sin6_port = htons(PORT);
|
|
||||||
p->sin6_addr = in6addr_any; /* in6addr_any is not available with MinGW32 3.4.2 */
|
|
||||||
} else {
|
|
||||||
struct sockaddr_in * p = (struct sockaddr_in *)&sockudp_r;
|
|
||||||
p->sin_family = AF_INET;
|
|
||||||
if(sameport)
|
|
||||||
p->sin_port = htons(PORT);
|
|
||||||
p->sin_addr.s_addr = INADDR_ANY;
|
|
||||||
}
|
|
||||||
#ifdef _WIN32
|
|
||||||
/* This code could help us to use the right Network interface for
|
|
||||||
* SSDP multicast traffic */
|
|
||||||
/* Get IP associated with the index given in the ip_forward struct
|
|
||||||
* in order to give this ip to setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF) */
|
|
||||||
if(!ipv6
|
|
||||||
&& (GetBestRoute(inet_addr("223.255.255.255"), 0, &ip_forward) == NO_ERROR)) {
|
|
||||||
DWORD dwRetVal = 0;
|
|
||||||
PMIB_IPADDRTABLE pIPAddrTable;
|
|
||||||
DWORD dwSize = 0;
|
|
||||||
#ifdef DEBUG
|
|
||||||
IN_ADDR IPAddr;
|
|
||||||
#endif
|
|
||||||
int i;
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("ifIndex=%lu nextHop=%lx \n", ip_forward.dwForwardIfIndex, ip_forward.dwForwardNextHop);
|
|
||||||
#endif
|
|
||||||
pIPAddrTable = (MIB_IPADDRTABLE *) malloc(sizeof (MIB_IPADDRTABLE));
|
|
||||||
if(pIPAddrTable) {
|
|
||||||
if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
|
|
||||||
free(pIPAddrTable);
|
|
||||||
pIPAddrTable = (MIB_IPADDRTABLE *) malloc(dwSize);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(pIPAddrTable) {
|
|
||||||
dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 );
|
|
||||||
if (dwRetVal == NO_ERROR) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("\tNum Entries: %ld\n", pIPAddrTable->dwNumEntries);
|
|
||||||
#endif
|
|
||||||
for (i=0; i < (int) pIPAddrTable->dwNumEntries; i++) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("\n\tInterface Index[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwIndex);
|
|
||||||
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr;
|
|
||||||
printf("\tIP Address[%d]: \t%s\n", i, inet_ntoa(IPAddr) );
|
|
||||||
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwMask;
|
|
||||||
printf("\tSubnet Mask[%d]: \t%s\n", i, inet_ntoa(IPAddr) );
|
|
||||||
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwBCastAddr;
|
|
||||||
printf("\tBroadCast[%d]: \t%s (%ld)\n", i, inet_ntoa(IPAddr), pIPAddrTable->table[i].dwBCastAddr);
|
|
||||||
printf("\tReassembly size[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwReasmSize);
|
|
||||||
printf("\tType and State[%d]:", i);
|
|
||||||
printf("\n");
|
|
||||||
#endif
|
|
||||||
if (pIPAddrTable->table[i].dwIndex == ip_forward.dwForwardIfIndex) {
|
|
||||||
/* Set the address of this interface to be used */
|
|
||||||
struct in_addr mc_if;
|
|
||||||
memset(&mc_if, 0, sizeof(mc_if));
|
|
||||||
mc_if.s_addr = pIPAddrTable->table[i].dwAddr;
|
|
||||||
if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&mc_if, sizeof(mc_if)) < 0) {
|
|
||||||
PRINT_SOCKET_ERROR("setsockopt");
|
|
||||||
}
|
|
||||||
((struct sockaddr_in *)&sockudp_r)->sin_addr.s_addr = pIPAddrTable->table[i].dwAddr;
|
|
||||||
#ifndef DEBUG
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(pIPAddrTable);
|
|
||||||
pIPAddrTable = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* _WIN32 */
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
if (setsockopt(sudp, SOL_SOCKET, SO_REUSEADDR, (const char *)&opt, sizeof (opt)) < 0)
|
|
||||||
#else
|
|
||||||
if (setsockopt(sudp, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)) < 0)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
if(error)
|
|
||||||
*error = MINISSDPC_SOCKET_ERROR;
|
|
||||||
PRINT_SOCKET_ERROR("setsockopt(SO_REUSEADDR,...)");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_TTL, (const char *)&_ttl, sizeof(_ttl)) < 0)
|
|
||||||
#else /* _WIN32 */
|
|
||||||
if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) < 0)
|
|
||||||
#endif /* _WIN32 */
|
|
||||||
{
|
|
||||||
/* not a fatal error */
|
|
||||||
PRINT_SOCKET_ERROR("setsockopt(IP_MULTICAST_TTL,...)");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(multicastif)
|
|
||||||
{
|
|
||||||
if(ipv6) {
|
|
||||||
#if !defined(_WIN32)
|
|
||||||
/* according to MSDN, if_nametoindex() is supported since
|
|
||||||
* MS Windows Vista and MS Windows Server 2008.
|
|
||||||
* http://msdn.microsoft.com/en-us/library/bb408409%28v=vs.85%29.aspx */
|
|
||||||
unsigned int ifindex = if_nametoindex(multicastif); /* eth0, etc. */
|
|
||||||
if(setsockopt(sudp, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifindex, sizeof(ifindex)) < 0)
|
|
||||||
{
|
|
||||||
PRINT_SOCKET_ERROR("setsockopt");
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("Setting of multicast interface not supported in IPv6 under Windows.\n");
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
struct in_addr mc_if;
|
|
||||||
mc_if.s_addr = inet_addr(multicastif); /* ex: 192.168.x.x */
|
|
||||||
if(mc_if.s_addr != INADDR_NONE)
|
|
||||||
{
|
|
||||||
((struct sockaddr_in *)&sockudp_r)->sin_addr.s_addr = mc_if.s_addr;
|
|
||||||
if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&mc_if, sizeof(mc_if)) < 0)
|
|
||||||
{
|
|
||||||
PRINT_SOCKET_ERROR("setsockopt");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
#ifdef HAS_IP_MREQN
|
|
||||||
/* was not an ip address, try with an interface name */
|
|
||||||
struct ip_mreqn reqn; /* only defined with -D_BSD_SOURCE or -D_GNU_SOURCE */
|
|
||||||
memset(&reqn, 0, sizeof(struct ip_mreqn));
|
|
||||||
reqn.imr_ifindex = if_nametoindex(multicastif);
|
|
||||||
if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&reqn, sizeof(reqn)) < 0)
|
|
||||||
{
|
|
||||||
PRINT_SOCKET_ERROR("setsockopt");
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("Setting of multicast interface not supported with interface name.\n");
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Before sending the packed, we first "bind" in order to be able
|
|
||||||
* to receive the response */
|
|
||||||
if (bind(sudp, (const struct sockaddr *)&sockudp_r,
|
|
||||||
ipv6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)) != 0)
|
|
||||||
{
|
|
||||||
if(error)
|
|
||||||
*error = MINISSDPC_SOCKET_ERROR;
|
|
||||||
PRINT_SOCKET_ERROR("bind");
|
|
||||||
closesocket(sudp);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(error)
|
|
||||||
*error = MINISSDPC_SUCCESS;
|
|
||||||
/* Calculating maximum response time in seconds */
|
|
||||||
mx = ((unsigned int)delay) / 1000u;
|
|
||||||
if(mx == 0) {
|
|
||||||
mx = 1;
|
|
||||||
delay = 1000;
|
|
||||||
}
|
|
||||||
/* receiving SSDP response packet */
|
|
||||||
for(deviceIndex = 0; deviceTypes[deviceIndex]; deviceIndex++) {
|
|
||||||
/* sending the SSDP M-SEARCH packet */
|
|
||||||
n = snprintf(bufr, sizeof(bufr),
|
|
||||||
MSearchMsgFmt,
|
|
||||||
ipv6 ?
|
|
||||||
(linklocal ? "[" UPNP_MCAST_LL_ADDR "]" : "[" UPNP_MCAST_SL_ADDR "]")
|
|
||||||
: UPNP_MCAST_ADDR,
|
|
||||||
deviceTypes[deviceIndex], mx);
|
|
||||||
#ifdef DEBUG
|
|
||||||
/*printf("Sending %s", bufr);*/
|
|
||||||
printf("Sending M-SEARCH request to %s with ST: %s\n",
|
|
||||||
ipv6 ?
|
|
||||||
(linklocal ? "[" UPNP_MCAST_LL_ADDR "]" : "[" UPNP_MCAST_SL_ADDR "]")
|
|
||||||
: UPNP_MCAST_ADDR,
|
|
||||||
deviceTypes[deviceIndex]);
|
|
||||||
#endif
|
|
||||||
#ifdef NO_GETADDRINFO
|
|
||||||
/* the following code is not using getaddrinfo */
|
|
||||||
/* emission */
|
|
||||||
memset(&sockudp_w, 0, sizeof(struct sockaddr_storage));
|
|
||||||
if(ipv6) {
|
|
||||||
struct sockaddr_in6 * p = (struct sockaddr_in6 *)&sockudp_w;
|
|
||||||
p->sin6_family = AF_INET6;
|
|
||||||
p->sin6_port = htons(PORT);
|
|
||||||
inet_pton(AF_INET6,
|
|
||||||
linklocal ? UPNP_MCAST_LL_ADDR : UPNP_MCAST_SL_ADDR,
|
|
||||||
&(p->sin6_addr));
|
|
||||||
} else {
|
|
||||||
struct sockaddr_in * p = (struct sockaddr_in *)&sockudp_w;
|
|
||||||
p->sin_family = AF_INET;
|
|
||||||
p->sin_port = htons(PORT);
|
|
||||||
p->sin_addr.s_addr = inet_addr(UPNP_MCAST_ADDR);
|
|
||||||
}
|
|
||||||
n = sendto(sudp, bufr, n, 0, &sockudp_w,
|
|
||||||
ipv6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in));
|
|
||||||
if (n < 0) {
|
|
||||||
if(error)
|
|
||||||
*error = MINISSDPC_SOCKET_ERROR;
|
|
||||||
PRINT_SOCKET_ERROR("sendto");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#else /* #ifdef NO_GETADDRINFO */
|
|
||||||
memset(&hints, 0, sizeof(hints));
|
|
||||||
hints.ai_family = AF_UNSPEC; /* AF_INET6 or AF_INET */
|
|
||||||
hints.ai_socktype = SOCK_DGRAM;
|
|
||||||
/*hints.ai_flags = */
|
|
||||||
if ((rv = getaddrinfo(ipv6
|
|
||||||
? (linklocal ? UPNP_MCAST_LL_ADDR : UPNP_MCAST_SL_ADDR)
|
|
||||||
: UPNP_MCAST_ADDR,
|
|
||||||
XSTR(PORT), &hints, &servinfo)) != 0) {
|
|
||||||
if(error)
|
|
||||||
*error = MINISSDPC_SOCKET_ERROR;
|
|
||||||
#ifdef _WIN32
|
|
||||||
fprintf(stderr, "getaddrinfo() failed: %d\n", rv);
|
|
||||||
#else
|
|
||||||
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
for(p = servinfo; p; p = p->ai_next) {
|
|
||||||
n = sendto(sudp, bufr, n, 0, p->ai_addr, p->ai_addrlen);
|
|
||||||
if (n < 0) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
|
|
||||||
if (getnameinfo(p->ai_addr, p->ai_addrlen, hbuf, sizeof(hbuf), sbuf,
|
|
||||||
sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0) {
|
|
||||||
fprintf(stderr, "host:%s port:%s\n", hbuf, sbuf);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
PRINT_SOCKET_ERROR("sendto");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
freeaddrinfo(servinfo);
|
|
||||||
if(n < 0) {
|
|
||||||
if(error)
|
|
||||||
*error = MINISSDPC_SOCKET_ERROR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif /* #ifdef NO_GETADDRINFO */
|
|
||||||
/* Waiting for SSDP REPLY packet to M-SEARCH
|
|
||||||
* if searchalltypes is set, enter the loop only
|
|
||||||
* when the last deviceType is reached */
|
|
||||||
if(!searchalltypes || !deviceTypes[deviceIndex + 1]) do {
|
|
||||||
n = receivedata(sudp, bufr, sizeof(bufr), delay, &scope_id);
|
|
||||||
if (n < 0) {
|
|
||||||
/* error */
|
|
||||||
if(error)
|
|
||||||
*error = MINISSDPC_SOCKET_ERROR;
|
|
||||||
goto error;
|
|
||||||
} else if (n == 0) {
|
|
||||||
/* no data or Time Out */
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("NODATA or TIMEOUT\n");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
if (devlist && !searchalltypes) {
|
|
||||||
/* found some devices, stop now*/
|
|
||||||
if(error)
|
|
||||||
*error = MINISSDPC_SUCCESS;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const char * descURL=NULL;
|
|
||||||
int urlsize=0;
|
|
||||||
const char * st=NULL;
|
|
||||||
int stsize=0;
|
|
||||||
const char * usn=NULL;
|
|
||||||
int usnsize=0;
|
|
||||||
parseMSEARCHReply(bufr, n, &descURL, &urlsize, &st, &stsize, &usn, &usnsize);
|
|
||||||
if(st&&descURL) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("M-SEARCH Reply:\n ST: %.*s\n USN: %.*s\n Location: %.*s\n",
|
|
||||||
stsize, st, usnsize, (usn?usn:""), urlsize, descURL);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
for(tmp=devlist; tmp; tmp = tmp->pNext) {
|
|
||||||
if(memcmp(tmp->descURL, descURL, urlsize) == 0 &&
|
|
||||||
tmp->descURL[urlsize] == '\0' &&
|
|
||||||
memcmp(tmp->st, st, stsize) == 0 &&
|
|
||||||
tmp->st[stsize] == '\0' &&
|
|
||||||
(usnsize == 0 || memcmp(tmp->usn, usn, usnsize) == 0) &&
|
|
||||||
tmp->usn[usnsize] == '\0')
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* at the exit of the loop above, tmp is null if
|
|
||||||
* no duplicate device was found */
|
|
||||||
if(tmp)
|
|
||||||
continue;
|
|
||||||
tmp = (struct UPNPDev *)malloc(sizeof(struct UPNPDev)+urlsize+stsize+usnsize);
|
|
||||||
if(!tmp) {
|
|
||||||
/* memory allocation error */
|
|
||||||
if(error)
|
|
||||||
*error = MINISSDPC_MEMORY_ERROR;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
tmp->pNext = devlist;
|
|
||||||
tmp->descURL = tmp->buffer;
|
|
||||||
tmp->st = tmp->buffer + 1 + urlsize;
|
|
||||||
tmp->usn = tmp->st + 1 + stsize;
|
|
||||||
memcpy(tmp->buffer, descURL, urlsize);
|
|
||||||
tmp->buffer[urlsize] = '\0';
|
|
||||||
memcpy(tmp->st, st, stsize);
|
|
||||||
tmp->buffer[urlsize+1+stsize] = '\0';
|
|
||||||
if(usn != NULL)
|
|
||||||
memcpy(tmp->usn, usn, usnsize);
|
|
||||||
tmp->buffer[urlsize+1+stsize+1+usnsize] = '\0';
|
|
||||||
tmp->scope_id = scope_id;
|
|
||||||
devlist = tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while(n > 0);
|
|
||||||
if(ipv6) {
|
|
||||||
/* switch linklocal flag */
|
|
||||||
if(linklocal) {
|
|
||||||
linklocal = 0;
|
|
||||||
--deviceIndex;
|
|
||||||
} else {
|
|
||||||
linklocal = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
error:
|
|
||||||
closesocket(sudp);
|
|
||||||
return devlist;
|
|
||||||
}
|
|
||||||
|
|
58
Externals/miniupnpc/src/minissdpc.h
vendored
58
Externals/miniupnpc/src/minissdpc.h
vendored
@ -1,58 +0,0 @@
|
|||||||
/* $Id: minissdpc.h,v 1.6 2015/09/18 12:45:16 nanard Exp $ */
|
|
||||||
/* Project: miniupnp
|
|
||||||
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
|
|
||||||
* Author: Thomas Bernard
|
|
||||||
* Copyright (c) 2005-2015 Thomas Bernard
|
|
||||||
* This software is subjects to the conditions detailed
|
|
||||||
* in the LICENCE file provided within this distribution */
|
|
||||||
#ifndef MINISSDPC_H_INCLUDED
|
|
||||||
#define MINISSDPC_H_INCLUDED
|
|
||||||
|
|
||||||
#include "miniupnpc_declspec.h"
|
|
||||||
#include "upnpdev.h"
|
|
||||||
|
|
||||||
/* error codes : */
|
|
||||||
#define MINISSDPC_SUCCESS (0)
|
|
||||||
#define MINISSDPC_UNKNOWN_ERROR (-1)
|
|
||||||
#define MINISSDPC_SOCKET_ERROR (-101)
|
|
||||||
#define MINISSDPC_MEMORY_ERROR (-102)
|
|
||||||
#define MINISSDPC_INVALID_INPUT (-103)
|
|
||||||
#define MINISSDPC_INVALID_SERVER_REPLY (-104)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !(defined(_WIN32) || defined(__amigaos__) || defined(__amigaos4__))
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
|
||||||
getDevicesFromMiniSSDPD(const char * devtype, const char * socketpath, int * error);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
connectToMiniSSDPD(const char * socketpath);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
disconnectFromMiniSSDPD(int fd);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
requestDevicesFromMiniSSDPD(int fd, const char * devtype);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
|
||||||
receiveDevicesFromMiniSSDPD(int fd, int * error);
|
|
||||||
|
|
||||||
#endif /* !(defined(_WIN32) || defined(__amigaos__) || defined(__amigaos4__)) */
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
|
||||||
ssdpDiscoverDevices(const char * const deviceTypes[],
|
|
||||||
int delay, const char * multicastif,
|
|
||||||
int sameport,
|
|
||||||
int ipv6, unsigned char ttl,
|
|
||||||
int * error,
|
|
||||||
int searchalltypes);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
663
Externals/miniupnpc/src/miniupnpc.c
vendored
663
Externals/miniupnpc/src/miniupnpc.c
vendored
@ -1,663 +0,0 @@
|
|||||||
/* $Id: miniupnpc.c,v 1.135 2015/07/23 20:40:08 nanard Exp $ */
|
|
||||||
/* Project : miniupnp
|
|
||||||
* Web : http://miniupnp.free.fr/
|
|
||||||
* Author : Thomas BERNARD
|
|
||||||
* copyright (c) 2005-2015 Thomas Bernard
|
|
||||||
* This software is subjet to the conditions detailed in the
|
|
||||||
* provided LICENSE file. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#ifdef _WIN32
|
|
||||||
/* Win32 Specific includes and defines */
|
|
||||||
#include <winsock2.h>
|
|
||||||
#include <ws2tcpip.h>
|
|
||||||
#include <io.h>
|
|
||||||
#include <iphlpapi.h>
|
|
||||||
#define snprintf _snprintf
|
|
||||||
#define strdup _strdup
|
|
||||||
#ifndef strncasecmp
|
|
||||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
|
||||||
#define strncasecmp _memicmp
|
|
||||||
#else /* defined(_MSC_VER) && (_MSC_VER >= 1400) */
|
|
||||||
#define strncasecmp memicmp
|
|
||||||
#endif /* defined(_MSC_VER) && (_MSC_VER >= 1400) */
|
|
||||||
#endif /* #ifndef strncasecmp */
|
|
||||||
#define MAXHOSTNAMELEN 64
|
|
||||||
#else /* #ifdef _WIN32 */
|
|
||||||
/* Standard POSIX includes */
|
|
||||||
#include <unistd.h>
|
|
||||||
#if defined(__amigaos__) && !defined(__amigaos4__)
|
|
||||||
/* Amiga OS 3 specific stuff */
|
|
||||||
#define socklen_t int
|
|
||||||
#else
|
|
||||||
#include <sys/select.h>
|
|
||||||
#endif
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#if !defined(__amigaos__) && !defined(__amigaos4__)
|
|
||||||
#include <poll.h>
|
|
||||||
#endif
|
|
||||||
#include <strings.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#define closesocket close
|
|
||||||
#endif /* #else _WIN32 */
|
|
||||||
#ifdef __GNU__
|
|
||||||
#define MAXHOSTNAMELEN 64
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#include "miniupnpc.h"
|
|
||||||
#include "minissdpc.h"
|
|
||||||
#include "miniwget.h"
|
|
||||||
#include "minisoap.h"
|
|
||||||
#include "minixml.h"
|
|
||||||
#include "upnpcommands.h"
|
|
||||||
#include "connecthostport.h"
|
|
||||||
|
|
||||||
/* compare the begining of a string with a constant string */
|
|
||||||
#define COMPARE(str, cstr) (0==memcmp(str, cstr, sizeof(cstr) - 1))
|
|
||||||
|
|
||||||
#ifndef MAXHOSTNAMELEN
|
|
||||||
#define MAXHOSTNAMELEN 64
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SOAPPREFIX "s"
|
|
||||||
#define SERVICEPREFIX "u"
|
|
||||||
#define SERVICEPREFIX2 'u'
|
|
||||||
|
|
||||||
/* root description parsing */
|
|
||||||
MINIUPNP_LIBSPEC void parserootdesc(const char * buffer, int bufsize, struct IGDdatas * data)
|
|
||||||
{
|
|
||||||
struct xmlparser parser;
|
|
||||||
/* xmlparser object */
|
|
||||||
parser.xmlstart = buffer;
|
|
||||||
parser.xmlsize = bufsize;
|
|
||||||
parser.data = data;
|
|
||||||
parser.starteltfunc = IGDstartelt;
|
|
||||||
parser.endeltfunc = IGDendelt;
|
|
||||||
parser.datafunc = IGDdata;
|
|
||||||
parser.attfunc = 0;
|
|
||||||
parsexml(&parser);
|
|
||||||
#ifdef DEBUG
|
|
||||||
printIGD(data);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* simpleUPnPcommand2 :
|
|
||||||
* not so simple !
|
|
||||||
* return values :
|
|
||||||
* pointer - OK
|
|
||||||
* NULL - error */
|
|
||||||
char * simpleUPnPcommand2(int s, const char * url, const char * service,
|
|
||||||
const char * action, struct UPNParg * args,
|
|
||||||
int * bufsize, const char * httpversion)
|
|
||||||
{
|
|
||||||
char hostname[MAXHOSTNAMELEN+1];
|
|
||||||
unsigned short port = 0;
|
|
||||||
char * path;
|
|
||||||
char soapact[128];
|
|
||||||
char soapbody[2048];
|
|
||||||
char * buf;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
*bufsize = 0;
|
|
||||||
snprintf(soapact, sizeof(soapact), "%s#%s", service, action);
|
|
||||||
if(args==NULL)
|
|
||||||
{
|
|
||||||
/*soapbodylen = */snprintf(soapbody, sizeof(soapbody),
|
|
||||||
"<?xml version=\"1.0\"?>\r\n"
|
|
||||||
"<" SOAPPREFIX ":Envelope "
|
|
||||||
"xmlns:" SOAPPREFIX "=\"http://schemas.xmlsoap.org/soap/envelope/\" "
|
|
||||||
SOAPPREFIX ":encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
|
|
||||||
"<" SOAPPREFIX ":Body>"
|
|
||||||
"<" SERVICEPREFIX ":%s xmlns:" SERVICEPREFIX "=\"%s\">"
|
|
||||||
"</" SERVICEPREFIX ":%s>"
|
|
||||||
"</" SOAPPREFIX ":Body></" SOAPPREFIX ":Envelope>"
|
|
||||||
"\r\n", action, service, action);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char * p;
|
|
||||||
const char * pe, * pv;
|
|
||||||
int soapbodylen;
|
|
||||||
soapbodylen = snprintf(soapbody, sizeof(soapbody),
|
|
||||||
"<?xml version=\"1.0\"?>\r\n"
|
|
||||||
"<" SOAPPREFIX ":Envelope "
|
|
||||||
"xmlns:" SOAPPREFIX "=\"http://schemas.xmlsoap.org/soap/envelope/\" "
|
|
||||||
SOAPPREFIX ":encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
|
|
||||||
"<" SOAPPREFIX ":Body>"
|
|
||||||
"<" SERVICEPREFIX ":%s xmlns:" SERVICEPREFIX "=\"%s\">",
|
|
||||||
action, service);
|
|
||||||
p = soapbody + soapbodylen;
|
|
||||||
while(args->elt)
|
|
||||||
{
|
|
||||||
/* check that we are never overflowing the string... */
|
|
||||||
if(soapbody + sizeof(soapbody) <= p + 100)
|
|
||||||
{
|
|
||||||
/* we keep a margin of at least 100 bytes */
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
*(p++) = '<';
|
|
||||||
pe = args->elt;
|
|
||||||
while(*pe)
|
|
||||||
*(p++) = *(pe++);
|
|
||||||
*(p++) = '>';
|
|
||||||
if((pv = args->val))
|
|
||||||
{
|
|
||||||
while(*pv)
|
|
||||||
*(p++) = *(pv++);
|
|
||||||
}
|
|
||||||
*(p++) = '<';
|
|
||||||
*(p++) = '/';
|
|
||||||
pe = args->elt;
|
|
||||||
while(*pe)
|
|
||||||
*(p++) = *(pe++);
|
|
||||||
*(p++) = '>';
|
|
||||||
args++;
|
|
||||||
}
|
|
||||||
*(p++) = '<';
|
|
||||||
*(p++) = '/';
|
|
||||||
*(p++) = SERVICEPREFIX2;
|
|
||||||
*(p++) = ':';
|
|
||||||
pe = action;
|
|
||||||
while(*pe)
|
|
||||||
*(p++) = *(pe++);
|
|
||||||
strncpy(p, "></" SOAPPREFIX ":Body></" SOAPPREFIX ":Envelope>\r\n",
|
|
||||||
soapbody + sizeof(soapbody) - p);
|
|
||||||
}
|
|
||||||
if(!parseURL(url, hostname, &port, &path, NULL)) return NULL;
|
|
||||||
if(s < 0) {
|
|
||||||
s = connecthostport(hostname, port, 0);
|
|
||||||
if(s < 0) {
|
|
||||||
/* failed to connect */
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
n = soapPostSubmit(s, path, hostname, port, soapact, soapbody, httpversion);
|
|
||||||
if(n<=0) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("Error sending SOAP request\n");
|
|
||||||
#endif
|
|
||||||
closesocket(s);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf = getHTTPResponse(s, bufsize);
|
|
||||||
#ifdef DEBUG
|
|
||||||
if(*bufsize > 0 && buf)
|
|
||||||
{
|
|
||||||
printf("SOAP Response :\n%.*s\n", *bufsize, buf);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
closesocket(s);
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* simpleUPnPcommand :
|
|
||||||
* not so simple !
|
|
||||||
* return values :
|
|
||||||
* pointer - OK
|
|
||||||
* NULL - error */
|
|
||||||
char * simpleUPnPcommand(int s, const char * url, const char * service,
|
|
||||||
const char * action, struct UPNParg * args,
|
|
||||||
int * bufsize)
|
|
||||||
{
|
|
||||||
char * buf;
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
buf = simpleUPnPcommand2(s, url, service, action, args, bufsize, "1.1");
|
|
||||||
#else
|
|
||||||
buf = simpleUPnPcommand2(s, url, service, action, args, bufsize, "1.0");
|
|
||||||
if (!buf || *bufsize == 0)
|
|
||||||
{
|
|
||||||
#if DEBUG
|
|
||||||
printf("Error or no result from SOAP request; retrying with HTTP/1.1\n");
|
|
||||||
#endif
|
|
||||||
buf = simpleUPnPcommand2(s, url, service, action, args, bufsize, "1.1");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* upnpDiscoverDevices() :
|
|
||||||
* return a chained list of all devices found or NULL if
|
|
||||||
* no devices was found.
|
|
||||||
* It is up to the caller to free the chained list
|
|
||||||
* delay is in millisecond (poll).
|
|
||||||
* UDA v1.1 says :
|
|
||||||
* The TTL for the IP packet SHOULD default to 2 and
|
|
||||||
* SHOULD be configurable. */
|
|
||||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
|
||||||
upnpDiscoverDevices(const char * const deviceTypes[],
|
|
||||||
int delay, const char * multicastif,
|
|
||||||
const char * minissdpdsock, int sameport,
|
|
||||||
int ipv6, unsigned char ttl,
|
|
||||||
int * error,
|
|
||||||
int searchalltypes)
|
|
||||||
{
|
|
||||||
struct UPNPDev * tmp;
|
|
||||||
struct UPNPDev * devlist = 0;
|
|
||||||
#if !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__)
|
|
||||||
int deviceIndex;
|
|
||||||
#endif /* !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) */
|
|
||||||
|
|
||||||
if(error)
|
|
||||||
*error = UPNPDISCOVER_UNKNOWN_ERROR;
|
|
||||||
#if !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__)
|
|
||||||
/* first try to get infos from minissdpd ! */
|
|
||||||
if(!minissdpdsock)
|
|
||||||
minissdpdsock = "/var/run/minissdpd.sock";
|
|
||||||
for(deviceIndex = 0; deviceTypes[deviceIndex]; deviceIndex++) {
|
|
||||||
struct UPNPDev * minissdpd_devlist;
|
|
||||||
int only_rootdevice = 1;
|
|
||||||
minissdpd_devlist = getDevicesFromMiniSSDPD(deviceTypes[deviceIndex],
|
|
||||||
minissdpdsock, 0);
|
|
||||||
if(minissdpd_devlist) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("returned by MiniSSDPD: %s\t%s\n",
|
|
||||||
minissdpd_devlist->st, minissdpd_devlist->descURL);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
if(!strstr(minissdpd_devlist->st, "rootdevice"))
|
|
||||||
only_rootdevice = 0;
|
|
||||||
for(tmp = minissdpd_devlist; tmp->pNext != NULL; tmp = tmp->pNext) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("returned by MiniSSDPD: %s\t%s\n",
|
|
||||||
tmp->pNext->st, tmp->pNext->descURL);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
if(!strstr(tmp->st, "rootdevice"))
|
|
||||||
only_rootdevice = 0;
|
|
||||||
}
|
|
||||||
tmp->pNext = devlist;
|
|
||||||
devlist = minissdpd_devlist;
|
|
||||||
if(!searchalltypes && !only_rootdevice)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(tmp = devlist; tmp != NULL; tmp = tmp->pNext) {
|
|
||||||
/* We return what we have found if it was not only a rootdevice */
|
|
||||||
if(!strstr(tmp->st, "rootdevice")) {
|
|
||||||
if(error)
|
|
||||||
*error = UPNPDISCOVER_SUCCESS;
|
|
||||||
return devlist;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) */
|
|
||||||
|
|
||||||
/* direct discovery if minissdpd responses are not sufficient */
|
|
||||||
{
|
|
||||||
struct UPNPDev * discovered_devlist;
|
|
||||||
discovered_devlist = ssdpDiscoverDevices(deviceTypes, delay, multicastif, sameport,
|
|
||||||
ipv6, ttl, error, searchalltypes);
|
|
||||||
if(devlist == NULL)
|
|
||||||
devlist = discovered_devlist;
|
|
||||||
else {
|
|
||||||
for(tmp = devlist; tmp->pNext != NULL; tmp = tmp->pNext);
|
|
||||||
tmp->pNext = discovered_devlist;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return devlist;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* upnpDiscover() Discover IGD device */
|
|
||||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
|
||||||
upnpDiscover(int delay, const char * multicastif,
|
|
||||||
const char * minissdpdsock, int sameport,
|
|
||||||
int ipv6, unsigned char ttl,
|
|
||||||
int * error)
|
|
||||||
{
|
|
||||||
static const char * const deviceList[] = {
|
|
||||||
#if 0
|
|
||||||
"urn:schemas-upnp-org:device:InternetGatewayDevice:2",
|
|
||||||
"urn:schemas-upnp-org:service:WANIPConnection:2",
|
|
||||||
#endif
|
|
||||||
"urn:schemas-upnp-org:device:InternetGatewayDevice:1",
|
|
||||||
"urn:schemas-upnp-org:service:WANIPConnection:1",
|
|
||||||
"urn:schemas-upnp-org:service:WANPPPConnection:1",
|
|
||||||
"upnp:rootdevice",
|
|
||||||
/*"ssdp:all",*/
|
|
||||||
0
|
|
||||||
};
|
|
||||||
return upnpDiscoverDevices(deviceList,
|
|
||||||
delay, multicastif, minissdpdsock, sameport,
|
|
||||||
ipv6, ttl, error, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* upnpDiscoverAll() Discover all UPnP devices */
|
|
||||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
|
||||||
upnpDiscoverAll(int delay, const char * multicastif,
|
|
||||||
const char * minissdpdsock, int sameport,
|
|
||||||
int ipv6, unsigned char ttl,
|
|
||||||
int * error)
|
|
||||||
{
|
|
||||||
static const char * const deviceList[] = {
|
|
||||||
/*"upnp:rootdevice",*/
|
|
||||||
"ssdp:all",
|
|
||||||
0
|
|
||||||
};
|
|
||||||
return upnpDiscoverDevices(deviceList,
|
|
||||||
delay, multicastif, minissdpdsock, sameport,
|
|
||||||
ipv6, ttl, error, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* upnpDiscoverDevice() Discover a specific device */
|
|
||||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
|
||||||
upnpDiscoverDevice(const char * device, int delay, const char * multicastif,
|
|
||||||
const char * minissdpdsock, int sameport,
|
|
||||||
int ipv6, unsigned char ttl,
|
|
||||||
int * error)
|
|
||||||
{
|
|
||||||
const char * const deviceList[] = {
|
|
||||||
device,
|
|
||||||
0
|
|
||||||
};
|
|
||||||
return upnpDiscoverDevices(deviceList,
|
|
||||||
delay, multicastif, minissdpdsock, sameport,
|
|
||||||
ipv6, ttl, error, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *
|
|
||||||
build_absolute_url(const char * baseurl, const char * descURL,
|
|
||||||
const char * url, unsigned int scope_id)
|
|
||||||
{
|
|
||||||
int l, n;
|
|
||||||
char * s;
|
|
||||||
const char * base;
|
|
||||||
char * p;
|
|
||||||
#if defined(IF_NAMESIZE) && !defined(_WIN32)
|
|
||||||
char ifname[IF_NAMESIZE];
|
|
||||||
#else /* defined(IF_NAMESIZE) && !defined(_WIN32) */
|
|
||||||
char scope_str[8];
|
|
||||||
#endif /* defined(IF_NAMESIZE) && !defined(_WIN32) */
|
|
||||||
|
|
||||||
if( (url[0] == 'h')
|
|
||||||
&&(url[1] == 't')
|
|
||||||
&&(url[2] == 't')
|
|
||||||
&&(url[3] == 'p')
|
|
||||||
&&(url[4] == ':')
|
|
||||||
&&(url[5] == '/')
|
|
||||||
&&(url[6] == '/'))
|
|
||||||
return strdup(url);
|
|
||||||
base = (baseurl[0] == '\0') ? descURL : baseurl;
|
|
||||||
n = strlen(base);
|
|
||||||
if(n > 7) {
|
|
||||||
p = strchr(base + 7, '/');
|
|
||||||
if(p)
|
|
||||||
n = p - base;
|
|
||||||
}
|
|
||||||
l = n + strlen(url) + 1;
|
|
||||||
if(url[0] != '/')
|
|
||||||
l++;
|
|
||||||
if(scope_id != 0) {
|
|
||||||
#if defined(IF_NAMESIZE) && !defined(_WIN32)
|
|
||||||
if(if_indextoname(scope_id, ifname)) {
|
|
||||||
l += 3 + strlen(ifname); /* 3 == strlen(%25) */
|
|
||||||
}
|
|
||||||
#else /* defined(IF_NAMESIZE) && !defined(_WIN32) */
|
|
||||||
/* under windows, scope is numerical */
|
|
||||||
l += 3 + snprintf(scope_str, sizeof(scope_str), "%u", scope_id);
|
|
||||||
#endif /* defined(IF_NAMESIZE) && !defined(_WIN32) */
|
|
||||||
}
|
|
||||||
s = malloc(l);
|
|
||||||
if(s == NULL) return NULL;
|
|
||||||
memcpy(s, base, n);
|
|
||||||
if(scope_id != 0) {
|
|
||||||
s[n] = '\0';
|
|
||||||
if(0 == memcmp(s, "http://[fe80:", 13)) {
|
|
||||||
/* this is a linklocal IPv6 address */
|
|
||||||
p = strchr(s, ']');
|
|
||||||
if(p) {
|
|
||||||
/* insert %25<scope> into URL */
|
|
||||||
#if defined(IF_NAMESIZE) && !defined(_WIN32)
|
|
||||||
memmove(p + 3 + strlen(ifname), p, strlen(p) + 1);
|
|
||||||
memcpy(p, "%25", 3);
|
|
||||||
memcpy(p + 3, ifname, strlen(ifname));
|
|
||||||
n += 3 + strlen(ifname);
|
|
||||||
#else /* defined(IF_NAMESIZE) && !defined(_WIN32) */
|
|
||||||
memmove(p + 3 + strlen(scope_str), p, strlen(p) + 1);
|
|
||||||
memcpy(p, "%25", 3);
|
|
||||||
memcpy(p + 3, scope_str, strlen(scope_str));
|
|
||||||
n += 3 + strlen(scope_str);
|
|
||||||
#endif /* defined(IF_NAMESIZE) && !defined(_WIN32) */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(url[0] != '/')
|
|
||||||
s[n++] = '/';
|
|
||||||
memcpy(s + n, url, l - n);
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prepare the Urls for usage...
|
|
||||||
*/
|
|
||||||
MINIUPNP_LIBSPEC void
|
|
||||||
GetUPNPUrls(struct UPNPUrls * urls, struct IGDdatas * data,
|
|
||||||
const char * descURL, unsigned int scope_id)
|
|
||||||
{
|
|
||||||
/* strdup descURL */
|
|
||||||
urls->rootdescURL = strdup(descURL);
|
|
||||||
|
|
||||||
/* get description of WANIPConnection */
|
|
||||||
urls->ipcondescURL = build_absolute_url(data->urlbase, descURL,
|
|
||||||
data->first.scpdurl, scope_id);
|
|
||||||
urls->controlURL = build_absolute_url(data->urlbase, descURL,
|
|
||||||
data->first.controlurl, scope_id);
|
|
||||||
urls->controlURL_CIF = build_absolute_url(data->urlbase, descURL,
|
|
||||||
data->CIF.controlurl, scope_id);
|
|
||||||
urls->controlURL_6FC = build_absolute_url(data->urlbase, descURL,
|
|
||||||
data->IPv6FC.controlurl, scope_id);
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("urls->ipcondescURL='%s'\n", urls->ipcondescURL);
|
|
||||||
printf("urls->controlURL='%s'\n", urls->controlURL);
|
|
||||||
printf("urls->controlURL_CIF='%s'\n", urls->controlURL_CIF);
|
|
||||||
printf("urls->controlURL_6FC='%s'\n", urls->controlURL_6FC);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC void
|
|
||||||
FreeUPNPUrls(struct UPNPUrls * urls)
|
|
||||||
{
|
|
||||||
if(!urls)
|
|
||||||
return;
|
|
||||||
free(urls->controlURL);
|
|
||||||
urls->controlURL = 0;
|
|
||||||
free(urls->ipcondescURL);
|
|
||||||
urls->ipcondescURL = 0;
|
|
||||||
free(urls->controlURL_CIF);
|
|
||||||
urls->controlURL_CIF = 0;
|
|
||||||
free(urls->controlURL_6FC);
|
|
||||||
urls->controlURL_6FC = 0;
|
|
||||||
free(urls->rootdescURL);
|
|
||||||
urls->rootdescURL = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
UPNPIGD_IsConnected(struct UPNPUrls * urls, struct IGDdatas * data)
|
|
||||||
{
|
|
||||||
char status[64];
|
|
||||||
unsigned int uptime;
|
|
||||||
status[0] = '\0';
|
|
||||||
UPNP_GetStatusInfo(urls->controlURL, data->first.servicetype,
|
|
||||||
status, &uptime, NULL);
|
|
||||||
if(0 == strcmp("Connected", status))
|
|
||||||
return 1;
|
|
||||||
else if(0 == strcmp("Up", status)) /* Also accept "Up" */
|
|
||||||
return 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* UPNP_GetValidIGD() :
|
|
||||||
* return values :
|
|
||||||
* -1 = Internal error
|
|
||||||
* 0 = NO IGD found
|
|
||||||
* 1 = A valid connected IGD has been found
|
|
||||||
* 2 = A valid IGD has been found but it reported as
|
|
||||||
* not connected
|
|
||||||
* 3 = an UPnP device has been found but was not recognized as an IGD
|
|
||||||
*
|
|
||||||
* In any positive non zero return case, the urls and data structures
|
|
||||||
* passed as parameters are set. Donc forget to call FreeUPNPUrls(urls) to
|
|
||||||
* free allocated memory.
|
|
||||||
*/
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_GetValidIGD(struct UPNPDev * devlist,
|
|
||||||
struct UPNPUrls * urls,
|
|
||||||
struct IGDdatas * data,
|
|
||||||
char * lanaddr, int lanaddrlen)
|
|
||||||
{
|
|
||||||
struct xml_desc {
|
|
||||||
char * xml;
|
|
||||||
int size;
|
|
||||||
int is_igd;
|
|
||||||
} * desc = NULL;
|
|
||||||
struct UPNPDev * dev;
|
|
||||||
int ndev = 0;
|
|
||||||
int i;
|
|
||||||
int state = -1; /* state 1 : IGD connected. State 2 : IGD. State 3 : anything */
|
|
||||||
int n_igd = 0;
|
|
||||||
char extIpAddr[16];
|
|
||||||
if(!devlist)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("Empty devlist\n");
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* counting total number of devices in the list */
|
|
||||||
for(dev = devlist; dev; dev = dev->pNext)
|
|
||||||
ndev++;
|
|
||||||
if(ndev > 0)
|
|
||||||
{
|
|
||||||
desc = calloc(ndev, sizeof(struct xml_desc));
|
|
||||||
if(!desc)
|
|
||||||
return -1; /* memory allocation error */
|
|
||||||
}
|
|
||||||
/* Step 1 : downloading descriptions and testing type */
|
|
||||||
for(dev = devlist, i = 0; dev; dev = dev->pNext, i++)
|
|
||||||
{
|
|
||||||
/* we should choose an internet gateway device.
|
|
||||||
* with st == urn:schemas-upnp-org:device:InternetGatewayDevice:1 */
|
|
||||||
desc[i].xml = miniwget_getaddr(dev->descURL, &(desc[i].size),
|
|
||||||
lanaddr, lanaddrlen,
|
|
||||||
dev->scope_id);
|
|
||||||
#ifdef DEBUG
|
|
||||||
if(!desc[i].xml)
|
|
||||||
{
|
|
||||||
printf("error getting XML description %s\n", dev->descURL);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if(desc[i].xml)
|
|
||||||
{
|
|
||||||
memset(data, 0, sizeof(struct IGDdatas));
|
|
||||||
memset(urls, 0, sizeof(struct UPNPUrls));
|
|
||||||
parserootdesc(desc[i].xml, desc[i].size, data);
|
|
||||||
if(COMPARE(data->CIF.servicetype,
|
|
||||||
"urn:schemas-upnp-org:service:WANCommonInterfaceConfig:"))
|
|
||||||
{
|
|
||||||
desc[i].is_igd = 1;
|
|
||||||
n_igd++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* iterate the list to find a device depending on state */
|
|
||||||
for(state = 1; state <= 3; state++)
|
|
||||||
{
|
|
||||||
for(dev = devlist, i = 0; dev; dev = dev->pNext, i++)
|
|
||||||
{
|
|
||||||
if(desc[i].xml)
|
|
||||||
{
|
|
||||||
memset(data, 0, sizeof(struct IGDdatas));
|
|
||||||
memset(urls, 0, sizeof(struct UPNPUrls));
|
|
||||||
parserootdesc(desc[i].xml, desc[i].size, data);
|
|
||||||
if(desc[i].is_igd || state >= 3 )
|
|
||||||
{
|
|
||||||
GetUPNPUrls(urls, data, dev->descURL, dev->scope_id);
|
|
||||||
|
|
||||||
/* in state 2 and 3 we dont test if device is connected ! */
|
|
||||||
if(state >= 2)
|
|
||||||
goto free_and_return;
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("UPNPIGD_IsConnected(%s) = %d\n",
|
|
||||||
urls->controlURL,
|
|
||||||
UPNPIGD_IsConnected(urls, data));
|
|
||||||
#endif
|
|
||||||
/* checks that status is connected AND there is a external IP address assigned */
|
|
||||||
if(UPNPIGD_IsConnected(urls, data)
|
|
||||||
&& (UPNP_GetExternalIPAddress(urls->controlURL, data->first.servicetype, extIpAddr) == 0))
|
|
||||||
goto free_and_return;
|
|
||||||
FreeUPNPUrls(urls);
|
|
||||||
if(data->second.servicetype[0] != '\0') {
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("We tried %s, now we try %s !\n",
|
|
||||||
data->first.servicetype, data->second.servicetype);
|
|
||||||
#endif
|
|
||||||
/* swaping WANPPPConnection and WANIPConnection ! */
|
|
||||||
memcpy(&data->tmp, &data->first, sizeof(struct IGDdatas_service));
|
|
||||||
memcpy(&data->first, &data->second, sizeof(struct IGDdatas_service));
|
|
||||||
memcpy(&data->second, &data->tmp, sizeof(struct IGDdatas_service));
|
|
||||||
GetUPNPUrls(urls, data, dev->descURL, dev->scope_id);
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("UPNPIGD_IsConnected(%s) = %d\n",
|
|
||||||
urls->controlURL,
|
|
||||||
UPNPIGD_IsConnected(urls, data));
|
|
||||||
#endif
|
|
||||||
if(UPNPIGD_IsConnected(urls, data)
|
|
||||||
&& (UPNP_GetExternalIPAddress(urls->controlURL, data->first.servicetype, extIpAddr) == 0))
|
|
||||||
goto free_and_return;
|
|
||||||
FreeUPNPUrls(urls);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
memset(data, 0, sizeof(struct IGDdatas));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state = 0;
|
|
||||||
free_and_return:
|
|
||||||
if(desc) {
|
|
||||||
for(i = 0; i < ndev; i++) {
|
|
||||||
if(desc[i].xml) {
|
|
||||||
free(desc[i].xml);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(desc);
|
|
||||||
}
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* UPNP_GetIGDFromUrl()
|
|
||||||
* Used when skipping the discovery process.
|
|
||||||
* return value :
|
|
||||||
* 0 - Not ok
|
|
||||||
* 1 - OK */
|
|
||||||
int
|
|
||||||
UPNP_GetIGDFromUrl(const char * rootdescurl,
|
|
||||||
struct UPNPUrls * urls,
|
|
||||||
struct IGDdatas * data,
|
|
||||||
char * lanaddr, int lanaddrlen)
|
|
||||||
{
|
|
||||||
char * descXML;
|
|
||||||
int descXMLsize = 0;
|
|
||||||
descXML = miniwget_getaddr(rootdescurl, &descXMLsize,
|
|
||||||
lanaddr, lanaddrlen, 0);
|
|
||||||
if(descXML) {
|
|
||||||
memset(data, 0, sizeof(struct IGDdatas));
|
|
||||||
memset(urls, 0, sizeof(struct UPNPUrls));
|
|
||||||
parserootdesc(descXML, descXMLsize, data);
|
|
||||||
free(descXML);
|
|
||||||
descXML = NULL;
|
|
||||||
GetUPNPUrls(urls, data, rootdescurl, 0);
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
144
Externals/miniupnpc/src/miniupnpc.h
vendored
144
Externals/miniupnpc/src/miniupnpc.h
vendored
@ -1,144 +0,0 @@
|
|||||||
/* $Id: miniupnpc.h,v 1.44 2015/07/23 20:40:10 nanard Exp $ */
|
|
||||||
/* Project: miniupnp
|
|
||||||
* http://miniupnp.free.fr/
|
|
||||||
* Author: Thomas Bernard
|
|
||||||
* Copyright (c) 2005-2015 Thomas Bernard
|
|
||||||
* This software is subjects to the conditions detailed
|
|
||||||
* in the LICENCE file provided within this distribution */
|
|
||||||
#ifndef MINIUPNPC_H_INCLUDED
|
|
||||||
#define MINIUPNPC_H_INCLUDED
|
|
||||||
|
|
||||||
#include "miniupnpc_declspec.h"
|
|
||||||
#include "igd_desc_parse.h"
|
|
||||||
#include "upnpdev.h"
|
|
||||||
|
|
||||||
/* error codes : */
|
|
||||||
#define UPNPDISCOVER_SUCCESS (0)
|
|
||||||
#define UPNPDISCOVER_UNKNOWN_ERROR (-1)
|
|
||||||
#define UPNPDISCOVER_SOCKET_ERROR (-101)
|
|
||||||
#define UPNPDISCOVER_MEMORY_ERROR (-102)
|
|
||||||
|
|
||||||
/* versions : */
|
|
||||||
#define MINIUPNPC_VERSION "1.9"
|
|
||||||
#define MINIUPNPC_API_VERSION 14
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Structures definitions : */
|
|
||||||
struct UPNParg { const char * elt; const char * val; };
|
|
||||||
|
|
||||||
char *
|
|
||||||
simpleUPnPcommand(int, const char *, const char *,
|
|
||||||
const char *, struct UPNParg *,
|
|
||||||
int *);
|
|
||||||
|
|
||||||
/* upnpDiscover()
|
|
||||||
* discover UPnP devices on the network.
|
|
||||||
* The discovered devices are returned as a chained list.
|
|
||||||
* It is up to the caller to free the list with freeUPNPDevlist().
|
|
||||||
* delay (in millisecond) is the maximum time for waiting any device
|
|
||||||
* response.
|
|
||||||
* If available, device list will be obtained from MiniSSDPd.
|
|
||||||
* Default path for minissdpd socket will be used if minissdpdsock argument
|
|
||||||
* is NULL.
|
|
||||||
* If multicastif is not NULL, it will be used instead of the default
|
|
||||||
* multicast interface for sending SSDP discover packets.
|
|
||||||
* If sameport is not null, SSDP packets will be sent from the source port
|
|
||||||
* 1900 (same as destination port) otherwise system assign a source port.
|
|
||||||
* "searchalltypes" parameter is useful when searching several types,
|
|
||||||
* if 0, the discovery will stop with the first type returning results.
|
|
||||||
* TTL should default to 2. */
|
|
||||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
|
||||||
upnpDiscover(int delay, const char * multicastif,
|
|
||||||
const char * minissdpdsock, int sameport,
|
|
||||||
int ipv6, unsigned char ttl,
|
|
||||||
int * error);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
|
||||||
upnpDiscoverAll(int delay, const char * multicastif,
|
|
||||||
const char * minissdpdsock, int sameport,
|
|
||||||
int ipv6, unsigned char ttl,
|
|
||||||
int * error);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
|
||||||
upnpDiscoverDevice(const char * device, int delay, const char * multicastif,
|
|
||||||
const char * minissdpdsock, int sameport,
|
|
||||||
int ipv6, unsigned char ttl,
|
|
||||||
int * error);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC struct UPNPDev *
|
|
||||||
upnpDiscoverDevices(const char * const deviceTypes[],
|
|
||||||
int delay, const char * multicastif,
|
|
||||||
const char * minissdpdsock, int sameport,
|
|
||||||
int ipv6, unsigned char ttl,
|
|
||||||
int * error,
|
|
||||||
int searchalltypes);
|
|
||||||
|
|
||||||
/* parserootdesc() :
|
|
||||||
* parse root XML description of a UPnP device and fill the IGDdatas
|
|
||||||
* structure. */
|
|
||||||
MINIUPNP_LIBSPEC void parserootdesc(const char *, int, struct IGDdatas *);
|
|
||||||
|
|
||||||
/* structure used to get fast access to urls
|
|
||||||
* controlURL: controlURL of the WANIPConnection
|
|
||||||
* ipcondescURL: url of the description of the WANIPConnection
|
|
||||||
* controlURL_CIF: controlURL of the WANCommonInterfaceConfig
|
|
||||||
* controlURL_6FC: controlURL of the WANIPv6FirewallControl
|
|
||||||
*/
|
|
||||||
struct UPNPUrls {
|
|
||||||
char * controlURL;
|
|
||||||
char * ipcondescURL;
|
|
||||||
char * controlURL_CIF;
|
|
||||||
char * controlURL_6FC;
|
|
||||||
char * rootdescURL;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* UPNP_GetValidIGD() :
|
|
||||||
* return values :
|
|
||||||
* 0 = NO IGD found
|
|
||||||
* 1 = A valid connected IGD has been found
|
|
||||||
* 2 = A valid IGD has been found but it reported as
|
|
||||||
* not connected
|
|
||||||
* 3 = an UPnP device has been found but was not recognized as an IGD
|
|
||||||
*
|
|
||||||
* In any non zero return case, the urls and data structures
|
|
||||||
* passed as parameters are set. Donc forget to call FreeUPNPUrls(urls) to
|
|
||||||
* free allocated memory.
|
|
||||||
*/
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_GetValidIGD(struct UPNPDev * devlist,
|
|
||||||
struct UPNPUrls * urls,
|
|
||||||
struct IGDdatas * data,
|
|
||||||
char * lanaddr, int lanaddrlen);
|
|
||||||
|
|
||||||
/* UPNP_GetIGDFromUrl()
|
|
||||||
* Used when skipping the discovery process.
|
|
||||||
* When succeding, urls, data, and lanaddr arguments are set.
|
|
||||||
* return value :
|
|
||||||
* 0 - Not ok
|
|
||||||
* 1 - OK */
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_GetIGDFromUrl(const char * rootdescurl,
|
|
||||||
struct UPNPUrls * urls,
|
|
||||||
struct IGDdatas * data,
|
|
||||||
char * lanaddr, int lanaddrlen);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC void
|
|
||||||
GetUPNPUrls(struct UPNPUrls *, struct IGDdatas *,
|
|
||||||
const char *, unsigned int);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC void
|
|
||||||
FreeUPNPUrls(struct UPNPUrls *);
|
|
||||||
|
|
||||||
/* return 0 or 1 */
|
|
||||||
MINIUPNP_LIBSPEC int UPNPIGD_IsConnected(struct UPNPUrls *, struct IGDdatas *);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
12
Externals/miniupnpc/src/miniupnpc_declspec.h
vendored
12
Externals/miniupnpc/src/miniupnpc_declspec.h
vendored
@ -1,12 +0,0 @@
|
|||||||
#ifndef MINIUPNPC_DECLSPEC_H_INCLUDED
|
|
||||||
#define MINIUPNPC_DECLSPEC_H_INCLUDED
|
|
||||||
|
|
||||||
#if defined(__GNUC__) && __GNUC__ >= 4
|
|
||||||
/* fix dynlib for OS X 10.9.2 and Apple LLVM version 5.0 */
|
|
||||||
#define MINIUPNP_LIBSPEC __attribute__ ((visibility ("default")))
|
|
||||||
#else
|
|
||||||
#define MINIUPNP_LIBSPEC
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* MINIUPNPC_DECLSPEC_H_INCLUDED */
|
|
||||||
|
|
648
Externals/miniupnpc/src/miniupnpcmodule.c
vendored
648
Externals/miniupnpc/src/miniupnpcmodule.c
vendored
@ -1,648 +0,0 @@
|
|||||||
/* $Id: miniupnpcmodule.c,v 1.24 2014/06/10 09:48:11 nanard Exp $*/
|
|
||||||
/* Project : miniupnp
|
|
||||||
* Author : Thomas BERNARD
|
|
||||||
* website : http://miniupnp.tuxfamily.org/
|
|
||||||
* copyright (c) 2007-2014 Thomas Bernard
|
|
||||||
* This software is subjet to the conditions detailed in the
|
|
||||||
* provided LICENCE file. */
|
|
||||||
#include <Python.h>
|
|
||||||
#define MINIUPNP_STATICLIB
|
|
||||||
#include "structmember.h"
|
|
||||||
#include "miniupnpc.h"
|
|
||||||
#include "upnpcommands.h"
|
|
||||||
#include "upnperrors.h"
|
|
||||||
|
|
||||||
/* for compatibility with Python < 2.4 */
|
|
||||||
#ifndef Py_RETURN_NONE
|
|
||||||
#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Py_RETURN_TRUE
|
|
||||||
#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Py_RETURN_FALSE
|
|
||||||
#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* for compatibility with Python < 3.0 */
|
|
||||||
#ifndef PyVarObject_HEAD_INIT
|
|
||||||
#define PyVarObject_HEAD_INIT(type, size) \
|
|
||||||
PyObject_HEAD_INIT(type) size,
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Py_TYPE
|
|
||||||
#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
PyObject_HEAD
|
|
||||||
/* Type-specific fields go here. */
|
|
||||||
struct UPNPDev * devlist;
|
|
||||||
struct UPNPUrls urls;
|
|
||||||
struct IGDdatas data;
|
|
||||||
unsigned int discoverdelay; /* value passed to upnpDiscover() */
|
|
||||||
char lanaddr[40]; /* our ip address on the LAN */
|
|
||||||
char * multicastif;
|
|
||||||
char * minissdpdsocket;
|
|
||||||
} UPnPObject;
|
|
||||||
|
|
||||||
static PyMemberDef UPnP_members[] = {
|
|
||||||
{"lanaddr", T_STRING_INPLACE, offsetof(UPnPObject, lanaddr),
|
|
||||||
READONLY, "ip address on the LAN"
|
|
||||||
},
|
|
||||||
{"discoverdelay", T_UINT, offsetof(UPnPObject, discoverdelay),
|
|
||||||
0/*READWRITE*/, "value in ms used to wait for SSDP responses"
|
|
||||||
},
|
|
||||||
/* T_STRING is allways readonly :( */
|
|
||||||
{"multicastif", T_STRING, offsetof(UPnPObject, multicastif),
|
|
||||||
0, "IP of the network interface to be used for multicast operations"
|
|
||||||
},
|
|
||||||
{"minissdpdsocket", T_STRING, offsetof(UPnPObject, minissdpdsocket),
|
|
||||||
0, "path of the MiniSSDPd unix socket"
|
|
||||||
},
|
|
||||||
{NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static int UPnP_init(UPnPObject *self, PyObject *args, PyObject *kwds)
|
|
||||||
{
|
|
||||||
char* multicastif = NULL;
|
|
||||||
char* minissdpdsocket = NULL;
|
|
||||||
static char *kwlist[] = {
|
|
||||||
"multicastif", "minissdpdsocket", "discoverdelay", NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
if(!PyArg_ParseTupleAndKeywords(args, kwds, "|zzI", kwlist,
|
|
||||||
&multicastif,
|
|
||||||
&minissdpdsocket,
|
|
||||||
&self->discoverdelay))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if(multicastif)
|
|
||||||
self->multicastif = strdup(multicastif);
|
|
||||||
if(minissdpdsocket)
|
|
||||||
self->minissdpdsocket = strdup(minissdpdsocket);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
UPnPObject_dealloc(UPnPObject *self)
|
|
||||||
{
|
|
||||||
freeUPNPDevlist(self->devlist);
|
|
||||||
FreeUPNPUrls(&self->urls);
|
|
||||||
free(self->multicastif);
|
|
||||||
free(self->minissdpdsocket);
|
|
||||||
Py_TYPE(self)->tp_free((PyObject*)self);
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
UPnP_discover(UPnPObject *self)
|
|
||||||
{
|
|
||||||
struct UPNPDev * dev;
|
|
||||||
int i;
|
|
||||||
PyObject *res = NULL;
|
|
||||||
if(self->devlist)
|
|
||||||
{
|
|
||||||
freeUPNPDevlist(self->devlist);
|
|
||||||
self->devlist = 0;
|
|
||||||
}
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
self->devlist = upnpDiscover((int)self->discoverdelay/*timeout in ms*/,
|
|
||||||
self->multicastif,
|
|
||||||
self->minissdpdsocket,
|
|
||||||
0/*sameport flag*/,
|
|
||||||
0/*ip v6*/,
|
|
||||||
2/* TTL */,
|
|
||||||
0/*error */);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
/* Py_RETURN_NONE ??? */
|
|
||||||
for(dev = self->devlist, i = 0; dev; dev = dev->pNext)
|
|
||||||
i++;
|
|
||||||
res = Py_BuildValue("i", i);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
UPnP_selectigd(UPnPObject *self)
|
|
||||||
{
|
|
||||||
int r;
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
r = UPNP_GetValidIGD(self->devlist, &self->urls, &self->data,
|
|
||||||
self->lanaddr, sizeof(self->lanaddr));
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
if(r)
|
|
||||||
{
|
|
||||||
return Py_BuildValue("s", self->urls.controlURL);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* TODO: have our own exception type ! */
|
|
||||||
PyErr_SetString(PyExc_Exception, "No UPnP device discovered");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
UPnP_totalbytesent(UPnPObject *self)
|
|
||||||
{
|
|
||||||
UNSIGNED_INTEGER i;
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
i = UPNP_GetTotalBytesSent(self->urls.controlURL_CIF,
|
|
||||||
self->data.CIF.servicetype);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
return Py_BuildValue("I", i);
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
UPnP_totalbytereceived(UPnPObject *self)
|
|
||||||
{
|
|
||||||
UNSIGNED_INTEGER i;
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
i = UPNP_GetTotalBytesReceived(self->urls.controlURL_CIF,
|
|
||||||
self->data.CIF.servicetype);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
return Py_BuildValue("I", i);
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
UPnP_totalpacketsent(UPnPObject *self)
|
|
||||||
{
|
|
||||||
UNSIGNED_INTEGER i;
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
i = UPNP_GetTotalPacketsSent(self->urls.controlURL_CIF,
|
|
||||||
self->data.CIF.servicetype);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
return Py_BuildValue("I", i);
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
UPnP_totalpacketreceived(UPnPObject *self)
|
|
||||||
{
|
|
||||||
UNSIGNED_INTEGER i;
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
i = UPNP_GetTotalPacketsReceived(self->urls.controlURL_CIF,
|
|
||||||
self->data.CIF.servicetype);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
return Py_BuildValue("I", i);
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
UPnP_statusinfo(UPnPObject *self)
|
|
||||||
{
|
|
||||||
char status[64];
|
|
||||||
char lastconnerror[64];
|
|
||||||
unsigned int uptime = 0;
|
|
||||||
int r;
|
|
||||||
status[0] = '\0';
|
|
||||||
lastconnerror[0] = '\0';
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
r = UPNP_GetStatusInfo(self->urls.controlURL, self->data.first.servicetype,
|
|
||||||
status, &uptime, lastconnerror);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
if(r==UPNPCOMMAND_SUCCESS) {
|
|
||||||
return Py_BuildValue("(s,I,s)", status, uptime, lastconnerror);
|
|
||||||
} else {
|
|
||||||
/* TODO: have our own exception type ! */
|
|
||||||
PyErr_SetString(PyExc_Exception, strupnperror(r));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
UPnP_connectiontype(UPnPObject *self)
|
|
||||||
{
|
|
||||||
char connectionType[64];
|
|
||||||
int r;
|
|
||||||
connectionType[0] = '\0';
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
r = UPNP_GetConnectionTypeInfo(self->urls.controlURL,
|
|
||||||
self->data.first.servicetype,
|
|
||||||
connectionType);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
if(r==UPNPCOMMAND_SUCCESS) {
|
|
||||||
return Py_BuildValue("s", connectionType);
|
|
||||||
} else {
|
|
||||||
/* TODO: have our own exception type ! */
|
|
||||||
PyErr_SetString(PyExc_Exception, strupnperror(r));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
UPnP_externalipaddress(UPnPObject *self)
|
|
||||||
{
|
|
||||||
char externalIPAddress[40];
|
|
||||||
int r;
|
|
||||||
externalIPAddress[0] = '\0';
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
r = UPNP_GetExternalIPAddress(self->urls.controlURL,
|
|
||||||
self->data.first.servicetype,
|
|
||||||
externalIPAddress);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
if(r==UPNPCOMMAND_SUCCESS) {
|
|
||||||
return Py_BuildValue("s", externalIPAddress);
|
|
||||||
} else {
|
|
||||||
/* TODO: have our own exception type ! */
|
|
||||||
PyErr_SetString(PyExc_Exception, strupnperror(r));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* AddPortMapping(externalPort, protocol, internalHost, internalPort, desc,
|
|
||||||
* remoteHost)
|
|
||||||
* protocol is 'UDP' or 'TCP' */
|
|
||||||
static PyObject *
|
|
||||||
UPnP_addportmapping(UPnPObject *self, PyObject *args)
|
|
||||||
{
|
|
||||||
char extPort[6];
|
|
||||||
unsigned short ePort;
|
|
||||||
char inPort[6];
|
|
||||||
unsigned short iPort;
|
|
||||||
const char * proto;
|
|
||||||
const char * host;
|
|
||||||
const char * desc;
|
|
||||||
const char * remoteHost;
|
|
||||||
const char * leaseDuration = "0";
|
|
||||||
int r;
|
|
||||||
if (!PyArg_ParseTuple(args, "HssHss", &ePort, &proto,
|
|
||||||
&host, &iPort, &desc, &remoteHost))
|
|
||||||
return NULL;
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
sprintf(extPort, "%hu", ePort);
|
|
||||||
sprintf(inPort, "%hu", iPort);
|
|
||||||
r = UPNP_AddPortMapping(self->urls.controlURL, self->data.first.servicetype,
|
|
||||||
extPort, inPort, host, desc, proto,
|
|
||||||
remoteHost, leaseDuration);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
if(r==UPNPCOMMAND_SUCCESS)
|
|
||||||
{
|
|
||||||
Py_RETURN_TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// TODO: RAISE an Exception. See upnpcommands.h for errors codes.
|
|
||||||
// upnperrors.c
|
|
||||||
//Py_RETURN_FALSE;
|
|
||||||
/* TODO: have our own exception type ! */
|
|
||||||
PyErr_SetString(PyExc_Exception, strupnperror(r));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* AddAnyPortMapping(externalPort, protocol, internalHost, internalPort, desc,
|
|
||||||
* remoteHost)
|
|
||||||
* protocol is 'UDP' or 'TCP' */
|
|
||||||
static PyObject *
|
|
||||||
UPnP_addanyportmapping(UPnPObject *self, PyObject *args)
|
|
||||||
{
|
|
||||||
char extPort[6];
|
|
||||||
unsigned short ePort;
|
|
||||||
char inPort[6];
|
|
||||||
unsigned short iPort;
|
|
||||||
char reservedPort[6];
|
|
||||||
const char * proto;
|
|
||||||
const char * host;
|
|
||||||
const char * desc;
|
|
||||||
const char * remoteHost;
|
|
||||||
const char * leaseDuration = "0";
|
|
||||||
int r;
|
|
||||||
if (!PyArg_ParseTuple(args, "HssHss", &ePort, &proto, &host, &iPort, &desc, &remoteHost))
|
|
||||||
return NULL;
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
sprintf(extPort, "%hu", ePort);
|
|
||||||
sprintf(inPort, "%hu", iPort);
|
|
||||||
r = UPNP_AddAnyPortMapping(self->urls.controlURL, self->data.first.servicetype,
|
|
||||||
extPort, inPort, host, desc, proto,
|
|
||||||
remoteHost, leaseDuration, reservedPort);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
if(r==UPNPCOMMAND_SUCCESS) {
|
|
||||||
return Py_BuildValue("i", atoi(reservedPort));
|
|
||||||
} else {
|
|
||||||
/* TODO: have our own exception type ! */
|
|
||||||
PyErr_SetString(PyExc_Exception, strupnperror(r));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* DeletePortMapping(extPort, proto, removeHost='')
|
|
||||||
* proto = 'UDP', 'TCP' */
|
|
||||||
static PyObject *
|
|
||||||
UPnP_deleteportmapping(UPnPObject *self, PyObject *args)
|
|
||||||
{
|
|
||||||
char extPort[6];
|
|
||||||
unsigned short ePort;
|
|
||||||
const char * proto;
|
|
||||||
const char * remoteHost = "";
|
|
||||||
int r;
|
|
||||||
if(!PyArg_ParseTuple(args, "Hs|z", &ePort, &proto, &remoteHost))
|
|
||||||
return NULL;
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
sprintf(extPort, "%hu", ePort);
|
|
||||||
r = UPNP_DeletePortMapping(self->urls.controlURL, self->data.first.servicetype,
|
|
||||||
extPort, proto, remoteHost);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
if(r==UPNPCOMMAND_SUCCESS) {
|
|
||||||
Py_RETURN_TRUE;
|
|
||||||
} else {
|
|
||||||
/* TODO: have our own exception type ! */
|
|
||||||
PyErr_SetString(PyExc_Exception, strupnperror(r));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* DeletePortMappingRange(extPort, proto, removeHost='')
|
|
||||||
* proto = 'UDP', 'TCP' */
|
|
||||||
static PyObject *
|
|
||||||
UPnP_deleteportmappingrange(UPnPObject *self, PyObject *args)
|
|
||||||
{
|
|
||||||
char extPortStart[6];
|
|
||||||
unsigned short ePortStart;
|
|
||||||
char extPortEnd[6];
|
|
||||||
unsigned short ePortEnd;
|
|
||||||
const char * proto;
|
|
||||||
unsigned char manage;
|
|
||||||
char manageStr[1];
|
|
||||||
int r;
|
|
||||||
if(!PyArg_ParseTuple(args, "HHsb", &ePortStart, &ePortEnd, &proto, &manage))
|
|
||||||
return NULL;
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
sprintf(extPortStart, "%hu", ePortStart);
|
|
||||||
sprintf(extPortEnd, "%hu", ePortEnd);
|
|
||||||
sprintf(manageStr, "%hhu", manage);
|
|
||||||
r = UPNP_DeletePortMappingRange(self->urls.controlURL, self->data.first.servicetype,
|
|
||||||
extPortStart, extPortEnd, proto, manageStr);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
if(r==UPNPCOMMAND_SUCCESS) {
|
|
||||||
Py_RETURN_TRUE;
|
|
||||||
} else {
|
|
||||||
/* TODO: have our own exception type ! */
|
|
||||||
PyErr_SetString(PyExc_Exception, strupnperror(r));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
UPnP_getportmappingnumberofentries(UPnPObject *self)
|
|
||||||
{
|
|
||||||
unsigned int n = 0;
|
|
||||||
int r;
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
r = UPNP_GetPortMappingNumberOfEntries(self->urls.controlURL,
|
|
||||||
self->data.first.servicetype,
|
|
||||||
&n);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
if(r==UPNPCOMMAND_SUCCESS) {
|
|
||||||
return Py_BuildValue("I", n);
|
|
||||||
} else {
|
|
||||||
/* TODO: have our own exception type ! */
|
|
||||||
PyErr_SetString(PyExc_Exception, strupnperror(r));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* GetSpecificPortMapping(ePort, proto, remoteHost='')
|
|
||||||
* proto = 'UDP' or 'TCP' */
|
|
||||||
static PyObject *
|
|
||||||
UPnP_getspecificportmapping(UPnPObject *self, PyObject *args)
|
|
||||||
{
|
|
||||||
char extPort[6];
|
|
||||||
unsigned short ePort;
|
|
||||||
const char * proto;
|
|
||||||
const char * remoteHost = "";
|
|
||||||
char intClient[40];
|
|
||||||
char intPort[6];
|
|
||||||
unsigned short iPort;
|
|
||||||
char desc[80];
|
|
||||||
char enabled[4];
|
|
||||||
char leaseDuration[16];
|
|
||||||
if(!PyArg_ParseTuple(args, "Hs|z", &ePort, &proto, &remoteHost))
|
|
||||||
return NULL;
|
|
||||||
extPort[0] = '\0'; intClient[0] = '\0'; intPort[0] = '\0';
|
|
||||||
desc[0] = '\0'; enabled[0] = '\0'; leaseDuration[0] = '\0';
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
sprintf(extPort, "%hu", ePort);
|
|
||||||
UPNP_GetSpecificPortMappingEntry(self->urls.controlURL,
|
|
||||||
self->data.first.servicetype,
|
|
||||||
extPort, proto, remoteHost,
|
|
||||||
intClient, intPort,
|
|
||||||
desc, enabled, leaseDuration);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
if(intClient[0])
|
|
||||||
{
|
|
||||||
iPort = (unsigned short)atoi(intPort);
|
|
||||||
return Py_BuildValue("(s,H,s,O,i)",
|
|
||||||
intClient, iPort, desc,
|
|
||||||
PyBool_FromLong(atoi(enabled)),
|
|
||||||
atoi(leaseDuration));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Py_RETURN_NONE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* GetGenericPortMapping(index) */
|
|
||||||
static PyObject *
|
|
||||||
UPnP_getgenericportmapping(UPnPObject *self, PyObject *args)
|
|
||||||
{
|
|
||||||
int i, r;
|
|
||||||
char index[8];
|
|
||||||
char intClient[40];
|
|
||||||
char intPort[6];
|
|
||||||
unsigned short iPort;
|
|
||||||
char extPort[6];
|
|
||||||
unsigned short ePort;
|
|
||||||
char protocol[4];
|
|
||||||
char desc[80];
|
|
||||||
char enabled[6];
|
|
||||||
char rHost[64];
|
|
||||||
char duration[16]; /* lease duration */
|
|
||||||
unsigned int dur;
|
|
||||||
if(!PyArg_ParseTuple(args, "i", &i))
|
|
||||||
return NULL;
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
snprintf(index, sizeof(index), "%d", i);
|
|
||||||
rHost[0] = '\0'; enabled[0] = '\0';
|
|
||||||
duration[0] = '\0'; desc[0] = '\0';
|
|
||||||
extPort[0] = '\0'; intPort[0] = '\0'; intClient[0] = '\0';
|
|
||||||
r = UPNP_GetGenericPortMappingEntry(self->urls.controlURL,
|
|
||||||
self->data.first.servicetype,
|
|
||||||
index,
|
|
||||||
extPort, intClient, intPort,
|
|
||||||
protocol, desc, enabled, rHost,
|
|
||||||
duration);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
if(r==UPNPCOMMAND_SUCCESS)
|
|
||||||
{
|
|
||||||
ePort = (unsigned short)atoi(extPort);
|
|
||||||
iPort = (unsigned short)atoi(intPort);
|
|
||||||
dur = (unsigned int)strtoul(duration, 0, 0);
|
|
||||||
return Py_BuildValue("(H,s,(s,H),s,s,s,I)",
|
|
||||||
ePort, protocol, intClient, iPort,
|
|
||||||
desc, enabled, rHost, dur);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Py_RETURN_NONE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* miniupnpc.UPnP object Method Table */
|
|
||||||
static PyMethodDef UPnP_methods[] = {
|
|
||||||
{"discover", (PyCFunction)UPnP_discover, METH_NOARGS,
|
|
||||||
"discover UPnP IGD devices on the network"
|
|
||||||
},
|
|
||||||
{"selectigd", (PyCFunction)UPnP_selectigd, METH_NOARGS,
|
|
||||||
"select a valid UPnP IGD among discovered devices"
|
|
||||||
},
|
|
||||||
{"totalbytesent", (PyCFunction)UPnP_totalbytesent, METH_NOARGS,
|
|
||||||
"return the total number of bytes sent by UPnP IGD"
|
|
||||||
},
|
|
||||||
{"totalbytereceived", (PyCFunction)UPnP_totalbytereceived, METH_NOARGS,
|
|
||||||
"return the total number of bytes received by UPnP IGD"
|
|
||||||
},
|
|
||||||
{"totalpacketsent", (PyCFunction)UPnP_totalpacketsent, METH_NOARGS,
|
|
||||||
"return the total number of packets sent by UPnP IGD"
|
|
||||||
},
|
|
||||||
{"totalpacketreceived", (PyCFunction)UPnP_totalpacketreceived, METH_NOARGS,
|
|
||||||
"return the total number of packets received by UPnP IGD"
|
|
||||||
},
|
|
||||||
{"statusinfo", (PyCFunction)UPnP_statusinfo, METH_NOARGS,
|
|
||||||
"return status and uptime"
|
|
||||||
},
|
|
||||||
{"connectiontype", (PyCFunction)UPnP_connectiontype, METH_NOARGS,
|
|
||||||
"return IGD WAN connection type"
|
|
||||||
},
|
|
||||||
{"externalipaddress", (PyCFunction)UPnP_externalipaddress, METH_NOARGS,
|
|
||||||
"return external IP address"
|
|
||||||
},
|
|
||||||
{"addportmapping", (PyCFunction)UPnP_addportmapping, METH_VARARGS,
|
|
||||||
"add a port mapping"
|
|
||||||
},
|
|
||||||
{"addanyportmapping", (PyCFunction)UPnP_addanyportmapping, METH_VARARGS,
|
|
||||||
"add a port mapping, IGD to select alternative if necessary"
|
|
||||||
},
|
|
||||||
{"deleteportmapping", (PyCFunction)UPnP_deleteportmapping, METH_VARARGS,
|
|
||||||
"delete a port mapping"
|
|
||||||
},
|
|
||||||
{"deleteportmappingrange", (PyCFunction)UPnP_deleteportmappingrange, METH_VARARGS,
|
|
||||||
"delete a range of port mappings"
|
|
||||||
},
|
|
||||||
{"getportmappingnumberofentries", (PyCFunction)UPnP_getportmappingnumberofentries, METH_NOARGS,
|
|
||||||
"-- non standard --"
|
|
||||||
},
|
|
||||||
{"getspecificportmapping", (PyCFunction)UPnP_getspecificportmapping, METH_VARARGS,
|
|
||||||
"get details about a specific port mapping entry"
|
|
||||||
},
|
|
||||||
{"getgenericportmapping", (PyCFunction)UPnP_getgenericportmapping, METH_VARARGS,
|
|
||||||
"get all details about the port mapping at index"
|
|
||||||
},
|
|
||||||
{NULL} /* Sentinel */
|
|
||||||
};
|
|
||||||
|
|
||||||
static PyTypeObject UPnPType = {
|
|
||||||
PyVarObject_HEAD_INIT(NULL,
|
|
||||||
0) /*ob_size*/
|
|
||||||
"miniupnpc.UPnP", /*tp_name*/
|
|
||||||
sizeof(UPnPObject), /*tp_basicsize*/
|
|
||||||
0, /*tp_itemsize*/
|
|
||||||
(destructor)UPnPObject_dealloc,/*tp_dealloc*/
|
|
||||||
0, /*tp_print*/
|
|
||||||
0, /*tp_getattr*/
|
|
||||||
0, /*tp_setattr*/
|
|
||||||
0, /*tp_compare*/
|
|
||||||
0, /*tp_repr*/
|
|
||||||
0, /*tp_as_number*/
|
|
||||||
0, /*tp_as_sequence*/
|
|
||||||
0, /*tp_as_mapping*/
|
|
||||||
0, /*tp_hash */
|
|
||||||
0, /*tp_call*/
|
|
||||||
0, /*tp_str*/
|
|
||||||
0, /*tp_getattro*/
|
|
||||||
0, /*tp_setattro*/
|
|
||||||
0, /*tp_as_buffer*/
|
|
||||||
Py_TPFLAGS_DEFAULT, /*tp_flags*/
|
|
||||||
"UPnP objects", /* tp_doc */
|
|
||||||
0, /* tp_traverse */
|
|
||||||
0, /* tp_clear */
|
|
||||||
0, /* tp_richcompare */
|
|
||||||
0, /* tp_weaklistoffset */
|
|
||||||
0, /* tp_iter */
|
|
||||||
0, /* tp_iternext */
|
|
||||||
UPnP_methods, /* tp_methods */
|
|
||||||
UPnP_members, /* tp_members */
|
|
||||||
0, /* tp_getset */
|
|
||||||
0, /* tp_base */
|
|
||||||
0, /* tp_dict */
|
|
||||||
0, /* tp_descr_get */
|
|
||||||
0, /* tp_descr_set */
|
|
||||||
0, /* tp_dictoffset */
|
|
||||||
(initproc)UPnP_init, /* tp_init */
|
|
||||||
0, /* tp_alloc */
|
|
||||||
#ifndef _WIN32
|
|
||||||
PyType_GenericNew,/*UPnP_new,*/ /* tp_new */
|
|
||||||
#else
|
|
||||||
0,
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
/* module methods */
|
|
||||||
static PyMethodDef miniupnpc_methods[] = {
|
|
||||||
{NULL} /* Sentinel */
|
|
||||||
};
|
|
||||||
|
|
||||||
#if PY_MAJOR_VERSION >= 3
|
|
||||||
static struct PyModuleDef moduledef = {
|
|
||||||
PyModuleDef_HEAD_INIT,
|
|
||||||
"miniupnpc", /* m_name */
|
|
||||||
"miniupnpc module.", /* m_doc */
|
|
||||||
-1, /* m_size */
|
|
||||||
miniupnpc_methods, /* m_methods */
|
|
||||||
NULL, /* m_reload */
|
|
||||||
NULL, /* m_traverse */
|
|
||||||
NULL, /* m_clear */
|
|
||||||
NULL, /* m_free */
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
|
|
||||||
#define PyMODINIT_FUNC void
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PyMODINIT_FUNC
|
|
||||||
#if PY_MAJOR_VERSION >= 3
|
|
||||||
PyInit_miniupnpc(void)
|
|
||||||
#else
|
|
||||||
initminiupnpc(void)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
PyObject* m;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
UPnPType.tp_new = PyType_GenericNew;
|
|
||||||
#endif
|
|
||||||
if (PyType_Ready(&UPnPType) < 0)
|
|
||||||
#if PY_MAJOR_VERSION >= 3
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if PY_MAJOR_VERSION >= 3
|
|
||||||
m = PyModule_Create(&moduledef);
|
|
||||||
#else
|
|
||||||
m = Py_InitModule3("miniupnpc", miniupnpc_methods,
|
|
||||||
"miniupnpc module.");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Py_INCREF(&UPnPType);
|
|
||||||
PyModule_AddObject(m, "UPnP", (PyObject *)&UPnPType);
|
|
||||||
|
|
||||||
#if PY_MAJOR_VERSION >= 3
|
|
||||||
return m;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
20
Externals/miniupnpc/src/miniupnpcstrings.h
vendored
20
Externals/miniupnpc/src/miniupnpcstrings.h
vendored
@ -1,20 +0,0 @@
|
|||||||
#ifndef MINIUPNPCSTRINGS_H_INCLUDED
|
|
||||||
#define MINIUPNPCSTRINGS_H_INCLUDED
|
|
||||||
|
|
||||||
#if defined(_WIN32)
|
|
||||||
#define OS_STRING "Windows"
|
|
||||||
#elif defined(__linux__)
|
|
||||||
#define OS_STRING "Linux"
|
|
||||||
#elif defined(__OSX__)
|
|
||||||
#define OS_STRING "Mac OS X"
|
|
||||||
#elif defined(__APPLE__)
|
|
||||||
#define OS_STRING "Mac OS X"
|
|
||||||
#elif defined(__DARWIN__)
|
|
||||||
#define OS_STRING "Darwin"
|
|
||||||
#else
|
|
||||||
#define OS_STRING "Generic"
|
|
||||||
#endif
|
|
||||||
#define MINIUPNPC_VERSION_STRING "1.9"
|
|
||||||
#define UPNP_VERSION_STRING "UPnP/1.1"
|
|
||||||
|
|
||||||
#endif
|
|
19
Externals/miniupnpc/src/miniupnpctypes.h
vendored
19
Externals/miniupnpc/src/miniupnpctypes.h
vendored
@ -1,19 +0,0 @@
|
|||||||
/* $Id: miniupnpctypes.h,v 1.1 2011/02/15 11:10:40 nanard Exp $ */
|
|
||||||
/* Miniupnp project : http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org
|
|
||||||
* Author : Thomas Bernard
|
|
||||||
* Copyright (c) 2011 Thomas Bernard
|
|
||||||
* This software is subject to the conditions detailed in the
|
|
||||||
* LICENCE file provided within this distribution */
|
|
||||||
#ifndef MINIUPNPCTYPES_H_INCLUDED
|
|
||||||
#define MINIUPNPCTYPES_H_INCLUDED
|
|
||||||
|
|
||||||
#if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
|
|
||||||
#define UNSIGNED_INTEGER unsigned long long
|
|
||||||
#define STRTOUI strtoull
|
|
||||||
#else
|
|
||||||
#define UNSIGNED_INTEGER unsigned int
|
|
||||||
#define STRTOUI strtoul
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
621
Externals/miniupnpc/src/miniwget.c
vendored
621
Externals/miniupnpc/src/miniwget.c
vendored
@ -1,621 +0,0 @@
|
|||||||
/* $Id: miniwget.c,v 1.70 2015/07/15 12:41:13 nanard Exp $ */
|
|
||||||
/* Project : miniupnp
|
|
||||||
* Website : http://miniupnp.free.fr/
|
|
||||||
* Author : Thomas Bernard
|
|
||||||
* Copyright (c) 2005-2015 Thomas Bernard
|
|
||||||
* This software is subject to the conditions detailed in the
|
|
||||||
* LICENCE file provided in this distribution. */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <winsock2.h>
|
|
||||||
#include <ws2tcpip.h>
|
|
||||||
#include <io.h>
|
|
||||||
#define MAXHOSTNAMELEN 64
|
|
||||||
#define snprintf _snprintf
|
|
||||||
#define socklen_t int
|
|
||||||
#ifndef strncasecmp
|
|
||||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
|
||||||
#define strncasecmp _memicmp
|
|
||||||
#else /* defined(_MSC_VER) && (_MSC_VER >= 1400) */
|
|
||||||
#define strncasecmp memicmp
|
|
||||||
#endif /* defined(_MSC_VER) && (_MSC_VER >= 1400) */
|
|
||||||
#endif /* #ifndef strncasecmp */
|
|
||||||
#else /* #ifdef _WIN32 */
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#if defined(__amigaos__) && !defined(__amigaos4__)
|
|
||||||
#define socklen_t int
|
|
||||||
#else /* #if defined(__amigaos__) && !defined(__amigaos4__) */
|
|
||||||
#include <sys/select.h>
|
|
||||||
#endif /* #else defined(__amigaos__) && !defined(__amigaos4__) */
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#define closesocket close
|
|
||||||
#include <strings.h>
|
|
||||||
#endif /* #else _WIN32 */
|
|
||||||
#ifdef __GNU__
|
|
||||||
#define MAXHOSTNAMELEN 64
|
|
||||||
#endif /* __GNU__ */
|
|
||||||
|
|
||||||
#ifndef MIN
|
|
||||||
#define MIN(x,y) (((x)<(y))?(x):(y))
|
|
||||||
#endif /* MIN */
|
|
||||||
|
|
||||||
|
|
||||||
#include "miniupnpcstrings.h"
|
|
||||||
#include "miniwget.h"
|
|
||||||
#include "connecthostport.h"
|
|
||||||
#include "receivedata.h"
|
|
||||||
|
|
||||||
#ifndef MAXHOSTNAMELEN
|
|
||||||
#define MAXHOSTNAMELEN 64
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read a HTTP response from a socket.
|
|
||||||
* Process Content-Length and Transfer-encoding headers.
|
|
||||||
* return a pointer to the content buffer, which length is saved
|
|
||||||
* to the length parameter.
|
|
||||||
*/
|
|
||||||
void *
|
|
||||||
getHTTPResponse(int s, int * size)
|
|
||||||
{
|
|
||||||
char buf[2048];
|
|
||||||
int n;
|
|
||||||
int endofheaders = 0;
|
|
||||||
int chunked = 0;
|
|
||||||
int content_length = -1;
|
|
||||||
unsigned int chunksize = 0;
|
|
||||||
unsigned int bytestocopy = 0;
|
|
||||||
/* buffers : */
|
|
||||||
char * header_buf;
|
|
||||||
unsigned int header_buf_len = 2048;
|
|
||||||
unsigned int header_buf_used = 0;
|
|
||||||
char * content_buf;
|
|
||||||
unsigned int content_buf_len = 2048;
|
|
||||||
unsigned int content_buf_used = 0;
|
|
||||||
char chunksize_buf[32];
|
|
||||||
unsigned int chunksize_buf_index;
|
|
||||||
|
|
||||||
header_buf = malloc(header_buf_len);
|
|
||||||
if(header_buf == NULL)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "%s: Memory allocation error\n", "getHTTPResponse");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
*size = -1;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
content_buf = malloc(content_buf_len);
|
|
||||||
if(content_buf == NULL)
|
|
||||||
{
|
|
||||||
free(header_buf);
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "%s: Memory allocation error\n", "getHTTPResponse");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
*size = -1;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
chunksize_buf[0] = '\0';
|
|
||||||
chunksize_buf_index = 0;
|
|
||||||
|
|
||||||
while((n = receivedata(s, buf, 2048, 5000, NULL)) > 0)
|
|
||||||
{
|
|
||||||
if(endofheaders == 0)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int linestart=0;
|
|
||||||
int colon=0;
|
|
||||||
int valuestart=0;
|
|
||||||
if(header_buf_used + n > header_buf_len) {
|
|
||||||
char * tmp = realloc(header_buf, header_buf_used + n);
|
|
||||||
if(tmp == NULL) {
|
|
||||||
/* memory allocation error */
|
|
||||||
free(header_buf);
|
|
||||||
free(content_buf);
|
|
||||||
*size = -1;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
header_buf = tmp;
|
|
||||||
header_buf_len = header_buf_used + n;
|
|
||||||
}
|
|
||||||
memcpy(header_buf + header_buf_used, buf, n);
|
|
||||||
header_buf_used += n;
|
|
||||||
/* search for CR LF CR LF (end of headers)
|
|
||||||
* recognize also LF LF */
|
|
||||||
i = 0;
|
|
||||||
while(i < ((int)header_buf_used-1) && (endofheaders == 0)) {
|
|
||||||
if(header_buf[i] == '\r') {
|
|
||||||
i++;
|
|
||||||
if(header_buf[i] == '\n') {
|
|
||||||
i++;
|
|
||||||
if(i < (int)header_buf_used && header_buf[i] == '\r') {
|
|
||||||
i++;
|
|
||||||
if(i < (int)header_buf_used && header_buf[i] == '\n') {
|
|
||||||
endofheaders = i+1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if(header_buf[i] == '\n') {
|
|
||||||
i++;
|
|
||||||
if(header_buf[i] == '\n') {
|
|
||||||
endofheaders = i+1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if(endofheaders == 0)
|
|
||||||
continue;
|
|
||||||
/* parse header lines */
|
|
||||||
for(i = 0; i < endofheaders - 1; i++) {
|
|
||||||
if(colon <= linestart && header_buf[i]==':')
|
|
||||||
{
|
|
||||||
colon = i;
|
|
||||||
while(i < (endofheaders-1)
|
|
||||||
&& (header_buf[i+1] == ' ' || header_buf[i+1] == '\t'))
|
|
||||||
i++;
|
|
||||||
valuestart = i + 1;
|
|
||||||
}
|
|
||||||
/* detecting end of line */
|
|
||||||
else if(header_buf[i]=='\r' || header_buf[i]=='\n')
|
|
||||||
{
|
|
||||||
if(colon > linestart && valuestart > colon)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("header='%.*s', value='%.*s'\n",
|
|
||||||
colon-linestart, header_buf+linestart,
|
|
||||||
i-valuestart, header_buf+valuestart);
|
|
||||||
#endif
|
|
||||||
if(0==strncasecmp(header_buf+linestart, "content-length", colon-linestart))
|
|
||||||
{
|
|
||||||
content_length = atoi(header_buf+valuestart);
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("Content-Length: %d\n", content_length);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else if(0==strncasecmp(header_buf+linestart, "transfer-encoding", colon-linestart)
|
|
||||||
&& 0==strncasecmp(header_buf+valuestart, "chunked", 7))
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("chunked transfer-encoding!\n");
|
|
||||||
#endif
|
|
||||||
chunked = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while((i < (int)header_buf_used) && (header_buf[i]=='\r' || header_buf[i] == '\n'))
|
|
||||||
i++;
|
|
||||||
linestart = i;
|
|
||||||
colon = linestart;
|
|
||||||
valuestart = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* copy the remaining of the received data back to buf */
|
|
||||||
n = header_buf_used - endofheaders;
|
|
||||||
memcpy(buf, header_buf + endofheaders, n);
|
|
||||||
/* if(headers) */
|
|
||||||
}
|
|
||||||
if(endofheaders)
|
|
||||||
{
|
|
||||||
/* content */
|
|
||||||
if(chunked)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
while(i < n)
|
|
||||||
{
|
|
||||||
if(chunksize == 0)
|
|
||||||
{
|
|
||||||
/* reading chunk size */
|
|
||||||
if(chunksize_buf_index == 0) {
|
|
||||||
/* skipping any leading CR LF */
|
|
||||||
if(i<n && buf[i] == '\r') i++;
|
|
||||||
if(i<n && buf[i] == '\n') i++;
|
|
||||||
}
|
|
||||||
while(i<n && isxdigit(buf[i])
|
|
||||||
&& chunksize_buf_index < (sizeof(chunksize_buf)-1))
|
|
||||||
{
|
|
||||||
chunksize_buf[chunksize_buf_index++] = buf[i];
|
|
||||||
chunksize_buf[chunksize_buf_index] = '\0';
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
while(i<n && buf[i] != '\r' && buf[i] != '\n')
|
|
||||||
i++; /* discarding chunk-extension */
|
|
||||||
if(i<n && buf[i] == '\r') i++;
|
|
||||||
if(i<n && buf[i] == '\n') {
|
|
||||||
unsigned int j;
|
|
||||||
for(j = 0; j < chunksize_buf_index; j++) {
|
|
||||||
if(chunksize_buf[j] >= '0'
|
|
||||||
&& chunksize_buf[j] <= '9')
|
|
||||||
chunksize = (chunksize << 4) + (chunksize_buf[j] - '0');
|
|
||||||
else
|
|
||||||
chunksize = (chunksize << 4) + ((chunksize_buf[j] | 32) - 'a' + 10);
|
|
||||||
}
|
|
||||||
chunksize_buf[0] = '\0';
|
|
||||||
chunksize_buf_index = 0;
|
|
||||||
i++;
|
|
||||||
} else {
|
|
||||||
/* not finished to get chunksize */
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("chunksize = %u (%x)\n", chunksize, chunksize);
|
|
||||||
#endif
|
|
||||||
if(chunksize == 0)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("end of HTTP content - %d %d\n", i, n);
|
|
||||||
/*printf("'%.*s'\n", n-i, buf+i);*/
|
|
||||||
#endif
|
|
||||||
goto end_of_stream;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bytestocopy = ((int)chunksize < (n - i))?chunksize:(unsigned int)(n - i);
|
|
||||||
if((content_buf_used + bytestocopy) > content_buf_len)
|
|
||||||
{
|
|
||||||
char * tmp;
|
|
||||||
if(content_length >= (int)(content_buf_used + bytestocopy)) {
|
|
||||||
content_buf_len = content_length;
|
|
||||||
} else {
|
|
||||||
content_buf_len = content_buf_used + bytestocopy;
|
|
||||||
}
|
|
||||||
tmp = realloc(content_buf, content_buf_len);
|
|
||||||
if(tmp == NULL) {
|
|
||||||
/* memory allocation error */
|
|
||||||
free(content_buf);
|
|
||||||
free(header_buf);
|
|
||||||
*size = -1;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
content_buf = tmp;
|
|
||||||
}
|
|
||||||
memcpy(content_buf + content_buf_used, buf + i, bytestocopy);
|
|
||||||
content_buf_used += bytestocopy;
|
|
||||||
i += bytestocopy;
|
|
||||||
chunksize -= bytestocopy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* not chunked */
|
|
||||||
if(content_length > 0
|
|
||||||
&& (int)(content_buf_used + n) > content_length) {
|
|
||||||
/* skipping additional bytes */
|
|
||||||
n = content_length - content_buf_used;
|
|
||||||
}
|
|
||||||
if(content_buf_used + n > content_buf_len)
|
|
||||||
{
|
|
||||||
char * tmp;
|
|
||||||
if(content_length >= (int)(content_buf_used + n)) {
|
|
||||||
content_buf_len = content_length;
|
|
||||||
} else {
|
|
||||||
content_buf_len = content_buf_used + n;
|
|
||||||
}
|
|
||||||
tmp = realloc(content_buf, content_buf_len);
|
|
||||||
if(tmp == NULL) {
|
|
||||||
/* memory allocation error */
|
|
||||||
free(content_buf);
|
|
||||||
free(header_buf);
|
|
||||||
*size = -1;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
content_buf = tmp;
|
|
||||||
}
|
|
||||||
memcpy(content_buf + content_buf_used, buf, n);
|
|
||||||
content_buf_used += n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* use the Content-Length header value if available */
|
|
||||||
if(content_length > 0 && (int)content_buf_used >= content_length)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("End of HTTP content\n");
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
end_of_stream:
|
|
||||||
free(header_buf); header_buf = NULL;
|
|
||||||
*size = content_buf_used;
|
|
||||||
if(content_buf_used == 0)
|
|
||||||
{
|
|
||||||
free(content_buf);
|
|
||||||
content_buf = NULL;
|
|
||||||
}
|
|
||||||
return content_buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* miniwget3() :
|
|
||||||
* do all the work.
|
|
||||||
* Return NULL if something failed. */
|
|
||||||
static void *
|
|
||||||
miniwget3(const char * host,
|
|
||||||
unsigned short port, const char * path,
|
|
||||||
int * size, char * addr_str, int addr_str_len,
|
|
||||||
const char * httpversion, unsigned int scope_id)
|
|
||||||
{
|
|
||||||
char buf[2048];
|
|
||||||
int s;
|
|
||||||
int n;
|
|
||||||
int len;
|
|
||||||
int sent;
|
|
||||||
void * content;
|
|
||||||
|
|
||||||
*size = 0;
|
|
||||||
s = connecthostport(host, port, scope_id);
|
|
||||||
if(s < 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* get address for caller ! */
|
|
||||||
if(addr_str)
|
|
||||||
{
|
|
||||||
struct sockaddr_storage saddr;
|
|
||||||
socklen_t saddrlen;
|
|
||||||
|
|
||||||
saddrlen = sizeof(saddr);
|
|
||||||
if(getsockname(s, (struct sockaddr *)&saddr, &saddrlen) < 0)
|
|
||||||
{
|
|
||||||
perror("getsockname");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#if defined(__amigaos__) && !defined(__amigaos4__)
|
|
||||||
/* using INT WINAPI WSAAddressToStringA(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD);
|
|
||||||
* But his function make a string with the port : nn.nn.nn.nn:port */
|
|
||||||
/* if(WSAAddressToStringA((SOCKADDR *)&saddr, sizeof(saddr),
|
|
||||||
NULL, addr_str, (DWORD *)&addr_str_len))
|
|
||||||
{
|
|
||||||
printf("WSAAddressToStringA() failed : %d\n", WSAGetLastError());
|
|
||||||
}*/
|
|
||||||
/* the following code is only compatible with ip v4 addresses */
|
|
||||||
strncpy(addr_str, inet_ntoa(((struct sockaddr_in *)&saddr)->sin_addr), addr_str_len);
|
|
||||||
#else
|
|
||||||
#if 0
|
|
||||||
if(saddr.sa_family == AF_INET6) {
|
|
||||||
inet_ntop(AF_INET6,
|
|
||||||
&(((struct sockaddr_in6 *)&saddr)->sin6_addr),
|
|
||||||
addr_str, addr_str_len);
|
|
||||||
} else {
|
|
||||||
inet_ntop(AF_INET,
|
|
||||||
&(((struct sockaddr_in *)&saddr)->sin_addr),
|
|
||||||
addr_str, addr_str_len);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/* getnameinfo return ip v6 address with the scope identifier
|
|
||||||
* such as : 2a01:e35:8b2b:7330::%4281128194 */
|
|
||||||
n = getnameinfo((const struct sockaddr *)&saddr, saddrlen,
|
|
||||||
addr_str, addr_str_len,
|
|
||||||
NULL, 0,
|
|
||||||
NI_NUMERICHOST | NI_NUMERICSERV);
|
|
||||||
if(n != 0) {
|
|
||||||
#ifdef _WIN32
|
|
||||||
fprintf(stderr, "getnameinfo() failed : %d\n", n);
|
|
||||||
#else
|
|
||||||
fprintf(stderr, "getnameinfo() failed : %s\n", gai_strerror(n));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("address miniwget : %s\n", addr_str);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
len = snprintf(buf, sizeof(buf),
|
|
||||||
"GET %s HTTP/%s\r\n"
|
|
||||||
"Host: %s:%d\r\n"
|
|
||||||
"Connection: Close\r\n"
|
|
||||||
"User-Agent: " OS_STRING ", " UPNP_VERSION_STRING ", MiniUPnPc/" MINIUPNPC_VERSION_STRING "\r\n"
|
|
||||||
|
|
||||||
"\r\n",
|
|
||||||
path, httpversion, host, port);
|
|
||||||
sent = 0;
|
|
||||||
/* sending the HTTP request */
|
|
||||||
while(sent < len)
|
|
||||||
{
|
|
||||||
n = send(s, buf+sent, len-sent, 0);
|
|
||||||
if(n < 0)
|
|
||||||
{
|
|
||||||
perror("send");
|
|
||||||
closesocket(s);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sent += n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
content = getHTTPResponse(s, size);
|
|
||||||
closesocket(s);
|
|
||||||
return content;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* miniwget2() :
|
|
||||||
* Call miniwget3(); retry with HTTP/1.1 if 1.0 fails. */
|
|
||||||
static void *
|
|
||||||
miniwget2(const char * host,
|
|
||||||
unsigned short port, const char * path,
|
|
||||||
int * size, char * addr_str, int addr_str_len,
|
|
||||||
unsigned int scope_id)
|
|
||||||
{
|
|
||||||
char * respbuffer;
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
respbuffer = miniwget3(host, port, path, size,
|
|
||||||
addr_str, addr_str_len, "1.1", scope_id);
|
|
||||||
#else
|
|
||||||
respbuffer = miniwget3(host, port, path, size,
|
|
||||||
addr_str, addr_str_len, "1.0", scope_id);
|
|
||||||
if (*size == 0)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("Retrying with HTTP/1.1\n");
|
|
||||||
#endif
|
|
||||||
free(respbuffer);
|
|
||||||
respbuffer = miniwget3(host, port, path, size,
|
|
||||||
addr_str, addr_str_len, "1.1", scope_id);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return respbuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* parseURL()
|
|
||||||
* arguments :
|
|
||||||
* url : source string not modified
|
|
||||||
* hostname : hostname destination string (size of MAXHOSTNAMELEN+1)
|
|
||||||
* port : port (destination)
|
|
||||||
* path : pointer to the path part of the URL
|
|
||||||
*
|
|
||||||
* Return values :
|
|
||||||
* 0 - Failure
|
|
||||||
* 1 - Success */
|
|
||||||
int
|
|
||||||
parseURL(const char * url,
|
|
||||||
char * hostname, unsigned short * port,
|
|
||||||
char * * path, unsigned int * scope_id)
|
|
||||||
{
|
|
||||||
char * p1, *p2, *p3;
|
|
||||||
if(!url)
|
|
||||||
return 0;
|
|
||||||
p1 = strstr(url, "://");
|
|
||||||
if(!p1)
|
|
||||||
return 0;
|
|
||||||
p1 += 3;
|
|
||||||
if( (url[0]!='h') || (url[1]!='t')
|
|
||||||
||(url[2]!='t') || (url[3]!='p'))
|
|
||||||
return 0;
|
|
||||||
memset(hostname, 0, MAXHOSTNAMELEN + 1);
|
|
||||||
if(*p1 == '[')
|
|
||||||
{
|
|
||||||
/* IP v6 : http://[2a00:1450:8002::6a]/path/abc */
|
|
||||||
char * scope;
|
|
||||||
scope = strchr(p1, '%');
|
|
||||||
p2 = strchr(p1, ']');
|
|
||||||
if(p2 && scope && scope < p2 && scope_id) {
|
|
||||||
/* parse scope */
|
|
||||||
#ifdef IF_NAMESIZE
|
|
||||||
char tmp[IF_NAMESIZE];
|
|
||||||
int l;
|
|
||||||
scope++;
|
|
||||||
/* "%25" is just '%' in URL encoding */
|
|
||||||
if(scope[0] == '2' && scope[1] == '5')
|
|
||||||
scope += 2; /* skip "25" */
|
|
||||||
l = p2 - scope;
|
|
||||||
if(l >= IF_NAMESIZE)
|
|
||||||
l = IF_NAMESIZE - 1;
|
|
||||||
memcpy(tmp, scope, l);
|
|
||||||
tmp[l] = '\0';
|
|
||||||
*scope_id = if_nametoindex(tmp);
|
|
||||||
if(*scope_id == 0) {
|
|
||||||
*scope_id = (unsigned int)strtoul(tmp, NULL, 10);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* under windows, scope is numerical */
|
|
||||||
char tmp[8];
|
|
||||||
int l;
|
|
||||||
scope++;
|
|
||||||
/* "%25" is just '%' in URL encoding */
|
|
||||||
if(scope[0] == '2' && scope[1] == '5')
|
|
||||||
scope += 2; /* skip "25" */
|
|
||||||
l = p2 - scope;
|
|
||||||
if(l >= sizeof(tmp))
|
|
||||||
l = sizeof(tmp) - 1;
|
|
||||||
memcpy(tmp, scope, l);
|
|
||||||
tmp[l] = '\0';
|
|
||||||
*scope_id = (unsigned int)strtoul(tmp, NULL, 10);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
p3 = strchr(p1, '/');
|
|
||||||
if(p2 && p3)
|
|
||||||
{
|
|
||||||
p2++;
|
|
||||||
strncpy(hostname, p1, MIN(MAXHOSTNAMELEN, (int)(p2-p1)));
|
|
||||||
if(*p2 == ':')
|
|
||||||
{
|
|
||||||
*port = 0;
|
|
||||||
p2++;
|
|
||||||
while( (*p2 >= '0') && (*p2 <= '9'))
|
|
||||||
{
|
|
||||||
*port *= 10;
|
|
||||||
*port += (unsigned short)(*p2 - '0');
|
|
||||||
p2++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*port = 80;
|
|
||||||
}
|
|
||||||
*path = p3;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p2 = strchr(p1, ':');
|
|
||||||
p3 = strchr(p1, '/');
|
|
||||||
if(!p3)
|
|
||||||
return 0;
|
|
||||||
if(!p2 || (p2>p3))
|
|
||||||
{
|
|
||||||
strncpy(hostname, p1, MIN(MAXHOSTNAMELEN, (int)(p3-p1)));
|
|
||||||
*port = 80;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
strncpy(hostname, p1, MIN(MAXHOSTNAMELEN, (int)(p2-p1)));
|
|
||||||
*port = 0;
|
|
||||||
p2++;
|
|
||||||
while( (*p2 >= '0') && (*p2 <= '9'))
|
|
||||||
{
|
|
||||||
*port *= 10;
|
|
||||||
*port += (unsigned short)(*p2 - '0');
|
|
||||||
p2++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*path = p3;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
miniwget(const char * url, int * size, unsigned int scope_id)
|
|
||||||
{
|
|
||||||
unsigned short port;
|
|
||||||
char * path;
|
|
||||||
/* protocol://host:port/chemin */
|
|
||||||
char hostname[MAXHOSTNAMELEN+1];
|
|
||||||
*size = 0;
|
|
||||||
if(!parseURL(url, hostname, &port, &path, &scope_id))
|
|
||||||
return NULL;
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("parsed url : hostname='%s' port=%hu path='%s' scope_id=%u\n",
|
|
||||||
hostname, port, path, scope_id);
|
|
||||||
#endif
|
|
||||||
return miniwget2(hostname, port, path, size, 0, 0, scope_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
miniwget_getaddr(const char * url, int * size,
|
|
||||||
char * addr, int addrlen, unsigned int scope_id)
|
|
||||||
{
|
|
||||||
unsigned short port;
|
|
||||||
char * path;
|
|
||||||
/* protocol://host:port/path */
|
|
||||||
char hostname[MAXHOSTNAMELEN+1];
|
|
||||||
*size = 0;
|
|
||||||
if(addr)
|
|
||||||
addr[0] = '\0';
|
|
||||||
if(!parseURL(url, hostname, &port, &path, &scope_id))
|
|
||||||
return NULL;
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("parsed url : hostname='%s' port=%hu path='%s' scope_id=%u\n",
|
|
||||||
hostname, port, path, scope_id);
|
|
||||||
#endif
|
|
||||||
return miniwget2(hostname, port, path, size, addr, addrlen, scope_id);
|
|
||||||
}
|
|
||||||
|
|
30
Externals/miniupnpc/src/miniwget.h
vendored
30
Externals/miniupnpc/src/miniwget.h
vendored
@ -1,30 +0,0 @@
|
|||||||
/* $Id: miniwget.h,v 1.7 2012/06/23 22:35:59 nanard Exp $ */
|
|
||||||
/* Project : miniupnp
|
|
||||||
* Author : Thomas Bernard
|
|
||||||
* Copyright (c) 2005-2015 Thomas Bernard
|
|
||||||
* This software is subject to the conditions detailed in the
|
|
||||||
* LICENCE file provided in this distribution.
|
|
||||||
* */
|
|
||||||
#ifndef MINIWGET_H_INCLUDED
|
|
||||||
#define MINIWGET_H_INCLUDED
|
|
||||||
|
|
||||||
#include "miniupnpc_declspec.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC void * getHTTPResponse(int s, int * size);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC void * miniwget(const char *, int *, unsigned int);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC void * miniwget_getaddr(const char *, int *, char *, int, unsigned int);
|
|
||||||
|
|
||||||
int parseURL(const char *, char *, unsigned short *, char * *, unsigned int *);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
229
Externals/miniupnpc/src/minixml.c
vendored
229
Externals/miniupnpc/src/minixml.c
vendored
@ -1,229 +0,0 @@
|
|||||||
/* $Id: minixml.c,v 1.10 2012/03/05 19:42:47 nanard Exp $ */
|
|
||||||
/* minixml.c : the minimum size a xml parser can be ! */
|
|
||||||
/* Project : miniupnp
|
|
||||||
* webpage: http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
|
|
||||||
* Author : Thomas Bernard
|
|
||||||
|
|
||||||
Copyright (c) 2005-2014, Thomas BERNARD
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
* The name of the author may not be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#include <string.h>
|
|
||||||
#include "minixml.h"
|
|
||||||
|
|
||||||
/* parseatt : used to parse the argument list
|
|
||||||
* return 0 (false) in case of success and -1 (true) if the end
|
|
||||||
* of the xmlbuffer is reached. */
|
|
||||||
static int parseatt(struct xmlparser * p)
|
|
||||||
{
|
|
||||||
const char * attname;
|
|
||||||
int attnamelen;
|
|
||||||
const char * attvalue;
|
|
||||||
int attvaluelen;
|
|
||||||
while(p->xml < p->xmlend)
|
|
||||||
{
|
|
||||||
if(*p->xml=='/' || *p->xml=='>')
|
|
||||||
return 0;
|
|
||||||
if( !IS_WHITE_SPACE(*p->xml) )
|
|
||||||
{
|
|
||||||
char sep;
|
|
||||||
attname = p->xml;
|
|
||||||
attnamelen = 0;
|
|
||||||
while(*p->xml!='=' && !IS_WHITE_SPACE(*p->xml) )
|
|
||||||
{
|
|
||||||
attnamelen++; p->xml++;
|
|
||||||
if(p->xml >= p->xmlend)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
while(*(p->xml++) != '=')
|
|
||||||
{
|
|
||||||
if(p->xml >= p->xmlend)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
while(IS_WHITE_SPACE(*p->xml))
|
|
||||||
{
|
|
||||||
p->xml++;
|
|
||||||
if(p->xml >= p->xmlend)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
sep = *p->xml;
|
|
||||||
if(sep=='\'' || sep=='\"')
|
|
||||||
{
|
|
||||||
p->xml++;
|
|
||||||
if(p->xml >= p->xmlend)
|
|
||||||
return -1;
|
|
||||||
attvalue = p->xml;
|
|
||||||
attvaluelen = 0;
|
|
||||||
while(*p->xml != sep)
|
|
||||||
{
|
|
||||||
attvaluelen++; p->xml++;
|
|
||||||
if(p->xml >= p->xmlend)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
attvalue = p->xml;
|
|
||||||
attvaluelen = 0;
|
|
||||||
while( !IS_WHITE_SPACE(*p->xml)
|
|
||||||
&& *p->xml != '>' && *p->xml != '/')
|
|
||||||
{
|
|
||||||
attvaluelen++; p->xml++;
|
|
||||||
if(p->xml >= p->xmlend)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*printf("%.*s='%.*s'\n",
|
|
||||||
attnamelen, attname, attvaluelen, attvalue);*/
|
|
||||||
if(p->attfunc)
|
|
||||||
p->attfunc(p->data, attname, attnamelen, attvalue, attvaluelen);
|
|
||||||
}
|
|
||||||
p->xml++;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* parseelt parse the xml stream and
|
|
||||||
* call the callback functions when needed... */
|
|
||||||
static void parseelt(struct xmlparser * p)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
const char * elementname;
|
|
||||||
while(p->xml < (p->xmlend - 1))
|
|
||||||
{
|
|
||||||
if((p->xml + 4) <= p->xmlend && (0 == memcmp(p->xml, "<!--", 4)))
|
|
||||||
{
|
|
||||||
p->xml += 3;
|
|
||||||
/* ignore comments */
|
|
||||||
do
|
|
||||||
{
|
|
||||||
p->xml++;
|
|
||||||
if ((p->xml + 3) >= p->xmlend)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
while(memcmp(p->xml, "-->", 3) != 0);
|
|
||||||
p->xml += 3;
|
|
||||||
}
|
|
||||||
else if((p->xml)[0]=='<' && (p->xml)[1]!='?')
|
|
||||||
{
|
|
||||||
i = 0; elementname = ++p->xml;
|
|
||||||
while( !IS_WHITE_SPACE(*p->xml)
|
|
||||||
&& (*p->xml!='>') && (*p->xml!='/')
|
|
||||||
)
|
|
||||||
{
|
|
||||||
i++; p->xml++;
|
|
||||||
if (p->xml >= p->xmlend)
|
|
||||||
return;
|
|
||||||
/* to ignore namespace : */
|
|
||||||
if(*p->xml==':')
|
|
||||||
{
|
|
||||||
i = 0;
|
|
||||||
elementname = ++p->xml;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(i>0)
|
|
||||||
{
|
|
||||||
if(p->starteltfunc)
|
|
||||||
p->starteltfunc(p->data, elementname, i);
|
|
||||||
if(parseatt(p))
|
|
||||||
return;
|
|
||||||
if(*p->xml!='/')
|
|
||||||
{
|
|
||||||
const char * data;
|
|
||||||
i = 0; data = ++p->xml;
|
|
||||||
if (p->xml >= p->xmlend)
|
|
||||||
return;
|
|
||||||
while( IS_WHITE_SPACE(*p->xml) )
|
|
||||||
{
|
|
||||||
i++; p->xml++;
|
|
||||||
if (p->xml >= p->xmlend)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(memcmp(p->xml, "<![CDATA[", 9) == 0)
|
|
||||||
{
|
|
||||||
/* CDATA handling */
|
|
||||||
p->xml += 9;
|
|
||||||
data = p->xml;
|
|
||||||
i = 0;
|
|
||||||
while(memcmp(p->xml, "]]>", 3) != 0)
|
|
||||||
{
|
|
||||||
i++; p->xml++;
|
|
||||||
if ((p->xml + 3) >= p->xmlend)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(i>0 && p->datafunc)
|
|
||||||
p->datafunc(p->data, data, i);
|
|
||||||
while(*p->xml!='<')
|
|
||||||
{
|
|
||||||
p->xml++;
|
|
||||||
if (p->xml >= p->xmlend)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
while(*p->xml!='<')
|
|
||||||
{
|
|
||||||
i++; p->xml++;
|
|
||||||
if ((p->xml + 1) >= p->xmlend)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(i>0 && p->datafunc && *(p->xml + 1) == '/')
|
|
||||||
p->datafunc(p->data, data, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(*p->xml == '/')
|
|
||||||
{
|
|
||||||
i = 0; elementname = ++p->xml;
|
|
||||||
if (p->xml >= p->xmlend)
|
|
||||||
return;
|
|
||||||
while((*p->xml != '>'))
|
|
||||||
{
|
|
||||||
i++; p->xml++;
|
|
||||||
if (p->xml >= p->xmlend)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(p->endeltfunc)
|
|
||||||
p->endeltfunc(p->data, elementname, i);
|
|
||||||
p->xml++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
p->xml++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* the parser must be initialized before calling this function */
|
|
||||||
void parsexml(struct xmlparser * parser)
|
|
||||||
{
|
|
||||||
parser->xml = parser->xmlstart;
|
|
||||||
parser->xmlend = parser->xmlstart + parser->xmlsize;
|
|
||||||
parseelt(parser);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
37
Externals/miniupnpc/src/minixml.h
vendored
37
Externals/miniupnpc/src/minixml.h
vendored
@ -1,37 +0,0 @@
|
|||||||
/* $Id: minixml.h,v 1.6 2006/11/30 11:47:21 nanard Exp $ */
|
|
||||||
/* minimal xml parser
|
|
||||||
*
|
|
||||||
* Project : miniupnp
|
|
||||||
* Website : http://miniupnp.free.fr/
|
|
||||||
* Author : Thomas Bernard
|
|
||||||
* Copyright (c) 2005 Thomas Bernard
|
|
||||||
* This software is subject to the conditions detailed in the
|
|
||||||
* LICENCE file provided in this distribution.
|
|
||||||
* */
|
|
||||||
#ifndef MINIXML_H_INCLUDED
|
|
||||||
#define MINIXML_H_INCLUDED
|
|
||||||
#define IS_WHITE_SPACE(c) ((c==' ') || (c=='\t') || (c=='\r') || (c=='\n'))
|
|
||||||
|
|
||||||
/* if a callback function pointer is set to NULL,
|
|
||||||
* the function is not called */
|
|
||||||
struct xmlparser {
|
|
||||||
const char *xmlstart;
|
|
||||||
const char *xmlend;
|
|
||||||
const char *xml; /* pointer to current character */
|
|
||||||
int xmlsize;
|
|
||||||
void * data;
|
|
||||||
void (*starteltfunc) (void *, const char *, int);
|
|
||||||
void (*endeltfunc) (void *, const char *, int);
|
|
||||||
void (*datafunc) (void *, const char *, int);
|
|
||||||
void (*attfunc) (void *, const char *, int, const char *, int);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* parsexml()
|
|
||||||
* the xmlparser structure must be initialized before the call
|
|
||||||
* the following structure members have to be initialized :
|
|
||||||
* xmlstart, xmlsize, data, *func
|
|
||||||
* xml is for internal usage, xmlend is computed automatically */
|
|
||||||
void parsexml(struct xmlparser *);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
172
Externals/miniupnpc/src/portlistingparse.c
vendored
172
Externals/miniupnpc/src/portlistingparse.c
vendored
@ -1,172 +0,0 @@
|
|||||||
/* $Id: portlistingparse.c,v 1.9 2015/07/15 12:41:13 nanard Exp $ */
|
|
||||||
/* MiniUPnP project
|
|
||||||
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
|
|
||||||
* (c) 2011-2015 Thomas Bernard
|
|
||||||
* This software is subject to the conditions detailed
|
|
||||||
* in the LICENCE file provided within the distribution */
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#ifdef DEBUG
|
|
||||||
#include <stdio.h>
|
|
||||||
#endif /* DEBUG */
|
|
||||||
#include "portlistingparse.h"
|
|
||||||
#include "minixml.h"
|
|
||||||
|
|
||||||
/* list of the elements */
|
|
||||||
static const struct {
|
|
||||||
const portMappingElt code;
|
|
||||||
const char * const str;
|
|
||||||
} elements[] = {
|
|
||||||
{ PortMappingEntry, "PortMappingEntry"},
|
|
||||||
{ NewRemoteHost, "NewRemoteHost"},
|
|
||||||
{ NewExternalPort, "NewExternalPort"},
|
|
||||||
{ NewProtocol, "NewProtocol"},
|
|
||||||
{ NewInternalPort, "NewInternalPort"},
|
|
||||||
{ NewInternalClient, "NewInternalClient"},
|
|
||||||
{ NewEnabled, "NewEnabled"},
|
|
||||||
{ NewDescription, "NewDescription"},
|
|
||||||
{ NewLeaseTime, "NewLeaseTime"},
|
|
||||||
{ PortMappingEltNone, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Helper function */
|
|
||||||
static UNSIGNED_INTEGER
|
|
||||||
atoui(const char * p, int l)
|
|
||||||
{
|
|
||||||
UNSIGNED_INTEGER r = 0;
|
|
||||||
while(l > 0 && *p)
|
|
||||||
{
|
|
||||||
if(*p >= '0' && *p <= '9')
|
|
||||||
r = r*10 + (*p - '0');
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
p++;
|
|
||||||
l--;
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Start element handler */
|
|
||||||
static void
|
|
||||||
startelt(void * d, const char * name, int l)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
struct PortMappingParserData * pdata = (struct PortMappingParserData *)d;
|
|
||||||
pdata->curelt = PortMappingEltNone;
|
|
||||||
for(i = 0; elements[i].str; i++)
|
|
||||||
{
|
|
||||||
if(memcmp(name, elements[i].str, l) == 0)
|
|
||||||
{
|
|
||||||
pdata->curelt = elements[i].code;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(pdata->curelt == PortMappingEntry)
|
|
||||||
{
|
|
||||||
struct PortMapping * pm;
|
|
||||||
pm = calloc(1, sizeof(struct PortMapping));
|
|
||||||
if(pm == NULL)
|
|
||||||
{
|
|
||||||
/* malloc error */
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "%s: error allocating memory",
|
|
||||||
"startelt");
|
|
||||||
#endif /* DEBUG */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pm->l_next = pdata->l_head; /* insert in list */
|
|
||||||
pdata->l_head = pm;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* End element handler */
|
|
||||||
static void
|
|
||||||
endelt(void * d, const char * name, int l)
|
|
||||||
{
|
|
||||||
struct PortMappingParserData * pdata = (struct PortMappingParserData *)d;
|
|
||||||
(void)name;
|
|
||||||
(void)l;
|
|
||||||
pdata->curelt = PortMappingEltNone;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Data handler */
|
|
||||||
static void
|
|
||||||
data(void * d, const char * data, int l)
|
|
||||||
{
|
|
||||||
struct PortMapping * pm;
|
|
||||||
struct PortMappingParserData * pdata = (struct PortMappingParserData *)d;
|
|
||||||
pm = pdata->l_head;
|
|
||||||
if(!pm)
|
|
||||||
return;
|
|
||||||
if(l > 63)
|
|
||||||
l = 63;
|
|
||||||
switch(pdata->curelt)
|
|
||||||
{
|
|
||||||
case NewRemoteHost:
|
|
||||||
memcpy(pm->remoteHost, data, l);
|
|
||||||
pm->remoteHost[l] = '\0';
|
|
||||||
break;
|
|
||||||
case NewExternalPort:
|
|
||||||
pm->externalPort = (unsigned short)atoui(data, l);
|
|
||||||
break;
|
|
||||||
case NewProtocol:
|
|
||||||
if(l > 3)
|
|
||||||
l = 3;
|
|
||||||
memcpy(pm->protocol, data, l);
|
|
||||||
pm->protocol[l] = '\0';
|
|
||||||
break;
|
|
||||||
case NewInternalPort:
|
|
||||||
pm->internalPort = (unsigned short)atoui(data, l);
|
|
||||||
break;
|
|
||||||
case NewInternalClient:
|
|
||||||
memcpy(pm->internalClient, data, l);
|
|
||||||
pm->internalClient[l] = '\0';
|
|
||||||
break;
|
|
||||||
case NewEnabled:
|
|
||||||
pm->enabled = (unsigned char)atoui(data, l);
|
|
||||||
break;
|
|
||||||
case NewDescription:
|
|
||||||
memcpy(pm->description, data, l);
|
|
||||||
pm->description[l] = '\0';
|
|
||||||
break;
|
|
||||||
case NewLeaseTime:
|
|
||||||
pm->leaseTime = atoui(data, l);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Parse the PortMappingList XML document for IGD version 2
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
ParsePortListing(const char * buffer, int bufsize,
|
|
||||||
struct PortMappingParserData * pdata)
|
|
||||||
{
|
|
||||||
struct xmlparser parser;
|
|
||||||
|
|
||||||
memset(pdata, 0, sizeof(struct PortMappingParserData));
|
|
||||||
/* init xmlparser */
|
|
||||||
parser.xmlstart = buffer;
|
|
||||||
parser.xmlsize = bufsize;
|
|
||||||
parser.data = pdata;
|
|
||||||
parser.starteltfunc = startelt;
|
|
||||||
parser.endeltfunc = endelt;
|
|
||||||
parser.datafunc = data;
|
|
||||||
parser.attfunc = 0;
|
|
||||||
parsexml(&parser);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
FreePortListing(struct PortMappingParserData * pdata)
|
|
||||||
{
|
|
||||||
struct PortMapping * pm;
|
|
||||||
while((pm = pdata->l_head) != NULL)
|
|
||||||
{
|
|
||||||
/* remove from list */
|
|
||||||
pdata->l_head = pm->l_next;
|
|
||||||
free(pm);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
65
Externals/miniupnpc/src/portlistingparse.h
vendored
65
Externals/miniupnpc/src/portlistingparse.h
vendored
@ -1,65 +0,0 @@
|
|||||||
/* $Id: portlistingparse.h,v 1.10 2014/11/01 10:37:32 nanard Exp $ */
|
|
||||||
/* MiniUPnP project
|
|
||||||
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
|
|
||||||
* (c) 2011-2015 Thomas Bernard
|
|
||||||
* This software is subject to the conditions detailed
|
|
||||||
* in the LICENCE file provided within the distribution */
|
|
||||||
#ifndef PORTLISTINGPARSE_H_INCLUDED
|
|
||||||
#define PORTLISTINGPARSE_H_INCLUDED
|
|
||||||
|
|
||||||
#include "miniupnpc_declspec.h"
|
|
||||||
/* for the definition of UNSIGNED_INTEGER */
|
|
||||||
#include "miniupnpctypes.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* sample of PortMappingEntry :
|
|
||||||
<p:PortMappingEntry>
|
|
||||||
<p:NewRemoteHost>202.233.2.1</p:NewRemoteHost>
|
|
||||||
<p:NewExternalPort>2345</p:NewExternalPort>
|
|
||||||
<p:NewProtocol>TCP</p:NewProtocol>
|
|
||||||
<p:NewInternalPort>2345</p:NewInternalPort>
|
|
||||||
<p:NewInternalClient>192.168.1.137</p:NewInternalClient>
|
|
||||||
<p:NewEnabled>1</p:NewEnabled>
|
|
||||||
<p:NewDescription>dooom</p:NewDescription>
|
|
||||||
<p:NewLeaseTime>345</p:NewLeaseTime>
|
|
||||||
</p:PortMappingEntry>
|
|
||||||
*/
|
|
||||||
typedef enum { PortMappingEltNone,
|
|
||||||
PortMappingEntry, NewRemoteHost,
|
|
||||||
NewExternalPort, NewProtocol,
|
|
||||||
NewInternalPort, NewInternalClient,
|
|
||||||
NewEnabled, NewDescription,
|
|
||||||
NewLeaseTime } portMappingElt;
|
|
||||||
|
|
||||||
struct PortMapping {
|
|
||||||
struct PortMapping * l_next; /* list next element */
|
|
||||||
UNSIGNED_INTEGER leaseTime;
|
|
||||||
unsigned short externalPort;
|
|
||||||
unsigned short internalPort;
|
|
||||||
char remoteHost[64];
|
|
||||||
char internalClient[64];
|
|
||||||
char description[64];
|
|
||||||
char protocol[4];
|
|
||||||
unsigned char enabled;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PortMappingParserData {
|
|
||||||
struct PortMapping * l_head; /* list head */
|
|
||||||
portMappingElt curelt;
|
|
||||||
};
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC void
|
|
||||||
ParsePortListing(const char * buffer, int bufsize,
|
|
||||||
struct PortMappingParserData * pdata);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC void
|
|
||||||
FreePortListing(struct PortMappingParserData * pdata);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
105
Externals/miniupnpc/src/receivedata.c
vendored
105
Externals/miniupnpc/src/receivedata.c
vendored
@ -1,105 +0,0 @@
|
|||||||
/* $Id: receivedata.c,v 1.6 2014/11/13 13:51:52 nanard Exp $ */
|
|
||||||
/* Project : miniupnp
|
|
||||||
* Website : http://miniupnp.free.fr/
|
|
||||||
* Author : Thomas Bernard
|
|
||||||
* Copyright (c) 2011-2014 Thomas Bernard
|
|
||||||
* This software is subject to the conditions detailed in the
|
|
||||||
* LICENCE file provided in this distribution. */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <winsock2.h>
|
|
||||||
#include <ws2tcpip.h>
|
|
||||||
#else /* _WIN32 */
|
|
||||||
#include <unistd.h>
|
|
||||||
#if defined(__amigaos__) && !defined(__amigaos4__)
|
|
||||||
#define socklen_t int
|
|
||||||
#else /* #if defined(__amigaos__) && !defined(__amigaos4__) */
|
|
||||||
#include <sys/select.h>
|
|
||||||
#endif /* #else defined(__amigaos__) && !defined(__amigaos4__) */
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#if !defined(__amigaos__) && !defined(__amigaos4__)
|
|
||||||
#include <poll.h>
|
|
||||||
#endif /* !defined(__amigaos__) && !defined(__amigaos4__) */
|
|
||||||
#include <errno.h>
|
|
||||||
#define MINIUPNPC_IGNORE_EINTR
|
|
||||||
#endif /* _WIN32 */
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define PRINT_SOCKET_ERROR(x) printf("Socket error: %s, %d\n", x, WSAGetLastError());
|
|
||||||
#else
|
|
||||||
#define PRINT_SOCKET_ERROR(x) perror(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "receivedata.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
receivedata(int socket,
|
|
||||||
char * data, int length,
|
|
||||||
int timeout, unsigned int * scope_id)
|
|
||||||
{
|
|
||||||
#if MINIUPNPC_GET_SRC_ADDR
|
|
||||||
struct sockaddr_storage src_addr;
|
|
||||||
socklen_t src_addr_len = sizeof(src_addr);
|
|
||||||
#endif /* MINIUPNPC_GET_SRC_ADDR */
|
|
||||||
int n;
|
|
||||||
#if !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__)
|
|
||||||
/* using poll */
|
|
||||||
struct pollfd fds[1]; /* for the poll */
|
|
||||||
#ifdef MINIUPNPC_IGNORE_EINTR
|
|
||||||
do {
|
|
||||||
#endif /* MINIUPNPC_IGNORE_EINTR */
|
|
||||||
fds[0].fd = socket;
|
|
||||||
fds[0].events = POLLIN;
|
|
||||||
n = poll(fds, 1, timeout);
|
|
||||||
#ifdef MINIUPNPC_IGNORE_EINTR
|
|
||||||
} while(n < 0 && errno == EINTR);
|
|
||||||
#endif /* MINIUPNPC_IGNORE_EINTR */
|
|
||||||
if(n < 0) {
|
|
||||||
PRINT_SOCKET_ERROR("poll");
|
|
||||||
return -1;
|
|
||||||
} else if(n == 0) {
|
|
||||||
/* timeout */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#else /* !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) */
|
|
||||||
/* using select under _WIN32 and amigaos */
|
|
||||||
fd_set socketSet;
|
|
||||||
TIMEVAL timeval;
|
|
||||||
FD_ZERO(&socketSet);
|
|
||||||
FD_SET(socket, &socketSet);
|
|
||||||
timeval.tv_sec = timeout / 1000;
|
|
||||||
timeval.tv_usec = (timeout % 1000) * 1000;
|
|
||||||
n = select(FD_SETSIZE, &socketSet, NULL, NULL, &timeval);
|
|
||||||
if(n < 0) {
|
|
||||||
PRINT_SOCKET_ERROR("select");
|
|
||||||
return -1;
|
|
||||||
} else if(n == 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) */
|
|
||||||
#if MINIUPNPC_GET_SRC_ADDR
|
|
||||||
memset(&src_addr, 0, sizeof(src_addr));
|
|
||||||
n = recvfrom(socket, data, length, 0,
|
|
||||||
(struct sockaddr *)&src_addr, &src_addr_len);
|
|
||||||
#else /* MINIUPNPC_GET_SRC_ADDR */
|
|
||||||
n = recv(socket, data, length, 0);
|
|
||||||
#endif /* MINIUPNPC_GET_SRC_ADDR */
|
|
||||||
if(n<0) {
|
|
||||||
PRINT_SOCKET_ERROR("recv");
|
|
||||||
}
|
|
||||||
#if MINIUPNPC_GET_SRC_ADDR
|
|
||||||
if (src_addr.ss_family == AF_INET6) {
|
|
||||||
const struct sockaddr_in6 * src_addr6 = (struct sockaddr_in6 *)&src_addr;
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("scope_id=%u\n", src_addr6->sin6_scope_id);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
if(scope_id)
|
|
||||||
*scope_id = src_addr6->sin6_scope_id;
|
|
||||||
}
|
|
||||||
#endif /* MINIUPNPC_GET_SRC_ADDR */
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
19
Externals/miniupnpc/src/receivedata.h
vendored
19
Externals/miniupnpc/src/receivedata.h
vendored
@ -1,19 +0,0 @@
|
|||||||
/* $Id: receivedata.h,v 1.3 2012/06/23 22:34:47 nanard Exp $ */
|
|
||||||
/* Project: miniupnp
|
|
||||||
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
|
|
||||||
* Author: Thomas Bernard
|
|
||||||
* Copyright (c) 2011-2012 Thomas Bernard
|
|
||||||
* This software is subjects to the conditions detailed
|
|
||||||
* in the LICENCE file provided within this distribution */
|
|
||||||
#ifndef RECEIVEDATA_H_INCLUDED
|
|
||||||
#define RECEIVEDATA_H_INCLUDED
|
|
||||||
|
|
||||||
/* Reads data from the specified socket.
|
|
||||||
* Returns the number of bytes read if successful, zero if no bytes were
|
|
||||||
* read or if we timed out. Returns negative if there was an error. */
|
|
||||||
int receivedata(int socket,
|
|
||||||
char * data, int length,
|
|
||||||
int timeout, unsigned int * scope_id);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
1237
Externals/miniupnpc/src/upnpcommands.c
vendored
1237
Externals/miniupnpc/src/upnpcommands.c
vendored
File diff suppressed because it is too large
Load Diff
348
Externals/miniupnpc/src/upnpcommands.h
vendored
348
Externals/miniupnpc/src/upnpcommands.h
vendored
@ -1,348 +0,0 @@
|
|||||||
/* $Id: upnpcommands.h,v 1.30 2015/07/15 12:21:28 nanard Exp $ */
|
|
||||||
/* Miniupnp project : http://miniupnp.free.fr/
|
|
||||||
* Author : Thomas Bernard
|
|
||||||
* Copyright (c) 2005-2015 Thomas Bernard
|
|
||||||
* This software is subject to the conditions detailed in the
|
|
||||||
* LICENCE file provided within this distribution */
|
|
||||||
#ifndef UPNPCOMMANDS_H_INCLUDED
|
|
||||||
#define UPNPCOMMANDS_H_INCLUDED
|
|
||||||
|
|
||||||
#include "upnpreplyparse.h"
|
|
||||||
#include "portlistingparse.h"
|
|
||||||
#include "miniupnpc_declspec.h"
|
|
||||||
#include "miniupnpctypes.h"
|
|
||||||
|
|
||||||
/* MiniUPnPc return codes : */
|
|
||||||
#define UPNPCOMMAND_SUCCESS (0)
|
|
||||||
#define UPNPCOMMAND_UNKNOWN_ERROR (-1)
|
|
||||||
#define UPNPCOMMAND_INVALID_ARGS (-2)
|
|
||||||
#define UPNPCOMMAND_HTTP_ERROR (-3)
|
|
||||||
#define UPNPCOMMAND_INVALID_RESPONSE (-4)
|
|
||||||
#define UPNPCOMMAND_MEM_ALLOC_ERROR (-5)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC UNSIGNED_INTEGER
|
|
||||||
UPNP_GetTotalBytesSent(const char * controlURL,
|
|
||||||
const char * servicetype);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC UNSIGNED_INTEGER
|
|
||||||
UPNP_GetTotalBytesReceived(const char * controlURL,
|
|
||||||
const char * servicetype);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC UNSIGNED_INTEGER
|
|
||||||
UPNP_GetTotalPacketsSent(const char * controlURL,
|
|
||||||
const char * servicetype);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC UNSIGNED_INTEGER
|
|
||||||
UPNP_GetTotalPacketsReceived(const char * controlURL,
|
|
||||||
const char * servicetype);
|
|
||||||
|
|
||||||
/* UPNP_GetStatusInfo()
|
|
||||||
* status and lastconnerror are 64 byte buffers
|
|
||||||
* Return values :
|
|
||||||
* UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
|
|
||||||
* or a UPnP Error code */
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_GetStatusInfo(const char * controlURL,
|
|
||||||
const char * servicetype,
|
|
||||||
char * status,
|
|
||||||
unsigned int * uptime,
|
|
||||||
char * lastconnerror);
|
|
||||||
|
|
||||||
/* UPNP_GetConnectionTypeInfo()
|
|
||||||
* argument connectionType is a 64 character buffer
|
|
||||||
* Return Values :
|
|
||||||
* UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
|
|
||||||
* or a UPnP Error code */
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_GetConnectionTypeInfo(const char * controlURL,
|
|
||||||
const char * servicetype,
|
|
||||||
char * connectionType);
|
|
||||||
|
|
||||||
/* UPNP_GetExternalIPAddress() call the corresponding UPNP method.
|
|
||||||
* if the third arg is not null the value is copied to it.
|
|
||||||
* at least 16 bytes must be available
|
|
||||||
*
|
|
||||||
* Return values :
|
|
||||||
* 0 : SUCCESS
|
|
||||||
* NON ZERO : ERROR Either an UPnP error code or an unknown error.
|
|
||||||
*
|
|
||||||
* possible UPnP Errors :
|
|
||||||
* 402 Invalid Args - See UPnP Device Architecture section on Control.
|
|
||||||
* 501 Action Failed - See UPnP Device Architecture section on Control. */
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_GetExternalIPAddress(const char * controlURL,
|
|
||||||
const char * servicetype,
|
|
||||||
char * extIpAdd);
|
|
||||||
|
|
||||||
/* UPNP_GetLinkLayerMaxBitRates()
|
|
||||||
* call WANCommonInterfaceConfig:1#GetCommonLinkProperties
|
|
||||||
*
|
|
||||||
* return values :
|
|
||||||
* UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
|
|
||||||
* or a UPnP Error Code. */
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_GetLinkLayerMaxBitRates(const char* controlURL,
|
|
||||||
const char* servicetype,
|
|
||||||
unsigned int * bitrateDown,
|
|
||||||
unsigned int * bitrateUp);
|
|
||||||
|
|
||||||
/* UPNP_AddPortMapping()
|
|
||||||
* if desc is NULL, it will be defaulted to "libminiupnpc"
|
|
||||||
* remoteHost is usually NULL because IGD don't support it.
|
|
||||||
*
|
|
||||||
* Return values :
|
|
||||||
* 0 : SUCCESS
|
|
||||||
* NON ZERO : ERROR. Either an UPnP error code or an unknown error.
|
|
||||||
*
|
|
||||||
* List of possible UPnP errors for AddPortMapping :
|
|
||||||
* errorCode errorDescription (short) - Description (long)
|
|
||||||
* 402 Invalid Args - See UPnP Device Architecture section on Control.
|
|
||||||
* 501 Action Failed - See UPnP Device Architecture section on Control.
|
|
||||||
* 606 Action not authorized - The action requested REQUIRES authorization and
|
|
||||||
* the sender was not authorized.
|
|
||||||
* 715 WildCardNotPermittedInSrcIP - The source IP address cannot be
|
|
||||||
* wild-carded
|
|
||||||
* 716 WildCardNotPermittedInExtPort - The external port cannot be wild-carded
|
|
||||||
* 718 ConflictInMappingEntry - The port mapping entry specified conflicts
|
|
||||||
* with a mapping assigned previously to another client
|
|
||||||
* 724 SamePortValuesRequired - Internal and External port values
|
|
||||||
* must be the same
|
|
||||||
* 725 OnlyPermanentLeasesSupported - The NAT implementation only supports
|
|
||||||
* permanent lease times on port mappings
|
|
||||||
* 726 RemoteHostOnlySupportsWildcard - RemoteHost must be a wildcard
|
|
||||||
* and cannot be a specific IP address or DNS name
|
|
||||||
* 727 ExternalPortOnlySupportsWildcard - ExternalPort must be a wildcard and
|
|
||||||
* cannot be a specific port value
|
|
||||||
* 728 NoPortMapsAvailable - There are not enough free ports available to
|
|
||||||
* complete port mapping.
|
|
||||||
* 729 ConflictWithOtherMechanisms - Attempted port mapping is not allowed
|
|
||||||
* due to conflict with other mechanisms.
|
|
||||||
* 732 WildCardNotPermittedInIntPort - The internal port cannot be wild-carded
|
|
||||||
*/
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_AddPortMapping(const char * controlURL, const char * servicetype,
|
|
||||||
const char * extPort,
|
|
||||||
const char * inPort,
|
|
||||||
const char * inClient,
|
|
||||||
const char * desc,
|
|
||||||
const char * proto,
|
|
||||||
const char * remoteHost,
|
|
||||||
const char * leaseDuration);
|
|
||||||
|
|
||||||
/* UPNP_AddAnyPortMapping()
|
|
||||||
* if desc is NULL, it will be defaulted to "libminiupnpc"
|
|
||||||
* remoteHost is usually NULL because IGD don't support it.
|
|
||||||
*
|
|
||||||
* Return values :
|
|
||||||
* 0 : SUCCESS
|
|
||||||
* NON ZERO : ERROR. Either an UPnP error code or an unknown error.
|
|
||||||
*
|
|
||||||
* List of possible UPnP errors for AddPortMapping :
|
|
||||||
* errorCode errorDescription (short) - Description (long)
|
|
||||||
* 402 Invalid Args - See UPnP Device Architecture section on Control.
|
|
||||||
* 501 Action Failed - See UPnP Device Architecture section on Control.
|
|
||||||
* 606 Action not authorized - The action requested REQUIRES authorization and
|
|
||||||
* the sender was not authorized.
|
|
||||||
* 715 WildCardNotPermittedInSrcIP - The source IP address cannot be
|
|
||||||
* wild-carded
|
|
||||||
* 716 WildCardNotPermittedInExtPort - The external port cannot be wild-carded
|
|
||||||
* 728 NoPortMapsAvailable - There are not enough free ports available to
|
|
||||||
* complete port mapping.
|
|
||||||
* 729 ConflictWithOtherMechanisms - Attempted port mapping is not allowed
|
|
||||||
* due to conflict with other mechanisms.
|
|
||||||
* 732 WildCardNotPermittedInIntPort - The internal port cannot be wild-carded
|
|
||||||
*/
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_AddAnyPortMapping(const char * controlURL, const char * servicetype,
|
|
||||||
const char * extPort,
|
|
||||||
const char * inPort,
|
|
||||||
const char * inClient,
|
|
||||||
const char * desc,
|
|
||||||
const char * proto,
|
|
||||||
const char * remoteHost,
|
|
||||||
const char * leaseDuration,
|
|
||||||
char * reservedPort);
|
|
||||||
|
|
||||||
/* UPNP_DeletePortMapping()
|
|
||||||
* Use same argument values as what was used for AddPortMapping().
|
|
||||||
* remoteHost is usually NULL because IGD don't support it.
|
|
||||||
* Return Values :
|
|
||||||
* 0 : SUCCESS
|
|
||||||
* NON ZERO : error. Either an UPnP error code or an undefined error.
|
|
||||||
*
|
|
||||||
* List of possible UPnP errors for DeletePortMapping :
|
|
||||||
* 402 Invalid Args - See UPnP Device Architecture section on Control.
|
|
||||||
* 606 Action not authorized - The action requested REQUIRES authorization
|
|
||||||
* and the sender was not authorized.
|
|
||||||
* 714 NoSuchEntryInArray - The specified value does not exist in the array */
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_DeletePortMapping(const char * controlURL, const char * servicetype,
|
|
||||||
const char * extPort, const char * proto,
|
|
||||||
const char * remoteHost);
|
|
||||||
|
|
||||||
/* UPNP_DeletePortRangeMapping()
|
|
||||||
* Use same argument values as what was used for AddPortMapping().
|
|
||||||
* remoteHost is usually NULL because IGD don't support it.
|
|
||||||
* Return Values :
|
|
||||||
* 0 : SUCCESS
|
|
||||||
* NON ZERO : error. Either an UPnP error code or an undefined error.
|
|
||||||
*
|
|
||||||
* List of possible UPnP errors for DeletePortMapping :
|
|
||||||
* 606 Action not authorized - The action requested REQUIRES authorization
|
|
||||||
* and the sender was not authorized.
|
|
||||||
* 730 PortMappingNotFound - This error message is returned if no port
|
|
||||||
* mapping is found in the specified range.
|
|
||||||
* 733 InconsistentParameters - NewStartPort and NewEndPort values are not consistent. */
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_DeletePortMappingRange(const char * controlURL, const char * servicetype,
|
|
||||||
const char * extPortStart, const char * extPortEnd,
|
|
||||||
const char * proto,
|
|
||||||
const char * manage);
|
|
||||||
|
|
||||||
/* UPNP_GetPortMappingNumberOfEntries()
|
|
||||||
* not supported by all routers */
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_GetPortMappingNumberOfEntries(const char* controlURL,
|
|
||||||
const char* servicetype,
|
|
||||||
unsigned int * num);
|
|
||||||
|
|
||||||
/* UPNP_GetSpecificPortMappingEntry()
|
|
||||||
* retrieves an existing port mapping
|
|
||||||
* params :
|
|
||||||
* in extPort
|
|
||||||
* in proto
|
|
||||||
* in remoteHost
|
|
||||||
* out intClient (16 bytes)
|
|
||||||
* out intPort (6 bytes)
|
|
||||||
* out desc (80 bytes)
|
|
||||||
* out enabled (4 bytes)
|
|
||||||
* out leaseDuration (16 bytes)
|
|
||||||
*
|
|
||||||
* return value :
|
|
||||||
* UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
|
|
||||||
* or a UPnP Error Code.
|
|
||||||
*
|
|
||||||
* List of possible UPnP errors for _GetSpecificPortMappingEntry :
|
|
||||||
* 402 Invalid Args - See UPnP Device Architecture section on Control.
|
|
||||||
* 501 Action Failed - See UPnP Device Architecture section on Control.
|
|
||||||
* 606 Action not authorized - The action requested REQUIRES authorization
|
|
||||||
* and the sender was not authorized.
|
|
||||||
* 714 NoSuchEntryInArray - The specified value does not exist in the array.
|
|
||||||
*/
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_GetSpecificPortMappingEntry(const char * controlURL,
|
|
||||||
const char * servicetype,
|
|
||||||
const char * extPort,
|
|
||||||
const char * proto,
|
|
||||||
const char * remoteHost,
|
|
||||||
char * intClient,
|
|
||||||
char * intPort,
|
|
||||||
char * desc,
|
|
||||||
char * enabled,
|
|
||||||
char * leaseDuration);
|
|
||||||
|
|
||||||
/* UPNP_GetGenericPortMappingEntry()
|
|
||||||
* params :
|
|
||||||
* in index
|
|
||||||
* out extPort (6 bytes)
|
|
||||||
* out intClient (16 bytes)
|
|
||||||
* out intPort (6 bytes)
|
|
||||||
* out protocol (4 bytes)
|
|
||||||
* out desc (80 bytes)
|
|
||||||
* out enabled (4 bytes)
|
|
||||||
* out rHost (64 bytes)
|
|
||||||
* out duration (16 bytes)
|
|
||||||
*
|
|
||||||
* return value :
|
|
||||||
* UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
|
|
||||||
* or a UPnP Error Code.
|
|
||||||
*
|
|
||||||
* Possible UPNP Error codes :
|
|
||||||
* 402 Invalid Args - See UPnP Device Architecture section on Control.
|
|
||||||
* 606 Action not authorized - The action requested REQUIRES authorization
|
|
||||||
* and the sender was not authorized.
|
|
||||||
* 713 SpecifiedArrayIndexInvalid - The specified array index is out of bounds
|
|
||||||
*/
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_GetGenericPortMappingEntry(const char * controlURL,
|
|
||||||
const char * servicetype,
|
|
||||||
const char * index,
|
|
||||||
char * extPort,
|
|
||||||
char * intClient,
|
|
||||||
char * intPort,
|
|
||||||
char * protocol,
|
|
||||||
char * desc,
|
|
||||||
char * enabled,
|
|
||||||
char * rHost,
|
|
||||||
char * duration);
|
|
||||||
|
|
||||||
/* UPNP_GetListOfPortMappings() Available in IGD v2
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Possible UPNP Error codes :
|
|
||||||
* 606 Action not Authorized
|
|
||||||
* 730 PortMappingNotFound - no port mapping is found in the specified range.
|
|
||||||
* 733 InconsistantParameters - NewStartPort and NewEndPort values are not
|
|
||||||
* consistent.
|
|
||||||
*/
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_GetListOfPortMappings(const char * controlURL,
|
|
||||||
const char * servicetype,
|
|
||||||
const char * startPort,
|
|
||||||
const char * endPort,
|
|
||||||
const char * protocol,
|
|
||||||
const char * numberOfPorts,
|
|
||||||
struct PortMappingParserData * data);
|
|
||||||
|
|
||||||
/* IGD:2, functions for service WANIPv6FirewallControl:1 */
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_GetFirewallStatus(const char * controlURL,
|
|
||||||
const char * servicetype,
|
|
||||||
int * firewallEnabled,
|
|
||||||
int * inboundPinholeAllowed);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype,
|
|
||||||
const char * remoteHost,
|
|
||||||
const char * remotePort,
|
|
||||||
const char * intClient,
|
|
||||||
const char * intPort,
|
|
||||||
const char * proto,
|
|
||||||
int * opTimeout);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_AddPinhole(const char * controlURL, const char * servicetype,
|
|
||||||
const char * remoteHost,
|
|
||||||
const char * remotePort,
|
|
||||||
const char * intClient,
|
|
||||||
const char * intPort,
|
|
||||||
const char * proto,
|
|
||||||
const char * leaseTime,
|
|
||||||
char * uniqueID);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_UpdatePinhole(const char * controlURL, const char * servicetype,
|
|
||||||
const char * uniqueID,
|
|
||||||
const char * leaseTime);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_DeletePinhole(const char * controlURL, const char * servicetype, const char * uniqueID);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_CheckPinholeWorking(const char * controlURL, const char * servicetype,
|
|
||||||
const char * uniqueID, int * isWorking);
|
|
||||||
|
|
||||||
MINIUPNP_LIBSPEC int
|
|
||||||
UPNP_GetPinholePackets(const char * controlURL, const char * servicetype,
|
|
||||||
const char * uniqueID, int * packets);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
23
Externals/miniupnpc/src/upnpdev.c
vendored
23
Externals/miniupnpc/src/upnpdev.c
vendored
@ -1,23 +0,0 @@
|
|||||||
/* $Id: upnpdev.c,v 1.1 2015/08/28 12:14:19 nanard Exp $ */
|
|
||||||
/* Project : miniupnp
|
|
||||||
* Web : http://miniupnp.free.fr/
|
|
||||||
* Author : Thomas BERNARD
|
|
||||||
* copyright (c) 2005-2015 Thomas Bernard
|
|
||||||
* This software is subjet to the conditions detailed in the
|
|
||||||
* provided LICENSE file. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "upnpdev.h"
|
|
||||||
|
|
||||||
/* freeUPNPDevlist() should be used to
|
|
||||||
* free the chained list returned by upnpDiscover() */
|
|
||||||
void freeUPNPDevlist(struct UPNPDev * devlist)
|
|
||||||
{
|
|
||||||
struct UPNPDev * next;
|
|
||||||
while(devlist)
|
|
||||||
{
|
|
||||||
next = devlist->pNext;
|
|
||||||
free(devlist);
|
|
||||||
devlist = next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
36
Externals/miniupnpc/src/upnpdev.h
vendored
36
Externals/miniupnpc/src/upnpdev.h
vendored
@ -1,36 +0,0 @@
|
|||||||
/* $Id: upnpdev.h,v 1.1 2015/08/28 12:14:19 nanard Exp $ */
|
|
||||||
/* Project : miniupnp
|
|
||||||
* Web : http://miniupnp.free.fr/
|
|
||||||
* Author : Thomas BERNARD
|
|
||||||
* copyright (c) 2005-2015 Thomas Bernard
|
|
||||||
* This software is subjet to the conditions detailed in the
|
|
||||||
* provided LICENSE file. */
|
|
||||||
#ifndef UPNPDEV_H_INCLUDED
|
|
||||||
#define UPNPDEV_H_INCLUDED
|
|
||||||
|
|
||||||
#include "miniupnpc_declspec.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct UPNPDev {
|
|
||||||
struct UPNPDev * pNext;
|
|
||||||
char * descURL;
|
|
||||||
char * st;
|
|
||||||
unsigned int scope_id;
|
|
||||||
char * usn;
|
|
||||||
char buffer[3];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* freeUPNPDevlist()
|
|
||||||
* free list returned by upnpDiscover() */
|
|
||||||
MINIUPNP_LIBSPEC void freeUPNPDevlist(struct UPNPDev * devlist);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* UPNPDEV_H_INCLUDED */
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user