aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitmodules4
-rw-r--r--CMakeLists.txt8
-rw-r--r--README.md25
-rw-r--r--cmake/Version.cmake8
-rw-r--r--contrib/epee/include/net/abstract_tcp_server2.inl3
-rw-r--r--contrib/epee/include/syncobj.h3
-rw-r--r--contrib/epee/src/mlog.cpp7
-rw-r--r--contrib/snap/snapcraft.yaml1
-rw-r--r--external/CMakeLists.txt41
-rw-r--r--external/db_drivers/liblmdb/mdb.c4
-rw-r--r--external/db_drivers/liblmdb/mdb_load.c12
m---------external/miniupnp0
-rw-r--r--external/miniupnpc/.gitignore36
-rw-r--r--external/miniupnpc/CMakeLists.txt203
-rw-r--r--external/miniupnpc/Changelog.txt687
-rw-r--r--external/miniupnpc/LICENSE27
-rw-r--r--external/miniupnpc/MANIFEST.in7
-rw-r--r--external/miniupnpc/Makefile390
-rw-r--r--external/miniupnpc/Makefile.mingw102
-rw-r--r--external/miniupnpc/README63
-rw-r--r--external/miniupnpc/VERSION1
-rw-r--r--external/miniupnpc/apiversions.txt172
-rw-r--r--external/miniupnpc/codelength.h54
-rw-r--r--external/miniupnpc/connecthostport.c262
-rw-r--r--external/miniupnpc/connecthostport.h18
-rwxr-xr-xexternal/miniupnpc/external-ip.sh4
-rw-r--r--external/miniupnpc/igd_desc_parse.c123
-rw-r--r--external/miniupnpc/igd_desc_parse.h49
-rw-r--r--external/miniupnpc/java/.gitignore2
-rw-r--r--external/miniupnpc/java/JavaBridgeTest.java97
-rwxr-xr-xexternal/miniupnpc/java/testjava.bat8
-rwxr-xr-xexternal/miniupnpc/java/testjava.sh8
-rw-r--r--external/miniupnpc/listdevices.c110
-rw-r--r--external/miniupnpc/man3/miniupnpc.355
-rw-r--r--external/miniupnpc/mingw32make.bat8
-rw-r--r--external/miniupnpc/minihttptestserver.c659
-rw-r--r--external/miniupnpc/minisoap.c123
-rw-r--r--external/miniupnpc/minisoap.h15
-rw-r--r--external/miniupnpc/minissdpc.c888
-rw-r--r--external/miniupnpc/minissdpc.h58
-rw-r--r--external/miniupnpc/miniupnpc.c722
-rw-r--r--external/miniupnpc/miniupnpc.def45
-rw-r--r--external/miniupnpc/miniupnpc.h152
-rw-r--r--external/miniupnpc/miniupnpc_declspec.h21
-rw-r--r--external/miniupnpc/miniupnpcmodule.c703
-rw-r--r--external/miniupnpc/miniupnpcstrings.h.cmake15
-rw-r--r--external/miniupnpc/miniupnpcstrings.h.in23
-rw-r--r--external/miniupnpc/miniupnpctypes.h19
-rw-r--r--external/miniupnpc/miniwget.c663
-rw-r--r--external/miniupnpc/miniwget.h30
-rw-r--r--external/miniupnpc/minixml.c229
-rw-r--r--external/miniupnpc/minixml.h37
-rw-r--r--external/miniupnpc/minixmlvalid.c163
-rw-r--r--external/miniupnpc/msvc/.gitignore4
-rw-r--r--external/miniupnpc/msvc/miniupnpc.sln29
-rw-r--r--external/miniupnpc/msvc/miniupnpc.vcproj283
-rw-r--r--external/miniupnpc/msvc/miniupnpc.vcxproj111
-rw-r--r--external/miniupnpc/msvc/miniupnpc.vcxproj.filters108
-rw-r--r--external/miniupnpc/msvc/miniupnpc_vs2015.sln28
-rw-r--r--external/miniupnpc/msvc/upnpc-static.vcproj195
-rw-r--r--external/miniupnpc/msvc/upnpc-static.vcxproj103
-rw-r--r--external/miniupnpc/msvc/upnpc-static.vcxproj.filters22
-rw-r--r--external/miniupnpc/portlistingparse.c172
-rw-r--r--external/miniupnpc/portlistingparse.h65
-rwxr-xr-xexternal/miniupnpc/pymoduletest.py88
-rwxr-xr-xexternal/miniupnpc/pymoduletest3.py52
-rw-r--r--external/miniupnpc/receivedata.c105
-rw-r--r--external/miniupnpc/receivedata.h19
-rwxr-xr-xexternal/miniupnpc/setup.py35
-rwxr-xr-xexternal/miniupnpc/setupmingw32.py28
-rw-r--r--external/miniupnpc/testdesc/linksys_WAG200G_desc.values14
-rw-r--r--external/miniupnpc/testdesc/linksys_WAG200G_desc.xml110
-rw-r--r--external/miniupnpc/testdesc/new_LiveBox_desc.values20
-rw-r--r--external/miniupnpc/testdesc/new_LiveBox_desc.xml90
-rw-r--r--external/miniupnpc/testigddescparse.c187
-rw-r--r--external/miniupnpc/testminiwget.c55
-rwxr-xr-xexternal/miniupnpc/testminiwget.sh96
-rw-r--r--external/miniupnpc/testminixml.c89
-rw-r--r--external/miniupnpc/testportlistingparse.c151
-rw-r--r--external/miniupnpc/testreplyparse/DeletePortMapping.namevalue3
-rw-r--r--external/miniupnpc/testreplyparse/DeletePortMapping.xml6
-rw-r--r--external/miniupnpc/testreplyparse/GetExternalIPAddress.namevalue2
-rw-r--r--external/miniupnpc/testreplyparse/GetExternalIPAddress.xml2
-rw-r--r--external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryReq.namevalue3
-rw-r--r--external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryReq.xml3
-rw-r--r--external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryResp.namevalue5
-rw-r--r--external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryResp.xml2
-rw-r--r--external/miniupnpc/testreplyparse/SetDefaultConnectionService.namevalue1
-rw-r--r--external/miniupnpc/testreplyparse/SetDefaultConnectionService.xml1
-rw-r--r--external/miniupnpc/testreplyparse/readme.txt7
-rwxr-xr-xexternal/miniupnpc/testupnpigd.py88
-rw-r--r--external/miniupnpc/testupnpreplyparse.c96
-rwxr-xr-xexternal/miniupnpc/testupnpreplyparse.sh14
-rwxr-xr-xexternal/miniupnpc/updateminiupnpcstrings.sh53
-rw-r--r--external/miniupnpc/upnpc.c857
-rw-r--r--external/miniupnpc/upnpcommands.c1240
-rw-r--r--external/miniupnpc/upnpcommands.h348
-rw-r--r--external/miniupnpc/upnpdev.c23
-rw-r--r--external/miniupnpc/upnpdev.h36
-rw-r--r--external/miniupnpc/upnperrors.c107
-rw-r--r--external/miniupnpc/upnperrors.h26
-rw-r--r--external/miniupnpc/upnpreplyparse.c197
-rw-r--r--external/miniupnpc/upnpreplyparse.h63
-rw-r--r--external/miniupnpc/wingenminiupnpcstrings.c83
-rw-r--r--src/blockchain_db/blockchain_db.h5
-rw-r--r--src/blockchain_db/lmdb/db_lmdb.cpp52
-rw-r--r--src/blockchain_db/lmdb/db_lmdb.h5
-rw-r--r--src/blockchain_utilities/blockchain_blackball.cpp3
-rw-r--r--src/blocks/checkpoints.datbin191524 -> 197348 bytes
-rw-r--r--src/checkpoints/checkpoints.cpp2
-rw-r--r--src/common/CMakeLists.txt1
-rw-r--r--src/common/dns_utils.cpp2
-rw-r--r--src/common/util.cpp44
-rw-r--r--src/crypto/chacha.h4
-rw-r--r--src/crypto/crypto.cpp20
-rw-r--r--src/crypto/slow-hash.c2
-rw-r--r--src/cryptonote_basic/cryptonote_format_utils.cpp37
-rw-r--r--src/cryptonote_config.h3
-rw-r--r--src/cryptonote_core/blockchain.cpp99
-rw-r--r--src/cryptonote_core/blockchain.h12
-rw-r--r--src/cryptonote_core/cryptonote_core.cpp47
-rw-r--r--src/cryptonote_core/cryptonote_core.h9
-rw-r--r--src/cryptonote_core/cryptonote_tx_utils.cpp15
-rw-r--r--src/cryptonote_core/cryptonote_tx_utils.h4
-rw-r--r--src/cryptonote_core/tx_pool.cpp47
-rw-r--r--src/cryptonote_protocol/cryptonote_protocol_handler.inl21
-rw-r--r--src/daemon/command_line_args.h6
-rw-r--r--src/daemon/command_parser_executor.cpp13
-rw-r--r--src/daemon/command_parser_executor.h2
-rw-r--r--src/daemon/command_server.cpp5
-rw-r--r--src/daemon/main.cpp45
-rw-r--r--src/daemon/rpc_command_executor.cpp13
-rw-r--r--src/device/device.hpp37
-rw-r--r--src/device/device_default.cpp30
-rw-r--r--src/device/device_default.hpp13
-rw-r--r--src/device/device_ledger.cpp710
-rw-r--r--src/device/device_ledger.hpp47
-rw-r--r--src/device/log.cpp10
-rw-r--r--src/p2p/net_node.cpp2
-rw-r--r--src/p2p/net_node.h4
-rw-r--r--src/p2p/net_node.inl19
-rw-r--r--src/ringct/rctSigs.cpp10
-rw-r--r--src/rpc/core_rpc_server.cpp75
-rw-r--r--src/rpc/core_rpc_server.h2
-rw-r--r--src/rpc/core_rpc_server_commands_defs.h6
-rw-r--r--src/rpc/get_output_distribution_cache.h113
-rw-r--r--src/simplewallet/simplewallet.cpp64
-rw-r--r--src/simplewallet/simplewallet.h1
-rw-r--r--src/version.cpp.in2
-rw-r--r--src/wallet/api/wallet.cpp6
-rw-r--r--src/wallet/api/wallet2_api.h17
-rw-r--r--src/wallet/api/wallet_manager.cpp44
-rw-r--r--src/wallet/api/wallet_manager.h16
-rw-r--r--src/wallet/wallet2.cpp310
-rw-r--r--src/wallet/wallet2.h33
-rw-r--r--tests/core_proxy/core_proxy.h1
-rw-r--r--tests/unit_tests/CMakeLists.txt2
-rw-r--r--tests/unit_tests/ban.cpp1
-rw-r--r--tests/unit_tests/hardfork.cpp3
-rw-r--r--tests/unit_tests/main.cpp11
160 files changed, 1344 insertions, 13455 deletions
diff --git a/.gitmodules b/.gitmodules
index fbcec5b46..73b430c10 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -2,3 +2,7 @@
path = external/unbound
url = https://github.com/monero-project/unbound
branch = monero
+[submodule "external/miniupnp"]
+ path = external/miniupnp
+ url = https://github.com/monero-project/miniupnp
+ branch = monero
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 08b47eaf6..b1297e716 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -430,14 +430,6 @@ include_directories("${CMAKE_CURRENT_BINARY_DIR}/translations")
add_subdirectory(external)
-# Final setup for miniupnpc
-if(UPNP_STATIC OR IOS)
- add_definitions("-DUPNP_STATIC")
-else()
- add_definitions("-DUPNP_DYNAMIC")
- include_directories(${UPNP_INCLUDE})
-endif()
-
# Final setup for libunbound
include_directories(${UNBOUND_INCLUDE})
link_directories(${UNBOUND_LIBRARY_DIRS})
diff --git a/README.md b/README.md
index 114afcd4e..4c3e9799a 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,10 @@ Portions Copyright (c) 2012-2013 The Cryptonote developers.
- Our [Vulnerability Response Process](https://github.com/monero-project/meta/blob/master/VULNERABILITY_RESPONSE_PROCESS.md) encourages responsible disclosure
- We are also available via [HackerOne](https://hackerone.com/monero)
+## Announcements
+
+- You can subscribe to an [announcement listserv](https://lists.getmonero.org) to get critical announcements from the Monero core team. The announcement list can be very helpful for knowing when software updates are needed.
+
## Build
| Operating System | Processor | Status |
@@ -86,9 +90,9 @@ See [LICENSE](LICENSE).
If you want to help out, see [CONTRIBUTING](CONTRIBUTING.md) for a set of guidelines.
-## Scheduled mandatory software upgrades
+## Scheduled software upgrades
-Monero uses a fixed-schedule mandatory software upgrade (hard fork) mechanism to implement new features. This means that users of Monero (end users and service providers) need to run current versions and upgrade their software on a regular schedule. Mandatory software upgrades occur during the months of March and September. The required software for these upgrades will be available prior to the scheduled date. Please check the repository prior to this date for the proper Monero software version. Below is the historical schedule and the projected schedule for the next upgrade.
+Monero uses a fixed-schedule software upgrade (hard fork) mechanism to implement new features. This means that users of Monero (end users and service providers) should run current versions and upgrade their software on a regular schedule. Software upgrades occur during the months of April and October. The required software for these upgrades will be available prior to the scheduled date. Please check the repository prior to this date for the proper Monero software version. Below is the historical schedule and the projected schedule for the next upgrade.
Dates are provided in the format YYYY-MM-DD.
@@ -100,12 +104,13 @@ Dates are provided in the format YYYY-MM-DD.
| 1288616 | 2017-04-15 | v5 | v0.10.3.0 | v0.10.3.1 | Adjusted minimum blocksize and fee algorithm |
| 1400000 | 2017-09-16 | v6 | v0.11.0.0 | v0.11.0.0 | Allow only RingCT transactions, allow only >= ringsize 5 |
| 1546000 | 2018-04-06 | v7 | v0.12.0.0 | v0.12.0.0 | Cryptonight variant 1, ringsize >= 7, sorted inputs
+| XXXXXXX | 2018-10-XX | XX | XXXXXXXXX | XXXXXXXXX | X
X's indicate that these details have not been determined as of commit date.
## Release staging schedule and protocol
-Approximately three months prior to a scheduled mandatory software upgrade, a branch from Master will be created with the new release version tag. Pull requests that address bugs should then be made to both Master and the new release branch. Pull requests that require extensive review and testing (generally, optimizations and new features) should *not* be made to the release branch.
+Approximately three months prior to a scheduled software upgrade, a branch from Master will be created with the new release version tag. Pull requests that address bugs should then be made to both Master and the new release branch. Pull requests that require extensive review and testing (generally, optimizations and new features) should *not* be made to the release branch.
## Installing Monero from a package
@@ -166,7 +171,7 @@ library archives (`.a`).
| Dep | Min. version | Vendored | Debian/Ubuntu pkg | Arch pkg | Fedora | Optional | Purpose |
| ------------ | ------------- | -------- | ------------------ | ------------ | ----------------- | -------- | -------------- |
| GCC | 4.7.3 | NO | `build-essential` | `base-devel` | `gcc` | NO | |
-| CMake | 3.2.0 | NO | `cmake` | `cmake` | `cmake` | NO | |
+| CMake | 3.0.0 | NO | `cmake` | `cmake` | `cmake` | NO | |
| pkg-config | any | NO | `pkg-config` | `base-devel` | `pkgconf` | NO | |
| Boost | 1.58 | NO | `libboost-all-dev` | `boost` | `boost-devel` | NO | C++ libraries |
| OpenSSL | basically any | NO | `libssl-dev` | `openssl` | `openssl-devel` | NO | sha256 sum |
@@ -187,6 +192,16 @@ library archives (`.a`).
[^] On Debian/Ubuntu `libgtest-dev` only includes sources and headers. You must
build the library binary manually. This can be done with the following command ```sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake . && sudo make && sudo mv libg* /usr/lib/ ```
+### Cloning the repository
+
+Clone recursively to pull-in needed submodule(s):
+
+`$ git clone --recursive https://github.com/monero-project/monero`
+
+If you already have a repo cloned, initialize and update:
+
+`$ cd monero && git submodule init && git submodule update`
+
### Build instructions
Monero uses the CMake build system and a top-level [Makefile](Makefile) that
@@ -228,6 +243,8 @@ invokes cmake commands as needed.
make release-static
+Dependencies need to be built with -fPIC. Static libraries usually aren't, so you may have to build them yourself with -fPIC. Refer to their documentation for how to build them.
+
* **Optional**: build documentation in `doc/html` (omit `HAVE_DOT=YES` if `graphviz` is not installed):
HAVE_DOT=YES doxygen Doxyfile
diff --git a/cmake/Version.cmake b/cmake/Version.cmake
index 63b2a6790..3677e80d7 100644
--- a/cmake/Version.cmake
+++ b/cmake/Version.cmake
@@ -28,7 +28,7 @@
function (write_static_version_header hash)
set(VERSIONTAG "${hash}")
- configure_file("src/version.cpp.in" "version.cpp")
+ configure_file("${CMAKE_SOURCE_DIR}/src/version.cpp.in" "${CMAKE_BINARY_DIR}/version.cpp")
endfunction ()
find_package(Git QUIET)
@@ -37,14 +37,16 @@ if ("$Format:$" STREQUAL "")
write_static_version_header("release")
elseif (GIT_FOUND OR Git_FOUND)
message(STATUS "Found Git: ${GIT_EXECUTABLE}")
- add_custom_target(genversion ALL
+ add_custom_command(
+ OUTPUT "${CMAKE_BINARY_DIR}/version.cpp"
COMMAND "${CMAKE_COMMAND}"
"-D" "GIT=${GIT_EXECUTABLE}"
"-D" "TO=${CMAKE_BINARY_DIR}/version.cpp"
"-P" "cmake/GenVersion.cmake"
- BYPRODUCTS "${CMAKE_BINARY_DIR}/version.cpp"
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
else()
message(STATUS "WARNING: Git was not found!")
write_static_version_header("unknown")
endif ()
+add_custom_target(genversion ALL
+ DEPENDS "${CMAKE_BINARY_DIR}/version.cpp")
diff --git a/contrib/epee/include/net/abstract_tcp_server2.inl b/contrib/epee/include/net/abstract_tcp_server2.inl
index 195ee2f0c..52b4c85ba 100644
--- a/contrib/epee/include/net/abstract_tcp_server2.inl
+++ b/contrib/epee/include/net/abstract_tcp_server2.inl
@@ -41,7 +41,8 @@
#include <boost/utility/value_init.hpp>
#include <boost/asio/deadline_timer.hpp>
#include <boost/date_time/posix_time/posix_time.hpp> // TODO
-#include <boost/thread/v2/thread.hpp> // TODO
+#include <boost/thread/thread.hpp> // TODO
+#include <boost/thread/condition_variable.hpp> // TODO
#include "misc_language.h"
#include "pragma_comp_defs.h"
diff --git a/contrib/epee/include/syncobj.h b/contrib/epee/include/syncobj.h
index 8912fc018..9f2404856 100644
--- a/contrib/epee/include/syncobj.h
+++ b/contrib/epee/include/syncobj.h
@@ -31,10 +31,11 @@
#define __WINH_OBJ_H__
#include <boost/chrono/duration.hpp>
+#include <boost/thread/condition_variable.hpp>
#include <boost/thread/locks.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/recursive_mutex.hpp>
-#include <boost/thread/v2/thread.hpp>
+#include <boost/thread/thread.hpp>
namespace epee
{
diff --git a/contrib/epee/src/mlog.cpp b/contrib/epee/src/mlog.cpp
index 5b9472006..fb0b4ac2b 100644
--- a/contrib/epee/src/mlog.cpp
+++ b/contrib/epee/src/mlog.cpp
@@ -202,7 +202,12 @@ void mlog_set_log(const char *log)
long level;
char *ptr = NULL;
- level = strtoll(log, &ptr, 10);
+ if (!*log)
+ {
+ mlog_set_categories(log);
+ return;
+ }
+ level = strtol(log, &ptr, 10);
if (ptr && *ptr)
{
// we can have a default level, eg, 2,foo:ERROR
diff --git a/contrib/snap/snapcraft.yaml b/contrib/snap/snapcraft.yaml
index 49e305243..b3b75d278 100644
--- a/contrib/snap/snapcraft.yaml
+++ b/contrib/snap/snapcraft.yaml
@@ -35,7 +35,6 @@ parts:
plugin: cmake
configflags:
- -DBDB_STATIC=1
- - -DUPNP_STATIC=1
- -DBoost_USE_STATIC_LIBS=1
- -DBoost_USE_STATIC_RUNTIME=1
- -DARCH=default
diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt
index 69dc84e87..1fc4d64c1 100644
--- a/external/CMakeLists.txt
+++ b/external/CMakeLists.txt
@@ -34,43 +34,22 @@
# We always compile if we are building statically to reduce static dependency issues...
# ...except for FreeBSD, because FreeBSD is a special case that doesn't play well with
# others.
-if(NOT IOS)
- find_package(Miniupnpc QUIET)
-endif()
-# If we have the correct shared version and we're not building static, use it
-if(STATIC OR IOS)
- set(USE_SHARED_MINIUPNPC false)
-elseif(MINIUPNP_FOUND AND MINIUPNPC_VERSION_1_7_OR_HIGHER)
- set(USE_SHARED_MINIUPNPC true)
-endif()
+find_package(Miniupnpc REQUIRED)
-if(USE_SHARED_MINIUPNPC)
- message(STATUS "Using shared miniupnpc found at ${MINIUPNP_INCLUDE_DIR}")
+message(STATUS "Using in-tree miniupnpc")
- set(UPNP_STATIC false PARENT_SCOPE)
- set(UPNP_INCLUDE ${MINIUPNP_INCLUDE_DIR} PARENT_SCOPE)
- set(UPNP_LIBRARIES ${MINIUPNP_LIBRARY} PARENT_SCOPE)
-else()
- if(STATIC)
- message(STATUS "Using miniupnpc from local source tree for static build")
- else()
- message(STATUS "Using miniupnpc from local source tree (/external/miniupnpc)")
- endif()
+add_subdirectory(miniupnp/miniupnpc)
- add_subdirectory(miniupnpc)
-
- set_property(TARGET libminiupnpc-static PROPERTY FOLDER "external")
- if(MSVC)
- set_property(TARGET libminiupnpc-static APPEND_STRING PROPERTY COMPILE_FLAGS " -wd4244 -wd4267")
- elseif(NOT MSVC)
- set_property(TARGET libminiupnpc-static APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-undef -Wno-unused-result -Wno-unused-value")
- endif()
-
- set(UPNP_STATIC true PARENT_SCOPE)
- set(UPNP_LIBRARIES "libminiupnpc-static" PARENT_SCOPE)
+set_property(TARGET libminiupnpc-static PROPERTY FOLDER "external")
+if(MSVC)
+ set_property(TARGET libminiupnpc-static APPEND_STRING PROPERTY COMPILE_FLAGS " -wd4244 -wd4267")
+elseif(NOT MSVC)
+ set_property(TARGET libminiupnpc-static APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-undef -Wno-unused-result -Wno-unused-value")
endif()
+set(UPNP_LIBRARIES "libminiupnpc-static" PARENT_SCOPE)
+
find_package(Unbound)
if(NOT UNBOUND_INCLUDE_DIR OR STATIC)
diff --git a/external/db_drivers/liblmdb/mdb.c b/external/db_drivers/liblmdb/mdb.c
index dde428c43..8e2b1eca1 100644
--- a/external/db_drivers/liblmdb/mdb.c
+++ b/external/db_drivers/liblmdb/mdb.c
@@ -7231,7 +7231,7 @@ mdb_cursor_put(MDB_cursor *mc, MDB_val *key, MDB_val *data,
dkey.mv_size = 0;
- if (flags == MDB_CURRENT) {
+ if (flags & MDB_CURRENT) {
if (!(mc->mc_flags & C_INITIALIZED))
return EINVAL;
rc = MDB_SUCCESS;
@@ -7624,7 +7624,7 @@ put_sub:
xdata.mv_size = 0;
xdata.mv_data = "";
leaf = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]);
- if (flags & MDB_CURRENT) {
+ if (flags == MDB_CURRENT) {
xflags = MDB_CURRENT|MDB_NOSPILL;
} else {
mdb_xcursor_init1(mc, leaf);
diff --git a/external/db_drivers/liblmdb/mdb_load.c b/external/db_drivers/liblmdb/mdb_load.c
index 797c2f979..c74ce81c9 100644
--- a/external/db_drivers/liblmdb/mdb_load.c
+++ b/external/db_drivers/liblmdb/mdb_load.c
@@ -78,6 +78,7 @@ static void readhdr(void)
{
char *ptr;
+ flags = 0;
while (fgets(dbuf.mv_data, dbuf.mv_size, stdin) != NULL) {
lineno++;
if (!strncmp(dbuf.mv_data, "VERSION=", STRLENOF("VERSION="))) {
@@ -303,7 +304,7 @@ int main(int argc, char *argv[])
MDB_cursor *mc;
MDB_dbi dbi;
char *envname;
- int envflags = 0, putflags = 0;
+ int envflags = MDB_NOSYNC, putflags = 0;
int dohdr = 0, append = 0;
MDB_val prevk;
@@ -391,13 +392,11 @@ int main(int argc, char *argv[])
kbuf.mv_data = malloc(kbuf.mv_size * 2);
k0buf.mv_size = kbuf.mv_size;
k0buf.mv_data = (char *)kbuf.mv_data + kbuf.mv_size;
- prevk.mv_size = 0;
prevk.mv_data = k0buf.mv_data;
while(!Eof) {
MDB_val key, data;
int batch = 0;
- flags = 0;
int appflag;
if (!dohdr) {
@@ -416,6 +415,7 @@ int main(int argc, char *argv[])
fprintf(stderr, "mdb_open failed, error %d %s\n", rc, mdb_strerror(rc));
goto txn_abort;
}
+ prevk.mv_size = 0;
if (append) {
mdb_set_compare(txn, dbi, greater);
if (flags & MDB_DUPSORT)
@@ -443,7 +443,7 @@ int main(int argc, char *argv[])
appflag = MDB_APPEND;
if (flags & MDB_DUPSORT) {
if (prevk.mv_size == key.mv_size && !memcmp(prevk.mv_data, key.mv_data, key.mv_size))
- appflag = MDB_APPENDDUP;
+ appflag = MDB_CURRENT|MDB_APPENDDUP;
else {
memcpy(prevk.mv_data, key.mv_data, key.mv_size);
prevk.mv_size = key.mv_size;
@@ -477,6 +477,10 @@ int main(int argc, char *argv[])
fprintf(stderr, "mdb_cursor_open failed, error %d %s\n", rc, mdb_strerror(rc));
goto txn_abort;
}
+ if (appflag & MDB_APPENDDUP) {
+ MDB_val k, d;
+ mdb_cursor_get(mc, &k, &d, MDB_LAST);
+ }
batch = 0;
}
}
diff --git a/external/miniupnp b/external/miniupnp
new file mode 160000
+Subproject 6a63f9954959119568fbc4af57d7b491b9428d8
diff --git a/external/miniupnpc/.gitignore b/external/miniupnpc/.gitignore
deleted file mode 100644
index 6bc38af20..000000000
--- a/external/miniupnpc/.gitignore
+++ /dev/null
@@ -1,36 +0,0 @@
-deb_dist/
-build/
-*.o
-*.a
-*.so
-*.dll
-*.dll.def
-*.exe
-*.lib
-*.dylib
-Makefile.bak
-miniupnpcstrings.h
-pythonmodule
-pythonmodule3
-upnpc-shared
-upnpc-static
-minihttptestserver
-minixmlvalid
-testminiwget
-validateminiwget
-validateminixml
-java/miniupnpc_*.jar
-_jnaerator.*
-out.errors.txt
-jnaerator-*.jar
-miniupnpc.h.bak
-testupnpreplyparse
-validateupnpreplyparse
-testportlistingparse
-validateportlistingparse
-listdevices
-testigddescparse
-validateigddescparse
-dist/
-miniupnpc.egg-info/
-init
diff --git a/external/miniupnpc/CMakeLists.txt b/external/miniupnpc/CMakeLists.txt
deleted file mode 100644
index 2df8d474b..000000000
--- a/external/miniupnpc/CMakeLists.txt
+++ /dev/null
@@ -1,203 +0,0 @@
-cmake_minimum_required (VERSION 2.6)
-
-project (miniupnpc C)
-set (MINIUPNPC_VERSION 2.0)
-set (MINIUPNPC_API_VERSION 16)
-
-# - we comment out this block as we don't support these other build types
-if(0)
-if (NOT CMAKE_BUILD_TYPE)
- if (WIN32)
- set (DEFAULT_BUILD_TYPE MinSizeRel)
- else (WIN32)
- set (DEFAULT_BUILD_TYPE RelWithDebInfo)
- endif(WIN32)
- set (CMAKE_BUILD_TYPE ${DEFAULT_BUILD_TYPE} CACHE STRING
- "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
- FORCE)
-endif()
-endif()
-
-option (UPNPC_BUILD_STATIC "Build static library" TRUE)
-option (UPNPC_BUILD_SHARED "Build shared library" FALSE)
-option (UPNPC_BUILD_TESTS "Build test executables" FALSE)
-option (NO_GETADDRINFO "Define NO_GETADDRINFO" FALSE)
-
-mark_as_advanced (NO_GETADDRINFO)
-
-if (NO_GETADDRINFO)
- add_definitions (-DNO_GETADDRINFO)
-endif (NO_GETADDRINFO)
-
-if (NOT WIN32)
- add_definitions (-DMINIUPNPC_SET_SOCKET_TIMEOUT)
- add_definitions (-D_BSD_SOURCE -D_DEFAULT_SOURCE)
- if (NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" AND NOT CMAKE_SYSTEM_NAME STREQUAL "DragonFly")
- # add_definitions (-D_POSIX_C_SOURCE=200112L)
- add_definitions (-D_XOPEN_SOURCE=600)
- endif (NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" AND NOT CMAKE_SYSTEM_NAME STREQUAL "DragonFly")
- if (CMAKE_SYSTEM_NAME MATCHES "(SunOS|Solaris)")
- add_definitions (-D__EXTENSIONS__ -std=c99)
- endif ()
-else (NOT WIN32)
- add_definitions (-D_WIN32_WINNT=0x0501) # XP or higher for getnameinfo and friends
-endif (NOT WIN32)
-
-if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
- add_definitions (-D_DARWIN_C_SOURCE)
-endif ()
-
-# - we comment out this block as we already set flags
-if(0)
-# Set compiler specific build flags
-if (CMAKE_COMPILER_IS_GNUC)
- # Set our own default flags at first run.
- if (NOT CONFIGURED)
-
- if (NOT CMAKE_SYSTEM_NAME STREQUAL "AmigaOS")
- set (_PIC -fPIC)
- endif (CMAKE_SYSTEM_NAME STREQUAL "AmigaOS")
-
- set (CMAKE_C_FLAGS "${_PIC} -Wall $ENV{CFLAGS}" # CMAKE_C_FLAGS gets appended to the other C flags
- CACHE STRING "Flags used by the C compiler during normal builds." FORCE)
- set (CMAKE_C_FLAGS_DEBUG "-g -DDDEBUG"
- CACHE STRING "Flags used by the C compiler during debug builds." FORCE)
- set (CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG"
- CACHE STRING "Flags used by the C compiler during release builds." FORCE)
- set (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG"
- CACHE STRING "Flags used by the C compiler during release builds." FORCE)
- set (CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG"
- CACHE STRING "Flags used by the C compiler during release builds." FORCE)
-
- endif (NOT CONFIGURED)
-endif ()
-endif()
-
-# always add -fPIC
-set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
-set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fPIC")
-set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -fPIC")
-set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -fPIC")
-set (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -fPIC")
-
-configure_file (${CMAKE_CURRENT_SOURCE_DIR}/miniupnpcstrings.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/miniupnpcstrings.h)
-include_directories (${CMAKE_CURRENT_BINARY_DIR})
-
-set (MINIUPNPC_SOURCES
- igd_desc_parse.c
- miniupnpc.c
- minixml.c
- minisoap.c
- minissdpc.c
- miniwget.c
- upnpcommands.c
- upnpdev.c
- upnpreplyparse.c
- upnperrors.c
- connecthostport.c
- portlistingparse.c
- receivedata.c
-)
-
-if (NOT WIN32 AND NOT CMAKE_SYSTEM_NAME STREQUAL "AmigaOS")
- set (MINIUPNPC_SOURCES ${MINIUPNPC_SOURCES} minissdpc.c)
-endif (NOT WIN32 AND NOT CMAKE_SYSTEM_NAME STREQUAL "AmigaOS")
-
-if (WIN32)
- set_source_files_properties (${MINIUPNPC_SOURCES} PROPERTIES
- COMPILE_DEFINITIONS "MINIUPNP_STATICLIB;MINIUPNP_EXPORTS"
- )
-endif (WIN32)
-
-if (WIN32)
- # We use set instead of find_library because otherwise static compilation on Windows breaks. Don't ask me why, just roll with it.
- # find_library (WINSOCK2_LIBRARY NAMES ws2_32 WS2_32 Ws2_32)
- # find_library (IPHLPAPI_LIBRARY NAMES iphlpapi)
- set (WINSOCK2_LIBRARY ws2_32)
- set (IPHLPAPI_LIBRARY iphlpapi)
- set (LDLIBS ${WINSOCK2_LIBRARY} ${IPHLPAPI_LIBRARY} ${LDLIBS})
-#elseif (CMAKE_SYSTEM_NAME STREQUAL "Solaris")
-# find_library (SOCKET_LIBRARY NAMES socket)
-# find_library (NSL_LIBRARY NAMES nsl)
-# find_library (RESOLV_LIBRARY NAMES resolv)
-# set (LDLIBS ${SOCKET_LIBRARY} ${NSL_LIBRARY} ${RESOLV_LIBRARY} ${LDLIBS})
-endif (WIN32)
-
-if (NOT UPNPC_BUILD_STATIC AND NOT UPNPC_BUILD_SHARED)
- message (FATAL "Both shared and static libraries are disabled!")
-endif (NOT UPNPC_BUILD_STATIC AND NOT UPNPC_BUILD_SHARED)
-
-if (UPNPC_BUILD_STATIC)
- add_library (libminiupnpc-static STATIC ${MINIUPNPC_SOURCES})
- set_target_properties (libminiupnpc-static PROPERTIES OUTPUT_NAME "miniupnpc")
- target_link_libraries (libminiupnpc-static ${LDLIBS})
- set (UPNPC_INSTALL_TARGETS ${UPNPC_INSTALL_TARGETS} libminiupnpc-static)
- set (UPNPC_LIBRARY_TARGET libminiupnpc-static)
- # add_executable (upnpc-static upnpc.c)
- # target_link_libraries (upnpc-static LINK_PRIVATE libminiupnpc-static)
-endif (UPNPC_BUILD_STATIC)
-
-if (UPNPC_BUILD_SHARED)
- add_library (libminiupnpc-shared SHARED ${MINIUPNPC_SOURCES})
- set_target_properties (libminiupnpc-shared PROPERTIES OUTPUT_NAME "miniupnpc")
- set_target_properties (libminiupnpc-shared PROPERTIES VERSION ${MINIUPNPC_VERSION})
- set_target_properties (libminiupnpc-shared PROPERTIES SOVERSION ${MINIUPNPC_API_VERSION})
- target_link_libraries (libminiupnpc-shared ${LDLIBS})
- set (UPNPC_INSTALL_TARGETS ${UPNPC_INSTALL_TARGETS} libminiupnpc-shared)
- set (UPNPC_LIBRARY_TARGET libminiupnpc-shared)
- add_executable (upnpc-shared upnpc.c)
- target_link_libraries (upnpc-shared LINK_PRIVATE libminiupnpc-shared)
-endif (UPNPC_BUILD_SHARED)
-
-if (UPNPC_BUILD_TESTS)
- add_executable (testminixml testminixml.c minixml.c igd_desc_parse.c)
- target_link_libraries (testminixml ${LDLIBS})
-
- add_executable (minixmlvalid minixmlvalid.c minixml.c)
- target_link_libraries (minixmlvalid ${LDLIBS})
-
- add_executable (testupnpreplyparse testupnpreplyparse.c
- minixml.c upnpreplyparse.c)
- target_link_libraries (testupnpreplyparse ${LDLIBS})
-
- add_executable (testigddescparse testigddescparse.c
- igd_desc_parse.c minixml.c miniupnpc.c miniwget.c minissdpc.c
- upnpcommands.c upnpreplyparse.c minisoap.c connecthostport.c
- portlistingparse.c receivedata.c
- )
- target_link_libraries (testigddescparse ${LDLIBS})
-
- add_executable (testminiwget testminiwget.c
- miniwget.c miniupnpc.c minisoap.c upnpcommands.c minissdpc.c
- upnpreplyparse.c minixml.c igd_desc_parse.c connecthostport.c
- portlistingparse.c receivedata.c
- )
- target_link_libraries (testminiwget ${LDLIBS})
-
-# set (UPNPC_INSTALL_TARGETS ${UPNPC_INSTALL_TARGETS} testminixml minixmlvalid testupnpreplyparse testigddescparse testminiwget)
-endif (UPNPC_BUILD_TESTS)
-
-
-install (TARGETS ${UPNPC_INSTALL_TARGETS}
- RUNTIME DESTINATION bin
- LIBRARY DESTINATION lib${LIB_SUFFIX}
- ARCHIVE DESTINATION lib${LIB_SUFFIX}
-)
-install (FILES
- miniupnpc.h
- miniwget.h
- upnpcommands.h
- igd_desc_parse.h
- upnpreplyparse.h
- upnperrors.h
- upnpdev.h
- miniupnpctypes.h
- portlistingparse.h
- miniupnpc_declspec.h
- DESTINATION include/miniupnpc
-)
-
-# commented out by Ben Boeckel, who I presume knows what he's doing;)
-# set (CONFIGURED YES CACHE INTERNAL "")
-
-# vim: ts=2:sw=2
diff --git a/external/miniupnpc/Changelog.txt b/external/miniupnpc/Changelog.txt
deleted file mode 100644
index a3ef51809..000000000
--- a/external/miniupnpc/Changelog.txt
+++ /dev/null
@@ -1,687 +0,0 @@
-$Id: Changelog.txt,v 1.226 2016/12/16 08:57:19 nanard Exp $
-miniUPnP client Changelog.
-
-2017/05/05:
- Fix CVE-2017-8798 Thanks to tin/Team OSTStrom
-
-2016/11/11:
- check strlen before memcmp in XML parsing portlistingparse.c
- fix build under SOLARIS and CYGWIN
-
-2016/10/11:
- Add python 3 compatibility to IGD test
-
-VERSION 2.0 : released 2016/04/19
-
-2016/01/24:
- change miniwget to return HTTP status code
- increments API_VERSION to 16
-
-2016/01/22:
- Improve UPNPIGD_IsConnected() to check if WAN address is not private.
- parse HTTP response status line in miniwget.c
-
-2015/10/26:
- snprintf() overflow check. check overflow in simpleUPnPcommand2()
-
-2015/10/25:
- fix compilation with old macs
- fix compilation with mingw32 (for Appveyor)
- fix python module for python <= 2.3
-
-2015/10/08:
- Change sameport to localport
- see https://github.com/miniupnp/miniupnp/pull/120
- increments API_VERSION to 15
-
-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
-
diff --git a/external/miniupnpc/LICENSE b/external/miniupnpc/LICENSE
deleted file mode 100644
index 081673370..000000000
--- a/external/miniupnpc/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-MiniUPnPc
-Copyright (c) 2005-2016, 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.
-
diff --git a/external/miniupnpc/MANIFEST.in b/external/miniupnpc/MANIFEST.in
deleted file mode 100644
index 543ffd6ac..000000000
--- a/external/miniupnpc/MANIFEST.in
+++ /dev/null
@@ -1,7 +0,0 @@
-include README
-include VERSION
-include LICENSE
-include miniupnpcmodule.c
-include setup.py
-include *.h
-include libminiupnpc.a
diff --git a/external/miniupnpc/Makefile b/external/miniupnpc/Makefile
deleted file mode 100644
index 178fbf5d3..000000000
--- a/external/miniupnpc/Makefile
+++ /dev/null
@@ -1,390 +0,0 @@
-# $Id: Makefile,v 1.134 2016/10/07 09:04:36 nanard Exp $
-# MiniUPnP Project
-# http://miniupnp.free.fr/
-# http://miniupnp.tuxfamily.org/
-# https://github.com/miniupnp/miniupnp
-# (c) 2005-2017 Thomas Bernard
-# to install use :
-# $ make DESTDIR=/tmp/dummylocation install
-# or
-# $ INSTALLPREFIX=/usr/local make install
-# or
-# $ make install (default INSTALLPREFIX is /usr)
-OS = $(shell uname -s)
-VERSION = $(shell cat VERSION)
-
-ifeq ($(OS), Darwin)
-JARSUFFIX=mac
-LIBTOOL ?= $(shell which libtool)
-endif
-ifeq ($(OS), Linux)
-JARSUFFIX=linux
-endif
-ifneq (,$(findstring NT-5.1,$(OS)))
-JARSUFFIX=win32
-endif
-
-HAVE_IPV6 ?= yes
-export HAVE_IPV6
-
-CC ?= gcc
-#AR = gar
-#CFLAGS = -O -g -DDEBUG
-CFLAGS ?= -O
-CFLAGS += -Wall
-CFLAGS += -W -Wstrict-prototypes
-CFLAGS += -fno-common
-CFLAGS += -DMINIUPNPC_SET_SOCKET_TIMEOUT
-CFLAGS += -DMINIUPNPC_GET_SRC_ADDR
-CFLAGS += -D_BSD_SOURCE
-CFLAGS += -D_DEFAULT_SOURCE
-ifeq ($(OS), NetBSD)
-CFLAGS += -D_NETBSD_SOURCE
-endif
-ifneq ($(OS), FreeBSD)
-ifneq ($(OS), Darwin)
-#CFLAGS += -D_POSIX_C_SOURCE=200112L
-CFLAGS += -D_XOPEN_SOURCE=600
-endif
-endif
-#CFLAGS += -ansi
-#CFLAGS += -DNO_GETADDRINFO
-INSTALL = install
-SH = /bin/sh
-JAVA = java
-# see http://code.google.com/p/jnaerator/
-#JNAERATOR = jnaerator-0.9.7.jar
-#JNAERATOR = jnaerator-0.9.8-shaded.jar
-#JNAERATORARGS = -library miniupnpc
-#JNAERATOR = jnaerator-0.10-shaded.jar
-#JNAERATOR = jnaerator-0.11-shaded.jar
-# https://repo1.maven.org/maven2/com/nativelibs4java/jnaerator/0.12/jnaerator-0.12-shaded.jar
-JNAERATOR = jnaerator-0.12-shaded.jar
-JNAERATORARGS = -mode StandaloneJar -runtime JNAerator -library miniupnpc
-#JNAERATORBASEURL = http://jnaerator.googlecode.com/files/
-JNAERATORBASEURL = https://repo1.maven.org/maven2/com/nativelibs4java/jnaerator/0.12
-
-ifeq (SunOS, $(OS))
- LDLIBS=-lsocket -lnsl -lresolv
- CFLAGS += -D__EXTENSIONS__
- CFLAGS += -std=c99
-endif
-
-# APIVERSION is used to build SONAME
-APIVERSION = 16
-
-SRCS = igd_desc_parse.c miniupnpc.c minixml.c minisoap.c miniwget.c \
- upnpc.c upnpcommands.c upnpreplyparse.c testminixml.c \
- minixmlvalid.c testupnpreplyparse.c minissdpc.c \
- upnperrors.c testigddescparse.c testminiwget.c \
- connecthostport.c portlistingparse.c receivedata.c \
- upnpdev.c testportlistingparse.c miniupnpcmodule.c \
- minihttptestserver.c \
- listdevices.c
-
-LIBOBJS = miniwget.o minixml.o igd_desc_parse.o minisoap.o \
- miniupnpc.o upnpreplyparse.o upnpcommands.o upnperrors.o \
- connecthostport.o portlistingparse.o receivedata.o upnpdev.o
-
-ifneq ($(OS), AmigaOS)
-ifeq (,$(findstring CYGWIN,$(OS)))
-CFLAGS := -fPIC $(CFLAGS)
-endif
-LIBOBJS := $(LIBOBJS) minissdpc.o
-endif
-
-OBJS = $(patsubst %.c,%.o,$(SRCS))
-
-# HEADERS to install
-HEADERS = miniupnpc.h miniwget.h upnpcommands.h igd_desc_parse.h \
- upnpreplyparse.h upnperrors.h miniupnpctypes.h \
- portlistingparse.h \
- upnpdev.h \
- miniupnpc_declspec.h
-
-# library names
-LIBRARY = libminiupnpc.a
-ifeq ($(OS), Darwin)
- SHAREDLIBRARY = libminiupnpc.dylib
- SONAME = $(basename $(SHAREDLIBRARY)).$(APIVERSION).dylib
- CFLAGS := -D_DARWIN_C_SOURCE $(CFLAGS)
-else
-ifeq ($(JARSUFFIX), win32)
- SHAREDLIBRARY = miniupnpc.dll
-else
- # Linux/BSD/etc.
- SHAREDLIBRARY = libminiupnpc.so
- SONAME = $(SHAREDLIBRARY).$(APIVERSION)
-endif
-endif
-
-EXECUTABLES = upnpc-static listdevices
-EXECUTABLES_ADDTESTS = testminixml minixmlvalid testupnpreplyparse \
- testigddescparse testminiwget testportlistingparse
-
-TESTMINIXMLOBJS = minixml.o igd_desc_parse.o testminixml.o
-
-TESTMINIWGETOBJS = miniwget.o testminiwget.o connecthostport.o receivedata.o
-
-TESTUPNPREPLYPARSE = testupnpreplyparse.o minixml.o upnpreplyparse.o
-
-TESTPORTLISTINGPARSE = testportlistingparse.o minixml.o portlistingparse.o
-
-TESTIGDDESCPARSE = testigddescparse.o igd_desc_parse.o minixml.o \
- miniupnpc.o miniwget.o upnpcommands.o upnpreplyparse.o \
- minisoap.o connecthostport.o receivedata.o \
- portlistingparse.o
-
-ifneq ($(OS), AmigaOS)
-EXECUTABLES := $(EXECUTABLES) upnpc-shared
-TESTMINIWGETOBJS := $(TESTMINIWGETOBJS) minissdpc.o
-TESTIGDDESCPARSE := $(TESTIGDDESCPARSE) minissdpc.o
-endif
-
-LIBDIR ?= lib
-# install directories
-ifeq ($(strip $(PREFIX)),)
-INSTALLPREFIX ?= /usr
-else
-INSTALLPREFIX ?= $(PREFIX)
-endif
-INSTALLDIRINC = $(INSTALLPREFIX)/include/miniupnpc
-INSTALLDIRLIB = $(INSTALLPREFIX)/$(LIBDIR)
-INSTALLDIRBIN = $(INSTALLPREFIX)/bin
-INSTALLDIRMAN = $(INSTALLPREFIX)/share/man
-
-FILESTOINSTALL = $(LIBRARY) $(EXECUTABLES)
-ifneq ($(OS), AmigaOS)
-FILESTOINSTALL := $(FILESTOINSTALL) $(SHAREDLIBRARY)
-endif
-
-
-.PHONY: install clean depend all check test everything \
- installpythonmodule updateversion
-# validateminixml validateminiwget
-
-all: $(LIBRARY) $(EXECUTABLES)
-
-test: check
-
-check: validateminixml validateminiwget validateupnpreplyparse \
- validateportlistingparse validateigddescparse
-
-everything: all $(EXECUTABLES_ADDTESTS)
-
-pythonmodule: $(LIBRARY) miniupnpcmodule.c setup.py
- MAKE=$(MAKE) python setup.py build
- touch $@
-
-installpythonmodule: pythonmodule
- MAKE=$(MAKE) python setup.py install
-
-pythonmodule3: $(LIBRARY) miniupnpcmodule.c setup.py
- MAKE=$(MAKE) python3 setup.py build
- touch $@
-
-installpythonmodule3: pythonmodule3
- MAKE=$(MAKE) python3 setup.py install
-
-validateminixml: minixmlvalid
- @echo "minixml validation test"
- ./minixmlvalid
- touch $@
-
-validateminiwget: testminiwget minihttptestserver testminiwget.sh
- @echo "miniwget validation test"
- ./testminiwget.sh
- touch $@
-
-validateupnpreplyparse: testupnpreplyparse testupnpreplyparse.sh
- @echo "upnpreplyparse validation test"
- ./testupnpreplyparse.sh
- touch $@
-
-validateportlistingparse: testportlistingparse
- @echo "portlistingparse validation test"
- ./testportlistingparse
- touch $@
-
-validateigddescparse: testigddescparse
- @echo "igd desc parse validation test"
- ./testigddescparse testdesc/new_LiveBox_desc.xml testdesc/new_LiveBox_desc.values
- ./testigddescparse testdesc/linksys_WAG200G_desc.xml testdesc/linksys_WAG200G_desc.values
- touch $@
-
-clean:
- $(RM) $(LIBRARY) $(SHAREDLIBRARY) $(EXECUTABLES) $(OBJS) miniupnpcstrings.h
- $(RM) $(EXECUTABLES_ADDTESTS)
- # clean python stuff
- $(RM) pythonmodule pythonmodule3
- $(RM) validateminixml validateminiwget validateupnpreplyparse
- $(RM) validateigddescparse
- $(RM) minihttptestserver
- $(RM) -r build/ dist/
- #python setup.py clean
- # clean jnaerator stuff
- $(RM) _jnaerator.* java/miniupnpc_$(OS).jar
-
-distclean: clean
- $(RM) $(JNAERATOR) java/*.jar java/*.class out.errors.txt
-
-updateversion: miniupnpc.h
- cp miniupnpc.h miniupnpc.h.bak
- sed 's/\(.*MINIUPNPC_API_VERSION\s\+\)[0-9]\+/\1$(APIVERSION)/' < miniupnpc.h.bak > miniupnpc.h
-
-install: updateversion $(FILESTOINSTALL)
- $(INSTALL) -d $(DESTDIR)$(INSTALLDIRINC)
- $(INSTALL) -m 644 $(HEADERS) $(DESTDIR)$(INSTALLDIRINC)
- $(INSTALL) -d $(DESTDIR)$(INSTALLDIRLIB)
- $(INSTALL) -m 644 $(LIBRARY) $(DESTDIR)$(INSTALLDIRLIB)
-ifneq ($(OS), AmigaOS)
- $(INSTALL) -m 644 $(SHAREDLIBRARY) $(DESTDIR)$(INSTALLDIRLIB)/$(SONAME)
- ln -fs $(SONAME) $(DESTDIR)$(INSTALLDIRLIB)/$(SHAREDLIBRARY)
-endif
- $(INSTALL) -d $(DESTDIR)$(INSTALLDIRBIN)
-ifeq ($(OS), AmigaOS)
- $(INSTALL) -m 755 upnpc-static $(DESTDIR)$(INSTALLDIRBIN)/upnpc
-else
- $(INSTALL) -m 755 upnpc-shared $(DESTDIR)$(INSTALLDIRBIN)/upnpc
-endif
- $(INSTALL) -m 755 external-ip.sh $(DESTDIR)$(INSTALLDIRBIN)/external-ip
-ifneq ($(OS), AmigaOS)
- $(INSTALL) -d $(DESTDIR)$(INSTALLDIRMAN)/man3
- $(INSTALL) -m 644 man3/miniupnpc.3 $(DESTDIR)$(INSTALLDIRMAN)/man3/miniupnpc.3
-ifeq ($(OS), Linux)
- gzip -f $(DESTDIR)$(INSTALLDIRMAN)/man3/miniupnpc.3
-endif
-endif
-
-install-static: updateversion $(FILESTOINSTALL)
- $(INSTALL) -d $(DESTDIR)$(INSTALLDIRINC)
- $(INSTALL) -m 644 $(HEADERS) $(DESTDIR)$(INSTALLDIRINC)
- $(INSTALL) -d $(DESTDIR)$(INSTALLDIRLIB)
- $(INSTALL) -m 644 $(LIBRARY) $(DESTDIR)$(INSTALLDIRLIB)
- $(INSTALL) -d $(DESTDIR)$(INSTALLDIRBIN)
- $(INSTALL) -m 755 external-ip.sh $(DESTDIR)$(INSTALLDIRBIN)/external-ip
-
-cleaninstall:
- $(RM) -r $(DESTDIR)$(INSTALLDIRINC)
- $(RM) $(DESTDIR)$(INSTALLDIRLIB)/$(LIBRARY)
- $(RM) $(DESTDIR)$(INSTALLDIRLIB)/$(SHAREDLIBRARY)
-
-depend:
- makedepend -Y -- $(CFLAGS) -- $(SRCS) 2>/dev/null
-
-$(LIBRARY): $(LIBOBJS)
-ifeq ($(OS), Darwin)
- $(LIBTOOL) -static -o $@ $?
-else
- $(AR) crs $@ $?
-endif
-
-$(SHAREDLIBRARY): $(LIBOBJS)
-ifeq ($(OS), Darwin)
-# $(CC) -dynamiclib $(LDFLAGS) -Wl,-install_name,$(SONAME) -o $@ $^
- $(CC) -dynamiclib $(LDFLAGS) -Wl,-install_name,$(INSTALLDIRLIB)/$(SONAME) -o $@ $^
-else
- $(CC) -shared $(LDFLAGS) -Wl,-soname,$(SONAME) -o $@ $^
-endif
-
-upnpc-static: upnpc.o $(LIBRARY)
- $(CC) $(LDFLAGS) -o $@ $^ $(LOADLIBES) $(LDLIBS)
-
-upnpc-shared: upnpc.o $(SHAREDLIBRARY)
- $(CC) $(LDFLAGS) -o $@ $^ $(LOADLIBES) $(LDLIBS)
-
-listdevices: listdevices.o $(LIBRARY)
-
-testminixml: $(TESTMINIXMLOBJS)
-
-testminiwget: $(TESTMINIWGETOBJS)
-
-minixmlvalid: minixml.o minixmlvalid.o
-
-testupnpreplyparse: $(TESTUPNPREPLYPARSE)
-
-testigddescparse: $(TESTIGDDESCPARSE)
-
-testportlistingparse: $(TESTPORTLISTINGPARSE)
-
-miniupnpcstrings.h: miniupnpcstrings.h.in updateminiupnpcstrings.sh VERSION
- $(SH) updateminiupnpcstrings.sh
-
-# ftp tool supplied with OpenBSD can download files from http.
-jnaerator-%.jar:
- wget $(JNAERATORBASEURL)/$@ || \
- curl -o $@ $(JNAERATORBASEURL)/$@ || \
- ftp $(JNAERATORBASEURL)/$@
-
-jar: $(SHAREDLIBRARY) $(JNAERATOR)
- $(JAVA) -jar $(JNAERATOR) $(JNAERATORARGS) \
- miniupnpc.h miniupnpc_declspec.h upnpcommands.h upnpreplyparse.h \
- igd_desc_parse.h miniwget.h upnperrors.h $(SHAREDLIBRARY) \
- -package fr.free.miniupnp -o . -jar java/miniupnpc_$(JARSUFFIX).jar -v
-
-mvn_install:
- mvn install:install-file -Dfile=java/miniupnpc_$(JARSUFFIX).jar \
- -DgroupId=com.github \
- -DartifactId=miniupnp \
- -Dversion=$(VERSION) \
- -Dpackaging=jar \
- -Dclassifier=$(JARSUFFIX) \
- -DgeneratePom=true \
- -DcreateChecksum=true
-
-# make .deb packages
-deb: /usr/share/pyshared/stdeb all
- (python setup.py --command-packages=stdeb.command bdist_deb)
-
-# install .deb packages
-ideb:
- (sudo dpkg -i deb_dist/*.deb)
-
-/usr/share/pyshared/stdeb: /usr/share/doc/python-all-dev
- (sudo apt-get install python-stdeb)
-
-/usr/share/doc/python-all-dev:
- (sudo apt-get install python-all-dev)
-
-minihttptestserver: minihttptestserver.o
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
-
-igd_desc_parse.o: igd_desc_parse.h
-miniupnpc.o: miniupnpc.h miniupnpc_declspec.h igd_desc_parse.h upnpdev.h
-miniupnpc.o: minissdpc.h miniwget.h minisoap.h minixml.h upnpcommands.h
-miniupnpc.o: upnpreplyparse.h portlistingparse.h miniupnpctypes.h
-miniupnpc.o: connecthostport.h
-minixml.o: minixml.h
-minisoap.o: minisoap.h miniupnpcstrings.h
-miniwget.o: miniupnpcstrings.h miniwget.h miniupnpc_declspec.h
-miniwget.o: connecthostport.h receivedata.h
-upnpc.o: miniwget.h miniupnpc_declspec.h miniupnpc.h igd_desc_parse.h
-upnpc.o: upnpdev.h upnpcommands.h upnpreplyparse.h portlistingparse.h
-upnpc.o: miniupnpctypes.h upnperrors.h miniupnpcstrings.h
-upnpcommands.o: upnpcommands.h upnpreplyparse.h portlistingparse.h
-upnpcommands.o: miniupnpc_declspec.h miniupnpctypes.h miniupnpc.h
-upnpcommands.o: igd_desc_parse.h upnpdev.h
-upnpreplyparse.o: upnpreplyparse.h minixml.h
-testminixml.o: minixml.h igd_desc_parse.h
-minixmlvalid.o: minixml.h
-testupnpreplyparse.o: upnpreplyparse.h
-minissdpc.o: minissdpc.h miniupnpc_declspec.h upnpdev.h miniupnpc.h
-minissdpc.o: igd_desc_parse.h receivedata.h codelength.h
-upnperrors.o: upnperrors.h miniupnpc_declspec.h upnpcommands.h
-upnperrors.o: upnpreplyparse.h portlistingparse.h miniupnpctypes.h
-upnperrors.o: miniupnpc.h igd_desc_parse.h upnpdev.h
-testigddescparse.o: igd_desc_parse.h minixml.h miniupnpc.h
-testigddescparse.o: miniupnpc_declspec.h upnpdev.h
-testminiwget.o: miniwget.h miniupnpc_declspec.h
-connecthostport.o: connecthostport.h
-portlistingparse.o: portlistingparse.h miniupnpc_declspec.h miniupnpctypes.h
-portlistingparse.o: minixml.h
-receivedata.o: receivedata.h
-upnpdev.o: upnpdev.h miniupnpc_declspec.h
-testportlistingparse.o: portlistingparse.h miniupnpc_declspec.h
-testportlistingparse.o: miniupnpctypes.h
-miniupnpcmodule.o: miniupnpc.h miniupnpc_declspec.h igd_desc_parse.h
-miniupnpcmodule.o: upnpdev.h upnpcommands.h upnpreplyparse.h
-miniupnpcmodule.o: portlistingparse.h miniupnpctypes.h upnperrors.h
-listdevices.o: miniupnpc.h miniupnpc_declspec.h igd_desc_parse.h upnpdev.h
diff --git a/external/miniupnpc/Makefile.mingw b/external/miniupnpc/Makefile.mingw
deleted file mode 100644
index 1b0d44aab..000000000
--- a/external/miniupnpc/Makefile.mingw
+++ /dev/null
@@ -1,102 +0,0 @@
-# $Id: Makefile.mingw,v 1.21 2015/09/18 12:45:16 nanard Exp $
-# Miniupnp project.
-# http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
-# (c) 2005-2015 Thomas Bernard
-# This Makefile is made for MinGW
-#
-CC ?= gcc
-#CFLAGS = -Wall -g -DDEBUG -D_WIN32_WINNT=0X501
-CFLAGS = -Wall -Os -DNDEBUG -D_WIN32_WINNT=0X501
-LDLIBS = -lws2_32 -liphlpapi
-# -lwsock32
-# -liphlpapi is needed for GetBestRoute() and GetIpAddrTable()
-PYTHON=\utils\python25\python
-OBJS=miniwget.o minixml.o igd_desc_parse.o minisoap.o \
- minissdpc.o \
- miniupnpc.o upnpreplyparse.o upnpcommands.o upnperrors.o \
- connecthostport.o portlistingparse.o receivedata.o \
- upnpdev.o
-OBJSDLL=$(addprefix dll/, $(OBJS))
-
-all: init upnpc-static upnpc-shared testminixml libminiupnpc.a \
- miniupnpc.dll listdevices
-
-init:
- mkdir dll
- echo init > init
-
-clean:
- del upnpc testminixml *.o
- del dll\*.o
- del *.exe
- del miniupnpc.dll
- del libminiupnpc.a
-
-libminiupnpc.a: $(OBJS)
- $(AR) cr $@ $?
-
-pythonmodule: libminiupnpc.a
- $(PYTHON) setupmingw32.py build --compiler=mingw32
- $(PYTHON) setupmingw32.py install --skip-build
-
-miniupnpc.dll: libminiupnpc.a $(OBJSDLL)
- dllwrap -k --driver-name gcc \
- --def miniupnpc.def \
- --output-def miniupnpc.dll.def \
- --implib miniupnpc.lib -o $@ \
- $(OBJSDLL) $(LDLIBS)
-
-miniupnpc.lib: miniupnpc.dll
-# echo $@ generated with $<
-
-dll/upnpc.o: upnpc.o
-# echo $@ generated with $<
-
-.c.o:
- $(CC) $(CFLAGS) -DMINIUPNP_STATICLIB -c -o $@ $<
- $(CC) $(CFLAGS) -DMINIUPNP_EXPORTS -c -o dll/$@ $<
-
-upnpc.o: upnpc.c
- $(CC) $(CFLAGS) -DMINIUPNP_STATICLIB -c -o $@ $<
- $(CC) $(CFLAGS) -c -o dll/$@ $<
-
-# --enable-stdcall-fixup
-upnpc-static: upnpc.o libminiupnpc.a
- $(CC) -o $@ $^ $(LDLIBS)
-
-upnpc-shared: dll/upnpc.o miniupnpc.lib
- $(CC) -o $@ $^ $(LDLIBS)
-
-listdevices: listdevices.o libminiupnpc.a
- $(CC) -o $@ $^ $(LDLIBS)
-
-wingenminiupnpcstrings: wingenminiupnpcstrings.o
-
-wingenminiupnpcstrings.o: wingenminiupnpcstrings.c
-
-miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings
- wingenminiupnpcstrings $< $@
-
-minixml.o: minixml.c minixml.h
-
-upnpc.o: miniwget.h minisoap.h miniupnpc.h igd_desc_parse.h
-upnpc.o: upnpreplyparse.h upnpcommands.h upnperrors.h miniupnpcstrings.h
-
-miniwget.o: miniwget.c miniwget.h miniupnpcstrings.h connecthostport.h
-
-minisoap.o: minisoap.c minisoap.h miniupnpcstrings.h
-
-miniupnpc.o: miniupnpc.c miniupnpc.h minisoap.h miniwget.h minixml.h
-
-igd_desc_parse.o: igd_desc_parse.c igd_desc_parse.h
-
-testminixml: minixml.o igd_desc_parse.o testminixml.c
-
-upnpreplyparse.o: upnpreplyparse.c upnpreplyparse.h minixml.h
-
-upnpcommands.o: upnpcommands.c upnpcommands.h upnpreplyparse.h miniupnpc.h portlistingparse.h
-
-minissdpc.o: minissdpc.c minissdpc.h receivedata.h
-
-upnpdev.o: upnpdev.c upnpdev.h
-
diff --git a/external/miniupnpc/README b/external/miniupnpc/README
deleted file mode 100644
index 0d3b8054c..000000000
--- a/external/miniupnpc/README
+++ /dev/null
@@ -1,63 +0,0 @@
-Project: miniupnp
-Project web page: http://miniupnp.free.fr/ or https://miniupnp.tuxfamily.org/
-github: https://github.com/miniupnp/miniupnp
-Author: Thomas Bernard
-Copyright (c) 2005-2017 Thomas Bernard
-This software is subject to the conditions detailed in the
-LICENSE file provided within this distribution.
-
-
-* 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()
-- UPNP_GetValidIGD()
-- 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 :
-https://miniupnp.tuxfamily.org/forum/
-
-Bugs should be reported on github :
-https://github.com/miniupnp/miniupnp/issues
diff --git a/external/miniupnpc/VERSION b/external/miniupnpc/VERSION
deleted file mode 100644
index cd5ac039d..000000000
--- a/external/miniupnpc/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-2.0
diff --git a/external/miniupnpc/apiversions.txt b/external/miniupnpc/apiversions.txt
deleted file mode 100644
index 9464a8675..000000000
--- a/external/miniupnpc/apiversions.txt
+++ /dev/null
@@ -1,172 +0,0 @@
-$Id: apiversions.txt,v 1.9 2016/01/24 17:24:36 nanard Exp $
-
-Differences in API between miniUPnPc versions
-
-API version 16
- added "status_code" argument to getHTTPResponse(), miniwget() and miniwget_getaddr()
- updated macro :
- #define MINIUPNPC_API_VERSION 16
-
-API version 15
- changed "sameport" argument of upnpDiscover() upnpDiscoverAll() upnpDiscoverDevice()
- to "localport". When 0 or 1, behaviour is not changed, but it can take
- any other value between 2 and 65535
- Existing programs should be compatible
- updated macro :
- #define MINIUPNPC_API_VERSION 15
-
-API version 14
-miniupnpc.h
- add ttl argument to upnpDiscover() upnpDiscoverAll() upnpDiscoverDevice()
- upnpDiscoverDevices()
- getDevicesFromMiniSSDPD() :
- connectToMiniSSDPD() / disconnectFromMiniSSDPD()
- requestDevicesFromMiniSSDPD() / receiveDevicesFromMiniSSDPD()
- updated macro :
- #define MINIUPNPC_API_VERSION 14
-
-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);
-
diff --git a/external/miniupnpc/codelength.h b/external/miniupnpc/codelength.h
deleted file mode 100644
index ea0b005ff..000000000
--- a/external/miniupnpc/codelength.h
+++ /dev/null
@@ -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 */
diff --git a/external/miniupnpc/connecthostport.c b/external/miniupnpc/connecthostport.c
deleted file mode 100644
index d28aaf5e0..000000000
--- a/external/miniupnpc/connecthostport.c
+++ /dev/null
@@ -1,262 +0,0 @@
-/* $Id: connecthostport.c,v 1.15 2015/10/09 16:26:19 nanard Exp $ */
-/* Project : miniupnp
- * Author : Thomas Bernard
- * Copyright (c) 2010-2017 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/types.h>
-#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
-#include <sys/time.h>
-#endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */
-#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
-#include <sys/socket.h>
-#include <sys/select.h>
-#endif /* #else _WIN32 */
-
-/* definition of PRINT_SOCKET_ERROR */
-#ifdef _WIN32
-#define PRINT_SOCKET_ERROR(x) fprintf(stderr, "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 SO_RCVTIMEO");
- }
- timeout.tv_sec = 3;
- timeout.tv_usec = 0;
- if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)) < 0)
- {
- PRINT_SOCKET_ERROR("setsockopt SO_SNDTIMEO");
- }
-#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;
-}
-
diff --git a/external/miniupnpc/connecthostport.h b/external/miniupnpc/connecthostport.h
deleted file mode 100644
index f3b2d2a84..000000000
--- a/external/miniupnpc/connecthostport.h
+++ /dev/null
@@ -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
-
diff --git a/external/miniupnpc/external-ip.sh b/external/miniupnpc/external-ip.sh
deleted file mode 100755
index 965d86b2a..000000000
--- a/external/miniupnpc/external-ip.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-# $Id: external-ip.sh,v 1.1 2010/08/05 12:57:41 nanard Exp $
-# (c) 2010 Reuben Hawkins
-upnpc -s | grep ExternalIPAddress | sed 's/[^0-9\.]//g'
diff --git a/external/miniupnpc/igd_desc_parse.c b/external/miniupnpc/igd_desc_parse.c
deleted file mode 100644
index d2999ad01..000000000
--- a/external/miniupnpc/igd_desc_parse.c
+++ /dev/null
@@ -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 */
-
diff --git a/external/miniupnpc/igd_desc_parse.h b/external/miniupnpc/igd_desc_parse.h
deleted file mode 100644
index 0de546b69..000000000
--- a/external/miniupnpc/igd_desc_parse.h
+++ /dev/null
@@ -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 */
diff --git a/external/miniupnpc/java/.gitignore b/external/miniupnpc/java/.gitignore
deleted file mode 100644
index 8e9e79486..000000000
--- a/external/miniupnpc/java/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.class
-*.jar
diff --git a/external/miniupnpc/java/JavaBridgeTest.java b/external/miniupnpc/java/JavaBridgeTest.java
deleted file mode 100644
index c658c5990..000000000
--- a/external/miniupnpc/java/JavaBridgeTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-import java.nio.ByteBuffer;
-import java.nio.IntBuffer;
-
-import fr.free.miniupnp.*;
-
-/**
- *
- * @author syuu
- */
-public class JavaBridgeTest {
- public static void main(String[] args) {
- int UPNP_DELAY = 2000;
- MiniupnpcLibrary miniupnpc = MiniupnpcLibrary.INSTANCE;
- UPNPDev devlist = null;
- UPNPUrls urls = new UPNPUrls();
- IGDdatas data = new IGDdatas();
- ByteBuffer lanaddr = ByteBuffer.allocate(16);
- ByteBuffer intClient = ByteBuffer.allocate(16);
- ByteBuffer intPort = ByteBuffer.allocate(6);
- ByteBuffer desc = ByteBuffer.allocate(80);
- ByteBuffer enabled = ByteBuffer.allocate(4);
- ByteBuffer leaseDuration = ByteBuffer.allocate(16);
- int ret;
- int i;
-
- if(args.length < 2) {
- System.err.println("Usage : java [...] JavaBridgeTest port protocol");
- System.out.println(" port is numeric, protocol is TCP or UDP");
- return;
- }
-
- devlist = miniupnpc.upnpDiscover(UPNP_DELAY, (String) null, (String) null, 0, 0, (byte)2, IntBuffer.allocate(1));
- if (devlist != null) {
- System.out.println("List of UPNP devices found on the network :");
- for (UPNPDev device = devlist; device != null; device = device.pNext) {
- System.out.println("desc: " + device.descURL.getString(0) + " st: " + device.st.getString(0));
- }
- if ((i = miniupnpc.UPNP_GetValidIGD(devlist, urls, data, lanaddr, 16)) != 0) {
- switch (i) {
- case 1:
- System.out.println("Found valid IGD : " + urls.controlURL.getString(0));
- break;
- case 2:
- System.out.println("Found a (not connected?) IGD : " + urls.controlURL.getString(0));
- System.out.println("Trying to continue anyway");
- break;
- case 3:
- System.out.println("UPnP device found. Is it an IGD ? : " + urls.controlURL.getString(0));
- System.out.println("Trying to continue anyway");
- break;
- default:
- System.out.println("Found device (igd ?) : " + urls.controlURL.getString(0));
- System.out.println("Trying to continue anyway");
-
- }
- System.out.println("Local LAN ip address : " + new String(lanaddr.array()));
- ByteBuffer externalAddress = ByteBuffer.allocate(16);
- miniupnpc.UPNP_GetExternalIPAddress(urls.controlURL.getString(0),
- new String(data.first.servicetype), externalAddress);
- System.out.println("ExternalIPAddress = " + new String(externalAddress.array()));
- ret = miniupnpc.UPNP_AddPortMapping(
- urls.controlURL.getString(0), // controlURL
- new String(data.first.servicetype), // servicetype
- args[0], // external Port
- args[0], // internal Port
- new String(lanaddr.array()), // internal client
- "added via miniupnpc/JAVA !", // description
- args[1], // protocol UDP or TCP
- null, // remote host (useless)
- "0"); // leaseDuration
- if (ret != MiniupnpcLibrary.UPNPCOMMAND_SUCCESS)
- System.out.println("AddPortMapping() failed with code " + ret);
- ret = miniupnpc.UPNP_GetSpecificPortMappingEntry(
- urls.controlURL.getString(0), new String(data.first.servicetype),
- args[0], args[1], null, intClient, intPort,
- desc, enabled, leaseDuration);
- if (ret != MiniupnpcLibrary.UPNPCOMMAND_SUCCESS)
- System.out.println("GetSpecificPortMappingEntry() failed with code " + ret);
- System.out.println("InternalIP:Port = " +
- new String(intClient.array()) + ":" + new String(intPort.array()) +
- " (" + new String(desc.array()) + ")");
- ret = miniupnpc.UPNP_DeletePortMapping(
- urls.controlURL.getString(0),
- new String(data.first.servicetype),
- args[0], args[1], null);
- if (ret != MiniupnpcLibrary.UPNPCOMMAND_SUCCESS)
- System.out.println("DelPortMapping() failed with code " + ret);
- miniupnpc.FreeUPNPUrls(urls);
- } else {
- System.out.println("No valid UPNP Internet Gateway Device found.");
- }
- miniupnpc.freeUPNPDevlist(devlist);
- } else {
- System.out.println("No IGD UPnP Device found on the network !\n");
- }
- }
-}
diff --git a/external/miniupnpc/java/testjava.bat b/external/miniupnpc/java/testjava.bat
deleted file mode 100755
index b836da149..000000000
--- a/external/miniupnpc/java/testjava.bat
+++ /dev/null
@@ -1,8 +0,0 @@
-@echo off
-set JAVA=java
-set JAVAC=javac
-REM notice the semicolon for Windows. Write once, run ... oh nevermind
-set CP=miniupnpc_win32.jar;.
-
-%JAVAC% -cp "%CP%" JavaBridgeTest.java || exit 1
-%JAVA% -cp "%CP%" JavaBridgeTest 12345 UDP || exit 1
diff --git a/external/miniupnpc/java/testjava.sh b/external/miniupnpc/java/testjava.sh
deleted file mode 100755
index 9880523a1..000000000
--- a/external/miniupnpc/java/testjava.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-
-JAVA=java
-JAVAC=javac
-CP=$(for i in *.jar; do echo -n $i:; done).
-
-$JAVAC -cp $CP JavaBridgeTest.java || exit 1
-$JAVA -cp $CP JavaBridgeTest 12345 UDP || exit 1
diff --git a/external/miniupnpc/listdevices.c b/external/miniupnpc/listdevices.c
deleted file mode 100644
index a72fb8b9f..000000000
--- a/external/miniupnpc/listdevices.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/* $Id: listdevices.c,v 1.6 2015/07/23 20:40:08 nanard Exp $ */
-/* Project : miniupnp
- * Author : Thomas Bernard
- * Copyright (c) 2013-2015 Thomas Bernard
- * This software is subject to the conditions detailed in the
- * LICENCE file provided in this distribution. */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#ifdef _WIN32
-#include <winsock2.h>
-#endif /* _WIN32 */
-#include "miniupnpc.h"
-
-int main(int argc, char * * argv)
-{
- const char * searched_device = NULL;
- const char * * searched_devices = NULL;
- const char * multicastif = 0;
- const char * minissdpdpath = 0;
- int ipv6 = 0;
- unsigned char ttl = 2;
- int error = 0;
- struct UPNPDev * devlist = 0;
- struct UPNPDev * dev;
- int i;
-
-#ifdef _WIN32
- WSADATA wsaData;
- int nResult = WSAStartup(MAKEWORD(2,2), &wsaData);
- if(nResult != NO_ERROR)
- {
- fprintf(stderr, "WSAStartup() failed.\n");
- return -1;
- }
-#endif
-
- for(i = 1; i < argc; i++) {
- if(strcmp(argv[i], "-6") == 0)
- ipv6 = 1;
- else if(strcmp(argv[i], "-d") == 0) {
- if(++i >= argc) {
- fprintf(stderr, "%s option needs one argument\n", "-d");
- return 1;
- }
- searched_device = argv[i];
- } else if(strcmp(argv[i], "-t") == 0) {
- if(++i >= argc) {
- fprintf(stderr, "%s option needs one argument\n", "-t");
- return 1;
- }
- ttl = (unsigned char)atoi(argv[i]);
- } else if(strcmp(argv[i], "-l") == 0) {
- if(++i >= argc) {
- fprintf(stderr, "-l option needs at least one argument\n");
- return 1;
- }
- searched_devices = (const char * *)(argv + i);
- break;
- } else if(strcmp(argv[i], "-m") == 0) {
- if(++i >= argc) {
- fprintf(stderr, "-m option needs one argument\n");
- return 1;
- }
- multicastif = argv[i];
- } else {
- printf("usage : %s [options] [-l <device1> <device2> ...]\n", argv[0]);
- printf("options :\n");
- printf(" -6 : use IPv6\n");
- printf(" -m address/ifname : network interface to use for multicast\n");
- printf(" -d <device string> : search only for this type of device\n");
- printf(" -l <device1> <device2> ... : search only for theses types of device\n");
- printf(" -t ttl : set multicast TTL. Default value is 2.\n");
- printf(" -h : this help\n");
- return 1;
- }
- }
-
- if(searched_device) {
- printf("searching UPnP device type %s\n", searched_device);
- devlist = upnpDiscoverDevice(searched_device,
- 2000, multicastif, minissdpdpath,
- 0/*localport*/, ipv6, ttl, &error);
- } else if(searched_devices) {
- printf("searching UPnP device types :\n");
- for(i = 0; searched_devices[i]; i++)
- printf("\t%s\n", searched_devices[i]);
- devlist = upnpDiscoverDevices(searched_devices,
- 2000, multicastif, minissdpdpath,
- 0/*localport*/, ipv6, ttl, &error, 1);
- } else {
- printf("searching all UPnP devices\n");
- devlist = upnpDiscoverAll(2000, multicastif, minissdpdpath,
- 0/*localport*/, ipv6, ttl, &error);
- }
- if(devlist) {
- for(dev = devlist, i = 1; dev != NULL; dev = dev->pNext, i++) {
- printf("%3d: %-48s\n", i, dev->st);
- printf(" %s\n", dev->descURL);
- printf(" %s\n", dev->usn);
- }
- freeUPNPDevlist(devlist);
- } else {
- printf("no device found.\n");
- }
-
- return 0;
-}
-
diff --git a/external/miniupnpc/man3/miniupnpc.3 b/external/miniupnpc/man3/miniupnpc.3
deleted file mode 100644
index 7b997d475..000000000
--- a/external/miniupnpc/man3/miniupnpc.3
+++ /dev/null
@@ -1,55 +0,0 @@
-.TH MINIUPNPC 3
-.SH NAME
-miniupnpc \- UPnP client library
-.SH SYNOPSIS
-.SH DESCRIPTION
-The miniupnpc library implement the UPnP protocol defined
-to dialog with Internet Gateway Devices. It also has
-the ability to use data gathered by minissdpd(1) about
-UPnP devices up on the network in order to skip the
-long UPnP device discovery process.
-.PP
-At first, upnpDiscover(3) has to be used to discover UPnP IGD present
-on the network. Then UPNP_GetValidIGD(3) to select the right one.
-Alternatively, UPNP_GetIGDFromUrl(3) could be used to bypass discovery
-process if the root description url of the device to use is known.
-Then all the UPNP_* functions can be used, such as
-UPNP_GetConnectionTypeInfo(3), UPNP_AddPortMapping(3), etc...
-.SH "HEADER FILES"
-.IP miniupnpc.h
-That's the main header file for the miniupnpc library API.
-It contains all the functions and structures related to device discovery.
-.IP upnpcommands.h
-This header file contain the UPnP IGD methods that are accessible
-through the miniupnpc API. The name of the C functions are matching
-the UPnP methods names. ie: GetGenericPortMappingEntry is
-UPNP_GetGenericPortMappingEntry.
-.SH "API FUNCTIONS"
-.IP "struct UPNPDev * upnpDiscover(int delay, const char * multicastif, const char * minissdpdsock, int localport, int ipv6, int * error);"
-execute the discovery process.
-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 localport is set to UPNP_LOCAL_PORT_SAME(1) SSDP packets will be sent
-from the source port 1900 (same as destination port), if set to
-UPNP_LOCAL_PORT_ANY(0) system assign a source port, any other value will
-be attempted as the source port.
-If ipv6 is not 0, IPv6 is used instead of IPv4 for the discovery process.
-.IP "void freeUPNPDevlist(struct UPNPDev * devlist);"
-free the list returned by upnpDiscover().
-.IP "int UPNP_GetValidIGD(struct UPNPDev * devlist, struct UPNPUrls * urls, struct IGDdatas * data, char * lanaddr, int lanaddrlen);"
-browse the list of device returned by upnpDiscover(), find
-a live UPnP internet gateway device and fill structures passed as arguments
-with data used for UPNP methods invokation.
-.IP "int UPNP_GetIGDFromUrl(const char * rootdescurl, struct UPNPUrls * urls, struct IGDdatas * data, char * lanaddr, int lanaddrlen);"
-permit to bypass the upnpDiscover() call if the xml root description
-URL of the UPnP IGD is known.
-Fill structures passed as arguments
-with data used for UPNP methods invokation.
-.IP "void GetUPNPUrls(struct UPNPUrls *, struct IGDdatas *, const char *);"
-.IP "void FreeUPNPUrls(struct UPNPUrls *);"
-
-.SH "SEE ALSO"
-minissdpd(1)
-.SH BUGS
diff --git a/external/miniupnpc/mingw32make.bat b/external/miniupnpc/mingw32make.bat
deleted file mode 100644
index c5d3cc4ff..000000000
--- a/external/miniupnpc/mingw32make.bat
+++ /dev/null
@@ -1,8 +0,0 @@
-@mingw32-make -f Makefile.mingw %1
-@if errorlevel 1 goto end
-@if not exist upnpc-static.exe goto end
-@strip upnpc-static.exe
-@upx --best upnpc-static.exe
-@strip upnpc-shared.exe
-@upx --best upnpc-shared.exe
-:end
diff --git a/external/miniupnpc/minihttptestserver.c b/external/miniupnpc/minihttptestserver.c
deleted file mode 100644
index e4cdc203c..000000000
--- a/external/miniupnpc/minihttptestserver.c
+++ /dev/null
@@ -1,659 +0,0 @@
-/* $Id: minihttptestserver.c,v 1.19 2015/11/17 09:07:17 nanard Exp $ */
-/* Project : miniUPnP
- * Author : Thomas Bernard
- * Copyright (c) 2011-2016 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 <unistd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/wait.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <signal.h>
-#include <time.h>
-#include <errno.h>
-
-#ifndef INADDR_LOOPBACK
-#define INADDR_LOOPBACK 0x7f000001
-#endif
-
-#define CRAP_LENGTH (2048)
-
-volatile sig_atomic_t quit = 0;
-volatile sig_atomic_t child_to_wait_for = 0;
-
-/**
- * signal handler for SIGCHLD (child status has changed)
- */
-void handle_signal_chld(int sig)
-{
- (void)sig;
- /* printf("handle_signal_chld(%d)\n", sig); */
- ++child_to_wait_for;
-}
-
-/**
- * signal handler for SIGINT (CRTL C)
- */
-void handle_signal_int(int sig)
-{
- (void)sig;
- /* printf("handle_signal_int(%d)\n", sig); */
- quit = 1;
-}
-
-/**
- * build a text/plain content of the specified length
- */
-void build_content(char * p, int n)
-{
- char line_buffer[80];
- int k;
- int i = 0;
-
- while(n > 0) {
- k = snprintf(line_buffer, sizeof(line_buffer),
- "%04d_ABCDEFGHIJKL_This_line_is_64_bytes_long_ABCDEFGHIJKL_%04d\r\n",
- i, i);
- if(k != 64) {
- fprintf(stderr, "snprintf() returned %d in build_content()\n", k);
- }
- ++i;
- if(n >= 64) {
- memcpy(p, line_buffer, 64);
- p += 64;
- n -= 64;
- } else {
- memcpy(p, line_buffer, n);
- p += n;
- n = 0;
- }
- }
-}
-
-/**
- * build crappy content
- */
-void build_crap(char * p, int n)
-{
- static const char crap[] = "_CRAP_\r\n";
- int i;
-
- while(n > 0) {
- i = sizeof(crap) - 1;
- if(i > n)
- i = n;
- memcpy(p, crap, i);
- p += i;
- n -= i;
- }
-}
-
-/**
- * build chunked response.
- * return a malloc'ed buffer
- */
-char * build_chunked_response(int content_length, int * response_len)
-{
- char * response_buffer;
- char * content_buffer;
- int buffer_length;
- int i, n;
-
- /* allocate to have some margin */
- buffer_length = 256 + content_length + (content_length >> 4);
- response_buffer = malloc(buffer_length);
- if(response_buffer == NULL)
- return NULL;
- *response_len = snprintf(response_buffer, buffer_length,
- "HTTP/1.1 200 OK\r\n"
- "Content-Type: text/plain\r\n"
- "Transfer-Encoding: chunked\r\n"
- "\r\n");
-
- /* build the content */
- content_buffer = malloc(content_length);
- if(content_buffer == NULL) {
- free(response_buffer);
- return NULL;
- }
- build_content(content_buffer, content_length);
-
- /* chunk it */
- i = 0;
- while(i < content_length) {
- n = (rand() % 199) + 1;
- if(i + n > content_length) {
- n = content_length - i;
- }
- /* TODO : check buffer size ! */
- *response_len += snprintf(response_buffer + *response_len,
- buffer_length - *response_len,
- "%x\r\n", n);
- memcpy(response_buffer + *response_len, content_buffer + i, n);
- *response_len += n;
- i += n;
- response_buffer[(*response_len)++] = '\r';
- response_buffer[(*response_len)++] = '\n';
- }
- /* the last chunk : "0\r\n" a empty body and then
- * the final "\r\n" */
- memcpy(response_buffer + *response_len, "0\r\n\r\n", 5);
- *response_len += 5;
- free(content_buffer);
-
- printf("resp_length=%d buffer_length=%d content_length=%d\n",
- *response_len, buffer_length, content_length);
- return response_buffer;
-}
-
-/* favicon.ico generator */
-#ifdef OLD_HEADER
-#define FAVICON_LENGTH (6 + 16 + 12 + 8 + 32 * 4)
-#else
-#define FAVICON_LENGTH (6 + 16 + 40 + 8 + 32 * 4)
-#endif
-void build_favicon_content(char * p, int n)
-{
- int i;
- if(n < FAVICON_LENGTH)
- return;
- /* header : 6 bytes */
- *p++ = 0;
- *p++ = 0;
- *p++ = 1; /* type : ICO */
- *p++ = 0;
- *p++ = 1; /* number of images in file */
- *p++ = 0;
- /* image directory (1 entry) : 16 bytes */
- *p++ = 16; /* width */
- *p++ = 16; /* height */
- *p++ = 2; /* number of colors in the palette. 0 = no palette */
- *p++ = 0; /* reserved */
- *p++ = 1; /* color planes */
- *p++ = 0; /* " */
- *p++ = 1; /* bpp */
- *p++ = 0; /* " */
-#ifdef OLD_HEADER
- *p++ = 12 + 8 + 32 * 4; /* bmp size */
-#else
- *p++ = 40 + 8 + 32 * 4; /* bmp size */
-#endif
- *p++ = 0; /* " */
- *p++ = 0; /* " */
- *p++ = 0; /* " */
- *p++ = 6 + 16; /* bmp offset */
- *p++ = 0; /* " */
- *p++ = 0; /* " */
- *p++ = 0; /* " */
- /* BMP */
-#ifdef OLD_HEADER
- /* BITMAPCOREHEADER */
- *p++ = 12; /* size of this header */
- *p++ = 0; /* " */
- *p++ = 0; /* " */
- *p++ = 0; /* " */
- *p++ = 16; /* width */
- *p++ = 0; /* " */
- *p++ = 16 * 2; /* height x 2 ! */
- *p++ = 0; /* " */
- *p++ = 1; /* color planes */
- *p++ = 0; /* " */
- *p++ = 1; /* bpp */
- *p++ = 0; /* " */
-#else
- /* BITMAPINFOHEADER */
- *p++ = 40; /* size of this header */
- *p++ = 0; /* " */
- *p++ = 0; /* " */
- *p++ = 0; /* " */
- *p++ = 16; /* width */
- *p++ = 0; /* " */
- *p++ = 0; /* " */
- *p++ = 0; /* " */
- *p++ = 16 * 2; /* height x 2 ! */
- *p++ = 0; /* " */
- *p++ = 0; /* " */
- *p++ = 0; /* " */
- *p++ = 1; /* color planes */
- *p++ = 0; /* " */
- *p++ = 1; /* bpp */
- *p++ = 0; /* " */
- /* compression method, image size, ppm x, ppm y */
- /* colors in the palette ? */
- /* important colors */
- for(i = 4 * 6; i > 0; --i)
- *p++ = 0;
-#endif
- /* palette */
- *p++ = 0; /* b */
- *p++ = 0; /* g */
- *p++ = 0; /* r */
- *p++ = 0; /* reserved */
- *p++ = 255; /* b */
- *p++ = 255; /* g */
- *p++ = 255; /* r */
- *p++ = 0; /* reserved */
- /* pixel data */
- for(i = 16; i > 0; --i) {
- if(i & 1) {
- *p++ = 0125;
- *p++ = 0125;
- } else {
- *p++ = 0252;
- *p++ = 0252;
- }
- *p++ = 0;
- *p++ = 0;
- }
- /* Opacity MASK */
- for(i = 16 * 4; i > 0; --i) {
- *p++ = 0;
- }
-}
-
-enum modes {
- MODE_INVALID, MODE_CHUNKED, MODE_ADDCRAP, MODE_NORMAL, MODE_FAVICON
-};
-
-const struct {
- const enum modes mode;
- const char * text;
-} modes_array[] = {
- {MODE_CHUNKED, "chunked"},
- {MODE_ADDCRAP, "addcrap"},
- {MODE_NORMAL, "normal"},
- {MODE_FAVICON, "favicon.ico"},
- {MODE_INVALID, NULL}
-};
-
-/**
- * write the response with random behaviour !
- */
-void send_response(int c, const char * buffer, int len)
-{
- int n;
- while(len > 0) {
- n = (rand() % 99) + 1;
- if(n > len)
- n = len;
- n = write(c, buffer, n);
- if(n < 0) {
- if(errno != EINTR) {
- perror("write");
- return;
- }
- /* if errno == EINTR, try again */
- } else {
- len -= n;
- buffer += n;
- }
- usleep(10000); /* 10ms */
- }
-}
-
-/**
- * handle the HTTP connection
- */
-void handle_http_connection(int c)
-{
- char request_buffer[2048];
- int request_len = 0;
- int headers_found = 0;
- int n, i;
- char request_method[16];
- char request_uri[256];
- char http_version[16];
- char * p;
- char * response_buffer;
- int response_len;
- enum modes mode;
- int content_length = 16*1024;
-
- /* read the request */
- while(request_len < (int)sizeof(request_buffer) && !headers_found) {
- n = read(c,
- request_buffer + request_len,
- sizeof(request_buffer) - request_len);
- if(n < 0) {
- if(errno == EINTR)
- continue;
- perror("read");
- return;
- } else if(n==0) {
- /* remote host closed the connection */
- break;
- } else {
- request_len += n;
- for(i = 0; i < request_len - 3; i++) {
- if(0 == memcmp(request_buffer + i, "\r\n\r\n", 4)) {
- /* found the end of headers */
- headers_found = 1;
- break;
- }
- }
- }
- }
- if(!headers_found) {
- /* error */
- printf("no HTTP header found in the request\n");
- return;
- }
- printf("headers :\n%.*s", request_len, request_buffer);
- /* the request have been received, now parse the request line */
- p = request_buffer;
- for(i = 0; i < (int)sizeof(request_method) - 1; i++) {
- if(*p == ' ' || *p == '\r')
- break;
- request_method[i] = *p;
- ++p;
- }
- request_method[i] = '\0';
- while(*p == ' ')
- p++;
- for(i = 0; i < (int)sizeof(request_uri) - 1; i++) {
- if(*p == ' ' || *p == '\r')
- break;
- request_uri[i] = *p;
- ++p;
- }
- request_uri[i] = '\0';
- while(*p == ' ')
- p++;
- for(i = 0; i < (int)sizeof(http_version) - 1; i++) {
- if(*p == ' ' || *p == '\r')
- break;
- http_version[i] = *p;
- ++p;
- }
- http_version[i] = '\0';
- printf("Method = %s, URI = %s, %s\n",
- request_method, request_uri, http_version);
- /* check if the request method is allowed */
- if(0 != strcmp(request_method, "GET")) {
- const char response405[] = "HTTP/1.1 405 Method Not Allowed\r\n"
- "Allow: GET\r\n\r\n";
- const char * pc;
- /* 405 Method Not Allowed */
- /* The response MUST include an Allow header containing a list
- * of valid methods for the requested resource. */
- n = sizeof(response405) - 1;
- pc = response405;
- while(n > 0) {
- i = write(c, pc, n);
- if(i<0) {
- if(errno != EINTR) {
- perror("write");
- return;
- }
- } else {
- n -= i;
- pc += i;
- }
- }
- return;
- }
-
- mode = MODE_INVALID;
- /* use the request URI to know what to do */
- for(i = 0; modes_array[i].mode != MODE_INVALID; i++) {
- if(strstr(request_uri, modes_array[i].text)) {
- mode = modes_array[i].mode; /* found */
- break;
- }
- }
-
- switch(mode) {
- case MODE_CHUNKED:
- response_buffer = build_chunked_response(content_length, &response_len);
- break;
- case MODE_ADDCRAP:
- response_len = content_length+256;
- response_buffer = malloc(response_len);
- if(!response_buffer)
- break;
- n = snprintf(response_buffer, response_len,
- "HTTP/1.1 200 OK\r\n"
- "Server: minihttptestserver\r\n"
- "Content-Type: text/plain\r\n"
- "Content-Length: %d\r\n"
- "\r\n", content_length);
- response_len = content_length+n+CRAP_LENGTH;
- p = realloc(response_buffer, response_len);
- if(p == NULL) {
- /* error 500 */
- free(response_buffer);
- response_buffer = NULL;
- break;
- }
- response_buffer = p;
- build_content(response_buffer + n, content_length);
- build_crap(response_buffer + n + content_length, CRAP_LENGTH);
- break;
- case MODE_FAVICON:
- content_length = FAVICON_LENGTH;
- response_len = content_length + 256;
- response_buffer = malloc(response_len);
- if(!response_buffer)
- break;
- n = snprintf(response_buffer, response_len,
- "HTTP/1.1 200 OK\r\n"
- "Server: minihttptestserver\r\n"
- "Content-Type: image/vnd.microsoft.icon\r\n"
- "Content-Length: %d\r\n"
- "\r\n", content_length);
- /* image/x-icon */
- build_favicon_content(response_buffer + n, content_length);
- response_len = content_length + n;
- break;
- default:
- response_len = content_length+256;
- response_buffer = malloc(response_len);
- if(!response_buffer)
- break;
- n = snprintf(response_buffer, response_len,
- "HTTP/1.1 200 OK\r\n"
- "Server: minihttptestserver\r\n"
- "Content-Type: text/plain\r\n"
- "\r\n");
- response_len = content_length+n;
- p = realloc(response_buffer, response_len);
- if(p == NULL) {
- /* Error 500 */
- free(response_buffer);
- response_buffer = NULL;
- break;
- }
- response_buffer = p;
- build_content(response_buffer + n, response_len - n);
- }
-
- if(response_buffer) {
- send_response(c, response_buffer, response_len);
- free(response_buffer);
- } else {
- /* Error 500 */
- }
-}
-
-/**
- */
-int main(int argc, char * * argv) {
- int ipv6 = 0;
- int s, c, i;
- unsigned short port = 0;
- struct sockaddr_storage server_addr;
- socklen_t server_addrlen;
- struct sockaddr_storage client_addr;
- socklen_t client_addrlen;
- pid_t pid;
- int child = 0;
- int status;
- const char * expected_file_name = NULL;
- struct sigaction sa;
-
- for(i = 1; i < argc; i++) {
- if(argv[i][0] == '-') {
- switch(argv[i][1]) {
- case '6':
- ipv6 = 1;
- break;
- case 'e':
- /* write expected file ! */
- expected_file_name = argv[++i];
- break;
- case 'p':
- /* port */
- if(++i < argc) {
- port = (unsigned short)atoi(argv[i]);
- }
- break;
- default:
- fprintf(stderr, "unknown command line switch '%s'\n", argv[i]);
- }
- } else {
- fprintf(stderr, "unknown command line argument '%s'\n", argv[i]);
- }
- }
-
- srand(time(NULL));
-
- memset(&sa, 0, sizeof(struct sigaction));
-
- /*signal(SIGCHLD, handle_signal_chld);*/
- sa.sa_handler = handle_signal_chld;
- if(sigaction(SIGCHLD, &sa, NULL) < 0) {
- perror("sigaction");
- return 1;
- }
- /*signal(SIGINT, handle_signal_int);*/
- sa.sa_handler = handle_signal_int;
- if(sigaction(SIGINT, &sa, NULL) < 0) {
- perror("sigaction");
- return 1;
- }
-
- s = socket(ipv6 ? AF_INET6 : AF_INET, SOCK_STREAM, 0);
- if(s < 0) {
- perror("socket");
- return 1;
- }
- memset(&server_addr, 0, sizeof(struct sockaddr_storage));
- memset(&client_addr, 0, sizeof(struct sockaddr_storage));
- if(ipv6) {
- struct sockaddr_in6 * addr = (struct sockaddr_in6 *)&server_addr;
- addr->sin6_family = AF_INET6;
- addr->sin6_port = htons(port);
- addr->sin6_addr = in6addr_loopback;
- } else {
- struct sockaddr_in * addr = (struct sockaddr_in *)&server_addr;
- addr->sin_family = AF_INET;
- addr->sin_port = htons(port);
- addr->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- }
- if(bind(s, (struct sockaddr *)&server_addr,
- ipv6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)) < 0) {
- perror("bind");
- return 1;
- }
- if(listen(s, 5) < 0) {
- perror("listen");
- }
- if(port == 0) {
- server_addrlen = sizeof(struct sockaddr_storage);
- if(getsockname(s, (struct sockaddr *)&server_addr, &server_addrlen) < 0) {
- perror("getsockname");
- return 1;
- }
- if(ipv6) {
- struct sockaddr_in6 * addr = (struct sockaddr_in6 *)&server_addr;
- port = ntohs(addr->sin6_port);
- } else {
- struct sockaddr_in * addr = (struct sockaddr_in *)&server_addr;
- port = ntohs(addr->sin_port);
- }
- printf("Listening on port %hu\n", port);
- fflush(stdout);
- }
-
- /* write expected file */
- if(expected_file_name) {
- FILE * f;
- f = fopen(expected_file_name, "wb");
- if(f) {
- char * buffer;
- buffer = malloc(16*1024);
- if(buffer == NULL) {
- fprintf(stderr, "memory allocation error\n");
- } else {
- build_content(buffer, 16*1024);
- i = fwrite(buffer, 1, 16*1024, f);
- if(i != 16*1024) {
- fprintf(stderr, "error writing to file %s : %dbytes written (out of %d)\n", expected_file_name, i, 16*1024);
- }
- free(buffer);
- }
- fclose(f);
- } else {
- fprintf(stderr, "error opening file %s for writing\n", expected_file_name);
- }
- }
-
- /* fork() loop */
- while(!child && !quit) {
- while(child_to_wait_for > 0) {
- pid = wait(&status);
- if(pid < 0) {
- perror("wait");
- } else {
- printf("child(%d) terminated with status %d\n", (int)pid, status);
- }
- --child_to_wait_for;
- }
- client_addrlen = sizeof(struct sockaddr_storage);
- c = accept(s, (struct sockaddr *)&client_addr,
- &client_addrlen);
- if(c < 0) {
- if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)
- continue;
- perror("accept");
- return 1;
- }
- printf("accept...\n");
- pid = fork();
- if(pid < 0) {
- perror("fork");
- return 1;
- } else if(pid == 0) {
- /* child */
- child = 1;
- close(s);
- s = -1;
- handle_http_connection(c);
- }
- close(c);
- }
- if(s >= 0) {
- close(s);
- s = -1;
- }
- if(!child) {
- while(child_to_wait_for > 0) {
- pid = wait(&status);
- if(pid < 0) {
- perror("wait");
- } else {
- printf("child(%d) terminated with status %d\n", (int)pid, status);
- }
- --child_to_wait_for;
- }
- printf("Bye...\n");
- }
- return 0;
-}
-
diff --git a/external/miniupnpc/minisoap.c b/external/miniupnpc/minisoap.c
deleted file mode 100644
index 76225f4b6..000000000
--- a/external/miniupnpc/minisoap.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/* $Id: minisoap.c,v 1.23 2014/11/04 22:31:55 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.
- *
- * 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) fprintf(stderr, "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, we could use writev() for that */
- p = malloc(headerssize+bodysize);
- if(!p)
- return -1;
- 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);
- if ((unsigned int)headerssize >= sizeof(headerbuf))
- return -1;
-#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);
-}
-
-
diff --git a/external/miniupnpc/minisoap.h b/external/miniupnpc/minisoap.h
deleted file mode 100644
index 60554f5c3..000000000
--- a/external/miniupnpc/minisoap.h
+++ /dev/null
@@ -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
-
diff --git a/external/miniupnpc/minissdpc.c b/external/miniupnpc/minissdpc.c
deleted file mode 100644
index 8eee2e927..000000000
--- a/external/miniupnpc/minissdpc.c
+++ /dev/null
@@ -1,888 +0,0 @@
-/* $Id: minissdpc.c,v 1.32 2016/10/07 09:04:36 nanard Exp $ */
-/* vim: tabstop=4 shiftwidth=4 noexpandtab
- * Project : miniupnp
- * Web : http://miniupnp.free.fr/
- * Author : Thomas BERNARD
- * copyright (c) 2005-2017 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 (__NetBSD__)
-#include <net/if.h>
-#endif
-#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) fprintf(stderr, "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(_WIN32)
-#include <sys/ioctl.h>
-#if defined(__sun)
-#include <sys/sockio.h>
-#endif
-#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 "miniupnpc.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;
-#if defined(MINIUPNPC_SET_SOCKET_TIMEOUT) && !defined(__sun)
- 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;
- }
-#if defined(MINIUPNPC_SET_SOCKET_TIMEOUT) && !defined(__sun)
- /* setting a 3 seconds timeout */
- /* not supported for AF_UNIX sockets under Solaris */
- timeout.tv_sec = 3;
- timeout.tv_usec = 0;
- if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)) < 0)
- {
- perror("setsockopt SO_RCVTIMEO unix");
- }
- timeout.tv_sec = 3;
- timeout.tv_usec = 0;
- if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)) < 0)
- {
- perror("setsockopt SO_SNDTIMEO unix");
- }
-#endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */
- if(!socketpath)
- socketpath = "/var/run/minissdpd.sock";
- memset(&addr, 0, sizeof(addr));
- 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 SSDP_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 localport,
- 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(SSDP_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;
- int sentok;
-
- if(error)
- *error = MINISSDPC_UNKNOWN_ERROR;
-
- if(localport==UPNP_LOCAL_PORT_SAME)
- localport = SSDP_PORT;
-
-#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(localport > 0 && localport < 65536)
- p->sin6_port = htons((unsigned short)localport);
- 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(localport > 0 && localport < 65536)
- p->sin_port = htons((unsigned short)localport);
- 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;
- }
-
- if(ipv6) {
- int mcastHops = ttl;
- if(setsockopt(sudp, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &mcastHops, sizeof(mcastHops)) < 0)
- {
- PRINT_SOCKET_ERROR("setsockopt(IPV6_MULTICAST_HOPS,...)");
- }
- } else {
-#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 IPV6_MULTICAST_IF");
- }
-#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 IP_MULTICAST_IF");
- }
- } 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 IP_MULTICAST_IF");
- }
-#elif !defined(_WIN32)
- struct ifreq ifr;
- int ifrlen = sizeof(ifr);
- strncpy(ifr.ifr_name, multicastif, IFNAMSIZ);
- ifr.ifr_name[IFNAMSIZ-1] = '\0';
- if(ioctl(sudp, SIOCGIFADDR, &ifr, &ifrlen) < 0)
- {
- PRINT_SOCKET_ERROR("ioctl(...SIOCGIFADDR...)");
- }
- mc_if.s_addr = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr;
- if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&mc_if, sizeof(mc_if)) < 0)
- {
- PRINT_SOCKET_ERROR("setsockopt IP_MULTICAST_IF");
- }
-#else /* _WIN32 */
-#ifdef DEBUG
- printf("Setting of multicast interface not supported with interface name.\n");
-#endif
-#endif /* #ifdef HAS_IP_MREQN / !defined(_WIN32) */
- }
- }
- }
-
- /* 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++) {
- sentok = 0;
- /* 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);
- if ((unsigned int)n >= sizeof(bufr)) {
- if(error)
- *error = MINISSDPC_MEMORY_ERROR;
- goto error;
- }
-#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(SSDP_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(SSDP_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");
- } else {
- sentok = 1;
- }
-#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(SSDP_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;
- } else {
- sentok = 1;
- }
- }
- freeaddrinfo(servinfo);
- if(!sentok) {
- if(error)
- *error = MINISSDPC_SOCKET_ERROR;
- }
-#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((sentok && !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;
-}
-
diff --git a/external/miniupnpc/minissdpc.h b/external/miniupnpc/minissdpc.h
deleted file mode 100644
index 167d897cb..000000000
--- a/external/miniupnpc/minissdpc.h
+++ /dev/null
@@ -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 localport,
- int ipv6, unsigned char ttl,
- int * error,
- int searchalltypes);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/external/miniupnpc/miniupnpc.c b/external/miniupnpc/miniupnpc.c
deleted file mode 100644
index 5eb9500e3..000000000
--- a/external/miniupnpc/miniupnpc.c
+++ /dev/null
@@ -1,722 +0,0 @@
-/* $Id: miniupnpc.c,v 1.148 2016/01/24 17:24:36 nanard Exp $ */
-/* vim: tabstop=4 shiftwidth=4 noexpandtab
- * Project : miniupnp
- * Web : http://miniupnp.free.fr/
- * Author : Thomas BERNARD
- * copyright (c) 2005-2016 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'
-
-/* check if an ip address is a private (LAN) address
- * see https://tools.ietf.org/html/rfc1918 */
-static int is_rfc1918addr(const char * addr)
-{
- /* 192.168.0.0 - 192.168.255.255 (192.168/16 prefix) */
- if(COMPARE(addr, "192.168."))
- return 1;
- /* 10.0.0.0 - 10.255.255.255 (10/8 prefix) */
- if(COMPARE(addr, "10."))
- return 1;
- /* 172.16.0.0 - 172.31.255.255 (172.16/12 prefix) */
- if(COMPARE(addr, "172.")) {
- int i = atoi(addr + 4);
- if((16 <= i) && (i <= 31))
- return 1;
- }
- return 0;
-}
-
-/* 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];
- int soapbodylen;
- char * buf;
- int n;
- int status_code;
-
- *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);
- if ((unsigned int)soapbodylen >= sizeof(soapbody))
- return NULL;
- }
- else
- {
- char * p;
- const char * pe, * pv;
- const char * const pend = soapbody + sizeof(soapbody);
- 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);
- if ((unsigned int)soapbodylen >= sizeof(soapbody))
- return NULL;
- p = soapbody + soapbodylen;
- while(args->elt)
- {
- if(p >= pend) /* check for space to write next byte */
- return NULL;
- *(p++) = '<';
-
- pe = args->elt;
- while(p < pend && *pe)
- *(p++) = *(pe++);
-
- if(p >= pend) /* check for space to write next byte */
- return NULL;
- *(p++) = '>';
-
- if((pv = args->val))
- {
- while(p < pend && *pv)
- *(p++) = *(pv++);
- }
-
- if((p+2) > pend) /* check for space to write next 2 bytes */
- return NULL;
- *(p++) = '<';
- *(p++) = '/';
-
- pe = args->elt;
- while(p < pend && *pe)
- *(p++) = *(pe++);
-
- if(p >= pend) /* check for space to write next byte */
- return NULL;
- *(p++) = '>';
-
- args++;
- }
- if((p+4) > pend) /* check for space to write next 4 bytes */
- return NULL;
- *(p++) = '<';
- *(p++) = '/';
- *(p++) = SERVICEPREFIX2;
- *(p++) = ':';
-
- pe = action;
- while(p < pend && *pe)
- *(p++) = *(pe++);
-
- strncpy(p, "></" SOAPPREFIX ":Body></" SOAPPREFIX ":Envelope>\r\n",
- pend - p);
- if(soapbody[sizeof(soapbody)-1]) /* strncpy pads buffer with 0s, so if it doesn't end in 0, could not fit full string */
- return NULL;
- }
- 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, &status_code);
-#ifdef DEBUG
- if(*bufsize > 0 && buf)
- {
- printf("HTTP %d SOAP Response :\n%.*s\n", status_code, *bufsize, buf);
- }
- else
- {
- printf("HTTP %d, empty SOAP response. size=%d\n", status_code, *bufsize);
- }
-#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 localport,
- 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, localport,
- 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 localport,
- 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, localport,
- ipv6, ttl, error, 0);
-}
-
-/* upnpDiscoverAll() Discover all UPnP devices */
-MINIUPNP_LIBSPEC struct UPNPDev *
-upnpDiscoverAll(int delay, const char * multicastif,
- const char * minissdpdsock, int localport,
- int ipv6, unsigned char ttl,
- int * error)
-{
- static const char * const deviceList[] = {
- /*"upnp:rootdevice",*/
- "ssdp:all",
- 0
- };
- return upnpDiscoverDevices(deviceList,
- delay, multicastif, minissdpdsock, localport,
- 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 localport,
- int ipv6, unsigned char ttl,
- int * error)
-{
- const char * const deviceList[] = {
- device,
- 0
- };
- return upnpDiscoverDevices(deviceList,
- delay, multicastif, minissdpdsock, localport,
- 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. Dont 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];
- char myLanAddr[40];
- int status_code = -1;
-
- 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),
- myLanAddr, sizeof(myLanAddr),
- dev->scope_id, &status_code);
-#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++;
- if(lanaddr)
- strncpy(lanaddr, myLanAddr, lanaddrlen);
- }
- }
- }
- /* 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 )
- {
- int is_connected;
-
- 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;
- is_connected = UPNPIGD_IsConnected(urls, data);
-#ifdef DEBUG
- printf("UPNPIGD_IsConnected(%s) = %d\n",
- urls->controlURL, is_connected);
-#endif
- /* checks that status is connected AND there is a external IP address assigned */
- if(is_connected &&
- (UPNP_GetExternalIPAddress(urls->controlURL, data->first.servicetype, extIpAddr) == 0)) {
- if(!is_rfc1918addr(extIpAddr) && (extIpAddr[0] != '\0')
- && (0 != strcmp(extIpAddr, "0.0.0.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);
- is_connected = UPNPIGD_IsConnected(urls, data);
-#ifdef DEBUG
- printf("UPNPIGD_IsConnected(%s) = %d\n",
- urls->controlURL, is_connected);
-#endif
- if(is_connected &&
- (UPNP_GetExternalIPAddress(urls->controlURL, data->first.servicetype, extIpAddr) == 0)) {
- if(!is_rfc1918addr(extIpAddr) && (extIpAddr[0] != '\0')
- && (0 != strcmp(extIpAddr, "0.0.0.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, NULL);
- 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;
- }
-}
-
diff --git a/external/miniupnpc/miniupnpc.def b/external/miniupnpc/miniupnpc.def
deleted file mode 100644
index 60e0bbe42..000000000
--- a/external/miniupnpc/miniupnpc.def
+++ /dev/null
@@ -1,45 +0,0 @@
-LIBRARY
-; miniupnpc library
- miniupnpc
-
-EXPORTS
-; miniupnpc
- upnpDiscover
- freeUPNPDevlist
- parserootdesc
- UPNP_GetValidIGD
- UPNP_GetIGDFromUrl
- GetUPNPUrls
- FreeUPNPUrls
-; miniwget
- miniwget
- miniwget_getaddr
-; upnpcommands
- UPNP_GetTotalBytesSent
- UPNP_GetTotalBytesReceived
- UPNP_GetTotalPacketsSent
- UPNP_GetTotalPacketsReceived
- UPNP_GetStatusInfo
- UPNP_GetConnectionTypeInfo
- UPNP_GetExternalIPAddress
- UPNP_GetLinkLayerMaxBitRates
- UPNP_AddPortMapping
- UPNP_AddAnyPortMapping
- UPNP_DeletePortMapping
- UPNP_DeletePortMappingRange
- UPNP_GetPortMappingNumberOfEntries
- UPNP_GetSpecificPortMappingEntry
- UPNP_GetGenericPortMappingEntry
- UPNP_GetListOfPortMappings
- UPNP_AddPinhole
- UPNP_CheckPinholeWorking
- UPNP_UpdatePinhole
- UPNP_GetPinholePackets
- UPNP_DeletePinhole
- UPNP_GetFirewallStatus
- UPNP_GetOutboundPinholeTimeout
-; upnperrors
- strupnperror
-; portlistingparse
- ParsePortListing
- FreePortListing
diff --git a/external/miniupnpc/miniupnpc.h b/external/miniupnpc/miniupnpc.h
deleted file mode 100644
index 0b5b47329..000000000
--- a/external/miniupnpc/miniupnpc.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/* $Id: miniupnpc.h,v 1.50 2016/04/19 21:06:21 nanard Exp $ */
-/* Project: miniupnp
- * http://miniupnp.free.fr/
- * Author: Thomas Bernard
- * Copyright (c) 2005-2016 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 "2.0"
-#define MINIUPNPC_API_VERSION 16
-
-/* Source port:
- Using "1" as an alias for 1900 for backwards compatability
- (presuming one would have used that for the "sameport" parameter) */
-#define UPNP_LOCAL_PORT_ANY 0
-#define UPNP_LOCAL_PORT_SAME 1
-
-#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 localport is set to UPNP_LOCAL_PORT_SAME(1) SSDP packets will be sent
- * from the source port 1900 (same as destination port), if set to
- * UPNP_LOCAL_PORT_ANY(0) system assign a source port, any other value will
- * be attempted as the 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 localport,
- int ipv6, unsigned char ttl,
- int * error);
-
-MINIUPNP_LIBSPEC struct UPNPDev *
-upnpDiscoverAll(int delay, const char * multicastif,
- const char * minissdpdsock, int localport,
- int ipv6, unsigned char ttl,
- int * error);
-
-MINIUPNP_LIBSPEC struct UPNPDev *
-upnpDiscoverDevice(const char * device, int delay, const char * multicastif,
- const char * minissdpdsock, int localport,
- 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 localport,
- 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
-
diff --git a/external/miniupnpc/miniupnpc_declspec.h b/external/miniupnpc/miniupnpc_declspec.h
deleted file mode 100644
index 40adb922e..000000000
--- a/external/miniupnpc/miniupnpc_declspec.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef MINIUPNPC_DECLSPEC_H_INCLUDED
-#define MINIUPNPC_DECLSPEC_H_INCLUDED
-
-#if defined(_WIN32) && !defined(MINIUPNP_STATICLIB)
- /* for windows dll */
- #ifdef MINIUPNP_EXPORTS
- #define MINIUPNP_LIBSPEC __declspec(dllexport)
- #else
- #define MINIUPNP_LIBSPEC __declspec(dllimport)
- #endif
-#else
- #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
-
-#endif /* MINIUPNPC_DECLSPEC_H_INCLUDED */
-
diff --git a/external/miniupnpc/miniupnpcmodule.c b/external/miniupnpc/miniupnpcmodule.c
deleted file mode 100644
index 8ffbf51a1..000000000
--- a/external/miniupnpc/miniupnpcmodule.c
+++ /dev/null
@@ -1,703 +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-2016 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"
-
-#ifdef _WIN32
-#include <winsock2.h>
-#endif
-
-/* 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() */
- unsigned int localport; /* 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"
- },
- {"localport", T_UINT, offsetof(UPnPObject, localport),
- 0/*READWRITE*/,
- "If localport is set to UPNP_LOCAL_PORT_SAME(1) "
- "SSDP packets will be sent from the source port "
- "1900 (same as destination port), if set to "
- "UPNP_LOCAL_PORT_ANY(0) system assign a source "
- "port, any other value will be attempted as the "
- "source port"
- },
- /* 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",
- "localport", NULL
- };
-
- if(!PyArg_ParseTupleAndKeywords(args, kwds, "|zzII", kwlist,
- &multicastif,
- &minissdpdsocket,
- &self->discoverdelay,
- &self->localport))
- return -1;
-
- if(self->localport>1 &&
- (self->localport>65534||self->localport<1024)) {
- PyErr_SetString(PyExc_Exception, "Invalid localport value");
- 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,
- (int)self->localport,
- 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
-#if (PY_MAJOR_VERSION >= 3) || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 3)
- return Py_BuildValue("I", i);
-#else
- return Py_BuildValue("i", (int)i);
-#endif
-}
-
-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
-#if (PY_MAJOR_VERSION >= 3) || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 3)
- return Py_BuildValue("I", i);
-#else
- return Py_BuildValue("i", (int)i);
-#endif
-}
-
-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
-#if (PY_MAJOR_VERSION >= 3) || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 3)
- return Py_BuildValue("I", i);
-#else
- return Py_BuildValue("i", (int)i);
-#endif
-}
-
-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
-#if (PY_MAJOR_VERSION >= 3) || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 3)
- return Py_BuildValue("I", i);
-#else
- return Py_BuildValue("i", (int)i);
-#endif
-}
-
-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) {
-#if (PY_MAJOR_VERSION >= 3) || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 3)
- return Py_BuildValue("(s,I,s)", status, uptime, lastconnerror);
-#else
- return Py_BuildValue("(s,i,s)", status, (int)uptime, lastconnerror);
-#endif
- } 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, "HssHzz", &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, "HssHzz", &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) {
-#if (PY_MAJOR_VERSION >= 3) || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 3)
- return Py_BuildValue("I", n);
-#else
- return Py_BuildValue("i", (int)n);
-#endif
- } 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);
-#if (PY_MAJOR_VERSION >= 3) || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 3)
- return Py_BuildValue("(H,s,(s,H),s,s,s,I)",
- ePort, protocol, intClient, iPort,
- desc, enabled, rHost, dur);
-#else
- return Py_BuildValue("(i,s,(s,i),s,s,s,i)",
- (int)ePort, protocol, intClient, (int)iPort,
- desc, enabled, rHost, (int)dur);
-#endif
- }
- 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
- /* initialize Winsock. */
- WSADATA wsaData;
- int nResult = WSAStartup(MAKEWORD(2,2), &wsaData);
-
- 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
-}
-
diff --git a/external/miniupnpc/miniupnpcstrings.h.cmake b/external/miniupnpc/miniupnpcstrings.h.cmake
deleted file mode 100644
index 78c8fe9c5..000000000
--- a/external/miniupnpc/miniupnpcstrings.h.cmake
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef MINIUPNPCSTRINGS_H_INCLUDED
-#define MINIUPNPCSTRINGS_H_INCLUDED
-
-#define OS_STRING "${CMAKE_SYSTEM_NAME}"
-#define MINIUPNPC_VERSION_STRING "${MINIUPNPC_VERSION}"
-
-#if 0
-/* according to "UPnP Device Architecture 1.0" */
-#define UPNP_VERSION_STRING "UPnP/1.0"
-#else
-/* according to "UPnP Device Architecture 1.1" */
-#define UPNP_VERSION_STRING "UPnP/1.1"
-#endif
-
-#endif
diff --git a/external/miniupnpc/miniupnpcstrings.h.in b/external/miniupnpc/miniupnpcstrings.h.in
deleted file mode 100644
index 68bf4293d..000000000
--- a/external/miniupnpc/miniupnpcstrings.h.in
+++ /dev/null
@@ -1,23 +0,0 @@
-/* $Id: miniupnpcstrings.h.in,v 1.6 2014/11/04 22:31:55 nanard Exp $ */
-/* Project: miniupnp
- * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
- * Author: Thomas Bernard
- * Copyright (c) 2005-2014 Thomas Bernard
- * This software is subjects to the conditions detailed
- * in the LICENCE file provided within this distribution */
-#ifndef MINIUPNPCSTRINGS_H_INCLUDED
-#define MINIUPNPCSTRINGS_H_INCLUDED
-
-#define OS_STRING "OS/version"
-#define MINIUPNPC_VERSION_STRING "version"
-
-#if 0
-/* according to "UPnP Device Architecture 1.0" */
-#define UPNP_VERSION_STRING "UPnP/1.0"
-#else
-/* according to "UPnP Device Architecture 1.1" */
-#define UPNP_VERSION_STRING "UPnP/1.1"
-#endif
-
-#endif
-
diff --git a/external/miniupnpc/miniupnpctypes.h b/external/miniupnpc/miniupnpctypes.h
deleted file mode 100644
index 307ce3969..000000000
--- a/external/miniupnpc/miniupnpctypes.h
+++ /dev/null
@@ -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
-
diff --git a/external/miniupnpc/miniwget.c b/external/miniupnpc/miniwget.c
deleted file mode 100644
index 1eda57c5e..000000000
--- a/external/miniupnpc/miniwget.c
+++ /dev/null
@@ -1,663 +0,0 @@
-/* $Id: miniwget.c,v 1.75 2016/01/24 17:24:36 nanard Exp $ */
-/* Project : miniupnp
- * Website : http://miniupnp.free.fr/
- * Author : Thomas Bernard
- * Copyright (c) 2005-2017 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, int * status_code)
-{
- 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;
-#ifdef DEBUG
- char * reason_phrase = NULL;
- int reason_phrase_len = 0;
-#endif
-
- if(status_code) *status_code = -1;
- 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, sizeof(buf), 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(linestart > 0 && 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(linestart == 0 && status_code)
- {
- /* Status line
- * HTTP-Version SP Status-Code SP Reason-Phrase CRLF */
- int sp;
- for(sp = 0; sp < i; sp++)
- if(header_buf[sp] == ' ')
- {
- if(*status_code < 0)
- *status_code = atoi(header_buf + sp + 1);
- else
- {
-#ifdef DEBUG
- reason_phrase = header_buf + sp + 1;
- reason_phrase_len = i - sp - 1;
-#endif
- break;
- }
- }
-#ifdef DEBUG
- printf("HTTP status code = %d, Reason phrase = %.*s\n",
- *status_code, reason_phrase_len, reason_phrase);
-#endif
- }
- else 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;
- }
- }
- /* it is guaranteed that (n >= i) */
- bytestocopy = (chunksize < (unsigned int)(n - i))?chunksize:(unsigned int)(n - i);
- if((content_buf_used + bytestocopy) > content_buf_len)
- {
- char * tmp;
- if((content_length >= 0) && ((unsigned int)content_length >= (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
- && (content_buf_used + n) > (unsigned int)content_length) {
- /* skipping additional bytes */
- n = content_length - content_buf_used;
- }
- if(content_buf_used + n > content_buf_len)
- {
- char * tmp;
- if(content_length >= 0
- && (unsigned int)content_length >= (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 && content_buf_used >= (unsigned int)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,
- int * status_code)
-{
- 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);
- if ((unsigned int)len >= sizeof(buf))
- {
- closesocket(s);
- return NULL;
- }
- 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, status_code);
- 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, int * status_code)
-{
- char * respbuffer;
-
-#if 1
- respbuffer = miniwget3(host, port, path, size,
- addr_str, addr_str_len, "1.1",
- scope_id, status_code);
-#else
- respbuffer = miniwget3(host, port, path, size,
- addr_str, addr_str_len, "1.0",
- scope_id, status_code);
- 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, status_code);
- }
-#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, int * status_code)
-{
- 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, status_code);
-}
-
-void *
-miniwget_getaddr(const char * url, int * size,
- char * addr, int addrlen, unsigned int scope_id,
- int * status_code)
-{
- 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, status_code);
-}
-
diff --git a/external/miniupnpc/miniwget.h b/external/miniupnpc/miniwget.h
deleted file mode 100644
index 0701494d0..000000000
--- a/external/miniupnpc/miniwget.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* $Id: miniwget.h,v 1.12 2016/01/24 17:24:36 nanard Exp $ */
-/* Project : miniupnp
- * Author : Thomas Bernard
- * Copyright (c) 2005-2016 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, int * status_code);
-
-MINIUPNP_LIBSPEC void * miniwget(const char *, int *, unsigned int, int *);
-
-MINIUPNP_LIBSPEC void * miniwget_getaddr(const char *, int *, char *, int, unsigned int, int *);
-
-int parseURL(const char *, char *, unsigned short *, char * *, unsigned int *);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/external/miniupnpc/minixml.c b/external/miniupnpc/minixml.c
deleted file mode 100644
index 1f2227343..000000000
--- a/external/miniupnpc/minixml.c
+++ /dev/null
@@ -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);
-}
-
-
diff --git a/external/miniupnpc/minixml.h b/external/miniupnpc/minixml.h
deleted file mode 100644
index 19e6f513b..000000000
--- a/external/miniupnpc/minixml.h
+++ /dev/null
@@ -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
-
diff --git a/external/miniupnpc/minixmlvalid.c b/external/miniupnpc/minixmlvalid.c
deleted file mode 100644
index dad148812..000000000
--- a/external/miniupnpc/minixmlvalid.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/* $Id: minixmlvalid.c,v 1.7 2015/07/15 12:41:15 nanard Exp $ */
-/* MiniUPnP Project
- * http://miniupnp.tuxfamily.org/ or http://miniupnp.free.fr/
- * minixmlvalid.c :
- * validation program for the minixml parser
- *
- * (c) 2006-2011 Thomas Bernard */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include "minixml.h"
-
-/* xml event structure */
-struct event {
- enum { ELTSTART, ELTEND, ATT, CHARDATA } type;
- const char * data;
- int len;
-};
-
-struct eventlist {
- int n;
- struct event * events;
-};
-
-/* compare 2 xml event lists
- * return 0 if the two lists are equals */
-int evtlistcmp(struct eventlist * a, struct eventlist * b)
-{
- int i;
- struct event * ae, * be;
- if(a->n != b->n)
- {
- printf("event number not matching : %d != %d\n", a->n, b->n);
- /*return 1;*/
- }
- for(i=0; i<a->n; i++)
- {
- ae = a->events + i;
- be = b->events + i;
- if( (ae->type != be->type)
- ||(ae->len != be->len)
- ||memcmp(ae->data, be->data, ae->len))
- {
- printf("Found a difference : %d '%.*s' != %d '%.*s'\n",
- ae->type, ae->len, ae->data,
- be->type, be->len, be->data);
- return 1;
- }
- }
- return 0;
-}
-
-/* Test data */
-static const char xmldata[] =
-"<xmlroot>\n"
-" <elt1 att1=\"attvalue1\" att2=\"attvalue2\">"
-"character data"
-"</elt1> \n \t"
-"<elt1b/>"
-"<elt1>\n<![CDATA[ <html>stuff !\n ]]> \n</elt1>\n"
-"<elt2a> \t<elt2b>chardata1</elt2b><elt2b> chardata2 </elt2b></elt2a>"
-"</xmlroot>";
-
-static const struct event evtref[] =
-{
- {ELTSTART, "xmlroot", 7},
- {ELTSTART, "elt1", 4},
- /* attributes */
- {CHARDATA, "character data", 14},
- {ELTEND, "elt1", 4},
- {ELTSTART, "elt1b", 5},
- {ELTSTART, "elt1", 4},
- {CHARDATA, " <html>stuff !\n ", 16},
- {ELTEND, "elt1", 4},
- {ELTSTART, "elt2a", 5},
- {ELTSTART, "elt2b", 5},
- {CHARDATA, "chardata1", 9},
- {ELTEND, "elt2b", 5},
- {ELTSTART, "elt2b", 5},
- {CHARDATA, " chardata2 ", 11},
- {ELTEND, "elt2b", 5},
- {ELTEND, "elt2a", 5},
- {ELTEND, "xmlroot", 7}
-};
-
-void startelt(void * data, const char * p, int l)
-{
- struct eventlist * evtlist = data;
- struct event * evt;
- evt = evtlist->events + evtlist->n;
- /*printf("startelt : %.*s\n", l, p);*/
- evt->type = ELTSTART;
- evt->data = p;
- evt->len = l;
- evtlist->n++;
-}
-
-void endelt(void * data, const char * p, int l)
-{
- struct eventlist * evtlist = data;
- struct event * evt;
- evt = evtlist->events + evtlist->n;
- /*printf("endelt : %.*s\n", l, p);*/
- evt->type = ELTEND;
- evt->data = p;
- evt->len = l;
- evtlist->n++;
-}
-
-void chardata(void * data, const char * p, int l)
-{
- struct eventlist * evtlist = data;
- struct event * evt;
- evt = evtlist->events + evtlist->n;
- /*printf("chardata : '%.*s'\n", l, p);*/
- evt->type = CHARDATA;
- evt->data = p;
- evt->len = l;
- evtlist->n++;
-}
-
-int testxmlparser(const char * xml, int size)
-{
- int r;
- struct eventlist evtlist;
- struct eventlist evtlistref;
- struct xmlparser parser;
- evtlist.n = 0;
- evtlist.events = malloc(sizeof(struct event)*100);
- if(evtlist.events == NULL)
- {
- fprintf(stderr, "Memory allocation error.\n");
- return -1;
- }
- memset(&parser, 0, sizeof(parser));
- parser.xmlstart = xml;
- parser.xmlsize = size;
- parser.data = &evtlist;
- parser.starteltfunc = startelt;
- parser.endeltfunc = endelt;
- parser.datafunc = chardata;
- parsexml(&parser);
- printf("%d events\n", evtlist.n);
- /* compare */
- evtlistref.n = sizeof(evtref)/sizeof(struct event);
- evtlistref.events = (struct event *)evtref;
- r = evtlistcmp(&evtlistref, &evtlist);
- free(evtlist.events);
- return r;
-}
-
-int main(int argc, char * * argv)
-{
- int r;
- (void)argc; (void)argv;
-
- r = testxmlparser(xmldata, sizeof(xmldata)-1);
- if(r)
- printf("minixml validation test failed\n");
- return r;
-}
-
diff --git a/external/miniupnpc/msvc/.gitignore b/external/miniupnpc/msvc/.gitignore
deleted file mode 100644
index 6d88bf128..000000000
--- a/external/miniupnpc/msvc/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-*.db
-.vs
-Debug/
-Release/
diff --git a/external/miniupnpc/msvc/miniupnpc.sln b/external/miniupnpc/msvc/miniupnpc.sln
deleted file mode 100644
index b3da1919e..000000000
--- a/external/miniupnpc/msvc/miniupnpc.sln
+++ /dev/null
@@ -1,29 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual C++ Express 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniupnpc", "miniupnpc.vcproj", "{D28CE435-CB33-4BAE-8A52-C6EF915956F5}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "upnpc-static", "upnpc-static.vcproj", "{469E1CF6-08A2-4B7B-A2AA-5BDB089857C1}"
- ProjectSection(ProjectDependencies) = postProject
- {D28CE435-CB33-4BAE-8A52-C6EF915956F5} = {D28CE435-CB33-4BAE-8A52-C6EF915956F5}
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {D28CE435-CB33-4BAE-8A52-C6EF915956F5}.Debug|Win32.ActiveCfg = Debug|Win32
- {D28CE435-CB33-4BAE-8A52-C6EF915956F5}.Debug|Win32.Build.0 = Debug|Win32
- {D28CE435-CB33-4BAE-8A52-C6EF915956F5}.Release|Win32.ActiveCfg = Release|Win32
- {D28CE435-CB33-4BAE-8A52-C6EF915956F5}.Release|Win32.Build.0 = Release|Win32
- {469E1CF6-08A2-4B7B-A2AA-5BDB089857C1}.Debug|Win32.ActiveCfg = Debug|Win32
- {469E1CF6-08A2-4B7B-A2AA-5BDB089857C1}.Debug|Win32.Build.0 = Debug|Win32
- {469E1CF6-08A2-4B7B-A2AA-5BDB089857C1}.Release|Win32.ActiveCfg = Release|Win32
- {469E1CF6-08A2-4B7B-A2AA-5BDB089857C1}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/external/miniupnpc/msvc/miniupnpc.vcproj b/external/miniupnpc/msvc/miniupnpc.vcproj
deleted file mode 100644
index fb301e3b8..000000000
--- a/external/miniupnpc/msvc/miniupnpc.vcproj
+++ /dev/null
@@ -1,283 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9,00"
- Name="miniupnpc"
- ProjectGUID="{D28CE435-CB33-4BAE-8A52-C6EF915956F5}"
- RootNamespace="miniupnpc"
- Keyword="Win32Proj"
- TargetFrameworkVersion="196613"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;MINIUPNP_STATICLIB;DEBUG"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="4"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;MINIUPNP_STATICLIB"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Fichiers sources"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\connecthostport.c"
- >
- </File>
- <File
- RelativePath="..\igd_desc_parse.c"
- >
- </File>
- <File
- RelativePath="..\minisoap.c"
- >
- </File>
- <File
- RelativePath="..\minissdpc.c"
- >
- </File>
- <File
- RelativePath="..\miniupnpc.c"
- >
- </File>
- <File
- RelativePath="..\miniwget.c"
- >
- </File>
- <File
- RelativePath="..\minixml.c"
- >
- </File>
- <File
- RelativePath="..\portlistingparse.c"
- >
- </File>
- <File
- RelativePath="..\receivedata.c"
- >
- </File>
- <File
- RelativePath="..\upnpcommands.c"
- >
- </File>
- <File
- RelativePath="..\upnpdev.c"
- >
- </File>
- <File
- RelativePath="..\upnperrors.c"
- >
- </File>
- <File
- RelativePath="..\upnpreplyparse.c"
- >
- </File>
- </Filter>
- <Filter
- Name="Fichiers d&apos;en-tête"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\connecthostport.h"
- >
- </File>
- <File
- RelativePath="..\declspec.h"
- >
- </File>
- <File
- RelativePath="..\igd_desc_parse.h"
- >
- </File>
- <File
- RelativePath="..\minisoap.h"
- >
- </File>
- <File
- RelativePath="..\minissdpc.h"
- >
- </File>
- <File
- RelativePath="..\miniupnpc.h"
- >
- </File>
- <File
- RelativePath="..\miniupnpcstrings.h"
- >
- </File>
- <File
- RelativePath="..\miniupnpctypes.h"
- >
- </File>
- <File
- RelativePath="..\miniwget.h"
- >
- </File>
- <File
- RelativePath="..\minixml.h"
- >
- </File>
- <File
- RelativePath="..\portlistingparse.h"
- >
- </File>
- <File
- RelativePath="..\receivedata.h"
- >
- </File>
- <File
- RelativePath="..\upnpcommands.h"
- >
- </File>
- <File
- RelativePath="..\upnpdev.h"
- >
- </File>
- <File
- RelativePath="..\upnperrors.h"
- >
- </File>
- <File
- RelativePath="..\upnpreplyparse.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Fichiers de ressources"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/external/miniupnpc/msvc/miniupnpc.vcxproj b/external/miniupnpc/msvc/miniupnpc.vcxproj
deleted file mode 100644
index 2725136e3..000000000
--- a/external/miniupnpc/msvc/miniupnpc.vcxproj
+++ /dev/null
@@ -1,111 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{D28CE435-CB33-4BAE-8A52-C6EF915956F5}</ProjectGuid>
- <RootNamespace>miniupnpc</RootNamespace>
- <Keyword>Win32Proj</Keyword>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <PlatformToolset>v140</PlatformToolset>
- <CharacterSet>Unicode</CharacterSet>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <PlatformToolset>v140</PlatformToolset>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup>
- <_ProjectFileVersion>14.0.25123.0</_ProjectFileVersion>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
- <IntDir>$(Configuration)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
- <IntDir>$(Configuration)\</IntDir>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;MINIUPNP_STATICLIB;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>true</MinimalRebuild>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeader />
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <ClCompile>
- <Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;MINIUPNP_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeader />
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="..\connecthostport.c" />
- <ClCompile Include="..\igd_desc_parse.c" />
- <ClCompile Include="..\minisoap.c" />
- <ClCompile Include="..\minissdpc.c" />
- <ClCompile Include="..\miniupnpc.c" />
- <ClCompile Include="..\miniwget.c" />
- <ClCompile Include="..\minixml.c" />
- <ClCompile Include="..\portlistingparse.c" />
- <ClCompile Include="..\receivedata.c" />
- <ClCompile Include="..\upnpcommands.c" />
- <ClCompile Include="..\upnpdev.c" />
- <ClCompile Include="..\upnperrors.c" />
- <ClCompile Include="..\upnpreplyparse.c" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\connecthostport.h" />
- <ClInclude Include="..\declspec.h" />
- <ClInclude Include="..\igd_desc_parse.h" />
- <ClInclude Include="..\minisoap.h" />
- <ClInclude Include="..\minissdpc.h" />
- <ClInclude Include="..\miniupnpc.h" />
- <ClInclude Include="..\miniupnpcstrings.h" />
- <ClInclude Include="..\miniupnpctypes.h" />
- <ClInclude Include="..\miniwget.h" />
- <ClInclude Include="..\minixml.h" />
- <ClInclude Include="..\portlistingparse.h" />
- <ClInclude Include="..\receivedata.h" />
- <ClInclude Include="..\upnpcommands.h" />
- <ClInclude Include="..\upnpdev.h" />
- <ClInclude Include="..\upnperrors.h" />
- <ClInclude Include="..\upnpreplyparse.h" />
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
-</Project> \ No newline at end of file
diff --git a/external/miniupnpc/msvc/miniupnpc.vcxproj.filters b/external/miniupnpc/msvc/miniupnpc.vcxproj.filters
deleted file mode 100644
index 01a4dbeb2..000000000
--- a/external/miniupnpc/msvc/miniupnpc.vcxproj.filters
+++ /dev/null
@@ -1,108 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Fichiers sources">
- <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
- <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
- </Filter>
- <Filter Include="Fichiers d%27en-tête">
- <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
- <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
- </Filter>
- <Filter Include="Fichiers de ressources">
- <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
- <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="..\connecthostport.c">
- <Filter>Fichiers sources</Filter>
- </ClCompile>
- <ClCompile Include="..\igd_desc_parse.c">
- <Filter>Fichiers sources</Filter>
- </ClCompile>
- <ClCompile Include="..\minisoap.c">
- <Filter>Fichiers sources</Filter>
- </ClCompile>
- <ClCompile Include="..\minissdpc.c">
- <Filter>Fichiers sources</Filter>
- </ClCompile>
- <ClCompile Include="..\miniupnpc.c">
- <Filter>Fichiers sources</Filter>
- </ClCompile>
- <ClCompile Include="..\miniwget.c">
- <Filter>Fichiers sources</Filter>
- </ClCompile>
- <ClCompile Include="..\minixml.c">
- <Filter>Fichiers sources</Filter>
- </ClCompile>
- <ClCompile Include="..\portlistingparse.c">
- <Filter>Fichiers sources</Filter>
- </ClCompile>
- <ClCompile Include="..\receivedata.c">
- <Filter>Fichiers sources</Filter>
- </ClCompile>
- <ClCompile Include="..\upnpcommands.c">
- <Filter>Fichiers sources</Filter>
- </ClCompile>
- <ClCompile Include="..\upnpdev.c">
- <Filter>Fichiers sources</Filter>
- </ClCompile>
- <ClCompile Include="..\upnperrors.c">
- <Filter>Fichiers sources</Filter>
- </ClCompile>
- <ClCompile Include="..\upnpreplyparse.c">
- <Filter>Fichiers sources</Filter>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="..\connecthostport.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\declspec.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\igd_desc_parse.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\minisoap.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\minissdpc.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\miniupnpc.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\miniupnpcstrings.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\miniupnpctypes.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\miniwget.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\minixml.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\portlistingparse.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\receivedata.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\upnpcommands.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\upnpdev.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\upnperrors.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- <ClInclude Include="..\upnpreplyparse.h">
- <Filter>Fichiers d%27en-tête</Filter>
- </ClInclude>
- </ItemGroup>
-</Project> \ No newline at end of file
diff --git a/external/miniupnpc/msvc/miniupnpc_vs2015.sln b/external/miniupnpc/msvc/miniupnpc_vs2015.sln
deleted file mode 100644
index 27a43f6c3..000000000
--- a/external/miniupnpc/msvc/miniupnpc_vs2015.sln
+++ /dev/null
@@ -1,28 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25123.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniupnpc", "miniupnpc.vcxproj", "{D28CE435-CB33-4BAE-8A52-C6EF915956F5}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "upnpc-static", "upnpc-static.vcxproj", "{469E1CF6-08A2-4B7B-A2AA-5BDB089857C1}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {D28CE435-CB33-4BAE-8A52-C6EF915956F5}.Debug|Win32.ActiveCfg = Debug|Win32
- {D28CE435-CB33-4BAE-8A52-C6EF915956F5}.Debug|Win32.Build.0 = Debug|Win32
- {D28CE435-CB33-4BAE-8A52-C6EF915956F5}.Release|Win32.ActiveCfg = Release|Win32
- {D28CE435-CB33-4BAE-8A52-C6EF915956F5}.Release|Win32.Build.0 = Release|Win32
- {469E1CF6-08A2-4B7B-A2AA-5BDB089857C1}.Debug|Win32.ActiveCfg = Debug|Win32
- {469E1CF6-08A2-4B7B-A2AA-5BDB089857C1}.Debug|Win32.Build.0 = Debug|Win32
- {469E1CF6-08A2-4B7B-A2AA-5BDB089857C1}.Release|Win32.ActiveCfg = Release|Win32
- {469E1CF6-08A2-4B7B-A2AA-5BDB089857C1}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/external/miniupnpc/msvc/upnpc-static.vcproj b/external/miniupnpc/msvc/upnpc-static.vcproj
deleted file mode 100644
index c88c9a6e9..000000000
--- a/external/miniupnpc/msvc/upnpc-static.vcproj
+++ /dev/null
@@ -1,195 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9,00"
- Name="upnpc-static"
- ProjectGUID="{469E1CF6-08A2-4B7B-A2AA-5BDB089857C1}"
- RootNamespace="upnpcstatic"
- Keyword="Win32Proj"
- TargetFrameworkVersion="196613"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="_DEBUG;_CONSOLE;MINIUPNP_STATICLIB;DEBUG;_CRT_SECURE_NO_WARNINGS"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib IPHlpApi.Lib Debug\miniupnpc.lib"
- LinkIncremental="2"
- GenerateDebugInformation="true"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- CharacterSet="1"
- WholeProgramOptimization="1"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- EnableIntrinsicFunctions="true"
- PreprocessorDefinitions="NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;MINIUPNP_STATICLIB"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- WarningLevel="3"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib IPHlpApi.Lib Release\miniupnpc.lib"
- LinkIncremental="1"
- GenerateDebugInformation="true"
- SubSystem="1"
- OptimizeReferences="2"
- EnableCOMDATFolding="2"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Fichiers sources"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\upnpc.c"
- >
- </File>
- </Filter>
- <Filter
- Name="Fichiers d&apos;en-tête"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- </Filter>
- <Filter
- Name="Fichiers de ressources"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/external/miniupnpc/msvc/upnpc-static.vcxproj b/external/miniupnpc/msvc/upnpc-static.vcxproj
deleted file mode 100644
index 44dea81e8..000000000
--- a/external/miniupnpc/msvc/upnpc-static.vcxproj
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{469E1CF6-08A2-4B7B-A2AA-5BDB089857C1}</ProjectGuid>
- <RootNamespace>upnpcstatic</RootNamespace>
- <Keyword>Win32Proj</Keyword>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <PlatformToolset>v140</PlatformToolset>
- <CharacterSet>Unicode</CharacterSet>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <PlatformToolset>v140</PlatformToolset>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup>
- <_ProjectFileVersion>14.0.25123.0</_ProjectFileVersion>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
- <IntDir>$(Configuration)\</IntDir>
- <LinkIncremental>true</LinkIncremental>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
- <IntDir>$(Configuration)\</IntDir>
- <LinkIncremental>false</LinkIncremental>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <ClCompile>
- <Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>_DEBUG;_CONSOLE;MINIUPNP_STATICLIB;DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <MinimalRebuild>true</MinimalRebuild>
- <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <PrecompiledHeader />
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
- </ClCompile>
- <Link>
- <AdditionalDependencies>ws2_32.lib;IPHlpApi.Lib;Debug\miniupnpc.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <SubSystem>Console</SubSystem>
- <TargetMachine>MachineX86</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <ClCompile>
- <Optimization>MaxSpeed</Optimization>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <PreprocessorDefinitions>NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;MINIUPNP_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeader />
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- </ClCompile>
- <Link>
- <AdditionalDependencies>ws2_32.lib;IPHlpApi.Lib;Release\miniupnpc.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <SubSystem>Console</SubSystem>
- <OptimizeReferences>true</OptimizeReferences>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <TargetMachine>MachineX86</TargetMachine>
- </Link>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="..\upnpc.c" />
- </ItemGroup>
- <ItemGroup>
- <ProjectReference Include="miniupnpc.vcxproj">
- <Project>{d28ce435-cb33-4bae-8a52-c6ef915956f5}</Project>
- <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
- </ProjectReference>
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
-</Project> \ No newline at end of file
diff --git a/external/miniupnpc/msvc/upnpc-static.vcxproj.filters b/external/miniupnpc/msvc/upnpc-static.vcxproj.filters
deleted file mode 100644
index 2e75de02f..000000000
--- a/external/miniupnpc/msvc/upnpc-static.vcxproj.filters
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Fichiers sources">
- <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
- <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
- </Filter>
- <Filter Include="Fichiers d%27en-tête">
- <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
- <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
- </Filter>
- <Filter Include="Fichiers de ressources">
- <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
- <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="..\upnpc.c">
- <Filter>Fichiers sources</Filter>
- </ClCompile>
- </ItemGroup>
-</Project> \ No newline at end of file
diff --git a/external/miniupnpc/portlistingparse.c b/external/miniupnpc/portlistingparse.c
deleted file mode 100644
index 55859f271..000000000
--- a/external/miniupnpc/portlistingparse.c
+++ /dev/null
@@ -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-2016 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(strlen(elements[i].str) == (size_t)l && 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);
- }
-}
-
diff --git a/external/miniupnpc/portlistingparse.h b/external/miniupnpc/portlistingparse.h
deleted file mode 100644
index e3957a3f4..000000000
--- a/external/miniupnpc/portlistingparse.h
+++ /dev/null
@@ -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
diff --git a/external/miniupnpc/pymoduletest.py b/external/miniupnpc/pymoduletest.py
deleted file mode 100755
index 9fddd9c29..000000000
--- a/external/miniupnpc/pymoduletest.py
+++ /dev/null
@@ -1,88 +0,0 @@
-#! /usr/bin/python
-# vim: tabstop=2 shiftwidth=2 expandtab
-# MiniUPnP project
-# Author : Thomas Bernard
-# This Sample code is public domain.
-# website : http://miniupnp.tuxfamily.org/
-
-# import the python miniupnpc module
-import miniupnpc
-import sys
-
-try:
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument('-m', '--multicastif')
- parser.add_argument('-p', '--minissdpdsocket')
- parser.add_argument('-d', '--discoverdelay', type=int, default=200)
- parser.add_argument('-z', '--localport', type=int, default=0)
- # create the object
- u = miniupnpc.UPnP(**vars(parser.parse_args()))
-except:
- print 'argparse not available'
- i = 1
- multicastif = None
- minissdpdsocket = None
- discoverdelay = 200
- localport = 0
- while i < len(sys.argv):
- print sys.argv[i]
- if sys.argv[i] == '-m' or sys.argv[i] == '--multicastif':
- multicastif = sys.argv[i+1]
- elif sys.argv[i] == '-p' or sys.argv[i] == '--minissdpdsocket':
- minissdpdsocket = sys.argv[i+1]
- elif sys.argv[i] == '-d' or sys.argv[i] == '--discoverdelay':
- discoverdelay = int(sys.argv[i+1])
- elif sys.argv[i] == '-z' or sys.argv[i] == '--localport':
- localport = int(sys.argv[i+1])
- else:
- raise Exception('invalid argument %s' % sys.argv[i])
- i += 2
- # create the object
- u = miniupnpc.UPnP(multicastif, minissdpdsocket, discoverdelay, localport)
-
-print 'inital(default) values :'
-print ' discoverdelay', u.discoverdelay
-print ' lanaddr', u.lanaddr
-print ' multicastif', u.multicastif
-print ' minissdpdsocket', u.minissdpdsocket
-#u.minissdpdsocket = '../minissdpd/minissdpd.sock'
-# discovery process, it usualy takes several seconds (2 seconds or more)
-print 'Discovering... delay=%ums' % u.discoverdelay
-print u.discover(), 'device(s) detected'
-# select an igd
-try:
- u.selectigd()
-except Exception, e:
- print 'Exception :', e
- sys.exit(1)
-# display information about the IGD and the internet connection
-print 'local ip address :', u.lanaddr
-print 'external ip address :', u.externalipaddress()
-print u.statusinfo(), u.connectiontype()
-print 'total bytes : sent', u.totalbytesent(), 'received', u.totalbytereceived()
-print 'total packets : sent', u.totalpacketsent(), 'received', u.totalpacketreceived()
-
-#print u.addportmapping(64000, 'TCP',
-# '192.168.1.166', 63000, 'port mapping test', '')
-#print u.deleteportmapping(64000, 'TCP')
-
-port = 0
-proto = 'UDP'
-# list the redirections :
-i = 0
-while True:
- p = u.getgenericportmapping(i)
- if p==None:
- break
- print i, p
- (port, proto, (ihost,iport), desc, c, d, e) = p
- #print port, desc
- i = i + 1
-
-print u.getspecificportmapping(port, proto)
-try:
- print u.getportmappingnumberofentries()
-except Exception, e:
- print 'GetPortMappingNumberOfEntries() is not supported :', e
-
diff --git a/external/miniupnpc/pymoduletest3.py b/external/miniupnpc/pymoduletest3.py
deleted file mode 100755
index d4cf1e22f..000000000
--- a/external/miniupnpc/pymoduletest3.py
+++ /dev/null
@@ -1,52 +0,0 @@
-#! /usr/bin/python3
-# MiniUPnP project
-# Author : Thomas Bernard
-# This Sample code is public domain.
-# website : http://miniupnp.tuxfamily.org/
-
-# import the python miniupnpc module
-import miniupnpc
-import sys
-
-# create the object
-u = miniupnpc.UPnP()
-print('inital(default) values :')
-print(' discoverdelay', u.discoverdelay)
-print(' lanaddr', u.lanaddr)
-print(' multicastif', u.multicastif)
-print(' minissdpdsocket', u.minissdpdsocket)
-u.discoverdelay = 200;
-#u.minissdpdsocket = '../minissdpd/minissdpd.sock'
-# discovery process, it usualy takes several seconds (2 seconds or more)
-print('Discovering... delay=%ums' % u.discoverdelay)
-print(u.discover(), 'device(s) detected')
-# select an igd
-try:
- u.selectigd()
-except Exception as e:
- print('Exception :', e)
- sys.exit(1)
-# display information about the IGD and the internet connection
-print('local ip address :', u.lanaddr)
-print('external ip address :', u.externalipaddress())
-print(u.statusinfo(), u.connectiontype())
-
-#print u.addportmapping(64000, 'TCP',
-# '192.168.1.166', 63000, 'port mapping test', '')
-#print u.deleteportmapping(64000, 'TCP')
-
-port = 0
-proto = 'UDP'
-# list the redirections :
-i = 0
-while True:
- p = u.getgenericportmapping(i)
- if p==None:
- break
- print(i, p)
- (port, proto, (ihost,iport), desc, c, d, e) = p
- #print port, desc
- i = i + 1
-
-print(u.getspecificportmapping(port, proto))
-
diff --git a/external/miniupnpc/receivedata.c b/external/miniupnpc/receivedata.c
deleted file mode 100644
index d003eb69d..000000000
--- a/external/miniupnpc/receivedata.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/* $Id: receivedata.c,v 1.7 2015/11/09 21:51:41 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) fprintf(stderr, "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)
-{
-#ifdef 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__) */
-#ifdef 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");
- }
-#ifdef 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;
-}
-
diff --git a/external/miniupnpc/receivedata.h b/external/miniupnpc/receivedata.h
deleted file mode 100644
index cb85c3317..000000000
--- a/external/miniupnpc/receivedata.h
+++ /dev/null
@@ -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
-
diff --git a/external/miniupnpc/setup.py b/external/miniupnpc/setup.py
deleted file mode 100755
index 24a676d85..000000000
--- a/external/miniupnpc/setup.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#! /usr/bin/python
-# vim: tabstop=8 shiftwidth=8 expandtab
-# $Id: setup.py,v 1.9 2012/05/23 08:50:10 nanard Exp $
-# the MiniUPnP Project (c) 2007-2017 Thomas Bernard
-# http://miniupnp.tuxfamily.org/ or http://miniupnp.free.fr/
-#
-# python script to build the miniupnpc module under unix
-#
-# Uses MAKE environment variable (defaulting to 'make')
-
-from setuptools import setup, Extension
-from setuptools.command import build_ext
-import subprocess
-import os
-
-EXT = ['libminiupnpc.a']
-
-class make_then_build_ext(build_ext.build_ext):
- def run(self):
- subprocess.check_call([os.environ.get('MAKE', 'make')] + EXT)
- build_ext.build_ext.run(self)
-
-setup(name="miniupnpc",
- version=open('VERSION').read().strip(),
- author='Thomas BERNARD',
- author_email='miniupnp@free.fr',
- license=open('LICENSE').read(),
- url='http://miniupnp.free.fr/',
- description='miniUPnP client',
- cmdclass={'build_ext': make_then_build_ext},
- ext_modules=[
- Extension(name="miniupnpc", sources=["miniupnpcmodule.c"],
- extra_objects=EXT)
- ])
-
diff --git a/external/miniupnpc/setupmingw32.py b/external/miniupnpc/setupmingw32.py
deleted file mode 100755
index 7e3c382bd..000000000
--- a/external/miniupnpc/setupmingw32.py
+++ /dev/null
@@ -1,28 +0,0 @@
-#! /usr/bin/python
-# vim: tabstop=8 shiftwidth=8 expandtab
-# $Id: setupmingw32.py,v 1.8 2012/05/23 08:50:10 nanard Exp $
-# the MiniUPnP Project (c) 2007-2014 Thomas Bernard
-# http://miniupnp.tuxfamily.org/ or http://miniupnp.free.fr/
-#
-# python script to build the miniupnpc module under windows (using mingw32)
-#
-try:
- from setuptools import setup, Extension
-except ImportError:
- from distutils.core import setup, Extension
-from distutils import sysconfig
-sysconfig.get_config_vars()["OPT"] = ''
-sysconfig.get_config_vars()["CFLAGS"] = ''
-setup(name="miniupnpc",
- version=open('VERSION').read().strip(),
- author='Thomas BERNARD',
- author_email='miniupnp@free.fr',
- license=open('LICENSE').read(),
- url='http://miniupnp.free.fr/',
- description='miniUPnP client',
- ext_modules=[
- Extension(name="miniupnpc", sources=["miniupnpcmodule.c"],
- libraries=["ws2_32", "iphlpapi"],
- extra_objects=["libminiupnpc.a"])
- ])
-
diff --git a/external/miniupnpc/testdesc/linksys_WAG200G_desc.values b/external/miniupnpc/testdesc/linksys_WAG200G_desc.values
deleted file mode 100644
index cf4222187..000000000
--- a/external/miniupnpc/testdesc/linksys_WAG200G_desc.values
+++ /dev/null
@@ -1,14 +0,0 @@
-# values for linksys_WAG200G_desc.xml
-
-CIF:
- servicetype = urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1
- controlurl = /upnp/control/WANCommonIFC1
- eventsuburl = /upnp/event/WANCommonIFC1
- scpdurl = /cmnicfg.xml
-
-first:
- servicetype = urn:schemas-upnp-org:service:WANPPPConnection:1
- controlurl = /upnp/control/WANPPPConn1
- eventsuburl = /upnp/event/WANPPPConn1
- scpdurl = /pppcfg.xml
-
diff --git a/external/miniupnpc/testdesc/linksys_WAG200G_desc.xml b/external/miniupnpc/testdesc/linksys_WAG200G_desc.xml
deleted file mode 100644
index d428d73b0..000000000
--- a/external/miniupnpc/testdesc/linksys_WAG200G_desc.xml
+++ /dev/null
@@ -1,110 +0,0 @@
-<?xml version="1.0"?>
-<root xmlns="urn:schemas-upnp-org:device-1-0">
-<specVersion>
-<major>1</major>
-<minor>0</minor>
-</specVersion>
-<URLBase>http://192.168.1.1:49152</URLBase>
-<device>
-<deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType>
-<friendlyName>LINKSYS WAG200G Gateway</friendlyName>
-<manufacturer>LINKSYS</manufacturer>
-<manufacturerURL>http://www.linksys.com</manufacturerURL>
-<modelDescription>LINKSYS WAG200G Gateway</modelDescription>
-<modelName>Wireless-G ADSL Home Gateway</modelName>
-<modelNumber>WAG200G</modelNumber>
-<modelURL>http://www.linksys.com</modelURL>
-<serialNumber>123456789</serialNumber>
-<UDN>uuid:8ca2eb37-1dd2-11b2-86f1-001a709b5aa8</UDN>
-<UPC>WAG200G</UPC>
-<serviceList>
-<service>
-<serviceType>urn:schemas-upnp-org:service:Layer3Forwarding:1</serviceType>
-<serviceId>urn:upnp-org:serviceId:L3Forwarding1</serviceId>
-<controlURL>/upnp/control/L3Forwarding1</controlURL>
-<eventSubURL>/upnp/event/L3Forwarding1</eventSubURL>
-<SCPDURL>/l3frwd.xml</SCPDURL>
-</service>
-</serviceList>
-<deviceList>
-<device>
-<deviceType>urn:schemas-upnp-org:device:WANDevice:1</deviceType>
-<friendlyName>WANDevice</friendlyName>
-<manufacturer>LINKSYS</manufacturer>
-<manufacturerURL>http://www.linksys.com/</manufacturerURL>
-<modelDescription>Residential Gateway</modelDescription>
-<modelName>Internet Connection Sharing</modelName>
-<modelNumber>1</modelNumber>
-<modelURL>http://www.linksys.com/</modelURL>
-<serialNumber>0000001</serialNumber>
-<UDN>uuid:8ca2eb36-1dd2-11b2-86f1-001a709b5aa8</UDN>
-<UPC>WAG200G</UPC>
-<serviceList>
-<service>
-<serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType>
-<serviceId>urn:upnp-org:serviceId:WANCommonIFC1</serviceId>
-<controlURL>/upnp/control/WANCommonIFC1</controlURL>
-<eventSubURL>/upnp/event/WANCommonIFC1</eventSubURL>
-<SCPDURL>/cmnicfg.xml</SCPDURL>
-</service>
-</serviceList>
-<deviceList>
-<device>
-<deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:1</deviceType>
-<friendlyName>WANConnectionDevice</friendlyName>
-<manufacturer>LINKSYS</manufacturer>
-<manufacturerURL>http://www.linksys.com/</manufacturerURL>
-<modelDescription>Residential Gateway</modelDescription>
-<modelName>Internet Connection Sharing</modelName>
-<modelNumber>1</modelNumber>
-<modelURL>http://www.linksys.com/</modelURL>
-<serialNumber>0000001</serialNumber>
-<UDN>uuid:8ca2eb37-1dd2-11b2-86f0-001a709b5aa8</UDN>
-<UPC>WAG200G</UPC>
-<serviceList>
-<service>
-<serviceType>urn:schemas-upnp-org:service:WANEthernetLinkConfig:1</serviceType>
-<serviceId>urn:upnp-org:serviceId:WANEthLinkC1</serviceId>
-<controlURL>/upnp/control/WANEthLinkC1</controlURL>
-<eventSubURL>/upnp/event/WANEthLinkC1</eventSubURL>
-<SCPDURL>/wanelcfg.xml</SCPDURL>
-</service>
-<service>
-<serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType>
-<serviceId>urn:upnp-org:serviceId:WANPPPConn1</serviceId>
-<controlURL>/upnp/control/WANPPPConn1</controlURL>
-<eventSubURL>/upnp/event/WANPPPConn1</eventSubURL>
-<SCPDURL>/pppcfg.xml</SCPDURL>
-</service>
-</serviceList>
-</device>
-</deviceList>
-</device>
-<device>
-<deviceType>urn:schemas-upnp-org:device:LANDevice:1</deviceType>
-<friendlyName>LANDevice</friendlyName>
-<manufacturer>LINKSYS</manufacturer>
-<manufacturerURL>http://www.linksys.com/</manufacturerURL>
-<modelDescription>Residential Gateway</modelDescription>
-<modelName>Residential Gateway</modelName>
-<modelNumber>1</modelNumber>
-<modelURL>http://www.linksys.com/</modelURL>
-<serialNumber>0000001</serialNumber>
-<UDN>uuid:8ca2eb36-1dd2-11b2-86f0-001a709b5aa
-8</UDN>
-<UPC>WAG200G</UPC>
-<serviceList>
-<service>
-<serviceType>urn:schemas-upnp-org:service:LANHostConfigManagement:1</serviceType>
-<serviceId>urn:upnp-org:serviceId:LANHostCfg1</serviceId>
-<controlURL>/upnp/control/LANHostCfg1</controlURL>
-<eventSubURL>/upnp/event/LANHostCfg1</eventSubURL>
-<SCPDURL>/lanhostc.xml</SCPDURL>
-</service>
-</serviceList>
-</device>
-</deviceList>
-<presentationURL>http://192.168.1.1/index.htm</presentationURL>
-</device>
-</root>
-
diff --git a/external/miniupnpc/testdesc/new_LiveBox_desc.values b/external/miniupnpc/testdesc/new_LiveBox_desc.values
deleted file mode 100644
index c55552e58..000000000
--- a/external/miniupnpc/testdesc/new_LiveBox_desc.values
+++ /dev/null
@@ -1,20 +0,0 @@
-# values for new_LiveBox_desc.xml
-
-CIF:
- servicetype = urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1
- controlurl = /87895a19/upnp/control/WANCommonIFC1
- eventsuburl = /87895a19/upnp/control/WANCommonIFC1
- scpdurl = /87895a19/gateicfgSCPD.xml
-
-first:
- servicetype = urn:schemas-upnp-org:service:WANPPPConnection:2
- controlurl = /87895a19/upnp/control/WANIPConn1
- eventsuburl = /87895a19/upnp/control/WANIPConn1
- scpdurl = /87895a19/gateconnSCPD_PPP.xml
-
-IPv6FC:
- servicetype = urn:schemas-upnp-org:service:WANIPv6FirewallControl:1
- controlurl = /87895a19/upnp/control/WANIPv6FwCtrl1
- eventsuburl = /87895a19/upnp/control/WANIPv6FwCtrl1
- scpdurl = /87895a19/wanipv6fwctrlSCPD.xml
-
diff --git a/external/miniupnpc/testdesc/new_LiveBox_desc.xml b/external/miniupnpc/testdesc/new_LiveBox_desc.xml
deleted file mode 100644
index 620eb55af..000000000
--- a/external/miniupnpc/testdesc/new_LiveBox_desc.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0"?>
-<root xmlns="urn:schemas-upnp-org:device-1-0">
- <specVersion>
- <major>1</major>
- <minor>0</minor>
- </specVersion>
- <device>
- <pnpx:X_hardwareId xmlns:pnpx="http://schemas.microsoft.com/windows/pnpx/2005/11">VEN_0129&amp;DEV_0000&amp;SUBSYS_03&amp;REV_250417</pnpx:X_hardwareId>
- <pnpx:X_compatibleId xmlns:pnpx="http://schemas.microsoft.com/windows/pnpx/2005/11">GenericUmPass</pnpx:X_compatibleId>
- <pnpx:X_deviceCategory xmlns:pnpx="http://schemas.microsoft.com/windows/pnpx/2005/11">NetworkInfrastructure.Gateway</pnpx:X_deviceCategory>
- <df:X_deviceCategory xmlns:df="http://schemas.microsoft.com/windows/2008/09/devicefoundation">Network.Gateway</df:X_deviceCategory>
- <deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:2</deviceType>
- <friendlyName>Orange Livebox</friendlyName>
- <manufacturer>Sagemcom</manufacturer>
- <manufacturerURL>http://www.sagemcom.com/</manufacturerURL>
- <modelName>Residential Livebox,(DSL,WAN Ethernet)</modelName>
- <UDN>uuid:87895a19-50f9-3736-a87f-115c230155f8</UDN>
- <modelDescription>Sagemcom,fr,SG30_sip-fr-4.28.35.1</modelDescription>
- <modelNumber>3</modelNumber>
- <serialNumber>LK14129DP441489</serialNumber>
- <presentationURL>http://192.168.1.1</presentationURL>
- <UPC></UPC>
- <iconList>
- <icon>
- <mimetype>image/png</mimetype>
- <width>16</width>
- <height>16</height>
- <depth>8</depth>
- <url>/87895a19/ligd.png</url>
- </icon>
- </iconList>
- <deviceList>
- <device>
- <deviceType>urn:schemas-upnp-org:device:WANDevice:2</deviceType>
- <friendlyName>WANDevice</friendlyName>
- <manufacturer>Sagemcom</manufacturer>
- <manufacturerURL>http://www.sagemcom.com/</manufacturerURL>
- <modelDescription>WAN Device on Sagemcom,fr,SG30_sip-fr-4.28.35.1</modelDescription>
- <modelName>Residential Livebox,(DSL,WAN Ethernet)</modelName>
- <modelNumber>3</modelNumber>
- <modelURL>http://www.sagemcom.com/</modelURL>
- <serialNumber>LK14129DP441489</serialNumber>
- <presentationURL>http://192.168.1.1</presentationURL>
- <UDN>uuid:e2397374-53d8-3fc6-8306-593ba1a34625</UDN>
- <UPC></UPC>
- <serviceList>
- <service>
- <serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType>
- <serviceId>urn:upnp-org:serviceId:WANCommonIFC1</serviceId>
- <controlURL>/87895a19/upnp/control/WANCommonIFC1</controlURL>
- <eventSubURL>/87895a19/upnp/control/WANCommonIFC1</eventSubURL>
- <SCPDURL>/87895a19/gateicfgSCPD.xml</SCPDURL>
- </service>
- </serviceList>
- <deviceList>
- <device>
- <deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:2</deviceType>
- <friendlyName>WANConnectionDevice</friendlyName>
- <manufacturer>Sagemcom</manufacturer>
- <manufacturerURL>http://www.sagemcom.com/</manufacturerURL>
- <modelDescription>WanConnectionDevice on Sagemcom,fr,SG30_sip-fr-4.28.35.1</modelDescription>
- <modelName>Residential Livebox,(DSL,WAN Ethernet)</modelName>
- <modelNumber>3</modelNumber>
- <modelURL>http://www.sagemcom.com/</modelURL>
- <serialNumber>LK14129DP441489</serialNumber>
- <presentationURL>http://192.168.1.1</presentationURL>
- <UDN>uuid:44598a08-288e-32c9-8a4d-d3c008ede331</UDN>
- <UPC></UPC>
- <serviceList>
- <service>
- <serviceType>urn:schemas-upnp-org:service:WANPPPConnection:2</serviceType>
- <serviceId>urn:upnp-org:serviceId:WANIPConn1</serviceId>
- <controlURL>/87895a19/upnp/control/WANIPConn1</controlURL>
- <eventSubURL>/87895a19/upnp/control/WANIPConn1</eventSubURL>
- <SCPDURL>/87895a19/gateconnSCPD_PPP.xml</SCPDURL>
- </service>
- <service>
- <serviceType>urn:schemas-upnp-org:service:WANIPv6FirewallControl:1</serviceType>
- <serviceId>urn:upnp-org:serviceId:WANIPv6FwCtrl1</serviceId>
- <controlURL>/87895a19/upnp/control/WANIPv6FwCtrl1</controlURL>
- <eventSubURL>/87895a19/upnp/control/WANIPv6FwCtrl1</eventSubURL>
- <SCPDURL>/87895a19/wanipv6fwctrlSCPD.xml</SCPDURL>
- </service>
- </serviceList>
- </device>
- </deviceList>
- </device>
- </deviceList>
- </device>
-</root> \ No newline at end of file
diff --git a/external/miniupnpc/testigddescparse.c b/external/miniupnpc/testigddescparse.c
deleted file mode 100644
index cb7e94ad6..000000000
--- a/external/miniupnpc/testigddescparse.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/* $Id: testigddescparse.c,v 1.8 2015/02/08 08:46:06 nanard Exp $ */
-/* Project : miniupnp
- * http://miniupnp.free.fr/
- * Author : Thomas Bernard
- * Copyright (c) 2008-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 "igd_desc_parse.h"
-#include "minixml.h"
-#include "miniupnpc.h"
-
-/* count number of differences */
-int compare_service(struct IGDdatas_service * s, FILE * f)
-{
- int n = 0;
- char line[1024];
-
- while(fgets(line, sizeof(line), f)) {
- char * value;
- char * equal;
- char * name;
- char * parsedvalue;
- int l;
- l = strlen(line);
- while((l > 0) && ((line[l-1] == '\r') || (line[l-1] == '\n') || (line[l-1] == ' ')))
- line[--l] = '\0';
- if(l == 0)
- break; /* end on blank line */
- if(line[0] == '#')
- continue; /* skip comments */
- equal = strchr(line, '=');
- if(equal == NULL) {
- fprintf(stderr, "Warning, line does not contain '=' : %s\n", line);
- continue;
- }
- *equal = '\0';
- name = line;
- while(*name == ' ' || *name == '\t')
- name++;
- l = strlen(name);
- while((l > 0) && (name[l-1] == ' ' || name[l-1] == '\t'))
- name[--l] = '\0';
- value = equal + 1;
- while(*value == ' ' || *value == '\t')
- value++;
- if(strcmp(name, "controlurl") == 0)
- parsedvalue = s->controlurl;
- else if(strcmp(name, "eventsuburl") == 0)
- parsedvalue = s->eventsuburl;
- else if(strcmp(name, "scpdurl") == 0)
- parsedvalue = s->scpdurl;
- else if(strcmp(name, "servicetype") == 0)
- parsedvalue = s->servicetype;
- else {
- fprintf(stderr, "unknown field '%s'\n", name);
- continue;
- }
- if(0 != strcmp(parsedvalue, value)) {
- fprintf(stderr, "difference : '%s' != '%s'\n", parsedvalue, value);
- n++;
- }
- }
- return n;
-}
-
-int compare_igd(struct IGDdatas * p, FILE * f)
-{
- int n = 0;
- char line[1024];
- struct IGDdatas_service * s;
-
- while(fgets(line, sizeof(line), f)) {
- char * colon;
- int l = (int)strlen(line);
- while((l > 0) && (line[l-1] == '\r' || (line[l-1] == '\n')))
- line[--l] = '\0';
- if(l == 0 || line[0] == '#')
- continue; /* skip blank lines and comments */
- colon = strchr(line, ':');
- if(colon == NULL) {
- fprintf(stderr, "Warning, no ':' : %s\n", line);
- continue;
- }
- s = NULL;
- *colon = '\0';
- if(strcmp(line, "CIF") == 0)
- s = &p->CIF;
- else if(strcmp(line, "first") == 0)
- s = &p->first;
- else if(strcmp(line, "second") == 0)
- s = &p->second;
- else if(strcmp(line, "IPv6FC") == 0)
- s = &p->IPv6FC;
- else {
- s = NULL;
- fprintf(stderr, "*** unknown service '%s' ***\n", line);
- n++;
- continue;
- }
- n += compare_service(s, f);
- }
- if(n > 0)
- fprintf(stderr, "*** %d difference%s ***\n", n, (n > 1) ? "s" : "");
- return n;
-}
-
-int test_igd_desc_parse(char * buffer, int len, FILE * f)
-{
- int n;
- struct IGDdatas igd;
- struct xmlparser parser;
- struct UPNPUrls urls;
-
- memset(&igd, 0, sizeof(struct IGDdatas));
- memset(&parser, 0, sizeof(struct xmlparser));
- parser.xmlstart = buffer;
- parser.xmlsize = len;
- parser.data = &igd;
- parser.starteltfunc = IGDstartelt;
- parser.endeltfunc = IGDendelt;
- parser.datafunc = IGDdata;
- parsexml(&parser);
-#ifdef DEBUG
- printIGD(&igd);
-#endif /* DEBUG */
- GetUPNPUrls(&urls, &igd, "http://fake/desc/url/file.xml", 0);
- printf("ipcondescURL='%s'\n", urls.ipcondescURL);
- printf("controlURL='%s'\n", urls.controlURL);
- printf("controlURL_CIF='%s'\n", urls.controlURL_CIF);
- n = f ? compare_igd(&igd, f) : 0;
- FreeUPNPUrls(&urls);
- return n;
-}
-
-int main(int argc, char * * argv)
-{
- FILE * f;
- char * buffer;
- int len;
- int r;
- if(argc<2) {
- fprintf(stderr, "Usage: %s file.xml [file.values]\n", argv[0]);
- return 1;
- }
- f = fopen(argv[1], "r");
- if(!f) {
- fprintf(stderr, "Cannot open %s for reading.\n", argv[1]);
- return 1;
- }
- fseek(f, 0, SEEK_END);
- len = ftell(f);
- fseek(f, 0, SEEK_SET);
- buffer = malloc(len);
- if(!buffer) {
- fprintf(stderr, "Memory allocation error.\n");
- fclose(f);
- return 1;
- }
- r = (int)fread(buffer, 1, len, f);
- if(r != len) {
- fprintf(stderr, "Failed to read file %s. %d out of %d bytes.\n",
- argv[1], r, len);
- fclose(f);
- free(buffer);
- return 1;
- }
- fclose(f);
- f = NULL;
- if(argc > 2) {
- f = fopen(argv[2], "r");
- if(!f) {
- fprintf(stderr, "Cannot open %s for reading.\n", argv[2]);
- free(buffer);
- return 1;
- }
- }
- r = test_igd_desc_parse(buffer, len, f);
- free(buffer);
- if(f)
- fclose(f);
- return r;
-}
-
diff --git a/external/miniupnpc/testminiwget.c b/external/miniupnpc/testminiwget.c
deleted file mode 100644
index 5eb49ec1c..000000000
--- a/external/miniupnpc/testminiwget.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $Id: testminiwget.c,v 1.5 2016/01/24 17:24:36 nanard Exp $ */
-/* Project : miniupnp
- * Author : Thomas Bernard
- * Copyright (c) 2005-2016 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 "miniwget.h"
-
-/**
- * This program uses the miniwget / miniwget_getaddr function
- * from miniwget.c in order to retreive a web ressource using
- * a GET HTTP method, and store it in a file.
- */
-int main(int argc, char * * argv)
-{
- void * data;
- int size, writtensize;
- FILE *f;
- char addr[64];
- int status_code = -1;
-
- if(argc < 3) {
- fprintf(stderr, "Usage:\t%s url file\n", argv[0]);
- fprintf(stderr, "Example:\t%s http://www.google.com/ out.html\n", argv[0]);
- return 1;
- }
- data = miniwget_getaddr(argv[1], &size, addr, sizeof(addr), 0, &status_code);
- if(!data || (status_code != 200)) {
- if(data) free(data);
- fprintf(stderr, "Error %d fetching %s\n", status_code, argv[1]);
- return 1;
- }
- printf("local address : %s\n", addr);
- printf("got %d bytes\n", size);
- f = fopen(argv[2], "wb");
- if(!f) {
- fprintf(stderr, "Cannot open file %s for writing\n", argv[2]);
- free(data);
- return 1;
- }
- writtensize = fwrite(data, 1, size, f);
- if(writtensize != size) {
- fprintf(stderr, "Could only write %d bytes out of %d to %s\n",
- writtensize, size, argv[2]);
- } else {
- printf("%d bytes written to %s\n", writtensize, argv[2]);
- }
- fclose(f);
- free(data);
- return 0;
-}
-
diff --git a/external/miniupnpc/testminiwget.sh b/external/miniupnpc/testminiwget.sh
deleted file mode 100755
index 690b4056f..000000000
--- a/external/miniupnpc/testminiwget.sh
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/bin/sh
-# $Id: testminiwget.sh,v 1.13 2015/09/03 17:57:44 nanard Exp $
-# project miniupnp : http://miniupnp.free.fr/
-# (c) 2011-2015 Thomas Bernard
-#
-# test program for miniwget.c
-# is usually invoked by "make check"
-#
-# This test program :
-# 1 - launches a local HTTP server (minihttptestserver)
-# 2 - uses testminiwget to retreive data from this server
-# 3 - compares served and received data
-# 4 - kills the local HTTP server and exits
-#
-# The script was tested and works with ksh, bash
-# it should now also run with dash
-
-TMPD=`mktemp -d -t miniwgetXXXXXXXXXX`
-HTTPSERVEROUT="${TMPD}/httpserverout"
-EXPECTEDFILE="${TMPD}/expectedfile"
-DOWNLOADEDFILE="${TMPD}/downloadedfile"
-PORT=
-RET=0
-
-case "$HAVE_IPV6" in
- n|no|0)
- ADDR=localhost
- SERVERARGS=""
- ;;
- *)
- ADDR="[::1]"
- SERVERARGS="-6"
- ;;
-
-esac
-
-#make minihttptestserver
-#make testminiwget
-
-# launching the test HTTP server
-./minihttptestserver $SERVERARGS -e $EXPECTEDFILE > $HTTPSERVEROUT &
-SERVERPID=$!
-while [ -z "$PORT" ]; do
- sleep 1
- PORT=`cat $HTTPSERVEROUT | sed 's/Listening on port \([0-9]*\)/\1/' `
-done
-echo "Test HTTP server is listening on $PORT"
-
-URL1="http://$ADDR:$PORT/index.html"
-URL2="http://$ADDR:$PORT/chunked"
-URL3="http://$ADDR:$PORT/addcrap"
-
-echo "standard test ..."
-./testminiwget $URL1 "${DOWNLOADEDFILE}.1"
-if cmp $EXPECTEDFILE "${DOWNLOADEDFILE}.1" ; then
- echo "ok"
-else
- echo "standard test FAILED"
- RET=1
-fi
-
-echo "chunked transfert encoding test ..."
-./testminiwget $URL2 "${DOWNLOADEDFILE}.2"
-if cmp $EXPECTEDFILE "${DOWNLOADEDFILE}.2" ; then
- echo "ok"
-else
- echo "chunked transfert encoding test FAILED"
- RET=1
-fi
-
-echo "response too long test ..."
-./testminiwget $URL3 "${DOWNLOADEDFILE}.3"
-if cmp $EXPECTEDFILE "${DOWNLOADEDFILE}.3" ; then
- echo "ok"
-else
- echo "response too long test FAILED"
- RET=1
-fi
-
-# kill the test HTTP server
-kill $SERVERPID
-wait $SERVERPID
-
-# remove temporary files (for success cases)
-if [ $RET -eq 0 ]; then
- rm -f "${DOWNLOADEDFILE}.1"
- rm -f "${DOWNLOADEDFILE}.2"
- rm -f "${DOWNLOADEDFILE}.3"
- rm -f $EXPECTEDFILE $HTTPSERVEROUT
- rmdir ${TMPD}
-else
- echo "at least one of the test FAILED"
- echo "directory ${TMPD} is left intact"
-fi
-exit $RET
-
diff --git a/external/miniupnpc/testminixml.c b/external/miniupnpc/testminixml.c
deleted file mode 100644
index 57c4a85eb..000000000
--- a/external/miniupnpc/testminixml.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* $Id: testminixml.c,v 1.10 2014/11/17 17:19:13 nanard Exp $
- * MiniUPnP project
- * Website : http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
- * Author : Thomas Bernard.
- * Copyright (c) 2005-2014 Thomas Bernard
- *
- * testminixml.c
- * test program for the "minixml" functions.
- */
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include "minixml.h"
-#include "igd_desc_parse.h"
-
-/* ---------------------------------------------------------------------- */
-void printeltname1(void * d, const char * name, int l)
-{
- int i;
- (void)d;
- printf("element ");
- for(i=0;i<l;i++)
- putchar(name[i]);
-}
-void printeltname2(void * d, const char * name, int l)
-{
- int i;
- (void)d;
- putchar('/');
- for(i=0;i<l;i++)
- putchar(name[i]);
- putchar('\n');
-}
-void printdata(void *d, const char * data, int l)
-{
- int i;
- (void)d;
- printf("data : ");
- for(i=0;i<l;i++)
- putchar(data[i]);
- putchar('\n');
-}
-
-void burptest(const char * buffer, int bufsize)
-{
- struct IGDdatas data;
- struct xmlparser parser;
- /*objet IGDdatas */
- memset(&data, 0, sizeof(struct IGDdatas));
- /* objet xmlparser */
- parser.xmlstart = buffer;
- parser.xmlsize = bufsize;
- parser.data = &data;
- /*parser.starteltfunc = printeltname1;
- parser.endeltfunc = printeltname2;
- parser.datafunc = printdata; */
- parser.starteltfunc = IGDstartelt;
- parser.endeltfunc = IGDendelt;
- parser.datafunc = IGDdata;
- parsexml(&parser);
-#ifdef DEBUG
- printIGD(&data);
-#endif /* DEBUG */
-}
-
-/* ----- main ---- */
-#define XML_MAX_SIZE (8192)
-int main(int argc, char * * argv)
-{
- FILE * f;
- char buffer[XML_MAX_SIZE];
- int bufsize;
- if(argc<2)
- {
- printf("usage:\t%s file.xml\n", argv[0]);
- return 1;
- }
- f = fopen(argv[1], "r");
- if(!f)
- {
- printf("cannot open file %s\n", argv[1]);
- return 1;
- }
- bufsize = (int)fread(buffer, 1, XML_MAX_SIZE, f);
- fclose(f);
- burptest(buffer, bufsize);
- return 0;
-}
-
diff --git a/external/miniupnpc/testportlistingparse.c b/external/miniupnpc/testportlistingparse.c
deleted file mode 100644
index bd9247dca..000000000
--- a/external/miniupnpc/testportlistingparse.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/* $Id: testportlistingparse.c,v 1.2 2014/11/01 10:37:32 nanard Exp $ */
-/* Project : miniupnp
- * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
- * Author : Thomas Bernard
- * Copyright (c) 2014 Thomas Bernard
- * This software is subject to the conditions detailed in the
- * LICENCE file provided in this distribution.
- * */
-
-#include <string.h>
-#include <stdio.h>
-#include "portlistingparse.h"
-
-struct port_mapping {
- unsigned int leasetime;
- unsigned short externalport;
- unsigned short internalport;
- const char * remotehost;
- const char * client;
- const char * proto;
- const char * desc;
- unsigned char enabled;
-};
-
-/* return the number of differences */
-int test(const char * portListingXml, int portListingXmlLen,
- const struct port_mapping * ref, int count)
-{
- int i;
- int r = 0;
- struct PortMappingParserData data;
- struct PortMapping * pm;
-
- memset(&data, 0, sizeof(data));
- ParsePortListing(portListingXml, portListingXmlLen, &data);
- for(i = 0, pm = data.l_head;
- (pm != NULL) && (i < count);
- i++, pm = pm->l_next) {
- printf("%2d %s %5hu->%s:%-5hu '%s' '%s' %u\n",
- i, pm->protocol, pm->externalPort, pm->internalClient,
- pm->internalPort,
- pm->description, pm->remoteHost,
- (unsigned)pm->leaseTime);
- if(0 != strcmp(pm->protocol, ref[i].proto)) {
- printf("protocol : '%s' != '%s'\n", pm->protocol, ref[i].proto);
- r++;
- }
- if(pm->externalPort != ref[i].externalport) {
- printf("externalPort : %hu != %hu\n",
- pm->externalPort, ref[i].externalport);
- r++;
- }
- if(0 != strcmp(pm->internalClient, ref[i].client)) {
- printf("client : '%s' != '%s'\n",
- pm->internalClient, ref[i].client);
- r++;
- }
- if(pm->internalPort != ref[i].internalport) {
- printf("internalPort : %hu != %hu\n",
- pm->internalPort, ref[i].internalport);
- r++;
- }
- if(0 != strcmp(pm->description, ref[i].desc)) {
- printf("description : '%s' != '%s'\n",
- pm->description, ref[i].desc);
- r++;
- }
- if(0 != strcmp(pm->remoteHost, ref[i].remotehost)) {
- printf("remoteHost : '%s' != '%s'\n",
- pm->remoteHost, ref[i].remotehost);
- r++;
- }
- if((unsigned)pm->leaseTime != ref[i].leasetime) {
- printf("leaseTime : %u != %u\n",
- (unsigned)pm->leaseTime, ref[i].leasetime);
- r++;
- }
- if(pm->enabled != ref[i].enabled) {
- printf("enabled : %d != %d\n",
- (int)pm->enabled, (int)ref[i].enabled);
- r++;
- }
- }
- if((i != count) || (pm != NULL)) {
- printf("count mismatch : i=%d count=%d pm=%p\n", i, count, pm);
- r++;
- }
- FreePortListing(&data);
- return r;
-}
-
-const char test_document[] =
-"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
-"<p:PortMappingList xmlns:p=\"urn:schemas-upnp-org:gw:WANIPConnection\"\n"
-"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n"
-"xsi:schemaLocation=\"urn:schemas-upnp-org:gw:WANIPConnection "
-"http://www.upnp.org/schemas/gw/WANIPConnection-v2.xsd\">\n"
-" <p:PortMappingEntry>\n"
-" <p:NewRemoteHost></p:NewRemoteHost>\n"
-" <p:NewExternalPort>5002</p:NewExternalPort>\n"
-" <p:NewProtocol>UDP</p:NewProtocol>\n"
-" <p:NewInternalPort>4001</p:NewInternalPort>\n"
-" <p:NewInternalClient>192.168.1.123</p:NewInternalClient>\n"
-" <p:NewEnabled>1</p:NewEnabled>\n"
-" <p:NewDescription>xxx</p:NewDescription>\n"
-" <p:NewLeaseTime>0</p:NewLeaseTime>\n"
-" </p:PortMappingEntry>\n"
-" <p:PortMappingEntry>\n"
-" <p:NewRemoteHost>202.233.2.1</p:NewRemoteHost>\n"
-" <p:NewExternalPort>2345</p:NewExternalPort>\n"
-" <p:NewProtocol>TCP</p:NewProtocol>\n"
-" <p:NewInternalPort>2349</p:NewInternalPort>\n"
-" <p:NewInternalClient>192.168.1.137</p:NewInternalClient>\n"
-" <p:NewEnabled>1</p:NewEnabled>\n"
-" <p:NewDescription>dooom</p:NewDescription>\n"
-" <p:NewLeaseTime>346</p:NewLeaseTime>\n"
-" </p:PortMappingEntry>\n"
-" <p:PortMappingEntry>\n"
-" <p:NewRemoteHost>134.231.2.11</p:NewRemoteHost>\n"
-" <p:NewExternalPort>12345</p:NewExternalPort>\n"
-" <p:NewProtocol>TCP</p:NewProtocol>\n"
-" <p:NewInternalPort>12345</p:NewInternalPort>\n"
-" <p:NewInternalClient>192.168.1.137</p:NewInternalClient>\n"
-" <p:NewEnabled>1</p:NewEnabled>\n"
-" <p:NewDescription>dooom A</p:NewDescription>\n"
-" <p:NewLeaseTime>347</p:NewLeaseTime>\n"
-" </p:PortMappingEntry>\n"
-"</p:PortMappingList>";
-
-#define PORT_MAPPINGS_COUNT 3
-const struct port_mapping port_mappings[PORT_MAPPINGS_COUNT] = {
-{347, 12345, 12345, "134.231.2.11", "192.168.1.137", "TCP", "dooom A", 1},
-{346, 2345, 2349, "202.233.2.1", "192.168.1.137", "TCP", "dooom", 1},
-{0, 5002, 4001, "", "192.168.1.123", "UDP", "xxx", 1}
-};
-
-/* --- main --- */
-int main(void)
-{
- int r;
- r = test(test_document, sizeof(test_document) - 1,
- port_mappings, PORT_MAPPINGS_COUNT);
- if(r == 0) {
- printf("test of portlistingparse OK\n");
- return 0;
- } else {
- printf("test FAILED (%d differences counted)\n", r);
- return 1;
- }
-}
-
diff --git a/external/miniupnpc/testreplyparse/DeletePortMapping.namevalue b/external/miniupnpc/testreplyparse/DeletePortMapping.namevalue
deleted file mode 100644
index 48ca0cccb..000000000
--- a/external/miniupnpc/testreplyparse/DeletePortMapping.namevalue
+++ /dev/null
@@ -1,3 +0,0 @@
-NewRemoteHost=
-NewExternalPort=123
-NewProtocol=TCP
diff --git a/external/miniupnpc/testreplyparse/DeletePortMapping.xml b/external/miniupnpc/testreplyparse/DeletePortMapping.xml
deleted file mode 100644
index a955c53fc..000000000
--- a/external/miniupnpc/testreplyparse/DeletePortMapping.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?>
-<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:DeletePortMapping xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewRemoteHost></NewRemoteHost><NewExternalPort>123</NewExternalPort>
-<NewProtocol>TCP</NewProtocol></u:DeletePortMapping></s:Body>
-
-</s:Envelope>
-
diff --git a/external/miniupnpc/testreplyparse/GetExternalIPAddress.namevalue b/external/miniupnpc/testreplyparse/GetExternalIPAddress.namevalue
deleted file mode 100644
index 5aa75f882..000000000
--- a/external/miniupnpc/testreplyparse/GetExternalIPAddress.namevalue
+++ /dev/null
@@ -1,2 +0,0 @@
-NewExternalIPAddress=1.2.3.4
-
diff --git a/external/miniupnpc/testreplyparse/GetExternalIPAddress.xml b/external/miniupnpc/testreplyparse/GetExternalIPAddress.xml
deleted file mode 100644
index db7ec1f9c..000000000
--- a/external/miniupnpc/testreplyparse/GetExternalIPAddress.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetExternalIPAddressResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewExternalIPAddress>1.2.3.4</NewExternalIPAddress></u:GetExternalIPAddressResponse></s:Body></s:Envelope>
-
diff --git a/external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryReq.namevalue b/external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryReq.namevalue
deleted file mode 100644
index 26b169c35..000000000
--- a/external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryReq.namevalue
+++ /dev/null
@@ -1,3 +0,0 @@
-NewProtocol=UDP
-NewExternalPort=12345
-NewRemoteHost=
diff --git a/external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryReq.xml b/external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryReq.xml
deleted file mode 100644
index bbb540eac..000000000
--- a/external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryReq.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0"?>
-<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetSpecificPortMappingEntry xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewRemoteHost></NewRemoteHost><NewExternalPort>12345</NewExternalPort><NewProtocol>UDP</NewProtocol></u:GetSpecificPortMappingEntry></s:Body></s:Envelope>
-
diff --git a/external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryResp.namevalue b/external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryResp.namevalue
deleted file mode 100644
index 2189789b4..000000000
--- a/external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryResp.namevalue
+++ /dev/null
@@ -1,5 +0,0 @@
-NewInternalPort=12345
-NewInternalClient=192.168.10.110
-NewEnabled=1
-NewPortMappingDescription=libminiupnpc
-NewLeaseDuration=0
diff --git a/external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryResp.xml b/external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryResp.xml
deleted file mode 100644
index 77e8d9c7c..000000000
--- a/external/miniupnpc/testreplyparse/GetSpecificPortMappingEntryResp.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetSpecificPortMappingEntryResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewInternalPort>12345</NewInternalPort><NewInternalClient>192.168.10.110</NewInternalClient><NewEnabled>1</NewEnabled><NewPortMappingDescription>libminiupnpc</NewPortMappingDescription><NewLeaseDuration>0</NewLeaseDuration></u:GetSpecificPortMappingEntryResponse></s:Body></s:Envelope>
-
diff --git a/external/miniupnpc/testreplyparse/SetDefaultConnectionService.namevalue b/external/miniupnpc/testreplyparse/SetDefaultConnectionService.namevalue
deleted file mode 100644
index f78c7e2ae..000000000
--- a/external/miniupnpc/testreplyparse/SetDefaultConnectionService.namevalue
+++ /dev/null
@@ -1 +0,0 @@
-NewDefaultConnectionService=uuid:c6c05a33-f704-48df-9910-e099b3471d81:WANConnectionDevice:1,INVALID_SERVICE_ID
diff --git a/external/miniupnpc/testreplyparse/SetDefaultConnectionService.xml b/external/miniupnpc/testreplyparse/SetDefaultConnectionService.xml
deleted file mode 100644
index ac04c07a9..000000000
--- a/external/miniupnpc/testreplyparse/SetDefaultConnectionService.xml
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><u:SetDefaultConnectionService xmlns:u="urn:schemas-upnp-org:service:Layer3Forwarding:1"><NewDefaultConnectionService>uuid:c6c05a33-f704-48df-9910-e099b3471d81:WANConnectionDevice:1,INVALID_SERVICE_ID</NewDefaultConnectionService></u:SetDefaultConnectionService></s:Body></s:Envelope>
diff --git a/external/miniupnpc/testreplyparse/readme.txt b/external/miniupnpc/testreplyparse/readme.txt
deleted file mode 100644
index 3eb1f015f..000000000
--- a/external/miniupnpc/testreplyparse/readme.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-This directory contains files used for validation of upnpreplyparse.c code.
-
-Each .xml file to parse should give the results which are in the .namevalue
-file.
-
-A .namevalue file contain name=value lines.
-
diff --git a/external/miniupnpc/testupnpigd.py b/external/miniupnpc/testupnpigd.py
deleted file mode 100755
index 33019bd99..000000000
--- a/external/miniupnpc/testupnpigd.py
+++ /dev/null
@@ -1,88 +0,0 @@
-#! /usr/bin/python
-# $Id: testupnpigd.py,v 1.4 2008/10/11 10:27:20 nanard Exp $
-# MiniUPnP project
-# Author : Thomas Bernard
-# This Sample code is public domain.
-# website : http://miniupnp.tuxfamily.org/
-
-# import the python miniupnpc module
-import miniupnpc
-import socket
-
-try:
- from http.server import BaseHTTPRequestHandler, HTTPServer
-except ImportError:
- from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
-
-# function definition
-def list_redirections():
- i = 0
- while True:
- p = u.getgenericportmapping(i)
- if p==None:
- break
- print(i, p)
- i = i + 1
-
-#define the handler class for HTTP connections
-class handler_class(BaseHTTPRequestHandler):
- def do_GET(self):
- self.send_response(200)
- self.end_headers()
- self.wfile.write("OK MON GARS")
-
-# create the object
-u = miniupnpc.UPnP()
-#print 'inital(default) values :'
-#print ' discoverdelay', u.discoverdelay
-#print ' lanaddr', u.lanaddr
-#print ' multicastif', u.multicastif
-#print ' minissdpdsocket', u.minissdpdsocket
-u.discoverdelay = 200;
-
-try:
- print('Discovering... delay=%ums' % u.discoverdelay)
- ndevices = u.discover()
- print(ndevices, 'device(s) detected')
-
- # select an igd
- u.selectigd()
- # display information about the IGD and the internet connection
- print('local ip address :', u.lanaddr)
- externalipaddress = u.externalipaddress()
- print('external ip address :', externalipaddress)
- print(u.statusinfo(), u.connectiontype())
-
- #instanciate a HTTPd object. The port is assigned by the system.
- httpd = HTTPServer((u.lanaddr, 0), handler_class)
- eport = httpd.server_port
-
- # find a free port for the redirection
- r = u.getspecificportmapping(eport, 'TCP')
- while r != None and eport < 65536:
- eport = eport + 1
- r = u.getspecificportmapping(eport, 'TCP')
-
- print('trying to redirect %s port %u TCP => %s port %u TCP' % (externalipaddress, eport, u.lanaddr, httpd.server_port))
-
- b = u.addportmapping(eport, 'TCP', u.lanaddr, httpd.server_port,
- 'UPnP IGD Tester port %u' % eport, '')
- if b:
- print('Success. Now waiting for some HTTP request on http://%s:%u' % (externalipaddress ,eport))
- try:
- httpd.handle_request()
- httpd.server_close()
- except KeyboardInterrupt as details:
- print("CTRL-C exception!", details)
- b = u.deleteportmapping(eport, 'TCP')
- if b:
- print('Successfully deleted port mapping')
- else:
- print('Failed to remove port mapping')
- else:
- print('Failed')
-
- httpd.server_close()
-
-except Exception as e:
- print('Exception :', e)
diff --git a/external/miniupnpc/testupnpreplyparse.c b/external/miniupnpc/testupnpreplyparse.c
deleted file mode 100644
index 7ba7131ea..000000000
--- a/external/miniupnpc/testupnpreplyparse.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/* $Id: testupnpreplyparse.c,v 1.4 2014/01/27 11:45:19 nanard Exp $ */
-/* MiniUPnP project
- * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
- * (c) 2006-2014 Thomas Bernard
- * This software is subject to the conditions detailed
- * in the LICENCE file provided within the distribution */
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include "upnpreplyparse.h"
-
-int
-test_parsing(const char * buf, int len, FILE * f)
-{
- char line[1024];
- struct NameValueParserData pdata;
- int ok = 1;
- ParseNameValue(buf, len, &pdata);
- /* check result */
- if(f != NULL)
- {
- while(fgets(line, sizeof(line), f))
- {
- char * value;
- char * equal;
- char * parsedvalue;
- int l;
- l = strlen(line);
- while((l > 0) && ((line[l-1] == '\r') || (line[l-1] == '\n')))
- line[--l] = '\0';
- /* skip empty lines */
- if(l == 0)
- continue;
- equal = strchr(line, '=');
- if(equal == NULL)
- {
- fprintf(stderr, "Warning, line does not contain '=' : %s\n", line);
- continue;
- }
- *equal = '\0';
- value = equal + 1;
- parsedvalue = GetValueFromNameValueList(&pdata, line);
- if((parsedvalue == NULL) || (strcmp(parsedvalue, value) != 0))
- {
- fprintf(stderr, "Element <%s> : expecting value '%s', got '%s'\n",
- line, value, parsedvalue ? parsedvalue : "<null string>");
- ok = 0;
- }
- }
- }
- ClearNameValueList(&pdata);
- return ok;
-}
-
-int main(int argc, char * * argv)
-{
- FILE * f;
- char buffer[4096];
- int l;
- int ok;
-
- if(argc<2)
- {
- fprintf(stderr, "Usage: %s file.xml [file.namevalues]\n", argv[0]);
- return 1;
- }
- f = fopen(argv[1], "r");
- if(!f)
- {
- fprintf(stderr, "Error : can not open file %s\n", argv[1]);
- return 2;
- }
- l = fread(buffer, 1, sizeof(buffer)-1, f);
- fclose(f);
- f = NULL;
- buffer[l] = '\0';
- if(argc > 2)
- {
- f = fopen(argv[2], "r");
- if(!f)
- {
- fprintf(stderr, "Error : can not open file %s\n", argv[2]);
- return 2;
- }
- }
-#ifdef DEBUG
- DisplayNameValueList(buffer, l);
-#endif
- ok = test_parsing(buffer, l, f);
- if(f)
- {
- fclose(f);
- }
- return ok ? 0 : 3;
-}
-
diff --git a/external/miniupnpc/testupnpreplyparse.sh b/external/miniupnpc/testupnpreplyparse.sh
deleted file mode 100755
index 992930b7b..000000000
--- a/external/miniupnpc/testupnpreplyparse.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-
-for f in testreplyparse/*.xml ; do
- bf="`dirname $f`/`basename $f .xml`"
- if ./testupnpreplyparse $f $bf.namevalue ; then
- echo "$f : passed"
- else
- echo "$f : FAILED"
- exit 1
- fi
-done
-
-exit 0
-
diff --git a/external/miniupnpc/updateminiupnpcstrings.sh b/external/miniupnpc/updateminiupnpcstrings.sh
deleted file mode 100755
index dde4354a8..000000000
--- a/external/miniupnpc/updateminiupnpcstrings.sh
+++ /dev/null
@@ -1,53 +0,0 @@
-#! /bin/sh
-# $Id: updateminiupnpcstrings.sh,v 1.7 2011/01/04 11:41:53 nanard Exp $
-# project miniupnp : http://miniupnp.free.fr/
-# (c) 2009 Thomas Bernard
-
-FILE=miniupnpcstrings.h
-TMPFILE=miniupnpcstrings.h.tmp
-TEMPLATE_FILE=${FILE}.in
-
-# detecting the OS name and version
-OS_NAME=`uname -s`
-OS_VERSION=`uname -r`
-if [ -f /etc/debian_version ]; then
- OS_NAME=Debian
- OS_VERSION=`cat /etc/debian_version`
-fi
-# use lsb_release (Linux Standard Base) when available
-LSB_RELEASE=`which lsb_release`
-if [ 0 -eq $? -a -x "${LSB_RELEASE}" ]; then
- OS_NAME=`${LSB_RELEASE} -i -s`
- OS_VERSION=`${LSB_RELEASE} -r -s`
- case $OS_NAME in
- Debian)
- #OS_VERSION=`${LSB_RELEASE} -c -s`
- ;;
- Ubuntu)
- #OS_VERSION=`${LSB_RELEASE} -c -s`
- ;;
- esac
-fi
-
-# on AmigaOS 3, uname -r returns "unknown", so we use uname -v
-if [ "$OS_NAME" = "AmigaOS" ]; then
- if [ "$OS_VERSION" = "unknown" ]; then
- OS_VERSION=`uname -v`
- fi
-fi
-
-echo "Detected OS [$OS_NAME] version [$OS_VERSION]"
-MINIUPNPC_VERSION=`cat VERSION`
-echo "MiniUPnPc version [${MINIUPNPC_VERSION}]"
-
-EXPR="s|OS_STRING \".*\"|OS_STRING \"${OS_NAME}/${OS_VERSION}\"|"
-#echo $EXPR
-test -f ${FILE}.in
-echo "setting OS_STRING macro value to ${OS_NAME}/${OS_VERSION} in $FILE."
-sed -e "$EXPR" < $TEMPLATE_FILE > $TMPFILE
-
-EXPR="s|MINIUPNPC_VERSION_STRING \".*\"|MINIUPNPC_VERSION_STRING \"${MINIUPNPC_VERSION}\"|"
-echo "setting MINIUPNPC_VERSION_STRING macro value to ${MINIUPNPC_VERSION} in $FILE."
-sed -e "$EXPR" < $TMPFILE > $FILE
-rm $TMPFILE
-
diff --git a/external/miniupnpc/upnpc.c b/external/miniupnpc/upnpc.c
deleted file mode 100644
index e719ecec5..000000000
--- a/external/miniupnpc/upnpc.c
+++ /dev/null
@@ -1,857 +0,0 @@
-/* $Id: upnpc.c,v 1.117 2017/05/26 15:26:55 nanard Exp $ */
-/* Project : miniupnp
- * Author : Thomas Bernard
- * Copyright (c) 2005-2017 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 <time.h>
-#ifdef _WIN32
-#include <winsock2.h>
-#define snprintf _snprintf
-#else
-/* for IPPROTO_TCP / IPPROTO_UDP */
-#include <netinet/in.h>
-#endif
-#include <ctype.h>
-#include "miniwget.h"
-#include "miniupnpc.h"
-#include "upnpcommands.h"
-#include "upnperrors.h"
-#include "miniupnpcstrings.h"
-
-/* protofix() checks if protocol is "UDP" or "TCP"
- * returns NULL if not */
-const char * protofix(const char * proto)
-{
- static const char proto_tcp[4] = { 'T', 'C', 'P', 0};
- static const char proto_udp[4] = { 'U', 'D', 'P', 0};
- int i, b;
- for(i=0, b=1; i<4; i++)
- b = b && ( (proto[i] == proto_tcp[i])
- || (proto[i] == (proto_tcp[i] | 32)) );
- if(b)
- return proto_tcp;
- for(i=0, b=1; i<4; i++)
- b = b && ( (proto[i] == proto_udp[i])
- || (proto[i] == (proto_udp[i] | 32)) );
- if(b)
- return proto_udp;
- return 0;
-}
-
-/* is_int() checks if parameter is an integer or not
- * 1 for integer
- * 0 for not an integer */
-int is_int(char const* s)
-{
- if(s == NULL)
- return 0;
- while(*s) {
- /* #define isdigit(c) ((c) >= '0' && (c) <= '9') */
- if(!isdigit(*s))
- return 0;
- s++;
- }
- return 1;
-}
-
-static void DisplayInfos(struct UPNPUrls * urls,
- struct IGDdatas * data)
-{
- char externalIPAddress[40];
- char connectionType[64];
- char status[64];
- char lastconnerr[64];
- unsigned int uptime = 0;
- unsigned int brUp, brDown;
- time_t timenow, timestarted;
- int r;
- if(UPNP_GetConnectionTypeInfo(urls->controlURL,
- data->first.servicetype,
- connectionType) != UPNPCOMMAND_SUCCESS)
- printf("GetConnectionTypeInfo failed.\n");
- else
- printf("Connection Type : %s\n", connectionType);
- if(UPNP_GetStatusInfo(urls->controlURL, data->first.servicetype,
- status, &uptime, lastconnerr) != UPNPCOMMAND_SUCCESS)
- printf("GetStatusInfo failed.\n");
- else
- printf("Status : %s, uptime=%us, LastConnectionError : %s\n",
- status, uptime, lastconnerr);
- if(uptime > 0) {
- timenow = time(NULL);
- timestarted = timenow - uptime;
- printf(" Time started : %s", ctime(&timestarted));
- }
- if(UPNP_GetLinkLayerMaxBitRates(urls->controlURL_CIF, data->CIF.servicetype,
- &brDown, &brUp) != UPNPCOMMAND_SUCCESS) {
- printf("GetLinkLayerMaxBitRates failed.\n");
- } else {
- printf("MaxBitRateDown : %u bps", brDown);
- if(brDown >= 1000000) {
- printf(" (%u.%u Mbps)", brDown / 1000000, (brDown / 100000) % 10);
- } else if(brDown >= 1000) {
- printf(" (%u Kbps)", brDown / 1000);
- }
- printf(" MaxBitRateUp %u bps", brUp);
- if(brUp >= 1000000) {
- printf(" (%u.%u Mbps)", brUp / 1000000, (brUp / 100000) % 10);
- } else if(brUp >= 1000) {
- printf(" (%u Kbps)", brUp / 1000);
- }
- printf("\n");
- }
- r = UPNP_GetExternalIPAddress(urls->controlURL,
- data->first.servicetype,
- externalIPAddress);
- if(r != UPNPCOMMAND_SUCCESS) {
- printf("GetExternalIPAddress failed. (errorcode=%d)\n", r);
- } else {
- printf("ExternalIPAddress = %s\n", externalIPAddress);
- }
-}
-
-static void GetConnectionStatus(struct UPNPUrls * urls,
- struct IGDdatas * data)
-{
- unsigned int bytessent, bytesreceived, packetsreceived, packetssent;
- DisplayInfos(urls, data);
- bytessent = UPNP_GetTotalBytesSent(urls->controlURL_CIF, data->CIF.servicetype);
- bytesreceived = UPNP_GetTotalBytesReceived(urls->controlURL_CIF, data->CIF.servicetype);
- packetssent = UPNP_GetTotalPacketsSent(urls->controlURL_CIF, data->CIF.servicetype);
- packetsreceived = UPNP_GetTotalPacketsReceived(urls->controlURL_CIF, data->CIF.servicetype);
- printf("Bytes: Sent: %8u\tRecv: %8u\n", bytessent, bytesreceived);
- printf("Packets: Sent: %8u\tRecv: %8u\n", packetssent, packetsreceived);
-}
-
-static void ListRedirections(struct UPNPUrls * urls,
- struct IGDdatas * data)
-{
- int r;
- int i = 0;
- char index[6];
- char intClient[40];
- char intPort[6];
- char extPort[6];
- char protocol[4];
- char desc[80];
- char enabled[6];
- char rHost[64];
- char duration[16];
- /*unsigned int num=0;
- UPNP_GetPortMappingNumberOfEntries(urls->controlURL, data->servicetype, &num);
- printf("PortMappingNumberOfEntries : %u\n", num);*/
- printf(" i protocol exPort->inAddr:inPort description remoteHost leaseTime\n");
- do {
- snprintf(index, 6, "%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(urls->controlURL,
- data->first.servicetype,
- index,
- extPort, intClient, intPort,
- protocol, desc, enabled,
- rHost, duration);
- if(r==0)
- /*
- printf("%02d - %s %s->%s:%s\tenabled=%s leaseDuration=%s\n"
- " desc='%s' rHost='%s'\n",
- i, protocol, extPort, intClient, intPort,
- enabled, duration,
- desc, rHost);
- */
- printf("%2d %s %5s->%s:%-5s '%s' '%s' %s\n",
- i, protocol, extPort, intClient, intPort,
- desc, rHost, duration);
- else
- printf("GetGenericPortMappingEntry() returned %d (%s)\n",
- r, strupnperror(r));
- i++;
- } while(r==0);
-}
-
-static void NewListRedirections(struct UPNPUrls * urls,
- struct IGDdatas * data)
-{
- int r;
- int i = 0;
- struct PortMappingParserData pdata;
- struct PortMapping * pm;
-
- memset(&pdata, 0, sizeof(struct PortMappingParserData));
- r = UPNP_GetListOfPortMappings(urls->controlURL,
- data->first.servicetype,
- "0",
- "65535",
- "TCP",
- "1000",
- &pdata);
- if(r == UPNPCOMMAND_SUCCESS)
- {
- printf(" i protocol exPort->inAddr:inPort description remoteHost leaseTime\n");
- for(pm = pdata.l_head; pm != NULL; pm = pm->l_next)
- {
- printf("%2d %s %5hu->%s:%-5hu '%s' '%s' %u\n",
- i, pm->protocol, pm->externalPort, pm->internalClient,
- pm->internalPort,
- pm->description, pm->remoteHost,
- (unsigned)pm->leaseTime);
- i++;
- }
- FreePortListing(&pdata);
- }
- else
- {
- printf("GetListOfPortMappings() returned %d (%s)\n",
- r, strupnperror(r));
- }
- r = UPNP_GetListOfPortMappings(urls->controlURL,
- data->first.servicetype,
- "0",
- "65535",
- "UDP",
- "1000",
- &pdata);
- if(r == UPNPCOMMAND_SUCCESS)
- {
- for(pm = pdata.l_head; pm != NULL; pm = pm->l_next)
- {
- printf("%2d %s %5hu->%s:%-5hu '%s' '%s' %u\n",
- i, pm->protocol, pm->externalPort, pm->internalClient,
- pm->internalPort,
- pm->description, pm->remoteHost,
- (unsigned)pm->leaseTime);
- i++;
- }
- FreePortListing(&pdata);
- }
- else
- {
- printf("GetListOfPortMappings() returned %d (%s)\n",
- r, strupnperror(r));
- }
-}
-
-/* Test function
- * 1 - get connection type
- * 2 - get extenal ip address
- * 3 - Add port mapping
- * 4 - get this port mapping from the IGD */
-static int SetRedirectAndTest(struct UPNPUrls * urls,
- struct IGDdatas * data,
- const char * iaddr,
- const char * iport,
- const char * eport,
- const char * proto,
- const char * leaseDuration,
- const char * description,
- int addAny)
-{
- char externalIPAddress[40];
- char intClient[40];
- char intPort[6];
- char reservedPort[6];
- char duration[16];
- int r;
-
- if(!iaddr || !iport || !eport || !proto)
- {
- fprintf(stderr, "Wrong arguments\n");
- return -1;
- }
- proto = protofix(proto);
- if(!proto)
- {
- fprintf(stderr, "invalid protocol\n");
- return -1;
- }
-
- r = UPNP_GetExternalIPAddress(urls->controlURL,
- data->first.servicetype,
- externalIPAddress);
- if(r!=UPNPCOMMAND_SUCCESS)
- printf("GetExternalIPAddress failed.\n");
- else
- printf("ExternalIPAddress = %s\n", externalIPAddress);
-
- if (addAny) {
- r = UPNP_AddAnyPortMapping(urls->controlURL, data->first.servicetype,
- eport, iport, iaddr, description,
- proto, 0, leaseDuration, reservedPort);
- if(r==UPNPCOMMAND_SUCCESS)
- eport = reservedPort;
- else
- printf("AddAnyPortMapping(%s, %s, %s) failed with code %d (%s)\n",
- eport, iport, iaddr, r, strupnperror(r));
- } else {
- r = UPNP_AddPortMapping(urls->controlURL, data->first.servicetype,
- eport, iport, iaddr, description,
- proto, 0, leaseDuration);
- if(r!=UPNPCOMMAND_SUCCESS) {
- printf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n",
- eport, iport, iaddr, r, strupnperror(r));
- return -2;
- }
- }
-
- r = UPNP_GetSpecificPortMappingEntry(urls->controlURL,
- data->first.servicetype,
- eport, proto, NULL/*remoteHost*/,
- intClient, intPort, NULL/*desc*/,
- NULL/*enabled*/, duration);
- if(r!=UPNPCOMMAND_SUCCESS) {
- printf("GetSpecificPortMappingEntry() failed with code %d (%s)\n",
- r, strupnperror(r));
- return -2;
- } else {
- printf("InternalIP:Port = %s:%s\n", intClient, intPort);
- printf("external %s:%s %s is redirected to internal %s:%s (duration=%s)\n",
- externalIPAddress, eport, proto, intClient, intPort, duration);
- }
- return 0;
-}
-
-static int
-RemoveRedirect(struct UPNPUrls * urls,
- struct IGDdatas * data,
- const char * eport,
- const char * proto,
- const char * remoteHost)
-{
- int r;
- if(!proto || !eport)
- {
- fprintf(stderr, "invalid arguments\n");
- return -1;
- }
- proto = protofix(proto);
- if(!proto)
- {
- fprintf(stderr, "protocol invalid\n");
- return -1;
- }
- r = UPNP_DeletePortMapping(urls->controlURL, data->first.servicetype, eport, proto, remoteHost);
- if(r!=UPNPCOMMAND_SUCCESS) {
- printf("UPNP_DeletePortMapping() failed with code : %d\n", r);
- return -2;
- }else {
- printf("UPNP_DeletePortMapping() returned : %d\n", r);
- }
- return 0;
-}
-
-static int
-RemoveRedirectRange(struct UPNPUrls * urls,
- struct IGDdatas * data,
- const char * ePortStart, char const * ePortEnd,
- const char * proto, const char * manage)
-{
- int r;
-
- if (!manage)
- manage = "0";
-
- if(!proto || !ePortStart || !ePortEnd)
- {
- fprintf(stderr, "invalid arguments\n");
- return -1;
- }
- proto = protofix(proto);
- if(!proto)
- {
- fprintf(stderr, "protocol invalid\n");
- return -1;
- }
- r = UPNP_DeletePortMappingRange(urls->controlURL, data->first.servicetype, ePortStart, ePortEnd, proto, manage);
- if(r!=UPNPCOMMAND_SUCCESS) {
- printf("UPNP_DeletePortMappingRange() failed with code : %d\n", r);
- return -2;
- }else {
- printf("UPNP_DeletePortMappingRange() returned : %d\n", r);
- }
- return 0;
-}
-
-/* IGD:2, functions for service WANIPv6FirewallControl:1 */
-static void GetFirewallStatus(struct UPNPUrls * urls, struct IGDdatas * data)
-{
- unsigned int bytessent, bytesreceived, packetsreceived, packetssent;
- int firewallEnabled = 0, inboundPinholeAllowed = 0;
-
- UPNP_GetFirewallStatus(urls->controlURL_6FC, data->IPv6FC.servicetype, &firewallEnabled, &inboundPinholeAllowed);
- printf("FirewallEnabled: %d & Inbound Pinhole Allowed: %d\n", firewallEnabled, inboundPinholeAllowed);
- printf("GetFirewallStatus:\n Firewall Enabled: %s\n Inbound Pinhole Allowed: %s\n", (firewallEnabled)? "Yes":"No", (inboundPinholeAllowed)? "Yes":"No");
-
- bytessent = UPNP_GetTotalBytesSent(urls->controlURL_CIF, data->CIF.servicetype);
- bytesreceived = UPNP_GetTotalBytesReceived(urls->controlURL_CIF, data->CIF.servicetype);
- packetssent = UPNP_GetTotalPacketsSent(urls->controlURL_CIF, data->CIF.servicetype);
- packetsreceived = UPNP_GetTotalPacketsReceived(urls->controlURL_CIF, data->CIF.servicetype);
- printf("Bytes: Sent: %8u\tRecv: %8u\n", bytessent, bytesreceived);
- printf("Packets: Sent: %8u\tRecv: %8u\n", packetssent, packetsreceived);
-}
-
-/* Test function
- * 1 - Add pinhole
- * 2 - Check if pinhole is working from the IGD side */
-static void SetPinholeAndTest(struct UPNPUrls * urls, struct IGDdatas * data,
- const char * remoteaddr, const char * eport,
- const char * intaddr, const char * iport,
- const char * proto, const char * lease_time)
-{
- char uniqueID[8];
- /*int isWorking = 0;*/
- int r;
- char proto_tmp[8];
-
- if(!intaddr || !remoteaddr || !iport || !eport || !proto || !lease_time)
- {
- fprintf(stderr, "Wrong arguments\n");
- return;
- }
- if(atoi(proto) == 0)
- {
- const char * protocol;
- protocol = protofix(proto);
- if(protocol && (strcmp("TCP", protocol) == 0))
- {
- snprintf(proto_tmp, sizeof(proto_tmp), "%d", IPPROTO_TCP);
- proto = proto_tmp;
- }
- else if(protocol && (strcmp("UDP", protocol) == 0))
- {
- snprintf(proto_tmp, sizeof(proto_tmp), "%d", IPPROTO_UDP);
- proto = proto_tmp;
- }
- else
- {
- fprintf(stderr, "invalid protocol\n");
- return;
- }
- }
- r = UPNP_AddPinhole(urls->controlURL_6FC, data->IPv6FC.servicetype, remoteaddr, eport, intaddr, iport, proto, lease_time, uniqueID);
- if(r!=UPNPCOMMAND_SUCCESS)
- printf("AddPinhole([%s]:%s -> [%s]:%s) failed with code %d (%s)\n",
- remoteaddr, eport, intaddr, iport, r, strupnperror(r));
- else
- {
- printf("AddPinhole: ([%s]:%s -> [%s]:%s) / Pinhole ID = %s\n",
- remoteaddr, eport, intaddr, iport, uniqueID);
- /*r = UPNP_CheckPinholeWorking(urls->controlURL_6FC, data->servicetype_6FC, uniqueID, &isWorking);
- if(r!=UPNPCOMMAND_SUCCESS)
- printf("CheckPinholeWorking() failed with code %d (%s)\n", r, strupnperror(r));
- printf("CheckPinholeWorking: Pinhole ID = %s / IsWorking = %s\n", uniqueID, (isWorking)? "Yes":"No");*/
- }
-}
-
-/* Test function
- * 1 - Check if pinhole is working from the IGD side
- * 2 - Update pinhole */
-static void GetPinholeAndUpdate(struct UPNPUrls * urls, struct IGDdatas * data,
- const char * uniqueID, const char * lease_time)
-{
- int isWorking = 0;
- int r;
-
- if(!uniqueID || !lease_time)
- {
- fprintf(stderr, "Wrong arguments\n");
- return;
- }
- r = UPNP_CheckPinholeWorking(urls->controlURL_6FC, data->IPv6FC.servicetype, uniqueID, &isWorking);
- printf("CheckPinholeWorking: Pinhole ID = %s / IsWorking = %s\n", uniqueID, (isWorking)? "Yes":"No");
- if(r!=UPNPCOMMAND_SUCCESS)
- printf("CheckPinholeWorking() failed with code %d (%s)\n", r, strupnperror(r));
- if(isWorking || r==709)
- {
- r = UPNP_UpdatePinhole(urls->controlURL_6FC, data->IPv6FC.servicetype, uniqueID, lease_time);
- printf("UpdatePinhole: Pinhole ID = %s with Lease Time: %s\n", uniqueID, lease_time);
- if(r!=UPNPCOMMAND_SUCCESS)
- printf("UpdatePinhole: ID (%s) failed with code %d (%s)\n", uniqueID, r, strupnperror(r));
- }
-}
-
-/* Test function
- * Get pinhole timeout
- */
-static void GetPinholeOutboundTimeout(struct UPNPUrls * urls, struct IGDdatas * data,
- const char * remoteaddr, const char * eport,
- const char * intaddr, const char * iport,
- const char * proto)
-{
- int timeout = 0;
- int r;
-
- if(!intaddr || !remoteaddr || !iport || !eport || !proto)
- {
- fprintf(stderr, "Wrong arguments\n");
- return;
- }
-
- r = UPNP_GetOutboundPinholeTimeout(urls->controlURL_6FC, data->IPv6FC.servicetype, remoteaddr, eport, intaddr, iport, proto, &timeout);
- if(r!=UPNPCOMMAND_SUCCESS)
- printf("GetOutboundPinholeTimeout([%s]:%s -> [%s]:%s) failed with code %d (%s)\n",
- intaddr, iport, remoteaddr, eport, r, strupnperror(r));
- else
- printf("GetOutboundPinholeTimeout: ([%s]:%s -> [%s]:%s) / Timeout = %d\n", intaddr, iport, remoteaddr, eport, timeout);
-}
-
-static void
-GetPinholePackets(struct UPNPUrls * urls,
- struct IGDdatas * data, const char * uniqueID)
-{
- int r, pinholePackets = 0;
- if(!uniqueID)
- {
- fprintf(stderr, "invalid arguments\n");
- return;
- }
- r = UPNP_GetPinholePackets(urls->controlURL_6FC, data->IPv6FC.servicetype, uniqueID, &pinholePackets);
- if(r!=UPNPCOMMAND_SUCCESS)
- printf("GetPinholePackets() failed with code %d (%s)\n", r, strupnperror(r));
- else
- printf("GetPinholePackets: Pinhole ID = %s / PinholePackets = %d\n", uniqueID, pinholePackets);
-}
-
-static void
-CheckPinhole(struct UPNPUrls * urls,
- struct IGDdatas * data, const char * uniqueID)
-{
- int r, isWorking = 0;
- if(!uniqueID)
- {
- fprintf(stderr, "invalid arguments\n");
- return;
- }
- r = UPNP_CheckPinholeWorking(urls->controlURL_6FC, data->IPv6FC.servicetype, uniqueID, &isWorking);
- if(r!=UPNPCOMMAND_SUCCESS)
- printf("CheckPinholeWorking() failed with code %d (%s)\n", r, strupnperror(r));
- else
- printf("CheckPinholeWorking: Pinhole ID = %s / IsWorking = %s\n", uniqueID, (isWorking)? "Yes":"No");
-}
-
-static void
-RemovePinhole(struct UPNPUrls * urls,
- struct IGDdatas * data, const char * uniqueID)
-{
- int r;
- if(!uniqueID)
- {
- fprintf(stderr, "invalid arguments\n");
- return;
- }
- r = UPNP_DeletePinhole(urls->controlURL_6FC, data->IPv6FC.servicetype, uniqueID);
- printf("UPNP_DeletePinhole() returned : %d\n", r);
-}
-
-
-/* sample upnp client program */
-int main(int argc, char ** argv)
-{
- char command = 0;
- char ** commandargv = 0;
- int commandargc = 0;
- struct UPNPDev * devlist = 0;
- char lanaddr[64] = "unset"; /* my ip address on the LAN */
- int i;
- const char * rootdescurl = 0;
- const char * multicastif = 0;
- const char * minissdpdpath = 0;
- int localport = UPNP_LOCAL_PORT_ANY;
- int retcode = 0;
- int error = 0;
- int ipv6 = 0;
- unsigned char ttl = 2; /* defaulting to 2 */
- const char * description = 0;
-
-#ifdef _WIN32
- WSADATA wsaData;
- int nResult = WSAStartup(MAKEWORD(2,2), &wsaData);
- if(nResult != NO_ERROR)
- {
- fprintf(stderr, "WSAStartup() failed.\n");
- return -1;
- }
-#endif
- printf("upnpc : miniupnpc library test client, version %s.\n", MINIUPNPC_VERSION_STRING);
- printf(" (c) 2005-2017 Thomas Bernard.\n");
- printf("Go to http://miniupnp.free.fr/ or https://miniupnp.tuxfamily.org/\n"
- "for more information.\n");
- /* command line processing */
- for(i=1; i<argc; i++)
- {
- if(0 == strcmp(argv[i], "--help") || 0 == strcmp(argv[i], "-h"))
- {
- command = 0;
- break;
- }
- if(argv[i][0] == '-')
- {
- if(argv[i][1] == 'u')
- rootdescurl = argv[++i];
- else if(argv[i][1] == 'm')
- multicastif = argv[++i];
- else if(argv[i][1] == 'z')
- {
- char junk;
- if(sscanf(argv[++i], "%d%c", &localport, &junk)!=1 ||
- localport<0 || localport>65535 ||
- (localport >1 && localport < 1024))
- {
- fprintf(stderr, "Invalid localport '%s'\n", argv[i]);
- localport = UPNP_LOCAL_PORT_ANY;
- break;
- }
- }
- else if(argv[i][1] == 'p')
- minissdpdpath = argv[++i];
- else if(argv[i][1] == '6')
- ipv6 = 1;
- else if(argv[i][1] == 'e')
- description = argv[++i];
- else if(argv[i][1] == 't')
- ttl = (unsigned char)atoi(argv[++i]);
- else
- {
- command = argv[i][1];
- i++;
- commandargv = argv + i;
- commandargc = argc - i;
- break;
- }
- }
- else
- {
- fprintf(stderr, "option '%s' invalid\n", argv[i]);
- }
- }
-
- if(!command
- || (command == 'a' && commandargc<4)
- || (command == 'd' && argc<2)
- || (command == 'r' && argc<2)
- || (command == 'A' && commandargc<6)
- || (command == 'U' && commandargc<2)
- || (command == 'D' && commandargc<1))
- {
- fprintf(stderr, "Usage :\t%s [options] -a ip port external_port protocol [duration]\n\t\tAdd port redirection\n", argv[0]);
- fprintf(stderr, " \t%s [options] -d external_port protocol <remote host>\n\t\tDelete port redirection\n", argv[0]);
- fprintf(stderr, " \t%s [options] -s\n\t\tGet Connection status\n", argv[0]);
- fprintf(stderr, " \t%s [options] -l\n\t\tList redirections\n", argv[0]);
- fprintf(stderr, " \t%s [options] -L\n\t\tList redirections (using GetListOfPortMappings (for IGD:2 only)\n", argv[0]);
- fprintf(stderr, " \t%s [options] -n ip port external_port protocol [duration]\n\t\tAdd (any) port redirection allowing IGD to use alternative external_port (for IGD:2 only)\n", argv[0]);
- fprintf(stderr, " \t%s [options] -N external_port_start external_port_end protocol [manage]\n\t\tDelete range of port redirections (for IGD:2 only)\n", argv[0]);
- fprintf(stderr, " \t%s [options] -r port1 [external_port1] protocol1 [port2 [external_port2] protocol2] [...]\n\t\tAdd all redirections to the current host\n", argv[0]);
- fprintf(stderr, " \t%s [options] -A remote_ip remote_port internal_ip internal_port protocol lease_time\n\t\tAdd Pinhole (for IGD:2 only)\n", argv[0]);
- fprintf(stderr, " \t%s [options] -U uniqueID new_lease_time\n\t\tUpdate Pinhole (for IGD:2 only)\n", argv[0]);
- fprintf(stderr, " \t%s [options] -C uniqueID\n\t\tCheck if Pinhole is Working (for IGD:2 only)\n", argv[0]);
- fprintf(stderr, " \t%s [options] -K uniqueID\n\t\tGet Number of packets going through the rule (for IGD:2 only)\n", argv[0]);
- fprintf(stderr, " \t%s [options] -D uniqueID\n\t\tDelete Pinhole (for IGD:2 only)\n", argv[0]);
- fprintf(stderr, " \t%s [options] -S\n\t\tGet Firewall status (for IGD:2 only)\n", argv[0]);
- fprintf(stderr, " \t%s [options] -G remote_ip remote_port internal_ip internal_port protocol\n\t\tGet Outbound Pinhole Timeout (for IGD:2 only)\n", argv[0]);
- fprintf(stderr, " \t%s [options] -P\n\t\tGet Presentation url\n", argv[0]);
- fprintf(stderr, "\nprotocol is UDP or TCP\n");
- fprintf(stderr, "Options:\n");
- fprintf(stderr, " -e description : set description for port mapping.\n");
- fprintf(stderr, " -6 : use ip v6 instead of ip v4.\n");
- fprintf(stderr, " -u url : bypass discovery process by providing the XML root description url.\n");
- fprintf(stderr, " -m address/interface : provide ip address (ip v4) or interface name (ip v4 or v6) to use for sending SSDP multicast packets.\n");
- fprintf(stderr, " -z localport : SSDP packets local (source) port (1024-65535).\n");
- fprintf(stderr, " -p path : use this path for MiniSSDPd socket.\n");
- fprintf(stderr, " -t ttl : set multicast TTL. Default value is 2.\n");
- return 1;
- }
-
- if( rootdescurl
- || (devlist = upnpDiscover(2000, multicastif, minissdpdpath,
- localport, ipv6, ttl, &error)))
- {
- struct UPNPDev * device;
- struct UPNPUrls urls;
- struct IGDdatas data;
- if(devlist)
- {
- printf("List of UPNP devices found on the network :\n");
- for(device = devlist; device; device = device->pNext)
- {
- printf(" desc: %s\n st: %s\n\n",
- device->descURL, device->st);
- }
- }
- else if(!rootdescurl)
- {
- printf("upnpDiscover() error code=%d\n", error);
- }
- i = 1;
- if( (rootdescurl && UPNP_GetIGDFromUrl(rootdescurl, &urls, &data, lanaddr, sizeof(lanaddr)))
- || (i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr))))
- {
- switch(i) {
- case 1:
- printf("Found valid IGD : %s\n", urls.controlURL);
- break;
- case 2:
- printf("Found a (not connected?) IGD : %s\n", urls.controlURL);
- printf("Trying to continue anyway\n");
- break;
- case 3:
- printf("UPnP device found. Is it an IGD ? : %s\n", urls.controlURL);
- printf("Trying to continue anyway\n");
- break;
- default:
- printf("Found device (igd ?) : %s\n", urls.controlURL);
- printf("Trying to continue anyway\n");
- }
- printf("Local LAN ip address : %s\n", lanaddr);
- #if 0
- printf("getting \"%s\"\n", urls.ipcondescURL);
- descXML = miniwget(urls.ipcondescURL, &descXMLsize);
- if(descXML)
- {
- /*fwrite(descXML, 1, descXMLsize, stdout);*/
- free(descXML); descXML = NULL;
- }
- #endif
-
- switch(command)
- {
- case 'l':
- DisplayInfos(&urls, &data);
- ListRedirections(&urls, &data);
- break;
- case 'L':
- NewListRedirections(&urls, &data);
- break;
- case 'a':
- if (SetRedirectAndTest(&urls, &data,
- commandargv[0], commandargv[1],
- commandargv[2], commandargv[3],
- (commandargc > 4)?commandargv[4]:"0",
- description, 0) < 0)
- retcode = 2;
- break;
- case 'd':
- if (RemoveRedirect(&urls, &data, commandargv[0], commandargv[1],
- commandargc > 2 ? commandargv[2] : NULL) < 0)
- retcode = 2;
- break;
- case 'n': /* aNy */
- if (SetRedirectAndTest(&urls, &data,
- commandargv[0], commandargv[1],
- commandargv[2], commandargv[3],
- (commandargc > 4)?commandargv[4]:"0",
- description, 1) < 0)
- retcode = 2;
- break;
- case 'N':
- if (commandargc < 3)
- fprintf(stderr, "too few arguments\n");
-
- if (RemoveRedirectRange(&urls, &data, commandargv[0], commandargv[1], commandargv[2],
- commandargc > 3 ? commandargv[3] : NULL) < 0)
- retcode = 2;
- break;
- case 's':
- GetConnectionStatus(&urls, &data);
- break;
- case 'r':
- i = 0;
- while(i<commandargc)
- {
- if(!is_int(commandargv[i])) {
- /* 1st parameter not an integer : error */
- fprintf(stderr, "command -r : %s is not an port number\n", commandargv[i]);
- retcode = 1;
- break;
- } else if(is_int(commandargv[i+1])){
- /* 2nd parameter is an integer : <port> <external_port> <protocol> */
- if (SetRedirectAndTest(&urls, &data,
- lanaddr, commandargv[i],
- commandargv[i+1], commandargv[i+2], "0",
- description, 0) < 0)
- retcode = 2;
- i+=3; /* 3 parameters parsed */
- } else {
- /* 2nd parameter not an integer : <port> <protocol> */
- if (SetRedirectAndTest(&urls, &data,
- lanaddr, commandargv[i],
- commandargv[i], commandargv[i+1], "0",
- description, 0) < 0)
- retcode = 2;
- i+=2; /* 2 parameters parsed */
- }
- }
- break;
- case 'A':
- SetPinholeAndTest(&urls, &data,
- commandargv[0], commandargv[1],
- commandargv[2], commandargv[3],
- commandargv[4], commandargv[5]);
- break;
- case 'U':
- GetPinholeAndUpdate(&urls, &data,
- commandargv[0], commandargv[1]);
- break;
- case 'C':
- for(i=0; i<commandargc; i++)
- {
- CheckPinhole(&urls, &data, commandargv[i]);
- }
- break;
- case 'K':
- for(i=0; i<commandargc; i++)
- {
- GetPinholePackets(&urls, &data, commandargv[i]);
- }
- break;
- case 'D':
- for(i=0; i<commandargc; i++)
- {
- RemovePinhole(&urls, &data, commandargv[i]);
- }
- break;
- case 'S':
- GetFirewallStatus(&urls, &data);
- break;
- case 'G':
- GetPinholeOutboundTimeout(&urls, &data,
- commandargv[0], commandargv[1],
- commandargv[2], commandargv[3],
- commandargv[4]);
- break;
- case 'P':
- printf("Presentation URL found:\n");
- printf(" %s\n", data.presentationurl);
- break;
- default:
- fprintf(stderr, "Unknown switch -%c\n", command);
- retcode = 1;
- }
-
- FreeUPNPUrls(&urls);
- }
- else
- {
- fprintf(stderr, "No valid UPNP Internet Gateway Device found.\n");
- retcode = 1;
- }
- freeUPNPDevlist(devlist); devlist = 0;
- }
- else
- {
- fprintf(stderr, "No IGD UPnP Device found on the network !\n");
- retcode = 1;
- }
-#ifdef _WIN32
- nResult = WSACleanup();
- if(nResult != NO_ERROR) {
- fprintf(stderr, "WSACleanup() failed.\n");
- }
-#endif /* _WIN32 */
- return retcode;
-}
-
diff --git a/external/miniupnpc/upnpcommands.c b/external/miniupnpc/upnpcommands.c
deleted file mode 100644
index 9f704496f..000000000
--- a/external/miniupnpc/upnpcommands.c
+++ /dev/null
@@ -1,1240 +0,0 @@
-/* $Id: upnpcommands.c,v 1.46 2015/07/15 12:19:00 nanard Exp $ */
-/* vim: tabstop=4 shiftwidth=4 noexpandtab
- * Project : miniupnp
- * Author : Thomas Bernard
- * Copyright (c) 2005-2017 Thomas Bernard
- * This software is subject to the conditions detailed in the
- * LICENCE file provided in this distribution.
- * */
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include "upnpcommands.h"
-#include "miniupnpc.h"
-#include "portlistingparse.h"
-
-static UNSIGNED_INTEGER
-my_atoui(const char * s)
-{
- return s ? ((UNSIGNED_INTEGER)STRTOUI(s, NULL, 0)) : 0;
-}
-
-/*
- * */
-MINIUPNP_LIBSPEC UNSIGNED_INTEGER
-UPNP_GetTotalBytesSent(const char * controlURL,
- const char * servicetype)
-{
- struct NameValueParserData pdata;
- char * buffer;
- int bufsize;
- unsigned int r = 0;
- char * p;
- if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetTotalBytesSent", 0, &bufsize))) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- ParseNameValue(buffer, bufsize, &pdata);
- /*DisplayNameValueList(buffer, bufsize);*/
- free(buffer); buffer = NULL;
- p = GetValueFromNameValueList(&pdata, "NewTotalBytesSent");
- r = my_atoui(p);
- ClearNameValueList(&pdata);
- return r;
-}
-
-/*
- * */
-MINIUPNP_LIBSPEC UNSIGNED_INTEGER
-UPNP_GetTotalBytesReceived(const char * controlURL,
- const char * servicetype)
-{
- struct NameValueParserData pdata;
- char * buffer;
- int bufsize;
- unsigned int r = 0;
- char * p;
- if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetTotalBytesReceived", 0, &bufsize))) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- ParseNameValue(buffer, bufsize, &pdata);
- /*DisplayNameValueList(buffer, bufsize);*/
- free(buffer); buffer = NULL;
- p = GetValueFromNameValueList(&pdata, "NewTotalBytesReceived");
- r = my_atoui(p);
- ClearNameValueList(&pdata);
- return r;
-}
-
-/*
- * */
-MINIUPNP_LIBSPEC UNSIGNED_INTEGER
-UPNP_GetTotalPacketsSent(const char * controlURL,
- const char * servicetype)
-{
- struct NameValueParserData pdata;
- char * buffer;
- int bufsize;
- unsigned int r = 0;
- char * p;
- if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetTotalPacketsSent", 0, &bufsize))) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- ParseNameValue(buffer, bufsize, &pdata);
- /*DisplayNameValueList(buffer, bufsize);*/
- free(buffer); buffer = NULL;
- p = GetValueFromNameValueList(&pdata, "NewTotalPacketsSent");
- r = my_atoui(p);
- ClearNameValueList(&pdata);
- return r;
-}
-
-/*
- * */
-MINIUPNP_LIBSPEC UNSIGNED_INTEGER
-UPNP_GetTotalPacketsReceived(const char * controlURL,
- const char * servicetype)
-{
- struct NameValueParserData pdata;
- char * buffer;
- int bufsize;
- unsigned int r = 0;
- char * p;
- if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetTotalPacketsReceived", 0, &bufsize))) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- ParseNameValue(buffer, bufsize, &pdata);
- /*DisplayNameValueList(buffer, bufsize);*/
- free(buffer); buffer = NULL;
- p = GetValueFromNameValueList(&pdata, "NewTotalPacketsReceived");
- r = my_atoui(p);
- ClearNameValueList(&pdata);
- return r;
-}
-
-/* UPNP_GetStatusInfo() call the corresponding UPNP method
- * returns the current status and uptime */
-MINIUPNP_LIBSPEC int
-UPNP_GetStatusInfo(const char * controlURL,
- const char * servicetype,
- char * status,
- unsigned int * uptime,
- char * lastconnerror)
-{
- struct NameValueParserData pdata;
- char * buffer;
- int bufsize;
- char * p;
- char * up;
- char * err;
- int ret = UPNPCOMMAND_UNKNOWN_ERROR;
-
- if(!status && !uptime)
- return UPNPCOMMAND_INVALID_ARGS;
-
- if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetStatusInfo", 0, &bufsize))) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- ParseNameValue(buffer, bufsize, &pdata);
- /*DisplayNameValueList(buffer, bufsize);*/
- free(buffer); buffer = NULL;
- up = GetValueFromNameValueList(&pdata, "NewUptime");
- p = GetValueFromNameValueList(&pdata, "NewConnectionStatus");
- err = GetValueFromNameValueList(&pdata, "NewLastConnectionError");
- if(p && up)
- ret = UPNPCOMMAND_SUCCESS;
-
- if(status) {
- if(p){
- strncpy(status, p, 64 );
- status[63] = '\0';
- }else
- status[0]= '\0';
- }
-
- if(uptime) {
- if(up)
- sscanf(up,"%u",uptime);
- else
- *uptime = 0;
- }
-
- if(lastconnerror) {
- if(err) {
- strncpy(lastconnerror, err, 64 );
- lastconnerror[63] = '\0';
- } else
- lastconnerror[0] = '\0';
- }
-
- p = GetValueFromNameValueList(&pdata, "errorCode");
- if(p) {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(p, "%d", &ret);
- }
- ClearNameValueList(&pdata);
- return ret;
-}
-
-/* UPNP_GetConnectionTypeInfo() call the corresponding UPNP method
- * returns the connection type */
-MINIUPNP_LIBSPEC int
-UPNP_GetConnectionTypeInfo(const char * controlURL,
- const char * servicetype,
- char * connectionType)
-{
- struct NameValueParserData pdata;
- char * buffer;
- int bufsize;
- char * p;
- int ret = UPNPCOMMAND_UNKNOWN_ERROR;
-
- if(!connectionType)
- return UPNPCOMMAND_INVALID_ARGS;
-
- if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetConnectionTypeInfo", 0, &bufsize))) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
- p = GetValueFromNameValueList(&pdata, "NewConnectionType");
- /*p = GetValueFromNameValueList(&pdata, "NewPossibleConnectionTypes");*/
- /* PossibleConnectionTypes will have several values.... */
- if(p) {
- strncpy(connectionType, p, 64 );
- connectionType[63] = '\0';
- ret = UPNPCOMMAND_SUCCESS;
- } else
- connectionType[0] = '\0';
- p = GetValueFromNameValueList(&pdata, "errorCode");
- if(p) {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(p, "%d", &ret);
- }
- ClearNameValueList(&pdata);
- return ret;
-}
-
-/* UPNP_GetLinkLayerMaxBitRate() call the corresponding UPNP method.
- * Returns 2 values: Downloadlink bandwidth and Uplink bandwidth.
- * One of the values can be null
- * Note : GetLinkLayerMaxBitRates belongs to WANPPPConnection:1 only
- * We can use the GetCommonLinkProperties from WANCommonInterfaceConfig:1 */
-MINIUPNP_LIBSPEC int
-UPNP_GetLinkLayerMaxBitRates(const char * controlURL,
- const char * servicetype,
- unsigned int * bitrateDown,
- unsigned int * bitrateUp)
-{
- struct NameValueParserData pdata;
- char * buffer;
- int bufsize;
- int ret = UPNPCOMMAND_UNKNOWN_ERROR;
- char * down;
- char * up;
- char * p;
-
- if(!bitrateDown && !bitrateUp)
- return UPNPCOMMAND_INVALID_ARGS;
-
- /* shouldn't we use GetCommonLinkProperties ? */
- if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetCommonLinkProperties", 0, &bufsize))) {
- /*"GetLinkLayerMaxBitRates", 0, &bufsize);*/
- return UPNPCOMMAND_HTTP_ERROR;
- }
- /*DisplayNameValueList(buffer, bufsize);*/
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
- /*down = GetValueFromNameValueList(&pdata, "NewDownstreamMaxBitRate");*/
- /*up = GetValueFromNameValueList(&pdata, "NewUpstreamMaxBitRate");*/
- down = GetValueFromNameValueList(&pdata, "NewLayer1DownstreamMaxBitRate");
- up = GetValueFromNameValueList(&pdata, "NewLayer1UpstreamMaxBitRate");
- /*GetValueFromNameValueList(&pdata, "NewWANAccessType");*/
- /*GetValueFromNameValueList(&pdata, "NewPhysicalLinkStatus");*/
- if(down && up)
- ret = UPNPCOMMAND_SUCCESS;
-
- if(bitrateDown) {
- if(down)
- sscanf(down,"%u",bitrateDown);
- else
- *bitrateDown = 0;
- }
-
- if(bitrateUp) {
- if(up)
- sscanf(up,"%u",bitrateUp);
- else
- *bitrateUp = 0;
- }
- p = GetValueFromNameValueList(&pdata, "errorCode");
- if(p) {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(p, "%d", &ret);
- }
- ClearNameValueList(&pdata);
- return ret;
-}
-
-
-/* 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.
- *
- * 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)
-{
- struct NameValueParserData pdata;
- char * buffer;
- int bufsize;
- char * p;
- int ret = UPNPCOMMAND_UNKNOWN_ERROR;
-
- if(!extIpAdd || !controlURL || !servicetype)
- return UPNPCOMMAND_INVALID_ARGS;
-
- if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetExternalIPAddress", 0, &bufsize))) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- /*DisplayNameValueList(buffer, bufsize);*/
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
- /*printf("external ip = %s\n", GetValueFromNameValueList(&pdata, "NewExternalIPAddress") );*/
- p = GetValueFromNameValueList(&pdata, "NewExternalIPAddress");
- if(p) {
- strncpy(extIpAdd, p, 16 );
- extIpAdd[15] = '\0';
- ret = UPNPCOMMAND_SUCCESS;
- } else
- extIpAdd[0] = '\0';
-
- p = GetValueFromNameValueList(&pdata, "errorCode");
- if(p) {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(p, "%d", &ret);
- }
-
- ClearNameValueList(&pdata);
- return ret;
-}
-
-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)
-{
- struct UPNParg * AddPortMappingArgs;
- char * buffer;
- int bufsize;
- struct NameValueParserData pdata;
- const char * resVal;
- int ret;
-
- if(!inPort || !inClient || !proto || !extPort)
- return UPNPCOMMAND_INVALID_ARGS;
-
- AddPortMappingArgs = calloc(9, sizeof(struct UPNParg));
- if(AddPortMappingArgs == NULL)
- return UPNPCOMMAND_MEM_ALLOC_ERROR;
- AddPortMappingArgs[0].elt = "NewRemoteHost";
- AddPortMappingArgs[0].val = remoteHost;
- AddPortMappingArgs[1].elt = "NewExternalPort";
- AddPortMappingArgs[1].val = extPort;
- AddPortMappingArgs[2].elt = "NewProtocol";
- AddPortMappingArgs[2].val = proto;
- AddPortMappingArgs[3].elt = "NewInternalPort";
- AddPortMappingArgs[3].val = inPort;
- AddPortMappingArgs[4].elt = "NewInternalClient";
- AddPortMappingArgs[4].val = inClient;
- AddPortMappingArgs[5].elt = "NewEnabled";
- AddPortMappingArgs[5].val = "1";
- AddPortMappingArgs[6].elt = "NewPortMappingDescription";
- AddPortMappingArgs[6].val = desc?desc:"libminiupnpc";
- AddPortMappingArgs[7].elt = "NewLeaseDuration";
- AddPortMappingArgs[7].val = leaseDuration?leaseDuration:"0";
- buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "AddPortMapping", AddPortMappingArgs,
- &bufsize);
- free(AddPortMappingArgs);
- if(!buffer) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- /*DisplayNameValueList(buffer, bufsize);*/
- /*buffer[bufsize] = '\0';*/
- /*puts(buffer);*/
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
- resVal = GetValueFromNameValueList(&pdata, "errorCode");
- if(resVal) {
- /*printf("AddPortMapping errorCode = '%s'\n", resVal); */
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(resVal, "%d", &ret);
- } else {
- ret = UPNPCOMMAND_SUCCESS;
- }
- ClearNameValueList(&pdata);
- return ret;
-}
-
-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)
-{
- struct UPNParg * AddPortMappingArgs;
- char * buffer;
- int bufsize;
- struct NameValueParserData pdata;
- const char * resVal;
- int ret;
-
- if(!inPort || !inClient || !proto || !extPort)
- return UPNPCOMMAND_INVALID_ARGS;
-
- AddPortMappingArgs = calloc(9, sizeof(struct UPNParg));
- if(AddPortMappingArgs == NULL)
- return UPNPCOMMAND_MEM_ALLOC_ERROR;
- AddPortMappingArgs[0].elt = "NewRemoteHost";
- AddPortMappingArgs[0].val = remoteHost;
- AddPortMappingArgs[1].elt = "NewExternalPort";
- AddPortMappingArgs[1].val = extPort;
- AddPortMappingArgs[2].elt = "NewProtocol";
- AddPortMappingArgs[2].val = proto;
- AddPortMappingArgs[3].elt = "NewInternalPort";
- AddPortMappingArgs[3].val = inPort;
- AddPortMappingArgs[4].elt = "NewInternalClient";
- AddPortMappingArgs[4].val = inClient;
- AddPortMappingArgs[5].elt = "NewEnabled";
- AddPortMappingArgs[5].val = "1";
- AddPortMappingArgs[6].elt = "NewPortMappingDescription";
- AddPortMappingArgs[6].val = desc?desc:"libminiupnpc";
- AddPortMappingArgs[7].elt = "NewLeaseDuration";
- AddPortMappingArgs[7].val = leaseDuration?leaseDuration:"0";
- buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "AddAnyPortMapping", AddPortMappingArgs,
- &bufsize);
- free(AddPortMappingArgs);
- if(!buffer) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
- resVal = GetValueFromNameValueList(&pdata, "errorCode");
- if(resVal) {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(resVal, "%d", &ret);
- } else {
- char *p;
-
- p = GetValueFromNameValueList(&pdata, "NewReservedPort");
- if(p) {
- strncpy(reservedPort, p, 6);
- reservedPort[5] = '\0';
- ret = UPNPCOMMAND_SUCCESS;
- } else {
- ret = UPNPCOMMAND_INVALID_RESPONSE;
- }
- }
- ClearNameValueList(&pdata);
- return ret;
-}
-
-MINIUPNP_LIBSPEC int
-UPNP_DeletePortMapping(const char * controlURL, const char * servicetype,
- const char * extPort, const char * proto,
- const char * remoteHost)
-{
- /*struct NameValueParserData pdata;*/
- struct UPNParg * DeletePortMappingArgs;
- char * buffer;
- int bufsize;
- struct NameValueParserData pdata;
- const char * resVal;
- int ret;
-
- if(!extPort || !proto)
- return UPNPCOMMAND_INVALID_ARGS;
-
- DeletePortMappingArgs = calloc(4, sizeof(struct UPNParg));
- if(DeletePortMappingArgs == NULL)
- return UPNPCOMMAND_MEM_ALLOC_ERROR;
- DeletePortMappingArgs[0].elt = "NewRemoteHost";
- DeletePortMappingArgs[0].val = remoteHost;
- DeletePortMappingArgs[1].elt = "NewExternalPort";
- DeletePortMappingArgs[1].val = extPort;
- DeletePortMappingArgs[2].elt = "NewProtocol";
- DeletePortMappingArgs[2].val = proto;
- buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "DeletePortMapping",
- DeletePortMappingArgs, &bufsize);
- free(DeletePortMappingArgs);
- if(!buffer) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- /*DisplayNameValueList(buffer, bufsize);*/
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
- resVal = GetValueFromNameValueList(&pdata, "errorCode");
- if(resVal) {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(resVal, "%d", &ret);
- } else {
- ret = UPNPCOMMAND_SUCCESS;
- }
- ClearNameValueList(&pdata);
- return ret;
-}
-
-MINIUPNP_LIBSPEC int
-UPNP_DeletePortMappingRange(const char * controlURL, const char * servicetype,
- const char * extPortStart, const char * extPortEnd,
- const char * proto,
- const char * manage)
-{
- struct UPNParg * DeletePortMappingArgs;
- char * buffer;
- int bufsize;
- struct NameValueParserData pdata;
- const char * resVal;
- int ret;
-
- if(!extPortStart || !extPortEnd || !proto || !manage)
- return UPNPCOMMAND_INVALID_ARGS;
-
- DeletePortMappingArgs = calloc(5, sizeof(struct UPNParg));
- if(DeletePortMappingArgs == NULL)
- return UPNPCOMMAND_MEM_ALLOC_ERROR;
- DeletePortMappingArgs[0].elt = "NewStartPort";
- DeletePortMappingArgs[0].val = extPortStart;
- DeletePortMappingArgs[1].elt = "NewEndPort";
- DeletePortMappingArgs[1].val = extPortEnd;
- DeletePortMappingArgs[2].elt = "NewProtocol";
- DeletePortMappingArgs[2].val = proto;
- DeletePortMappingArgs[3].elt = "NewManage";
- DeletePortMappingArgs[3].val = manage;
-
- buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "DeletePortMappingRange",
- DeletePortMappingArgs, &bufsize);
- free(DeletePortMappingArgs);
- if(!buffer) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
- resVal = GetValueFromNameValueList(&pdata, "errorCode");
- if(resVal) {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(resVal, "%d", &ret);
- } else {
- ret = UPNPCOMMAND_SUCCESS;
- }
- ClearNameValueList(&pdata);
- return ret;
-}
-
-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)
-{
- struct NameValueParserData pdata;
- struct UPNParg * GetPortMappingArgs;
- char * buffer;
- int bufsize;
- char * p;
- int r = UPNPCOMMAND_UNKNOWN_ERROR;
- if(!index)
- return UPNPCOMMAND_INVALID_ARGS;
- intClient[0] = '\0';
- intPort[0] = '\0';
- GetPortMappingArgs = calloc(2, sizeof(struct UPNParg));
- if(GetPortMappingArgs == NULL)
- return UPNPCOMMAND_MEM_ALLOC_ERROR;
- GetPortMappingArgs[0].elt = "NewPortMappingIndex";
- GetPortMappingArgs[0].val = index;
- buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetGenericPortMappingEntry",
- GetPortMappingArgs, &bufsize);
- free(GetPortMappingArgs);
- if(!buffer) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
-
- p = GetValueFromNameValueList(&pdata, "NewRemoteHost");
- if(p && rHost)
- {
- strncpy(rHost, p, 64);
- rHost[63] = '\0';
- }
- p = GetValueFromNameValueList(&pdata, "NewExternalPort");
- if(p && extPort)
- {
- strncpy(extPort, p, 6);
- extPort[5] = '\0';
- r = UPNPCOMMAND_SUCCESS;
- }
- p = GetValueFromNameValueList(&pdata, "NewProtocol");
- if(p && protocol)
- {
- strncpy(protocol, p, 4);
- protocol[3] = '\0';
- }
- p = GetValueFromNameValueList(&pdata, "NewInternalClient");
- if(p)
- {
- strncpy(intClient, p, 16);
- intClient[15] = '\0';
- r = 0;
- }
- p = GetValueFromNameValueList(&pdata, "NewInternalPort");
- if(p)
- {
- strncpy(intPort, p, 6);
- intPort[5] = '\0';
- }
- p = GetValueFromNameValueList(&pdata, "NewEnabled");
- if(p && enabled)
- {
- strncpy(enabled, p, 4);
- enabled[3] = '\0';
- }
- p = GetValueFromNameValueList(&pdata, "NewPortMappingDescription");
- if(p && desc)
- {
- strncpy(desc, p, 80);
- desc[79] = '\0';
- }
- p = GetValueFromNameValueList(&pdata, "NewLeaseDuration");
- if(p && duration)
- {
- strncpy(duration, p, 16);
- duration[15] = '\0';
- }
- p = GetValueFromNameValueList(&pdata, "errorCode");
- if(p) {
- r = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(p, "%d", &r);
- }
- ClearNameValueList(&pdata);
- return r;
-}
-
-MINIUPNP_LIBSPEC int
-UPNP_GetPortMappingNumberOfEntries(const char * controlURL,
- const char * servicetype,
- unsigned int * numEntries)
-{
- struct NameValueParserData pdata;
- char * buffer;
- int bufsize;
- char* p;
- int ret = UPNPCOMMAND_UNKNOWN_ERROR;
- if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetPortMappingNumberOfEntries", 0,
- &bufsize))) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
-#ifdef DEBUG
- DisplayNameValueList(buffer, bufsize);
-#endif
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
-
- p = GetValueFromNameValueList(&pdata, "NewPortMappingNumberOfEntries");
- if(numEntries && p) {
- *numEntries = 0;
- sscanf(p, "%u", numEntries);
- ret = UPNPCOMMAND_SUCCESS;
- }
-
- p = GetValueFromNameValueList(&pdata, "errorCode");
- if(p) {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(p, "%d", &ret);
- }
-
- ClearNameValueList(&pdata);
- return ret;
-}
-
-/* UPNP_GetSpecificPortMappingEntry retrieves an existing port mapping
- * the result is returned in the intClient and intPort strings
- * please provide 16 and 6 bytes of data */
-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)
-{
- struct NameValueParserData pdata;
- struct UPNParg * GetPortMappingArgs;
- char * buffer;
- int bufsize;
- char * p;
- int ret = UPNPCOMMAND_UNKNOWN_ERROR;
-
- if(!intPort || !intClient || !extPort || !proto)
- return UPNPCOMMAND_INVALID_ARGS;
-
- GetPortMappingArgs = calloc(4, sizeof(struct UPNParg));
- if(GetPortMappingArgs == NULL)
- return UPNPCOMMAND_MEM_ALLOC_ERROR;
- GetPortMappingArgs[0].elt = "NewRemoteHost";
- GetPortMappingArgs[0].val = remoteHost;
- GetPortMappingArgs[1].elt = "NewExternalPort";
- GetPortMappingArgs[1].val = extPort;
- GetPortMappingArgs[2].elt = "NewProtocol";
- GetPortMappingArgs[2].val = proto;
- buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetSpecificPortMappingEntry",
- GetPortMappingArgs, &bufsize);
- free(GetPortMappingArgs);
- if(!buffer) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- /*DisplayNameValueList(buffer, bufsize);*/
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
-
- p = GetValueFromNameValueList(&pdata, "NewInternalClient");
- if(p) {
- strncpy(intClient, p, 16);
- intClient[15] = '\0';
- ret = UPNPCOMMAND_SUCCESS;
- } else
- intClient[0] = '\0';
-
- p = GetValueFromNameValueList(&pdata, "NewInternalPort");
- if(p) {
- strncpy(intPort, p, 6);
- intPort[5] = '\0';
- } else
- intPort[0] = '\0';
-
- p = GetValueFromNameValueList(&pdata, "NewEnabled");
- if(p && enabled) {
- strncpy(enabled, p, 4);
- enabled[3] = '\0';
- }
-
- p = GetValueFromNameValueList(&pdata, "NewPortMappingDescription");
- if(p && desc) {
- strncpy(desc, p, 80);
- desc[79] = '\0';
- }
-
- p = GetValueFromNameValueList(&pdata, "NewLeaseDuration");
- if(p && leaseDuration)
- {
- strncpy(leaseDuration, p, 16);
- leaseDuration[15] = '\0';
- }
-
- p = GetValueFromNameValueList(&pdata, "errorCode");
- if(p) {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(p, "%d", &ret);
- }
-
- ClearNameValueList(&pdata);
- return ret;
-}
-
-/* UPNP_GetListOfPortMappings()
- *
- * 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)
-{
- struct NameValueParserData pdata;
- struct UPNParg * GetListOfPortMappingsArgs;
- const char * p;
- char * buffer;
- int bufsize;
- int ret = UPNPCOMMAND_UNKNOWN_ERROR;
-
- if(!startPort || !endPort || !protocol)
- return UPNPCOMMAND_INVALID_ARGS;
-
- GetListOfPortMappingsArgs = calloc(6, sizeof(struct UPNParg));
- if(GetListOfPortMappingsArgs == NULL)
- return UPNPCOMMAND_MEM_ALLOC_ERROR;
- GetListOfPortMappingsArgs[0].elt = "NewStartPort";
- GetListOfPortMappingsArgs[0].val = startPort;
- GetListOfPortMappingsArgs[1].elt = "NewEndPort";
- GetListOfPortMappingsArgs[1].val = endPort;
- GetListOfPortMappingsArgs[2].elt = "NewProtocol";
- GetListOfPortMappingsArgs[2].val = protocol;
- GetListOfPortMappingsArgs[3].elt = "NewManage";
- GetListOfPortMappingsArgs[3].val = "1";
- GetListOfPortMappingsArgs[4].elt = "NewNumberOfPorts";
- GetListOfPortMappingsArgs[4].val = numberOfPorts?numberOfPorts:"1000";
-
- buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetListOfPortMappings",
- GetListOfPortMappingsArgs, &bufsize);
- free(GetListOfPortMappingsArgs);
- if(!buffer) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
-
- /*DisplayNameValueList(buffer, bufsize);*/
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
-
- /*p = GetValueFromNameValueList(&pdata, "NewPortListing");*/
- /*if(p) {
- printf("NewPortListing : %s\n", p);
- }*/
- /*printf("NewPortListing(%d chars) : %s\n",
- pdata.portListingLength, pdata.portListing);*/
- if(pdata.portListing)
- {
- /*struct PortMapping * pm;
- int i = 0;*/
- ParsePortListing(pdata.portListing, pdata.portListingLength,
- data);
- ret = UPNPCOMMAND_SUCCESS;
- /*
- for(pm = data->head.lh_first; pm != NULL; pm = pm->entries.le_next)
- {
- printf("%2d %s %5hu->%s:%-5hu '%s' '%s'\n",
- i, pm->protocol, pm->externalPort, pm->internalClient,
- pm->internalPort,
- pm->description, pm->remoteHost);
- i++;
- }
- */
- /*FreePortListing(&data);*/
- }
-
- p = GetValueFromNameValueList(&pdata, "errorCode");
- if(p) {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(p, "%d", &ret);
- }
- ClearNameValueList(&pdata);
-
- /*printf("%.*s", bufsize, buffer);*/
-
- return ret;
-}
-
-/* IGD:2, functions for service WANIPv6FirewallControl:1 */
-MINIUPNP_LIBSPEC int
-UPNP_GetFirewallStatus(const char * controlURL,
- const char * servicetype,
- int * firewallEnabled,
- int * inboundPinholeAllowed)
-{
- struct NameValueParserData pdata;
- char * buffer;
- int bufsize;
- char * fe, *ipa, *p;
- int ret = UPNPCOMMAND_UNKNOWN_ERROR;
-
- if(!firewallEnabled || !inboundPinholeAllowed)
- return UPNPCOMMAND_INVALID_ARGS;
-
- buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetFirewallStatus", 0, &bufsize);
- if(!buffer) {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
- fe = GetValueFromNameValueList(&pdata, "FirewallEnabled");
- ipa = GetValueFromNameValueList(&pdata, "InboundPinholeAllowed");
- if(ipa && fe)
- ret = UPNPCOMMAND_SUCCESS;
- if(fe)
- *firewallEnabled = my_atoui(fe);
- /*else
- *firewallEnabled = 0;*/
- if(ipa)
- *inboundPinholeAllowed = my_atoui(ipa);
- /*else
- *inboundPinholeAllowed = 0;*/
- p = GetValueFromNameValueList(&pdata, "errorCode");
- if(p)
- {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(p, "%d", &ret);
- }
- ClearNameValueList(&pdata);
- return ret;
-}
-
-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)
-{
- struct UPNParg * GetOutboundPinholeTimeoutArgs;
- char * buffer;
- int bufsize;
- struct NameValueParserData pdata;
- const char * resVal;
- char * p;
- int ret;
-
- if(!intPort || !intClient || !proto || !remotePort || !remoteHost)
- return UPNPCOMMAND_INVALID_ARGS;
-
- GetOutboundPinholeTimeoutArgs = calloc(6, sizeof(struct UPNParg));
- if(GetOutboundPinholeTimeoutArgs == NULL)
- return UPNPCOMMAND_MEM_ALLOC_ERROR;
- GetOutboundPinholeTimeoutArgs[0].elt = "RemoteHost";
- GetOutboundPinholeTimeoutArgs[0].val = remoteHost;
- GetOutboundPinholeTimeoutArgs[1].elt = "RemotePort";
- GetOutboundPinholeTimeoutArgs[1].val = remotePort;
- GetOutboundPinholeTimeoutArgs[2].elt = "Protocol";
- GetOutboundPinholeTimeoutArgs[2].val = proto;
- GetOutboundPinholeTimeoutArgs[3].elt = "InternalPort";
- GetOutboundPinholeTimeoutArgs[3].val = intPort;
- GetOutboundPinholeTimeoutArgs[4].elt = "InternalClient";
- GetOutboundPinholeTimeoutArgs[4].val = intClient;
- buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetOutboundPinholeTimeout", GetOutboundPinholeTimeoutArgs, &bufsize);
- free(GetOutboundPinholeTimeoutArgs);
- if(!buffer)
- return UPNPCOMMAND_HTTP_ERROR;
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
- resVal = GetValueFromNameValueList(&pdata, "errorCode");
- if(resVal)
- {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(resVal, "%d", &ret);
- }
- else
- {
- ret = UPNPCOMMAND_SUCCESS;
- p = GetValueFromNameValueList(&pdata, "OutboundPinholeTimeout");
- if(p)
- *opTimeout = my_atoui(p);
- }
- ClearNameValueList(&pdata);
- return ret;
-}
-
-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)
-{
- struct UPNParg * AddPinholeArgs;
- char * buffer;
- int bufsize;
- struct NameValueParserData pdata;
- const char * resVal;
- char * p;
- int ret;
-
- if(!intPort || !intClient || !proto || !remoteHost || !remotePort || !leaseTime)
- return UPNPCOMMAND_INVALID_ARGS;
-
- AddPinholeArgs = calloc(7, sizeof(struct UPNParg));
- if(AddPinholeArgs == NULL)
- return UPNPCOMMAND_MEM_ALLOC_ERROR;
- /* RemoteHost can be wilcarded */
- if(strncmp(remoteHost, "empty", 5)==0)
- {
- AddPinholeArgs[0].elt = "RemoteHost";
- AddPinholeArgs[0].val = "";
- }
- else
- {
- AddPinholeArgs[0].elt = "RemoteHost";
- AddPinholeArgs[0].val = remoteHost;
- }
- AddPinholeArgs[1].elt = "RemotePort";
- AddPinholeArgs[1].val = remotePort;
- AddPinholeArgs[2].elt = "Protocol";
- AddPinholeArgs[2].val = proto;
- AddPinholeArgs[3].elt = "InternalPort";
- AddPinholeArgs[3].val = intPort;
- if(strncmp(intClient, "empty", 5)==0)
- {
- AddPinholeArgs[4].elt = "InternalClient";
- AddPinholeArgs[4].val = "";
- }
- else
- {
- AddPinholeArgs[4].elt = "InternalClient";
- AddPinholeArgs[4].val = intClient;
- }
- AddPinholeArgs[5].elt = "LeaseTime";
- AddPinholeArgs[5].val = leaseTime;
- buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "AddPinhole", AddPinholeArgs, &bufsize);
- free(AddPinholeArgs);
- if(!buffer)
- return UPNPCOMMAND_HTTP_ERROR;
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
- p = GetValueFromNameValueList(&pdata, "UniqueID");
- if(p)
- {
- strncpy(uniqueID, p, 8);
- uniqueID[7] = '\0';
- }
- resVal = GetValueFromNameValueList(&pdata, "errorCode");
- if(resVal)
- {
- /*printf("AddPortMapping errorCode = '%s'\n", resVal);*/
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(resVal, "%d", &ret);
- }
- else
- {
- ret = UPNPCOMMAND_SUCCESS;
- }
- ClearNameValueList(&pdata);
- return ret;
-}
-
-MINIUPNP_LIBSPEC int
-UPNP_UpdatePinhole(const char * controlURL, const char * servicetype,
- const char * uniqueID,
- const char * leaseTime)
-{
- struct UPNParg * UpdatePinholeArgs;
- char * buffer;
- int bufsize;
- struct NameValueParserData pdata;
- const char * resVal;
- int ret;
-
- if(!uniqueID || !leaseTime)
- return UPNPCOMMAND_INVALID_ARGS;
-
- UpdatePinholeArgs = calloc(3, sizeof(struct UPNParg));
- if(UpdatePinholeArgs == NULL)
- return UPNPCOMMAND_MEM_ALLOC_ERROR;
- UpdatePinholeArgs[0].elt = "UniqueID";
- UpdatePinholeArgs[0].val = uniqueID;
- UpdatePinholeArgs[1].elt = "NewLeaseTime";
- UpdatePinholeArgs[1].val = leaseTime;
- buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "UpdatePinhole", UpdatePinholeArgs, &bufsize);
- free(UpdatePinholeArgs);
- if(!buffer)
- return UPNPCOMMAND_HTTP_ERROR;
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
- resVal = GetValueFromNameValueList(&pdata, "errorCode");
- if(resVal)
- {
- /*printf("AddPortMapping errorCode = '%s'\n", resVal); */
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(resVal, "%d", &ret);
- }
- else
- {
- ret = UPNPCOMMAND_SUCCESS;
- }
- ClearNameValueList(&pdata);
- return ret;
-}
-
-MINIUPNP_LIBSPEC int
-UPNP_DeletePinhole(const char * controlURL, const char * servicetype, const char * uniqueID)
-{
- /*struct NameValueParserData pdata;*/
- struct UPNParg * DeletePinholeArgs;
- char * buffer;
- int bufsize;
- struct NameValueParserData pdata;
- const char * resVal;
- int ret;
-
- if(!uniqueID)
- return UPNPCOMMAND_INVALID_ARGS;
-
- DeletePinholeArgs = calloc(2, sizeof(struct UPNParg));
- if(DeletePinholeArgs == NULL)
- return UPNPCOMMAND_MEM_ALLOC_ERROR;
- DeletePinholeArgs[0].elt = "UniqueID";
- DeletePinholeArgs[0].val = uniqueID;
- buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "DeletePinhole", DeletePinholeArgs, &bufsize);
- free(DeletePinholeArgs);
- if(!buffer)
- return UPNPCOMMAND_HTTP_ERROR;
- /*DisplayNameValueList(buffer, bufsize);*/
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
- resVal = GetValueFromNameValueList(&pdata, "errorCode");
- if(resVal)
- {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(resVal, "%d", &ret);
- }
- else
- {
- ret = UPNPCOMMAND_SUCCESS;
- }
- ClearNameValueList(&pdata);
- return ret;
-}
-
-MINIUPNP_LIBSPEC int
-UPNP_CheckPinholeWorking(const char * controlURL, const char * servicetype,
- const char * uniqueID, int * isWorking)
-{
- struct NameValueParserData pdata;
- struct UPNParg * CheckPinholeWorkingArgs;
- char * buffer;
- int bufsize;
- char * p;
- int ret = UPNPCOMMAND_UNKNOWN_ERROR;
-
- if(!uniqueID)
- return UPNPCOMMAND_INVALID_ARGS;
-
- CheckPinholeWorkingArgs = calloc(4, sizeof(struct UPNParg));
- if(CheckPinholeWorkingArgs == NULL)
- return UPNPCOMMAND_MEM_ALLOC_ERROR;
- CheckPinholeWorkingArgs[0].elt = "UniqueID";
- CheckPinholeWorkingArgs[0].val = uniqueID;
- buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "CheckPinholeWorking", CheckPinholeWorkingArgs, &bufsize);
- free(CheckPinholeWorkingArgs);
- if(!buffer)
- {
- return UPNPCOMMAND_HTTP_ERROR;
- }
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
-
- p = GetValueFromNameValueList(&pdata, "IsWorking");
- if(p)
- {
- *isWorking=my_atoui(p);
- ret = UPNPCOMMAND_SUCCESS;
- }
- else
- *isWorking = 0;
-
- p = GetValueFromNameValueList(&pdata, "errorCode");
- if(p)
- {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(p, "%d", &ret);
- }
-
- ClearNameValueList(&pdata);
- return ret;
-}
-
-MINIUPNP_LIBSPEC int
-UPNP_GetPinholePackets(const char * controlURL, const char * servicetype,
- const char * uniqueID, int * packets)
-{
- struct NameValueParserData pdata;
- struct UPNParg * GetPinholePacketsArgs;
- char * buffer;
- int bufsize;
- char * p;
- int ret = UPNPCOMMAND_UNKNOWN_ERROR;
-
- if(!uniqueID)
- return UPNPCOMMAND_INVALID_ARGS;
-
- GetPinholePacketsArgs = calloc(4, sizeof(struct UPNParg));
- if(GetPinholePacketsArgs == NULL)
- return UPNPCOMMAND_MEM_ALLOC_ERROR;
- GetPinholePacketsArgs[0].elt = "UniqueID";
- GetPinholePacketsArgs[0].val = uniqueID;
- buffer = simpleUPnPcommand(-1, controlURL, servicetype,
- "GetPinholePackets", GetPinholePacketsArgs, &bufsize);
- free(GetPinholePacketsArgs);
- if(!buffer)
- return UPNPCOMMAND_HTTP_ERROR;
- ParseNameValue(buffer, bufsize, &pdata);
- free(buffer); buffer = NULL;
-
- p = GetValueFromNameValueList(&pdata, "PinholePackets");
- if(p)
- {
- *packets=my_atoui(p);
- ret = UPNPCOMMAND_SUCCESS;
- }
-
- p = GetValueFromNameValueList(&pdata, "errorCode");
- if(p)
- {
- ret = UPNPCOMMAND_UNKNOWN_ERROR;
- sscanf(p, "%d", &ret);
- }
-
- ClearNameValueList(&pdata);
- return ret;
-}
-
-
diff --git a/external/miniupnpc/upnpcommands.h b/external/miniupnpc/upnpcommands.h
deleted file mode 100644
index 55b7b060d..000000000
--- a/external/miniupnpc/upnpcommands.h
+++ /dev/null
@@ -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
-
diff --git a/external/miniupnpc/upnpdev.c b/external/miniupnpc/upnpdev.c
deleted file mode 100644
index d89a9934c..000000000
--- a/external/miniupnpc/upnpdev.c
+++ /dev/null
@@ -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;
- }
-}
-
diff --git a/external/miniupnpc/upnpdev.h b/external/miniupnpc/upnpdev.h
deleted file mode 100644
index f49fbe17c..000000000
--- a/external/miniupnpc/upnpdev.h
+++ /dev/null
@@ -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 */
diff --git a/external/miniupnpc/upnperrors.c b/external/miniupnpc/upnperrors.c
deleted file mode 100644
index 40a2e7857..000000000
--- a/external/miniupnpc/upnperrors.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/* $Id: upnperrors.c,v 1.5 2011/04/10 11:19:36 nanard Exp $ */
-/* Project : miniupnp
- * Author : Thomas BERNARD
- * copyright (c) 2007 Thomas Bernard
- * All Right reserved.
- * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
- * This software is subjet to the conditions detailed in the
- * provided LICENCE file. */
-#include <string.h>
-#include "upnperrors.h"
-#include "upnpcommands.h"
-#include "miniupnpc.h"
-
-const char * strupnperror(int err)
-{
- const char * s = NULL;
- switch(err) {
- case UPNPCOMMAND_SUCCESS:
- s = "Success";
- break;
- case UPNPCOMMAND_UNKNOWN_ERROR:
- s = "Miniupnpc Unknown Error";
- break;
- case UPNPCOMMAND_INVALID_ARGS:
- s = "Miniupnpc Invalid Arguments";
- break;
- case UPNPCOMMAND_INVALID_RESPONSE:
- s = "Miniupnpc Invalid response";
- break;
- case UPNPDISCOVER_SOCKET_ERROR:
- s = "Miniupnpc Socket error";
- break;
- case UPNPDISCOVER_MEMORY_ERROR:
- s = "Miniupnpc Memory allocation error";
- break;
- case 401:
- s = "Invalid Action";
- break;
- case 402:
- s = "Invalid Args";
- break;
- case 501:
- s = "Action Failed";
- break;
- case 606:
- s = "Action not authorized";
- break;
- case 701:
- s = "PinholeSpaceExhausted";
- break;
- case 702:
- s = "FirewallDisabled";
- break;
- case 703:
- s = "InboundPinholeNotAllowed";
- break;
- case 704:
- s = "NoSuchEntry";
- break;
- case 705:
- s = "ProtocolNotSupported";
- break;
- case 706:
- s = "InternalPortWildcardingNotAllowed";
- break;
- case 707:
- s = "ProtocolWildcardingNotAllowed";
- break;
- case 708:
- s = "WildcardNotPermittedInSrcIP";
- break;
- case 709:
- s = "NoPacketSent";
- break;
- case 713:
- s = "SpecifiedArrayIndexInvalid";
- break;
- case 714:
- s = "NoSuchEntryInArray";
- break;
- case 715:
- s = "WildCardNotPermittedInSrcIP";
- break;
- case 716:
- s = "WildCardNotPermittedInExtPort";
- break;
- case 718:
- s = "ConflictInMappingEntry";
- break;
- case 724:
- s = "SamePortValuesRequired";
- break;
- case 725:
- s = "OnlyPermanentLeasesSupported";
- break;
- case 726:
- s = "RemoteHostOnlySupportsWildcard";
- break;
- case 727:
- s = "ExternalPortOnlySupportsWildcard";
- break;
- default:
- s = "UnknownError";
- break;
- }
- return s;
-}
diff --git a/external/miniupnpc/upnperrors.h b/external/miniupnpc/upnperrors.h
deleted file mode 100644
index 8499d9a1c..000000000
--- a/external/miniupnpc/upnperrors.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $Id: upnperrors.h,v 1.2 2008/07/02 23:31:15 nanard Exp $ */
-/* (c) 2007-2015 Thomas Bernard
- * All rights reserved.
- * MiniUPnP Project.
- * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
- * This software is subjet to the conditions detailed in the
- * provided LICENCE file. */
-#ifndef UPNPERRORS_H_INCLUDED
-#define UPNPERRORS_H_INCLUDED
-
-#include "miniupnpc_declspec.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* strupnperror()
- * Return a string description of the UPnP error code
- * or NULL for undefinded errors */
-MINIUPNP_LIBSPEC const char * strupnperror(int err);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/external/miniupnpc/upnpreplyparse.c b/external/miniupnpc/upnpreplyparse.c
deleted file mode 100644
index 5de5796a3..000000000
--- a/external/miniupnpc/upnpreplyparse.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/* $Id: upnpreplyparse.c,v 1.19 2015/07/15 10:29:11 nanard Exp $ */
-/* MiniUPnP project
- * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
- * (c) 2006-2015 Thomas Bernard
- * This software is subject to the conditions detailed
- * in the LICENCE file provided within the distribution */
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "upnpreplyparse.h"
-#include "minixml.h"
-
-static void
-NameValueParserStartElt(void * d, const char * name, int l)
-{
- struct NameValueParserData * data = (struct NameValueParserData *)d;
- data->topelt = 1;
- if(l>63)
- l = 63;
- memcpy(data->curelt, name, l);
- data->curelt[l] = '\0';
- data->cdata = NULL;
- data->cdatalen = 0;
-}
-
-static void
-NameValueParserEndElt(void * d, const char * name, int l)
-{
- struct NameValueParserData * data = (struct NameValueParserData *)d;
- struct NameValue * nv;
- (void)name;
- (void)l;
- if(!data->topelt)
- return;
- if(strcmp(data->curelt, "NewPortListing") != 0)
- {
- int l;
- /* standard case. Limited to n chars strings */
- l = data->cdatalen;
- nv = malloc(sizeof(struct NameValue));
- if(nv == NULL)
- {
- /* malloc error */
-#ifdef DEBUG
- fprintf(stderr, "%s: error allocating memory",
- "NameValueParserEndElt");
-#endif /* DEBUG */
- return;
- }
- if(l>=(int)sizeof(nv->value))
- l = sizeof(nv->value) - 1;
- strncpy(nv->name, data->curelt, 64);
- nv->name[63] = '\0';
- if(data->cdata != NULL)
- {
- memcpy(nv->value, data->cdata, l);
- nv->value[l] = '\0';
- }
- else
- {
- nv->value[0] = '\0';
- }
- nv->l_next = data->l_head; /* insert in list */
- data->l_head = nv;
- }
- data->cdata = NULL;
- data->cdatalen = 0;
- data->topelt = 0;
-}
-
-static void
-NameValueParserGetData(void * d, const char * datas, int l)
-{
- struct NameValueParserData * data = (struct NameValueParserData *)d;
- if(strcmp(data->curelt, "NewPortListing") == 0)
- {
- /* specific case for NewPortListing which is a XML Document */
- data->portListing = malloc(l + 1);
- if(!data->portListing)
- {
- /* malloc error */
-#ifdef DEBUG
- fprintf(stderr, "%s: error allocating memory",
- "NameValueParserGetData");
-#endif /* DEBUG */
- return;
- }
- memcpy(data->portListing, datas, l);
- data->portListing[l] = '\0';
- data->portListingLength = l;
- }
- else
- {
- /* standard case. */
- data->cdata = datas;
- data->cdatalen = l;
- }
-}
-
-void
-ParseNameValue(const char * buffer, int bufsize,
- struct NameValueParserData * data)
-{
- struct xmlparser parser;
- data->l_head = NULL;
- data->portListing = NULL;
- data->portListingLength = 0;
- /* init xmlparser object */
- parser.xmlstart = buffer;
- parser.xmlsize = bufsize;
- parser.data = data;
- parser.starteltfunc = NameValueParserStartElt;
- parser.endeltfunc = NameValueParserEndElt;
- parser.datafunc = NameValueParserGetData;
- parser.attfunc = 0;
- parsexml(&parser);
-}
-
-void
-ClearNameValueList(struct NameValueParserData * pdata)
-{
- struct NameValue * nv;
- if(pdata->portListing)
- {
- free(pdata->portListing);
- pdata->portListing = NULL;
- pdata->portListingLength = 0;
- }
- while((nv = pdata->l_head) != NULL)
- {
- pdata->l_head = nv->l_next;
- free(nv);
- }
-}
-
-char *
-GetValueFromNameValueList(struct NameValueParserData * pdata,
- const char * Name)
-{
- struct NameValue * nv;
- char * p = NULL;
- for(nv = pdata->l_head;
- (nv != NULL) && (p == NULL);
- nv = nv->l_next)
- {
- if(strcmp(nv->name, Name) == 0)
- p = nv->value;
- }
- return p;
-}
-
-#if 0
-/* useless now that minixml ignores namespaces by itself */
-char *
-GetValueFromNameValueListIgnoreNS(struct NameValueParserData * pdata,
- const char * Name)
-{
- struct NameValue * nv;
- char * p = NULL;
- char * pname;
- for(nv = pdata->head.lh_first;
- (nv != NULL) && (p == NULL);
- nv = nv->entries.le_next)
- {
- pname = strrchr(nv->name, ':');
- if(pname)
- pname++;
- else
- pname = nv->name;
- if(strcmp(pname, Name)==0)
- p = nv->value;
- }
- return p;
-}
-#endif
-
-/* debug all-in-one function
- * do parsing then display to stdout */
-#ifdef DEBUG
-void
-DisplayNameValueList(char * buffer, int bufsize)
-{
- struct NameValueParserData pdata;
- struct NameValue * nv;
- ParseNameValue(buffer, bufsize, &pdata);
- for(nv = pdata.l_head;
- nv != NULL;
- nv = nv->l_next)
- {
- printf("%s = %s\n", nv->name, nv->value);
- }
- ClearNameValueList(&pdata);
-}
-#endif /* DEBUG */
-
diff --git a/external/miniupnpc/upnpreplyparse.h b/external/miniupnpc/upnpreplyparse.h
deleted file mode 100644
index 6badd15b2..000000000
--- a/external/miniupnpc/upnpreplyparse.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $Id: upnpreplyparse.h,v 1.19 2014/10/27 16:33:19 nanard Exp $ */
-/* MiniUPnP project
- * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
- * (c) 2006-2013 Thomas Bernard
- * This software is subject to the conditions detailed
- * in the LICENCE file provided within the distribution */
-
-#ifndef UPNPREPLYPARSE_H_INCLUDED
-#define UPNPREPLYPARSE_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct NameValue {
- struct NameValue * l_next;
- char name[64];
- char value[128];
-};
-
-struct NameValueParserData {
- struct NameValue * l_head;
- char curelt[64];
- char * portListing;
- int portListingLength;
- int topelt;
- const char * cdata;
- int cdatalen;
-};
-
-/* ParseNameValue() */
-void
-ParseNameValue(const char * buffer, int bufsize,
- struct NameValueParserData * data);
-
-/* ClearNameValueList() */
-void
-ClearNameValueList(struct NameValueParserData * pdata);
-
-/* GetValueFromNameValueList() */
-char *
-GetValueFromNameValueList(struct NameValueParserData * pdata,
- const char * Name);
-
-#if 0
-/* GetValueFromNameValueListIgnoreNS() */
-char *
-GetValueFromNameValueListIgnoreNS(struct NameValueParserData * pdata,
- const char * Name);
-#endif
-
-/* DisplayNameValueList() */
-#ifdef DEBUG
-void
-DisplayNameValueList(char * buffer, int bufsize);
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/external/miniupnpc/wingenminiupnpcstrings.c b/external/miniupnpc/wingenminiupnpcstrings.c
deleted file mode 100644
index 50df06a76..000000000
--- a/external/miniupnpc/wingenminiupnpcstrings.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/* $Id: wingenminiupnpcstrings.c,v 1.4 2015/02/08 08:46:06 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 LICENSE file provided within this distribution */
-#include <stdio.h>
-#include <windows.h>
-
-/* This program display the Windows version and is used to
- * generate the miniupnpcstrings.h
- * wingenminiupnpcstrings miniupnpcstrings.h.in miniupnpcstrings.h
- */
-int main(int argc, char * * argv) {
- char buffer[256];
- OSVERSIONINFO osvi;
- FILE * fin;
- FILE * fout;
- int n;
- char miniupnpcVersion[32];
- /* dwMajorVersion :
- The major version number of the operating system. For more information, see Remarks.
- dwMinorVersion :
- The minor version number of the operating system. For more information, see Remarks.
- dwBuildNumber :
- The build number of the operating system.
- dwPlatformId
- The operating system platform. This member can be the following value.
- szCSDVersion
- A null-terminated string, such as "Service Pack 3", that indicates the
- latest Service Pack installed on the system. If no Service Pack has
- been installed, the string is empty.
- */
- ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
- osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-
- GetVersionEx(&osvi);
-
- printf("Windows %lu.%lu Build %lu %s\n",
- osvi.dwMajorVersion, osvi.dwMinorVersion,
- osvi.dwBuildNumber, (const char *)&(osvi.szCSDVersion));
-
- fin = fopen("VERSION", "r");
- fgets(miniupnpcVersion, sizeof(miniupnpcVersion), fin);
- fclose(fin);
- for(n = 0; n < sizeof(miniupnpcVersion); n++) {
- if(miniupnpcVersion[n] < ' ')
- miniupnpcVersion[n] = '\0';
- }
- printf("MiniUPnPc version %s\n", miniupnpcVersion);
-
- if(argc >= 3) {
- fin = fopen(argv[1], "r");
- if(!fin) {
- fprintf(stderr, "Cannot open %s for reading.\n", argv[1]);
- return 1;
- }
- fout = fopen(argv[2], "w");
- if(!fout) {
- fprintf(stderr, "Cannot open %s for writing.\n", argv[2]);
- fclose(fin);
- return 1;
- }
- n = 0;
- while(fgets(buffer, sizeof(buffer), fin)) {
- if(0 == memcmp(buffer, "#define OS_STRING \"OS/version\"", 30)) {
- sprintf(buffer, "#define OS_STRING \"MSWindows/%ld.%ld.%ld\"\n",
- osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber);
- } else if(0 == memcmp(buffer, "#define MINIUPNPC_VERSION_STRING \"version\"", 42)) {
- sprintf(buffer, "#define MINIUPNPC_VERSION_STRING \"%s\"\n",
- miniupnpcVersion);
- }
- /*fputs(buffer, stdout);*/
- fputs(buffer, fout);
- n++;
- }
- fclose(fin);
- fclose(fout);
- printf("%d lines written to %s.\n", n, argv[2]);
- }
- return 0;
-}
diff --git a/src/blockchain_db/blockchain_db.h b/src/blockchain_db/blockchain_db.h
index d7230f644..1ed715315 100644
--- a/src/blockchain_db/blockchain_db.h
+++ b/src/blockchain_db/blockchain_db.h
@@ -1490,10 +1490,13 @@ public:
* @param amounts optional set of amounts to lookup
* @param unlocked whether to restrict count to unlocked outputs
* @param recent_cutoff timestamp to determine whether an output is recent
+ * @param min_count return only amounts with at least that many instances
*
* @return a set of amount/instances
*/
- virtual std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff) const = 0;
+ virtual std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff, uint64_t min_count) const = 0;
+
+ virtual bool get_output_distribution(uint64_t amount, uint64_t from_height, uint64_t to_height, std::vector<uint64_t> &distribution, uint64_t &base) const = 0;
/**
* @brief is BlockchainDB in read-only mode?
diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp
index 9a755fb0c..5c20c8de4 100644
--- a/src/blockchain_db/lmdb/db_lmdb.cpp
+++ b/src/blockchain_db/lmdb/db_lmdb.cpp
@@ -3086,7 +3086,7 @@ void BlockchainLMDB::get_output_tx_and_index(const uint64_t& amount, const std::
LOG_PRINT_L3("db3: " << db3);
}
-std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> BlockchainLMDB::get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff) const
+std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> BlockchainLMDB::get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff, uint64_t min_count) const
{
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
check_open();
@@ -3112,7 +3112,8 @@ std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> BlockchainLMDB::get
mdb_size_t num_elems = 0;
mdb_cursor_count(m_cur_output_amounts, &num_elems);
uint64_t amount = *(const uint64_t*)k.mv_data;
- histogram[amount] = std::make_tuple(num_elems, 0, 0);
+ if (num_elems >= min_count)
+ histogram[amount] = std::make_tuple(num_elems, 0, 0);
}
}
else
@@ -3123,13 +3124,15 @@ std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> BlockchainLMDB::get
int ret = mdb_cursor_get(m_cur_output_amounts, &k, &v, MDB_SET);
if (ret == MDB_NOTFOUND)
{
- histogram[amount] = std::make_tuple(0, 0, 0);
+ if (0 >= min_count)
+ histogram[amount] = std::make_tuple(0, 0, 0);
}
else if (ret == MDB_SUCCESS)
{
mdb_size_t num_elems = 0;
mdb_cursor_count(m_cur_output_amounts, &num_elems);
- histogram[amount] = std::make_tuple(num_elems, 0, 0);
+ if (num_elems >= min_count)
+ histogram[amount] = std::make_tuple(num_elems, 0, 0);
}
else
{
@@ -3176,6 +3179,47 @@ std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> BlockchainLMDB::get
return histogram;
}
+bool BlockchainLMDB::get_output_distribution(uint64_t amount, uint64_t from_height, uint64_t to_height, std::vector<uint64_t> &distribution, uint64_t &base) const
+{
+ LOG_PRINT_L3("BlockchainLMDB::" << __func__);
+ check_open();
+
+ TXN_PREFIX_RDONLY();
+ RCURSOR(output_amounts);
+
+ distribution.clear();
+ const uint64_t db_height = height();
+ if (from_height >= db_height)
+ return false;
+ distribution.resize(db_height - from_height, 0);
+
+ bool fret = true;
+ MDB_val_set(k, amount);
+ MDB_val v;
+ MDB_cursor_op op = MDB_SET;
+ while (1)
+ {
+ int ret = mdb_cursor_get(m_cur_output_amounts, &k, &v, op);
+ op = MDB_NEXT_DUP;
+ if (ret == MDB_NOTFOUND)
+ break;
+ if (ret)
+ throw0(DB_ERROR("Failed to enumerate outputs"));
+ const outkey *ok = (const outkey *)v.mv_data;
+ const uint64_t height = ok->data.height;
+ if (height >= from_height)
+ distribution[height - from_height]++;
+ else
+ base++;
+ if (to_height > 0 && height > to_height)
+ break;
+ }
+
+ TXN_POSTFIX_RDONLY();
+
+ return true;
+}
+
void BlockchainLMDB::check_hard_fork_info()
{
}
diff --git a/src/blockchain_db/lmdb/db_lmdb.h b/src/blockchain_db/lmdb/db_lmdb.h
index 0aa4bb86e..f1773bac8 100644
--- a/src/blockchain_db/lmdb/db_lmdb.h
+++ b/src/blockchain_db/lmdb/db_lmdb.h
@@ -287,10 +287,13 @@ public:
* @param amounts optional set of amounts to lookup
* @param unlocked whether to restrict count to unlocked outputs
* @param recent_cutoff timestamp to determine which outputs are recent
+ * @param min_count return only amounts with at least that many instances
*
* @return a set of amount/instances
*/
- std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff) const;
+ std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff, uint64_t min_count) const;
+
+ bool get_output_distribution(uint64_t amount, uint64_t from_height, uint64_t to_height, std::vector<uint64_t> &distribution, uint64_t &base) const;
private:
void do_resize(uint64_t size_increase=0);
diff --git a/src/blockchain_utilities/blockchain_blackball.cpp b/src/blockchain_utilities/blockchain_blackball.cpp
index 40ce898d9..1243822bb 100644
--- a/src/blockchain_utilities/blockchain_blackball.cpp
+++ b/src/blockchain_utilities/blockchain_blackball.cpp
@@ -253,7 +253,8 @@ int main(int argc, char* argv[])
return 1;
}
std::vector<std::unique_ptr<Blockchain>> core_storage(inputs.size());
- tx_memory_pool m_mempool(*(Blockchain*)NULL);
+ Blockchain *blockchain = NULL;
+ tx_memory_pool m_mempool(*blockchain);
for (size_t n = 0; n < inputs.size(); ++n)
{
core_storage[n].reset(new Blockchain(m_mempool));
diff --git a/src/blocks/checkpoints.dat b/src/blocks/checkpoints.dat
index cff103804..501a55673 100644
--- a/src/blocks/checkpoints.dat
+++ b/src/blocks/checkpoints.dat
Binary files differ
diff --git a/src/checkpoints/checkpoints.cpp b/src/checkpoints/checkpoints.cpp
index 2c11af4b2..ef1ee171d 100644
--- a/src/checkpoints/checkpoints.cpp
+++ b/src/checkpoints/checkpoints.cpp
@@ -207,7 +207,7 @@ namespace cryptonote
ADD_CHECKPOINT(1390000, "a8f5649dd4ded60eedab475f2bec8c934681c07e3cf640e9be0617554f13ff6c");
ADD_CHECKPOINT(1450000, "ac94e8860093bc7c83e4e91215cba1d663421ecf4067a0ae609c3a8b52bcfac2");
ADD_CHECKPOINT(1530000, "01759bce497ec38e63c78b1038892169203bb78f87e488172f6b854fcd63ba7e");
-
+ ADD_CHECKPOINT(1579000, "7d0d7a2346373afd41ed1e744a939fc5d474a7dbaa257be5c6fff4009e789241");
return true;
}
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index 66fd8d7ad..808ef7630 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -87,6 +87,7 @@ target_link_libraries(common
${Boost_SYSTEM_LIBRARY}
${Boost_THREAD_LIBRARY}
${Boost_REGEX_LIBRARY}
+ ${Boost_CHRONO_LIBRARY}
PRIVATE
${OPENSSL_LIBRARIES}
${EXTRA_LIBRARIES})
diff --git a/src/common/dns_utils.cpp b/src/common/dns_utils.cpp
index 1ecdae8ec..33f60bc3c 100644
--- a/src/common/dns_utils.cpp
+++ b/src/common/dns_utils.cpp
@@ -230,7 +230,7 @@ DNSResolver::DNSResolver() : m_data(new DNSResolverData())
if (use_dns_public)
{
for (const auto &ip: dns_public_addr)
- ub_ctx_set_fwd(m_data->m_ub_context, ip.c_str());
+ ub_ctx_set_fwd(m_data->m_ub_context, string_copy(ip.c_str()));
ub_ctx_set_option(m_data->m_ub_context, string_copy("do-udp:"), string_copy("no"));
ub_ctx_set_option(m_data->m_ub_context, string_copy("do-tcp:"), string_copy("yes"));
}
diff --git a/src/common/util.cpp b/src/common/util.cpp
index d01da0fb7..7e77e19b1 100644
--- a/src/common/util.cpp
+++ b/src/common/util.cpp
@@ -43,6 +43,7 @@ using namespace epee;
#include "crypto/crypto.h"
#include "util.h"
+#include "stack_trace.h"
#include "memwipe.h"
#include "cryptonote_config.h"
#include "net/http_client.h" // epee::net_utils::...
@@ -527,7 +528,10 @@ std::string get_nix_version_display_string()
{
ub_ctx *ctx = ub_ctx_create();
if (!ctx) return false; // cheat a bit, should not happen unless OOM
- ub_ctx_zone_add(ctx, "monero", "unbound"); // this calls ub_ctx_finalize first, then errors out with UB_SYNTAX
+ char *monero = strdup("monero"), *unbound = strdup("unbound");
+ ub_ctx_zone_add(ctx, monero, unbound); // this calls ub_ctx_finalize first, then errors out with UB_SYNTAX
+ free(unbound);
+ free(monero);
// if no threads, bails out early with UB_NOERROR, otherwise fails with UB_AFTERFINAL id already finalized
bool with_threads = ub_ctx_async(ctx, 1) != 0; // UB_AFTERFINAL is not defined in public headers, check any error
ub_ctx_delete(ctx);
@@ -557,10 +561,48 @@ std::string get_nix_version_display_string()
}
return false;
}
+
+#ifdef STACK_TRACE
+#ifdef _WIN32
+ // https://stackoverflow.com/questions/1992816/how-to-handle-seg-faults-under-windows
+ static LONG WINAPI windows_crash_handler(PEXCEPTION_POINTERS pExceptionInfo)
+ {
+ tools::log_stack_trace("crashing");
+ exit(1);
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+ static void setup_crash_dump()
+ {
+ SetUnhandledExceptionFilter(windows_crash_handler);
+ }
+#else
+ static void posix_crash_handler(int signal)
+ {
+ tools::log_stack_trace(("crashing with fatal signal " + std::to_string(signal)).c_str());
+#ifdef NDEBUG
+ _exit(1);
+#else
+ abort();
+#endif
+ }
+ static void setup_crash_dump()
+ {
+ signal(SIGSEGV, posix_crash_handler);
+ signal(SIGBUS, posix_crash_handler);
+ signal(SIGILL, posix_crash_handler);
+ signal(SIGFPE, posix_crash_handler);
+ }
+#endif
+#else
+ static void setup_crash_dump() {}
+#endif
+
bool on_startup()
{
mlog_configure("", true);
+ setup_crash_dump();
+
sanitize_locale();
#ifdef __GLIBC__
diff --git a/src/crypto/chacha.h b/src/crypto/chacha.h
index 7a120931a..2b3ed8043 100644
--- a/src/crypto/chacha.h
+++ b/src/crypto/chacha.h
@@ -73,14 +73,14 @@ namespace crypto {
static_assert(sizeof(chacha_key) <= sizeof(hash), "Size of hash must be at least that of chacha_key");
tools::scrubbed_arr<char, HASH_SIZE> pwd_hash;
crypto::cn_slow_hash(data, size, pwd_hash.data(), 0/*variant*/, 0/*prehashed*/);
- memcpy(&key, pwd_hash.data(), sizeof(key));
+ memcpy(&unwrap(key), pwd_hash.data(), sizeof(key));
}
inline void generate_chacha_key_prehashed(const void *data, size_t size, chacha_key& key) {
static_assert(sizeof(chacha_key) <= sizeof(hash), "Size of hash must be at least that of chacha_key");
tools::scrubbed_arr<char, HASH_SIZE> pwd_hash;
crypto::cn_slow_hash(data, size, pwd_hash.data(), 0/*variant*/, 1/*prehashed*/);
- memcpy(&key, pwd_hash.data(), sizeof(key));
+ memcpy(&unwrap(key), pwd_hash.data(), sizeof(key));
}
inline void generate_chacha_key(std::string password, chacha_key& key) {
diff --git a/src/crypto/crypto.cpp b/src/crypto/crypto.cpp
index 494027560..ba0149240 100644
--- a/src/crypto/crypto.cpp
+++ b/src/crypto/crypto.cpp
@@ -124,9 +124,9 @@ namespace crypto {
random_scalar(rng);
}
sec = rng;
- sc_reduce32(&sec); // reduce in case second round of keys (sendkeys)
+ sc_reduce32(&unwrap(sec)); // reduce in case second round of keys (sendkeys)
- ge_scalarmult_base(&point, &sec);
+ ge_scalarmult_base(&point, &unwrap(sec));
ge_p3_tobytes(&pub, &point);
return rng;
@@ -139,10 +139,10 @@ namespace crypto {
bool crypto_ops::secret_key_to_public_key(const secret_key &sec, public_key &pub) {
ge_p3 point;
- if (sc_check(&sec) != 0) {
+ if (sc_check(&unwrap(sec)) != 0) {
return false;
}
- ge_scalarmult_base(&point, &sec);
+ ge_scalarmult_base(&point, &unwrap(sec));
ge_p3_tobytes(&pub, &point);
return true;
}
@@ -155,7 +155,7 @@ namespace crypto {
if (ge_frombytes_vartime(&point, &key1) != 0) {
return false;
}
- ge_scalarmult(&point2, &key2, &point);
+ ge_scalarmult(&point2, &unwrap(key2), &point);
ge_mul8(&point3, &point2);
ge_p1p1_to_p2(&point2, &point3);
ge_tobytes(&derivation, &point2);
@@ -199,7 +199,7 @@ namespace crypto {
ec_scalar scalar;
assert(sc_check(&base) == 0);
derivation_to_scalar(derivation, output_index, scalar);
- sc_add(&derived_key, &base, &scalar);
+ sc_add(&unwrap(derived_key), &unwrap(base), &scalar);
}
bool crypto_ops::derive_subaddress_public_key(const public_key &out_key, const key_derivation &derivation, std::size_t output_index, public_key &derived_key) {
@@ -254,7 +254,7 @@ namespace crypto {
ge_scalarmult_base(&tmp3, &k);
ge_p3_tobytes(&buf.comm, &tmp3);
hash_to_scalar(&buf, sizeof(s_comm), sig.c);
- sc_mulsub(&sig.r, &sig.c, &sec, &k);
+ sc_mulsub(&sig.r, &sig.c, &unwrap(sec), &k);
}
bool crypto_ops::check_signature(const hash &prefix_hash, const public_key &pub, const signature &sig) {
@@ -347,7 +347,7 @@ namespace crypto {
hash_to_scalar(&buf, sizeof(buf), sig.c);
// sig.r = k - sig.c*r
- sc_mulsub(&sig.r, &sig.c, &r, &k);
+ sc_mulsub(&sig.r, &sig.c, &unwrap(r), &k);
}
bool crypto_ops::check_tx_proof(const hash &prefix_hash, const public_key &R, const public_key &A, const boost::optional<public_key> &B, const public_key &D, const signature &sig) {
@@ -451,7 +451,7 @@ namespace crypto {
ge_p2 point2;
assert(sc_check(&sec) == 0);
hash_to_ec(pub, point);
- ge_scalarmult(&point2, &sec, &point);
+ ge_scalarmult(&point2, &unwrap(sec), &point);
ge_tobytes(&image, &point2);
}
@@ -530,7 +530,7 @@ POP_WARNINGS
}
hash_to_scalar(buf.get(), rs_comm_size(pubs_count), h);
sc_sub(&sig[sec_index].c, &h, &sum);
- sc_mulsub(&sig[sec_index].r, &sig[sec_index].c, &sec, &k);
+ sc_mulsub(&sig[sec_index].r, &sig[sec_index].c, &unwrap(sec), &k);
}
bool crypto_ops::check_ring_signature(const hash &prefix_hash, const key_image &image,
diff --git a/src/crypto/slow-hash.c b/src/crypto/slow-hash.c
index d7dcbd274..35e98f2f5 100644
--- a/src/crypto/slow-hash.c
+++ b/src/crypto/slow-hash.c
@@ -524,7 +524,7 @@ void slow_hash_free_state(void)
else
{
#if defined(_MSC_VER) || defined(__MINGW32__)
- VirtualFree(hp_state, MEMORY, MEM_RELEASE);
+ VirtualFree(hp_state, 0, MEM_RELEASE);
#else
munmap(hp_state, MEMORY);
#endif
diff --git a/src/cryptonote_basic/cryptonote_format_utils.cpp b/src/cryptonote_basic/cryptonote_format_utils.cpp
index ae7c1c0ae..3c6885896 100644
--- a/src/cryptonote_basic/cryptonote_format_utils.cpp
+++ b/src/cryptonote_basic/cryptonote_format_utils.cpp
@@ -124,6 +124,40 @@ namespace cryptonote
return h;
}
//---------------------------------------------------------------
+ bool expand_transaction_1(transaction &tx, bool base_only)
+ {
+ if (tx.version >= 2 && !is_coinbase(tx))
+ {
+ rct::rctSig &rv = tx.rct_signatures;
+ if (rv.outPk.size() != tx.vout.size())
+ {
+ LOG_PRINT_L1("Failed to parse transaction from blob, bad outPk size in tx " << get_transaction_hash(tx));
+ return false;
+ }
+ for (size_t n = 0; n < tx.rct_signatures.outPk.size(); ++n)
+ rv.outPk[n].dest = rct::pk2rct(boost::get<txout_to_key>(tx.vout[n].target).key);
+
+ if (!base_only)
+ {
+ const bool bulletproof = rv.type == rct::RCTTypeFullBulletproof || rv.type == rct::RCTTypeSimpleBulletproof;
+ if (bulletproof)
+ {
+ if (rv.p.bulletproofs.size() != tx.vout.size())
+ {
+ LOG_PRINT_L1("Failed to parse transaction from blob, bad bulletproofs size in tx " << get_transaction_hash(tx));
+ return false;
+ }
+ for (size_t n = 0; n < rv.outPk.size(); ++n)
+ {
+ rv.p.bulletproofs[n].V.resize(1);
+ rv.p.bulletproofs[n].V[0] = rv.outPk[n].mask;
+ }
+ }
+ }
+ }
+ return true;
+ }
+ //---------------------------------------------------------------
bool parse_and_validate_tx_from_blob(const blobdata& tx_blob, transaction& tx)
{
std::stringstream ss;
@@ -131,6 +165,7 @@ namespace cryptonote
binary_archive<false> ba(ss);
bool r = ::serialization::serialize(ba, tx);
CHECK_AND_ASSERT_MES(r, false, "Failed to parse transaction from blob");
+ CHECK_AND_ASSERT_MES(expand_transaction_1(tx, false), false, "Failed to expand transaction data");
tx.invalidate_hashes();
return true;
}
@@ -142,6 +177,7 @@ namespace cryptonote
binary_archive<false> ba(ss);
bool r = tx.serialize_base(ba);
CHECK_AND_ASSERT_MES(r, false, "Failed to parse transaction from blob");
+ CHECK_AND_ASSERT_MES(expand_transaction_1(tx, true), false, "Failed to expand transaction data");
return true;
}
//---------------------------------------------------------------
@@ -152,6 +188,7 @@ namespace cryptonote
binary_archive<false> ba(ss);
bool r = ::serialization::serialize(ba, tx);
CHECK_AND_ASSERT_MES(r, false, "Failed to parse transaction from blob");
+ CHECK_AND_ASSERT_MES(expand_transaction_1(tx, false), false, "Failed to expand transaction data");
tx.invalidate_hashes();
//TODO: validate tx
diff --git a/src/cryptonote_config.h b/src/cryptonote_config.h
index 0ad8a6005..3e64073dd 100644
--- a/src/cryptonote_config.h
+++ b/src/cryptonote_config.h
@@ -200,6 +200,7 @@ namespace cryptonote
MAINNET = 0,
TESTNET,
STAGENET,
- FAKECHAIN
+ FAKECHAIN,
+ UNDEFINED = 255
};
}
diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp
index 3db516847..5814841f3 100644
--- a/src/cryptonote_core/blockchain.cpp
+++ b/src/cryptonote_core/blockchain.cpp
@@ -156,7 +156,9 @@ static const struct {
//------------------------------------------------------------------
Blockchain::Blockchain(tx_memory_pool& tx_pool) :
m_db(), m_tx_pool(tx_pool), m_hardfork(NULL), m_timestamps_and_difficulties_height(0), m_current_block_cumul_sz_limit(0), m_current_block_cumul_sz_median(0),
- m_enforce_dns_checkpoints(false), m_max_prepare_blocks_threads(4), m_db_blocks_per_sync(1), m_db_sync_mode(db_async), m_db_default_sync(false), m_fast_sync(true), m_show_time_stats(false), m_sync_counter(0), m_cancel(false)
+ m_enforce_dns_checkpoints(false), m_max_prepare_blocks_threads(4), m_db_blocks_per_sync(1), m_db_sync_mode(db_async), m_db_default_sync(false), m_fast_sync(true), m_show_time_stats(false), m_sync_counter(0), m_cancel(false),
+ m_difficulty_for_next_block_top_hash(crypto::null_hash),
+ m_difficulty_for_next_block(1)
{
LOG_PRINT_L3("Blockchain::" << __func__);
}
@@ -441,6 +443,53 @@ bool Blockchain::init(BlockchainDB* db, const network_type nettype, bool offline
MINFO("Blockchain initialized. last block: " << m_db->height() - 1 << ", " << epee::misc_utils::get_time_interval_string(timestamp_diff) << " time ago, current difficulty: " << get_difficulty_for_next_block());
m_db->block_txn_stop();
+ uint64_t num_popped_blocks = 0;
+ while (true)
+ {
+ const uint64_t top_height = m_db->height() - 1;
+ const crypto::hash top_id = m_db->top_block_hash();
+ const block top_block = m_db->get_top_block();
+ const uint8_t ideal_hf_version = get_ideal_hard_fork_version(top_height);
+ if (ideal_hf_version <= 1 || ideal_hf_version == top_block.major_version)
+ {
+ if (num_popped_blocks > 0)
+ MGINFO("Initial popping done, top block: " << top_id << ", top height: " << top_height << ", block version: " << (uint64_t)top_block.major_version);
+ break;
+ }
+ else
+ {
+ if (num_popped_blocks == 0)
+ MGINFO("Current top block " << top_id << " at height " << top_height << " has version " << (uint64_t)top_block.major_version << " which disagrees with the ideal version " << (uint64_t)ideal_hf_version);
+ if (num_popped_blocks % 100 == 0)
+ MGINFO("Popping blocks... " << top_height);
+ ++num_popped_blocks;
+ block popped_block;
+ std::vector<transaction> popped_txs;
+ try
+ {
+ m_db->pop_block(popped_block, popped_txs);
+ }
+ // anything that could cause this to throw is likely catastrophic,
+ // so we re-throw
+ catch (const std::exception& e)
+ {
+ MERROR("Error popping block from blockchain: " << e.what());
+ throw;
+ }
+ catch (...)
+ {
+ MERROR("Error popping block from blockchain, throwing!");
+ throw;
+ }
+ }
+ }
+ if (num_popped_blocks > 0)
+ {
+ m_timestamps_and_difficulties_height = 0;
+ m_hardfork->reorganize_from_chain_height(get_current_blockchain_height());
+ m_tx_pool.on_blockchain_dec(m_db->height()-1, get_tail_id());
+ }
+
update_next_cumulative_size_limit();
return true;
}
@@ -584,6 +633,12 @@ block Blockchain::pop_block_from_blockchain()
}
}
}
+
+ m_blocks_longhash_table.clear();
+ m_scan_table.clear();
+ m_blocks_txs_check.clear();
+ m_check_txin_table.clear();
+
update_next_cumulative_size_limit();
m_tx_pool.on_blockchain_dec(m_db->height()-1, get_tail_id());
@@ -751,7 +806,17 @@ bool Blockchain::get_block_by_hash(const crypto::hash &h, block &blk, bool *orph
difficulty_type Blockchain::get_difficulty_for_next_block()
{
LOG_PRINT_L3("Blockchain::" << __func__);
- CRITICAL_REGION_LOCAL(m_blockchain_lock);
+
+ CRITICAL_REGION_LOCAL(m_difficulty_lock);
+ // we can call this without the blockchain lock, it might just give us
+ // something a bit out of date, but that's fine since anything which
+ // requires the blockchain lock will have acquired it in the first place,
+ // and it will be unlocked only when called from the getinfo RPC
+ crypto::hash top_hash = get_tail_id();
+ if (top_hash == m_difficulty_for_next_block_top_hash)
+ return m_difficulty_for_next_block;
+
+ CRITICAL_REGION_LOCAL1(m_blockchain_lock);
std::vector<uint64_t> timestamps;
std::vector<difficulty_type> difficulties;
auto height = m_db->height();
@@ -794,7 +859,10 @@ difficulty_type Blockchain::get_difficulty_for_next_block()
m_difficulties = difficulties;
}
size_t target = get_difficulty_target();
- return next_difficulty(timestamps, difficulties, target);
+ difficulty_type diff = next_difficulty(timestamps, difficulties, target);
+ m_difficulty_for_next_block_top_hash = top_hash;
+ m_difficulty_for_next_block = diff;
+ return diff;
}
//------------------------------------------------------------------
// This function removes blocks from the blockchain until it gets to the
@@ -1903,7 +1971,7 @@ void Blockchain::get_output_key_mask_unlocked(const uint64_t& amount, const uint
unlocked = is_tx_spendtime_unlocked(m_db->get_tx_unlock_time(toi.first));
}
//------------------------------------------------------------------
-bool Blockchain::get_output_distribution(uint64_t amount, uint64_t from_height, uint64_t &start_height, std::vector<uint64_t> &distribution, uint64_t &base) const
+bool Blockchain::get_output_distribution(uint64_t amount, uint64_t from_height, uint64_t to_height, uint64_t &start_height, std::vector<uint64_t> &distribution, uint64_t &base) const
{
// rct outputs don't exist before v3
if (amount == 0)
@@ -1924,22 +1992,7 @@ bool Blockchain::get_output_distribution(uint64_t amount, uint64_t from_height,
if (from_height > start_height)
start_height = from_height;
- distribution.clear();
- uint64_t db_height = m_db->height();
- if (start_height >= db_height)
- return false;
- distribution.resize(db_height - start_height, 0);
- bool r = for_all_outputs(amount, [&](uint64_t height) {
- CHECK_AND_ASSERT_MES(height >= real_start_height && height <= db_height, false, "Height not in expected range");
- if (height >= start_height)
- distribution[height - start_height]++;
- else
- base++;
- return true;
- });
- if (!r)
- return false;
- return true;
+ return m_db->get_output_distribution(amount, start_height, to_height, distribution, base);
}
//------------------------------------------------------------------
// This function takes a list of block hashes from another node
@@ -4322,9 +4375,9 @@ uint64_t Blockchain::get_difficulty_target() const
return get_current_hard_fork_version() < 2 ? DIFFICULTY_TARGET_V1 : DIFFICULTY_TARGET_V2;
}
-std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> Blockchain:: get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff) const
+std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> Blockchain:: get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff, uint64_t min_count) const
{
- return m_db->get_output_histogram(amounts, unlocked, recent_cutoff);
+ return m_db->get_output_histogram(amounts, unlocked, recent_cutoff, min_count);
}
std::list<std::pair<Blockchain::block_extended_info,uint64_t>> Blockchain::get_alternative_chains() const
@@ -4365,7 +4418,7 @@ void Blockchain::cancel()
}
#if defined(PER_BLOCK_CHECKPOINT)
-static const char expected_block_hashes_hash[] = "4b553162ee4e7af3c53666506591489c68560b9175e6e941dc96c89f96f0e35c";
+static const char expected_block_hashes_hash[] = "59261c03b54bcb21bd463f9fe40a94f40840a12642e9a3b3bfb11b35839a5fe3";
void Blockchain::load_compiled_in_block_hashes()
{
const bool testnet = m_nettype == TESTNET;
diff --git a/src/cryptonote_core/blockchain.h b/src/cryptonote_core/blockchain.h
index 4423199de..6134418af 100644
--- a/src/cryptonote_core/blockchain.h
+++ b/src/cryptonote_core/blockchain.h
@@ -527,12 +527,13 @@ namespace cryptonote
* @brief gets per block distribution of outputs of a given amount
*
* @param amount the amount to get a ditribution for
- * @param return-by-reference from_height the height before which we do not care about the data
+ * @param from_height the height before which we do not care about the data
+ * @param to_height the height after which we do not care about the data
* @param return-by-reference start_height the height of the first rct output
* @param return-by-reference distribution the start offset of the first rct output in this block (same as previous if none)
* @param return-by-reference base how many outputs of that amount are before the stated distribution
*/
- bool get_output_distribution(uint64_t amount, uint64_t from_height, uint64_t &start_height, std::vector<uint64_t> &distribution, uint64_t &base) const;
+ bool get_output_distribution(uint64_t amount, uint64_t from_height, uint64_t to_height, uint64_t &start_height, std::vector<uint64_t> &distribution, uint64_t &base) const;
/**
* @brief gets the global indices for outputs from a given transaction
@@ -827,10 +828,11 @@ namespace cryptonote
* @param amounts optional set of amounts to lookup
* @param unlocked whether to restrict instances to unlocked ones
* @param recent_cutoff timestamp to consider outputs as recent
+ * @param min_count return only amounts with at least that many instances
*
* @return a set of amount/instances
*/
- std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff) const;
+ std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff, uint64_t min_count = 0) const;
/**
* @brief perform a check on all key images in the blockchain
@@ -1006,6 +1008,10 @@ namespace cryptonote
std::vector<difficulty_type> m_difficulties;
uint64_t m_timestamps_and_difficulties_height;
+ epee::critical_section m_difficulty_lock;
+ crypto::hash m_difficulty_for_next_block_top_hash;
+ difficulty_type m_difficulty_for_next_block;
+
boost::asio::io_service m_async_service;
boost::thread_group m_async_pool;
std::unique_ptr<boost::asio::io_service::work> m_async_work_idle;
diff --git a/src/cryptonote_core/cryptonote_core.cpp b/src/cryptonote_core/cryptonote_core.cpp
index adccd0469..01cd56a11 100644
--- a/src/cryptonote_core/cryptonote_core.cpp
+++ b/src/cryptonote_core/cryptonote_core.cpp
@@ -81,7 +81,7 @@ namespace cryptonote
, "Specify data directory"
, tools::get_default_data_dir()
, {{ &arg_testnet_on, &arg_stagenet_on }}
- , [](std::array<bool, 2> testnet_stagenet, bool defaulted, std::string val) {
+ , [](std::array<bool, 2> testnet_stagenet, bool defaulted, std::string val)->std::string {
if (testnet_stagenet[0])
return (boost::filesystem::path(val) / "testnet").string();
else if (testnet_stagenet[1])
@@ -171,7 +171,8 @@ namespace cryptonote
m_last_json_checkpoints_update(0),
m_disable_dns_checkpoints(false),
m_threadpool(tools::threadpool::getInstance()),
- m_update_download(0)
+ m_update_download(0),
+ m_nettype(UNDEFINED)
{
m_checkpoints_updating.clear();
set_cryptonote_protocol(pprotocol);
@@ -649,39 +650,6 @@ namespace cryptonote
return false;
}
- // resolve outPk references in rct txes
- // outPk aren't the only thing that need resolving for a fully resolved tx,
- // but outPk (1) are needed now to check range proof semantics, and
- // (2) do not need access to the blockchain to find data
- if (tx.version >= 2)
- {
- rct::rctSig &rv = tx.rct_signatures;
- if (rv.outPk.size() != tx.vout.size())
- {
- LOG_PRINT_L1("WRONG TRANSACTION BLOB, Bad outPk size in tx " << tx_hash << ", rejected");
- tvc.m_verifivation_failed = true;
- return false;
- }
- for (size_t n = 0; n < tx.rct_signatures.outPk.size(); ++n)
- rv.outPk[n].dest = rct::pk2rct(boost::get<txout_to_key>(tx.vout[n].target).key);
-
- const bool bulletproof = rv.type == rct::RCTTypeFullBulletproof || rv.type == rct::RCTTypeSimpleBulletproof;
- if (bulletproof)
- {
- if (rv.p.bulletproofs.size() != tx.vout.size())
- {
- LOG_PRINT_L1("WRONG TRANSACTION BLOB, Bad bulletproofs size in tx " << tx_hash << ", rejected");
- tvc.m_verifivation_failed = true;
- return false;
- }
- for (size_t n = 0; n < rv.outPk.size(); ++n)
- {
- rv.p.bulletproofs[n].V.resize(1);
- rv.p.bulletproofs[n].V[0] = rv.outPk[n].mask;
- }
- }
- }
-
if (keeped_by_block && get_blockchain_storage().is_within_compiled_block_hash_area())
{
MTRACE("Skipping semantics check for tx kept by block in embedded hash area");
@@ -1105,9 +1073,9 @@ namespace cryptonote
return m_blockchain_storage.get_random_rct_outs(req, res);
}
//-----------------------------------------------------------------------------------------------
- bool core::get_output_distribution(uint64_t amount, uint64_t from_height, uint64_t &start_height, std::vector<uint64_t> &distribution, uint64_t &base) const
+ bool core::get_output_distribution(uint64_t amount, uint64_t from_height, uint64_t to_height, uint64_t &start_height, std::vector<uint64_t> &distribution, uint64_t &base) const
{
- return m_blockchain_storage.get_output_distribution(amount, from_height, start_height, distribution, base);
+ return m_blockchain_storage.get_output_distribution(amount, from_height, to_height, start_height, distribution, base);
}
//-----------------------------------------------------------------------------------------------
bool core::get_tx_outputs_gindexs(const crypto::hash& tx_id, std::vector<uint64_t>& indexs) const
@@ -1417,6 +1385,11 @@ namespace cryptonote
return true;
}
//-----------------------------------------------------------------------------------------------
+ uint8_t core::get_ideal_hard_fork_version() const
+ {
+ return get_blockchain_storage().get_ideal_hard_fork_version();
+ }
+ //-----------------------------------------------------------------------------------------------
uint8_t core::get_ideal_hard_fork_version(uint64_t height) const
{
return get_blockchain_storage().get_ideal_hard_fork_version(height);
diff --git a/src/cryptonote_core/cryptonote_core.h b/src/cryptonote_core/cryptonote_core.h
index abf79be1d..f3b9dddc0 100644
--- a/src/cryptonote_core/cryptonote_core.h
+++ b/src/cryptonote_core/cryptonote_core.h
@@ -576,7 +576,7 @@ namespace cryptonote
*
* @brief get per block distribution of outputs of a given amount
*/
- bool get_output_distribution(uint64_t amount, uint64_t from_height, uint64_t &start_height, std::vector<uint64_t> &distribution, uint64_t &base) const;
+ bool get_output_distribution(uint64_t amount, uint64_t from_height, uint64_t to_height, uint64_t &start_height, std::vector<uint64_t> &distribution, uint64_t &base) const;
/**
* @copydoc miner::pause
@@ -642,6 +642,13 @@ namespace cryptonote
uint64_t get_target_blockchain_height() const;
/**
+ * @brief returns the newest hardfork version known to the blockchain
+ *
+ * @return the version
+ */
+ uint8_t get_ideal_hard_fork_version() const;
+
+ /**
* @brief return the ideal hard fork version for a given block height
*
* @return what it says above
diff --git a/src/cryptonote_core/cryptonote_tx_utils.cpp b/src/cryptonote_core/cryptonote_tx_utils.cpp
index db4ab9e11..071ce591e 100644
--- a/src/cryptonote_core/cryptonote_tx_utils.cpp
+++ b/src/cryptonote_core/cryptonote_tx_utils.cpp
@@ -29,6 +29,7 @@
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
#include <unordered_set>
+#include <random>
#include "include_base_utils.h"
#include "string_tools.h"
using namespace epee;
@@ -194,7 +195,7 @@ namespace cryptonote
return addr.m_view_public_key;
}
//---------------------------------------------------------------
- bool construct_tx_with_tx_key(const account_keys& sender_account_keys, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, std::vector<tx_source_entry>& sources, const std::vector<tx_destination_entry>& destinations, const boost::optional<cryptonote::account_public_address>& change_addr, std::vector<uint8_t> extra, transaction& tx, uint64_t unlock_time, const crypto::secret_key &tx_key, const std::vector<crypto::secret_key> &additional_tx_keys, bool rct, bool bulletproof, rct::multisig_out *msout)
+ bool construct_tx_with_tx_key(const account_keys& sender_account_keys, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, std::vector<tx_source_entry>& sources, std::vector<tx_destination_entry>& destinations, const boost::optional<cryptonote::account_public_address>& change_addr, std::vector<uint8_t> extra, transaction& tx, uint64_t unlock_time, const crypto::secret_key &tx_key, const std::vector<crypto::secret_key> &additional_tx_keys, bool rct, bool bulletproof, rct::multisig_out *msout, bool shuffle_outs)
{
hw::device &hwdev = sender_account_keys.get_device();
@@ -314,9 +315,10 @@ namespace cryptonote
tx.vin.push_back(input_to_key);
}
- // "Shuffle" outs
- std::vector<tx_destination_entry> shuffled_dsts(destinations);
- std::random_shuffle(shuffled_dsts.begin(), shuffled_dsts.end(), [](unsigned int i) { return crypto::rand<unsigned int>() % i; });
+ if (shuffle_outs)
+ {
+ std::shuffle(destinations.begin(), destinations.end(), std::default_random_engine(crypto::rand<unsigned int>()));
+ }
// sort ins by their key image
std::vector<size_t> ins_order(sources.size());
@@ -599,7 +601,7 @@ namespace cryptonote
return true;
}
//---------------------------------------------------------------
- bool construct_tx_and_get_tx_key(const account_keys& sender_account_keys, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, std::vector<tx_source_entry>& sources, const std::vector<tx_destination_entry>& destinations, const boost::optional<cryptonote::account_public_address>& change_addr, std::vector<uint8_t> extra, transaction& tx, uint64_t unlock_time, crypto::secret_key &tx_key, std::vector<crypto::secret_key> &additional_tx_keys, bool rct, bool bulletproof, rct::multisig_out *msout)
+ bool construct_tx_and_get_tx_key(const account_keys& sender_account_keys, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, std::vector<tx_source_entry>& sources, std::vector<tx_destination_entry>& destinations, const boost::optional<cryptonote::account_public_address>& change_addr, std::vector<uint8_t> extra, transaction& tx, uint64_t unlock_time, crypto::secret_key &tx_key, std::vector<crypto::secret_key> &additional_tx_keys, bool rct, bool bulletproof, rct::multisig_out *msout)
{
hw::device &hwdev = sender_account_keys.get_device();
hwdev.open_tx(tx_key);
@@ -628,7 +630,8 @@ namespace cryptonote
subaddresses[sender_account_keys.m_account_address.m_spend_public_key] = {0,0};
crypto::secret_key tx_key;
std::vector<crypto::secret_key> additional_tx_keys;
- return construct_tx_and_get_tx_key(sender_account_keys, subaddresses, sources, destinations, change_addr, extra, tx, unlock_time, tx_key, additional_tx_keys, false, false, NULL);
+ std::vector<tx_destination_entry> destinations_copy = destinations;
+ return construct_tx_and_get_tx_key(sender_account_keys, subaddresses, sources, destinations_copy, change_addr, extra, tx, unlock_time, tx_key, additional_tx_keys, false, false, NULL);
}
//---------------------------------------------------------------
bool generate_genesis_block(
diff --git a/src/cryptonote_core/cryptonote_tx_utils.h b/src/cryptonote_core/cryptonote_tx_utils.h
index 1c390078d..a5d149fca 100644
--- a/src/cryptonote_core/cryptonote_tx_utils.h
+++ b/src/cryptonote_core/cryptonote_tx_utils.h
@@ -90,8 +90,8 @@ namespace cryptonote
//---------------------------------------------------------------
crypto::public_key get_destination_view_key_pub(const std::vector<tx_destination_entry> &destinations, const boost::optional<cryptonote::account_public_address>& change_addr);
bool construct_tx(const account_keys& sender_account_keys, std::vector<tx_source_entry> &sources, const std::vector<tx_destination_entry>& destinations, const boost::optional<cryptonote::account_public_address>& change_addr, std::vector<uint8_t> extra, transaction& tx, uint64_t unlock_time);
- bool construct_tx_with_tx_key(const account_keys& sender_account_keys, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, std::vector<tx_source_entry>& sources, const std::vector<tx_destination_entry>& destinations, const boost::optional<cryptonote::account_public_address>& change_addr, std::vector<uint8_t> extra, transaction& tx, uint64_t unlock_time, const crypto::secret_key &tx_key, const std::vector<crypto::secret_key> &additional_tx_keys, bool rct = false, bool bulletproof = false, rct::multisig_out *msout = NULL);
- bool construct_tx_and_get_tx_key(const account_keys& sender_account_keys, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, std::vector<tx_source_entry>& sources, const std::vector<tx_destination_entry>& destinations, const boost::optional<cryptonote::account_public_address>& change_addr, std::vector<uint8_t> extra, transaction& tx, uint64_t unlock_time, crypto::secret_key &tx_key, std::vector<crypto::secret_key> &additional_tx_keys, bool rct = false, bool bulletproof = false, rct::multisig_out *msout = NULL);
+ bool construct_tx_with_tx_key(const account_keys& sender_account_keys, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, std::vector<tx_source_entry>& sources, std::vector<tx_destination_entry>& destinations, const boost::optional<cryptonote::account_public_address>& change_addr, std::vector<uint8_t> extra, transaction& tx, uint64_t unlock_time, const crypto::secret_key &tx_key, const std::vector<crypto::secret_key> &additional_tx_keys, bool rct = false, bool bulletproof = false, rct::multisig_out *msout = NULL, bool shuffle_outs = true);
+ bool construct_tx_and_get_tx_key(const account_keys& sender_account_keys, const std::unordered_map<crypto::public_key, subaddress_index>& subaddresses, std::vector<tx_source_entry>& sources, std::vector<tx_destination_entry>& destinations, const boost::optional<cryptonote::account_public_address>& change_addr, std::vector<uint8_t> extra, transaction& tx, uint64_t unlock_time, crypto::secret_key &tx_key, std::vector<crypto::secret_key> &additional_tx_keys, bool rct = false, bool bulletproof = false, rct::multisig_out *msout = NULL);
bool generate_genesis_block(
block& bl
diff --git a/src/cryptonote_core/tx_pool.cpp b/src/cryptonote_core/tx_pool.cpp
index 0af9737a7..bf1fe476e 100644
--- a/src/cryptonote_core/tx_pool.cpp
+++ b/src/cryptonote_core/tx_pool.cpp
@@ -1068,10 +1068,6 @@ namespace cryptonote
//TODO: investigate whether boolean return is appropriate
bool tx_memory_pool::fill_block_template(block &bl, size_t median_size, uint64_t already_generated_coins, size_t &total_size, uint64_t &fee, uint64_t &expected_reward, uint8_t version)
{
- // Warning: This function takes already_generated_
- // coins as an argument and appears to do nothing
- // with it.
-
CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain);
@@ -1268,24 +1264,33 @@ namespace cryptonote
m_spent_key_images.clear();
m_txpool_size = 0;
std::vector<crypto::hash> remove;
- bool r = m_blockchain.for_all_txpool_txes([this, &remove](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd) {
- cryptonote::transaction tx;
- if (!parse_and_validate_tx_from_blob(*bd, tx))
- {
- MWARNING("Failed to parse tx from txpool, removing");
- remove.push_back(txid);
- }
- if (!insert_key_images(tx, meta.kept_by_block))
- {
- MFATAL("Failed to insert key images from txpool tx");
+
+ // first add the not kept by block, then the kept by block,
+ // to avoid rejection due to key image collision
+ for (int pass = 0; pass < 2; ++pass)
+ {
+ const bool kept = pass == 1;
+ bool r = m_blockchain.for_all_txpool_txes([this, &remove, kept](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd) {
+ if (!!kept != !!meta.kept_by_block)
+ return true;
+ cryptonote::transaction tx;
+ if (!parse_and_validate_tx_from_blob(*bd, tx))
+ {
+ MWARNING("Failed to parse tx from txpool, removing");
+ remove.push_back(txid);
+ }
+ if (!insert_key_images(tx, meta.kept_by_block))
+ {
+ MFATAL("Failed to insert key images from txpool tx");
+ return false;
+ }
+ m_txs_by_fee_and_receive_time.emplace(std::pair<double, time_t>(meta.fee / (double)meta.blob_size, meta.receive_time), txid);
+ m_txpool_size += meta.blob_size;
+ return true;
+ }, true);
+ if (!r)
return false;
- }
- m_txs_by_fee_and_receive_time.emplace(std::pair<double, time_t>(meta.fee / (double)meta.blob_size, meta.receive_time), txid);
- m_txpool_size += meta.blob_size;
- return true;
- }, true);
- if (!r)
- return false;
+ }
if (!remove.empty())
{
LockedTXN lock(m_blockchain);
diff --git a/src/cryptonote_protocol/cryptonote_protocol_handler.inl b/src/cryptonote_protocol/cryptonote_protocol_handler.inl
index 5d91ad569..711605597 100644
--- a/src/cryptonote_protocol/cryptonote_protocol_handler.inl
+++ b/src/cryptonote_protocol/cryptonote_protocol_handler.inl
@@ -271,7 +271,7 @@ namespace cryptonote
const uint8_t version = m_core.get_ideal_hard_fork_version(hshd.current_height - 1);
if (version >= 6 && version != hshd.top_version)
{
- if (version < hshd.top_version)
+ if (version < hshd.top_version && version == m_core.get_ideal_hard_fork_version())
MCLOG_RED(el::Level::Warning, "global", context << " peer claims higher version that we think (" <<
(unsigned)hshd.top_version << " for " << (hshd.current_height - 1) << " instead of " << (unsigned)version <<
") - we may be forked from the network and a software upgrade may be needed");
@@ -795,7 +795,7 @@ namespace cryptonote
relay_transactions(arg, context);
}
- return true;
+ return 1;
}
//------------------------------------------------------------------------------------------------------------------------
template<class t_core>
@@ -1008,6 +1008,7 @@ skip:
if (blocks.empty())
{
MERROR("Next span has no blocks");
+ m_block_queue.remove_spans(span_connection_id, start_height);
break;
}
@@ -1015,6 +1016,7 @@ skip:
if (!parse_and_validate_block_from_blob(blocks.front().block, new_block))
{
MERROR("Failed to parse block, but it should already have been parsed");
+ m_block_queue.remove_spans(span_connection_id, start_height);
break;
}
bool parent_known = m_core.have_block(new_block.prev_id);
@@ -1031,6 +1033,7 @@ skip:
// this can happen if a connection was sicced onto a late span, if it did not have those blocks,
// since we don't know that at the sic time
LOG_ERROR_CCONTEXT("Got block with unknown parent which was not requested - querying block hashes");
+ m_block_queue.remove_spans(span_connection_id, start_height);
context.m_needed_objects.clear();
context.m_last_response_height = 0;
goto skip;
@@ -1064,7 +1067,7 @@ skip:
if (tvc.size() != block_entry.txs.size())
{
LOG_ERROR_CCONTEXT("Internal error: tvc.size() != block_entry.txs.size()");
- return true;
+ return 1;
}
std::list<blobdata>::const_iterator it = block_entry.txs.begin();
for (size_t i = 0; i < tvc.size(); ++i, ++it)
@@ -1075,7 +1078,7 @@ skip:
LOG_ERROR_CCONTEXT("transaction verification failed on NOTIFY_RESPONSE_GET_OBJECTS, tx_id = "
<< epee::string_tools::pod_to_hex(get_blob_hash(*it)) << ", dropping connection");
drop_connection(context, false, true);
- return true;
+ return 1;
}))
LOG_ERROR_CCONTEXT("span connection id not found");
@@ -1104,7 +1107,7 @@ skip:
if (!m_p2p->for_connection(span_connection_id, [&](cryptonote_connection_context& context, nodetool::peerid_type peer_id, uint32_t f)->bool{
LOG_PRINT_CCONTEXT_L1("Block verification failed, dropping connection");
drop_connection(context, true, true);
- return true;
+ return 1;
}))
LOG_ERROR_CCONTEXT("span connection id not found");
@@ -1123,7 +1126,7 @@ skip:
if (!m_p2p->for_connection(span_connection_id, [&](cryptonote_connection_context& context, nodetool::peerid_type peer_id, uint32_t f)->bool{
LOG_PRINT_CCONTEXT_L1("Block received at sync phase was marked as orphaned, dropping connection");
drop_connection(context, true, true);
- return true;
+ return 1;
}))
LOG_ERROR_CCONTEXT("span connection id not found");
@@ -1363,13 +1366,13 @@ skip:
MDEBUG(context << " we have the next span, and it is scheduled, resuming");
++context.m_callback_request_count;
m_p2p->request_callback(context);
- return 1;
+ return true;
}
for (size_t n = 0; n < 50; ++n)
{
if (m_stopping)
- return 1;
+ return true;
boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
}
}
@@ -1693,7 +1696,7 @@ skip:
m_p2p->relay_notify_to_list(NOTIFY_NEW_FLUFFY_BLOCK::ID, fluffyBlob, fluffyConnections);
m_p2p->relay_notify_to_list(NOTIFY_NEW_BLOCK::ID, fullBlob, fullConnections);
- return 1;
+ return true;
}
//------------------------------------------------------------------------------------------------------------------------
template<class t_core>
diff --git a/src/daemon/command_line_args.h b/src/daemon/command_line_args.h
index add752029..4673590aa 100644
--- a/src/daemon/command_line_args.h
+++ b/src/daemon/command_line_args.h
@@ -42,7 +42,7 @@ namespace daemon_args
, "Specify configuration file"
, (daemonizer::get_default_data_dir() / std::string(CRYPTONOTE_NAME ".conf")).string()
, {{ &cryptonote::arg_testnet_on, &cryptonote::arg_stagenet_on }}
- , [](std::array<bool, 2> testnet_stagenet, bool defaulted, std::string val) {
+ , [](std::array<bool, 2> testnet_stagenet, bool defaulted, std::string val)->std::string {
if (testnet_stagenet[0] && defaulted)
return (daemonizer::get_default_data_dir() / "testnet" /
std::string(CRYPTONOTE_NAME ".conf")).string();
@@ -57,7 +57,7 @@ namespace daemon_args
, "Specify log file"
, (daemonizer::get_default_data_dir() / std::string(CRYPTONOTE_NAME ".log")).string()
, {{ &cryptonote::arg_testnet_on, &cryptonote::arg_stagenet_on }}
- , [](std::array<bool, 2> testnet_stagenet, bool defaulted, std::string val) {
+ , [](std::array<bool, 2> testnet_stagenet, bool defaulted, std::string val)->std::string {
if (testnet_stagenet[0] && defaulted)
return (daemonizer::get_default_data_dir() / "testnet" /
std::string(CRYPTONOTE_NAME ".log")).string();
@@ -102,7 +102,7 @@ namespace daemon_args
, "Port for ZMQ RPC server to listen on"
, std::to_string(config::ZMQ_RPC_DEFAULT_PORT)
, {{ &cryptonote::arg_testnet_on, &cryptonote::arg_stagenet_on }}
- , [](std::array<bool, 2> testnet_stagenet, bool defaulted, std::string val) {
+ , [](std::array<bool, 2> testnet_stagenet, bool defaulted, std::string val)->std::string {
if (testnet_stagenet[0] && defaulted)
return std::to_string(config::testnet::ZMQ_RPC_DEFAULT_PORT);
if (testnet_stagenet[1] && defaulted)
diff --git a/src/daemon/command_parser_executor.cpp b/src/daemon/command_parser_executor.cpp
index 7a89ebc0c..8b51b9b85 100644
--- a/src/daemon/command_parser_executor.cpp
+++ b/src/daemon/command_parser_executor.cpp
@@ -27,6 +27,7 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "common/dns_utils.h"
+#include "version.h"
#include "daemon/command_parser_executor.h"
#undef MONERO_DEFAULT_LOG_CATEGORY
@@ -379,8 +380,6 @@ bool t_command_parser_executor::set_limit(const std::vector<std::string>& args)
std::cout << "failed to parse argument" << std::endl;
return false;
}
- if (limit > 0)
- limit *= 1024;
return m_executor.set_limit(limit, limit);
}
@@ -399,8 +398,6 @@ bool t_command_parser_executor::set_limit_up(const std::vector<std::string>& arg
std::cout << "failed to parse argument" << std::endl;
return false;
}
- if (limit > 0)
- limit *= 1024;
return m_executor.set_limit(0, limit);
}
@@ -419,8 +416,6 @@ bool t_command_parser_executor::set_limit_down(const std::vector<std::string>& a
std::cout << "failed to parse argument" << std::endl;
return false;
}
- if (limit > 0)
- limit *= 1024;
return m_executor.set_limit(limit, 0);
}
@@ -664,4 +659,10 @@ bool t_command_parser_executor::sync_info(const std::vector<std::string>& args)
return m_executor.sync_info();
}
+bool t_command_parser_executor::version(const std::vector<std::string>& args)
+{
+ std::cout << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << std::endl;
+ return true;
+}
+
} // namespace daemonize
diff --git a/src/daemon/command_parser_executor.h b/src/daemon/command_parser_executor.h
index 2c09a4748..a70070171 100644
--- a/src/daemon/command_parser_executor.h
+++ b/src/daemon/command_parser_executor.h
@@ -138,6 +138,8 @@ public:
bool relay_tx(const std::vector<std::string>& args);
bool sync_info(const std::vector<std::string>& args);
+
+ bool version(const std::vector<std::string>& args);
};
} // namespace daemonize
diff --git a/src/daemon/command_server.cpp b/src/daemon/command_server.cpp
index a50dbea69..144603597 100644
--- a/src/daemon/command_server.cpp
+++ b/src/daemon/command_server.cpp
@@ -280,6 +280,11 @@ t_command_server::t_command_server(
, std::bind(&t_command_parser_executor::sync_info, &m_parser, p::_1)
, "Print information about the blockchain sync state."
);
+ m_command_lookup.set_handler(
+ "version"
+ , std::bind(&t_command_parser_executor::version, &m_parser, p::_1)
+ , "Print version information."
+ );
}
bool t_command_server::process_command_str(const std::string& cmd)
diff --git a/src/daemon/main.cpp b/src/daemon/main.cpp
index 50384b2a6..49494e889 100644
--- a/src/daemon/main.cpp
+++ b/src/daemon/main.cpp
@@ -138,6 +138,28 @@ int main(int argc, char const * argv[])
return 0;
}
+ std::string config = command_line::get_arg(vm, daemon_args::arg_config_file);
+ boost::filesystem::path config_path(config);
+ boost::system::error_code ec;
+ if (bf::exists(config_path, ec))
+ {
+ try
+ {
+ po::store(po::parse_config_file<char>(config_path.string<std::string>().c_str(), core_settings), vm);
+ }
+ catch (const std::exception &e)
+ {
+ // log system isn't initialized yet
+ std::cerr << "Error parsing config file: " << e.what() << std::endl;
+ throw;
+ }
+ }
+ else if (!command_line::is_arg_defaulted(vm, daemon_args::arg_config_file))
+ {
+ std::cerr << "Can't find config file " << config << std::endl;
+ return 1;
+ }
+
const bool testnet = command_line::get_arg(vm, cryptonote::arg_testnet_on);
const bool stagenet = command_line::get_arg(vm, cryptonote::arg_stagenet_on);
if (testnet && stagenet)
@@ -170,29 +192,6 @@ int main(int argc, char const * argv[])
//bf::path relative_path_base = daemonizer::get_relative_path_base(vm);
bf::path relative_path_base = data_dir;
- std::string config = command_line::get_arg(vm, daemon_args::arg_config_file);
-
- boost::filesystem::path data_dir_path(data_dir);
- boost::filesystem::path config_path(config);
- if (!config_path.has_parent_path())
- {
- config_path = data_dir / config_path;
- }
-
- boost::system::error_code ec;
- if (bf::exists(config_path, ec))
- {
- try
- {
- po::store(po::parse_config_file<char>(config_path.string<std::string>().c_str(), core_settings), vm);
- }
- catch (const std::exception &e)
- {
- // log system isn't initialized yet
- std::cerr << "Error parsing config file: " << e.what() << std::endl;
- throw;
- }
- }
po::notify(vm);
// log_file_path
diff --git a/src/daemon/rpc_command_executor.cpp b/src/daemon/rpc_command_executor.cpp
index 73b8d1a18..2efb501ea 100644
--- a/src/daemon/rpc_command_executor.cpp
+++ b/src/daemon/rpc_command_executor.cpp
@@ -720,6 +720,7 @@ bool t_rpc_command_executor::print_transaction(crypto::hash transaction_hash,
req.txs_hashes.push_back(epee::string_tools::pod_to_hex(transaction_hash));
req.decode_as_json = false;
+ req.prune = false;
if (m_is_rpc)
{
if (!m_rpc_client->rpc_request(req, res, "/gettransactions", fail_message.c_str()))
@@ -1176,8 +1177,8 @@ bool t_rpc_command_executor::get_limit()
}
}
- tools::msg_writer() << "limit-down is " << res.limit_down/1024 << " kB/s";
- tools::msg_writer() << "limit-up is " << res.limit_up/1024 << " kB/s";
+ tools::msg_writer() << "limit-down is " << res.limit_down << " kB/s";
+ tools::msg_writer() << "limit-up is " << res.limit_up << " kB/s";
return true;
}
@@ -1207,8 +1208,8 @@ bool t_rpc_command_executor::set_limit(int64_t limit_down, int64_t limit_up)
}
}
- tools::msg_writer() << "Set limit-down to " << res.limit_down/1024 << " kB/s";
- tools::msg_writer() << "Set limit-up to " << res.limit_up/1024 << " kB/s";
+ tools::msg_writer() << "Set limit-down to " << res.limit_down << " kB/s";
+ tools::msg_writer() << "Set limit-up to " << res.limit_up << " kB/s";
return true;
}
@@ -1235,7 +1236,7 @@ bool t_rpc_command_executor::get_limit_up()
}
}
- tools::msg_writer() << "limit-up is " << res.limit_up/1024 << " kB/s";
+ tools::msg_writer() << "limit-up is " << res.limit_up << " kB/s";
return true;
}
@@ -1262,7 +1263,7 @@ bool t_rpc_command_executor::get_limit_down()
}
}
- tools::msg_writer() << "limit-down is " << res.limit_down/1024 << " kB/s";
+ tools::msg_writer() << "limit-down is " << res.limit_down << " kB/s";
return true;
}
diff --git a/src/device/device.hpp b/src/device/device.hpp
index b47460472..9df0cb39d 100644
--- a/src/device/device.hpp
+++ b/src/device/device.hpp
@@ -80,6 +80,9 @@ namespace hw {
class device {
+ protected:
+ std::string name;
+
public:
device() {}
@@ -87,12 +90,12 @@ namespace hw {
virtual ~device() {}
explicit virtual operator bool() const = 0;
-
- static const int SIGNATURE_REAL = 0;
- static const int SIGNATURE_FAKE = 1;
-
-
- std::string name;
+ enum device_mode {
+ NONE,
+ TRANSACTION_CREATE_REAL,
+ TRANSACTION_CREATE_FAKE,
+ TRANSACTION_PARSE
+ };
/* ======================================================================= */
/* SETUP/TEARDOWN */
@@ -104,7 +107,18 @@ namespace hw {
virtual bool release() = 0;
virtual bool connect(void) = 0;
- virtual bool disconnect() = 0;
+ virtual bool disconnect(void) = 0;
+
+ virtual bool set_mode(device_mode mode) = 0;
+
+
+ /* ======================================================================= */
+ /* LOCKER */
+ /* ======================================================================= */
+ virtual void lock(void) = 0;
+ virtual void unlock(void) = 0;
+ virtual bool try_lock(void) = 0;
+
/* ======================================================================= */
/* WALLET & ADDRESS */
@@ -131,6 +145,7 @@ namespace hw {
virtual bool sc_secret_add( crypto::secret_key &r, const crypto::secret_key &a, const crypto::secret_key &b) = 0;
virtual crypto::secret_key generate_keys(crypto::public_key &pub, crypto::secret_key &sec, const crypto::secret_key& recovery_key = crypto::secret_key(), bool recover = false) = 0;
virtual bool generate_key_derivation(const crypto::public_key &pub, const crypto::secret_key &sec, crypto::key_derivation &derivation) = 0;
+ virtual bool conceal_derivation(crypto::key_derivation &derivation, const crypto::public_key &tx_pub_key, const std::vector<crypto::public_key> &additional_tx_pub_keys, const crypto::key_derivation &main_derivation, const std::vector<crypto::key_derivation> &additional_derivations) = 0;
virtual bool derivation_to_scalar(const crypto::key_derivation &derivation, const size_t output_index, crypto::ec_scalar &res) = 0;
virtual bool derive_secret_key(const crypto::key_derivation &derivation, const std::size_t output_index, const crypto::secret_key &sec, crypto::secret_key &derived_sec) = 0;
virtual bool derive_public_key(const crypto::key_derivation &derivation, const std::size_t output_index, const crypto::public_key &pub, crypto::public_key &derived_pub) = 0;
@@ -158,8 +173,6 @@ namespace hw {
virtual bool open_tx(crypto::secret_key &tx_key) = 0;
- virtual bool set_signature_mode(unsigned int sig_mode) = 0;
-
virtual bool encrypt_payment_id(crypto::hash8 &payment_id, const crypto::public_key &public_key, const crypto::secret_key &secret_key) = 0;
bool decrypt_payment_id(crypto::hash8 &payment_id, const crypto::public_key &public_key, const crypto::secret_key &secret_key)
{
@@ -183,6 +196,12 @@ namespace hw {
virtual bool close_tx(void) = 0;
} ;
+ struct reset_mode {
+ device& hwref;
+ reset_mode(hw::device& dev) : hwref(dev) { }
+ ~reset_mode() { hwref.set_mode(hw::device::NONE);}
+ };
+
device& get_device(const std::string device_descriptor) ;
}
diff --git a/src/device/device_default.cpp b/src/device/device_default.cpp
index d63dafe9e..0071f7d4f 100644
--- a/src/device/device_default.cpp
+++ b/src/device/device_default.cpp
@@ -31,6 +31,7 @@
#include "device_default.hpp"
+#include "common/int-util.h"
#include "cryptonote_basic/account.h"
#include "cryptonote_basic/subaddress_index.h"
#include "ringct/rctOps.h"
@@ -81,6 +82,20 @@ namespace hw {
dfns();
}
+ bool device_default::set_mode(device_mode mode) {
+ return true;
+ }
+
+ /* ======================================================================= */
+ /* LOCKER */
+ /* ======================================================================= */
+
+ void device_default::lock() { }
+
+ bool device_default::try_lock() { return true; }
+
+ void device_default::unlock() { }
+
/* ======================================================================= */
/* WALLET & ADDRESS */
/* ======================================================================= */
@@ -181,10 +196,13 @@ namespace hw {
crypto::secret_key device_default::get_subaddress_secret_key(const crypto::secret_key &a, const cryptonote::subaddress_index &index) {
const char prefix[] = "SubAddr";
- char data[sizeof(prefix) + sizeof(crypto::secret_key) + sizeof(cryptonote::subaddress_index)];
+ char data[sizeof(prefix) + sizeof(crypto::secret_key) + 2 * sizeof(uint32_t)];
memcpy(data, prefix, sizeof(prefix));
memcpy(data + sizeof(prefix), &a, sizeof(crypto::secret_key));
- memcpy(data + sizeof(prefix) + sizeof(crypto::secret_key), &index, sizeof(cryptonote::subaddress_index));
+ uint32_t idx = SWAP32LE(index.major);
+ memcpy(data + sizeof(prefix) + sizeof(crypto::secret_key), &idx, sizeof(uint32_t));
+ idx = SWAP32LE(index.minor);
+ memcpy(data + sizeof(prefix) + sizeof(crypto::secret_key) + sizeof(uint32_t), &idx, sizeof(uint32_t));
crypto::secret_key m;
crypto::hash_to_scalar(data, sizeof(data), m);
return m;
@@ -246,6 +264,10 @@ namespace hw {
return true;
}
+ bool device_default::conceal_derivation(crypto::key_derivation &derivation, const crypto::public_key &tx_pub_key, const std::vector<crypto::public_key> &additional_tx_pub_keys, const crypto::key_derivation &main_derivation, const std::vector<crypto::key_derivation> &additional_derivations){
+ return true;
+ }
+
/* ======================================================================= */
/* TRANSACTION */
/* ======================================================================= */
@@ -262,10 +284,6 @@ namespace hw {
return true;
}
- bool device_default::set_signature_mode(unsigned int sig_mode) {
- return true;
- }
-
bool device_default::encrypt_payment_id(crypto::hash8 &payment_id, const crypto::public_key &public_key, const crypto::secret_key &secret_key) {
crypto::key_derivation derivation;
crypto::hash hash;
diff --git a/src/device/device_default.hpp b/src/device/device_default.hpp
index 02faeba0c..771fbba72 100644
--- a/src/device/device_default.hpp
+++ b/src/device/device_default.hpp
@@ -58,8 +58,17 @@ namespace hw {
bool connect(void) override;
bool disconnect() override;
+
+ bool set_mode(device_mode mode) override;
/* ======================================================================= */
+ /* LOCKER */
+ /* ======================================================================= */
+ void lock(void) override;
+ void unlock(void) override;
+ bool try_lock(void) override;
+
+ /* ======================================================================= */
/* WALLET & ADDRESS */
/* ======================================================================= */
bool get_public_address(cryptonote::account_public_address &pubkey) override;
@@ -84,6 +93,7 @@ namespace hw {
bool sc_secret_add(crypto::secret_key &r, const crypto::secret_key &a, const crypto::secret_key &b) override;
crypto::secret_key generate_keys(crypto::public_key &pub, crypto::secret_key &sec, const crypto::secret_key& recovery_key = crypto::secret_key(), bool recover = false) override;
bool generate_key_derivation(const crypto::public_key &pub, const crypto::secret_key &sec, crypto::key_derivation &derivation) override;
+ bool conceal_derivation(crypto::key_derivation &derivation, const crypto::public_key &tx_pub_key, const std::vector<crypto::public_key> &additional_tx_pub_keys, const crypto::key_derivation &main_derivation, const std::vector<crypto::key_derivation> &additional_derivations) override;
bool derivation_to_scalar(const crypto::key_derivation &derivation, const size_t output_index, crypto::ec_scalar &res) override;
bool derive_secret_key(const crypto::key_derivation &derivation, const std::size_t output_index, const crypto::secret_key &sec, crypto::secret_key &derived_sec) override;
bool derive_public_key(const crypto::key_derivation &derivation, const std::size_t output_index, const crypto::public_key &pub, crypto::public_key &derived_pub) override;
@@ -97,9 +107,6 @@ namespace hw {
bool open_tx(crypto::secret_key &tx_key) override;
- //bool get_additional_key(const bool subaddr, cryptonote::keypair &additional_txkey) override;
- bool set_signature_mode(unsigned int sig_mode) override;
-
bool encrypt_payment_id(crypto::hash8 &payment_id, const crypto::public_key &public_key, const crypto::secret_key &secret_key) override;
bool ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & sharedSec) override;
diff --git a/src/device/device_ledger.cpp b/src/device/device_ledger.cpp
index b3c0035a1..3b9ab6744 100644
--- a/src/device/device_ledger.cpp
+++ b/src/device/device_ledger.cpp
@@ -33,7 +33,8 @@
#include "cryptonote_basic/account.h"
#include "cryptonote_basic/subaddress_index.h"
-
+#include <boost/thread/locks.hpp>
+#include <boost/thread/lock_guard.hpp>
namespace hw {
@@ -55,10 +56,11 @@ namespace hw {
#define ASSERT_RV(rv) CHECK_AND_ASSERT_THROW_MES((rv)==SCARD_S_SUCCESS, "Fail SCard API : (" << (rv) << ") "<< pcsc_stringify_error(rv)<<" Device="<<this->id<<", hCard="<<hCard<<", hContext="<<hContext);
#define ASSERT_SW(sw,ok,msk) CHECK_AND_ASSERT_THROW_MES(((sw)&(mask))==(ok), "Wrong Device Status : SW=" << std::hex << (sw) << " (EXPECT=" << std::hex << (ok) << ", MASK=" << std::hex << (mask) << ")") ;
#define ASSERT_T0(exp) CHECK_AND_ASSERT_THROW_MES(exp, "Protocol assert failure: "#exp ) ;
+ #define ASSERT_X(exp,msg) CHECK_AND_ASSERT_THROW_MES(exp, msg);
#ifdef DEBUG_HWDEVICE
- crypto::secret_key viewkey;
- crypto::secret_key spendkey;
+ crypto::secret_key dbg_viewkey;
+ crypto::secret_key dbg_spendkey;
#endif
/* ===================================================================== */
@@ -118,7 +120,18 @@ namespace hw {
#endif
/* ===================================================================== */
- /* === Device ==== */
+ /* === Internal Helpers ==== */
+ /* ===================================================================== */
+ static bool is_fake_view_key(const crypto::secret_key &sec) {
+ return sec == crypto::null_skey;
+ }
+
+ bool operator==(const crypto::key_derivation &d0, const crypto::key_derivation &d1) {
+ return !memcmp(&d0, &d1, sizeof(d0));
+ }
+
+ /* ===================================================================== */
+ /* === Device ==== */
/* ===================================================================== */
static int device_id = 0;
@@ -196,6 +209,8 @@ namespace hw {
this->hCard = 0;
this->hContext = 0;
this->reset_buffer();
+ this->mode = NONE;
+ this->has_view_key = false;
MDEBUG( "Device "<<this->id <<" Created");
}
@@ -204,14 +219,51 @@ namespace hw {
MDEBUG( "Device "<<this->id <<" Destroyed");
}
+ /* ======================================================================= */
+ /* LOCKER */
+ /* ======================================================================= */
+
+ //automatic lock one more level on device ensuring the current thread is allowed to use it
+ #define AUTO_LOCK_CMD() \
+ /* lock both mutexes without deadlock*/ \
+ boost::lock(device_locker, command_locker); \
+ /* make sure both already-locked mutexes are unlocked at the end of scope */ \
+ boost::lock_guard<boost::recursive_mutex> lock1(device_locker, boost::adopt_lock); \
+ boost::lock_guard<boost::mutex> lock2(command_locker, boost::adopt_lock)
+
+ //lock the device for a long sequence
+ void device_ledger::lock(void) {
+ MDEBUG( "Ask for LOCKING for device "<<this->name << " in thread ");
+ device_locker.lock();
+ MDEBUG( "Device "<<this->name << " LOCKed");
+ }
+
+ //lock the device for a long sequence
+ bool device_ledger::try_lock(void) {
+ MDEBUG( "Ask for LOCKING(try) for device "<<this->name << " in thread ");
+ bool r = device_locker.try_lock();
+ if (r) {
+ MDEBUG( "Device "<<this->name << " LOCKed(try)");
+ } else {
+ MDEBUG( "Device "<<this->name << " not LOCKed(try)");
+ }
+ return r;
+ }
+
+ //lock the device for a long sequence
+ void device_ledger::unlock(void) {
+ try {
+ MDEBUG( "Ask for UNLOCKING for device "<<this->name << " in thread ");
+ } catch (...) {
+ }
+ device_locker.unlock();
+ MDEBUG( "Device "<<this->name << " UNLOCKed");
+ }
/* ======================================================================= */
/* MISC */
/* ======================================================================= */
bool device_ledger::reset() {
-
- lock_device();
- try {
int offset;
reset_buffer();
@@ -227,12 +279,7 @@ namespace hw {
this->buffer_send[4] = offset-5;
this->length_send = offset;
this->exchange();
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
unsigned int device_ledger::exchange(unsigned int ok, unsigned int mask) {
@@ -261,30 +308,6 @@ namespace hw {
memset(this->buffer_recv, 0, BUFFER_RECV_SIZE);
}
- void device_ledger::lock_device() {
- MDEBUG( "Ask for LOCKING for device "<<this->id);
- device_locker.lock();
- MDEBUG( "Device "<<this->id << " LOCKed");
- }
- void device_ledger::unlock_device() {
- try {
- MDEBUG( "Ask for UNLOCKING for device "<<this->id);
- } catch (...) {
- }
- device_locker.unlock();
- MDEBUG( "Device "<<this->id << " UNLOCKed");
- }
- void device_ledger::lock_tx() {
- MDEBUG( "Ask for LOCKING for TX "<<this->id);
- //tx_locker.lock();
- MDEBUG( "TX "<<this->id << " LOCKed");
- }
- void device_ledger::unlock_tx() {
- MDEBUG( "Ask for UNLOCKING for TX "<<this->id);
- //tx_locker.unlock();
- MDEBUG( "TX "<<this->id << " UNLOCKed");
- }
-
/* ======================================================================= */
/* SETUP/TEARDOWN */
/* ======================================================================= */
@@ -394,10 +417,10 @@ namespace hw {
#ifdef DEBUG_HWDEVICE
cryptonote::account_public_address pubkey;
this->get_public_address(pubkey);
+ #endif
crypto::secret_key vkey;
crypto::secret_key skey;
this->get_secret_keys(vkey,skey);
- #endif
return rv==SCARD_S_SUCCESS;
}
@@ -411,16 +434,55 @@ namespace hw {
return true;
}
+ bool device_ledger::set_mode(device_mode mode) {
+ AUTO_LOCK_CMD();
+
+ int offset;
+
+ reset_buffer();
+
+ switch(mode) {
+ case TRANSACTION_CREATE_REAL:
+ case TRANSACTION_CREATE_FAKE:
+ this->buffer_send[0] = 0x00;
+ this->buffer_send[1] = INS_SET_SIGNATURE_MODE;
+ this->buffer_send[2] = 0x01;
+ this->buffer_send[3] = 0x00;
+ this->buffer_send[4] = 0x00;
+ offset = 5;
+ //options
+ this->buffer_send[offset] = 0x00;
+ offset += 1;
+ //account
+ this->buffer_send[offset] = mode;
+ offset += 1;
+
+ this->buffer_send[4] = offset-5;
+ this->length_send = offset;
+ this->exchange();
+
+ this->mode = mode;
+ break;
+
+ case TRANSACTION_PARSE:
+ case NONE:
+ this->mode = mode;
+ break;
+ default:
+ CHECK_AND_ASSERT_THROW_MES(false, " device_ledger::set_mode(unsigned int mode): invalid mode: "<<mode);
+ }
+ MDEBUG("Switch to mode: " <<mode);
+ return true;
+ }
+
/* ======================================================================= */
/* WALLET & ADDRESS */
/* ======================================================================= */
- /* Application API */
bool device_ledger::get_public_address(cryptonote::account_public_address &pubkey){
+ AUTO_LOCK_CMD();
- lock_device();
- try {
int offset;
reset_buffer();
@@ -440,21 +502,17 @@ namespace hw {
memmove(pubkey.m_view_public_key.data, this->buffer_recv, 32);
memmove(pubkey.m_spend_public_key.data, this->buffer_recv+32, 32);
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+
+ return true;
}
- bool device_ledger::get_secret_keys(crypto::secret_key &viewkey , crypto::secret_key &spendkey) {
- memset(viewkey.data, 0x00, 32);
- memset(spendkey.data, 0xFF, 32);
+ bool device_ledger::get_secret_keys(crypto::secret_key &vkey , crypto::secret_key &skey) {
+ AUTO_LOCK_CMD();
+
+ //secret key are represented as fake key on the wallet side
+ memset(vkey.data, 0x00, 32);
+ memset(skey.data, 0xFF, 32);
- #ifdef DEBUG_HWDEVICE
- lock_device();
- try {
//spcialkey, normal conf handled in decrypt
int offset;
reset_buffer();
@@ -473,21 +531,26 @@ namespace hw {
this->length_send = offset;
this->exchange();
- //clear key
- memmove(ledger::viewkey.data, this->buffer_recv+64, 32);
- memmove(ledger::spendkey.data, this->buffer_recv+96, 32);
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- #endif
- return true;
+ //View key is retrievied, if allowed, to speed up blockchain parsing
+ memmove(this->viewkey.data, this->buffer_recv+0, 32);
+ if (is_fake_view_key(this->viewkey)) {
+ MDEBUG("Have Not view key");
+ this->has_view_key = false;
+ } else {
+ MDEBUG("Have view key");
+ this->has_view_key = true;
+ }
+
+ #ifdef DEBUG_HWDEVICE
+ memmove(dbg_viewkey.data, this->buffer_recv+0, 32);
+ memmove(dbg_spendkey.data, this->buffer_recv+32, 32);
+ #endif
+
+ return true;
}
bool device_ledger::generate_chacha_key(const cryptonote::account_keys &keys, crypto::chacha_key &key) {
- lock_device();
- try {
+ AUTO_LOCK_CMD();
int offset;
#ifdef DEBUG_HWDEVICE
@@ -519,11 +582,6 @@ namespace hw {
hw::ledger::check32("generate_chacha_key_prehashed", "key", (char*)key_x.data(), (char*)key.data());
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
return true;
}
@@ -532,15 +590,15 @@ namespace hw {
/* ======================================================================= */
bool device_ledger::derive_subaddress_public_key(const crypto::public_key &pub, const crypto::key_derivation &derivation, const std::size_t output_index, crypto::public_key &derived_pub){
-
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
-
+ AUTO_LOCK_CMD();
#ifdef DEBUG_HWDEVICE
const crypto::public_key pub_x = pub;
- const crypto::key_derivation derivation_x = hw::ledger::decrypt(derivation);
+ crypto::key_derivation derivation_x;
+ if ((this->mode == TRANSACTION_PARSE) && has_view_key) {
+ derivation_x = derivation;
+ } else {
+ derivation_x = hw::ledger::decrypt(derivation);
+ }
const std::size_t output_index_x = output_index;
crypto::public_key derived_pub_x;
hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] pub ", pub_x.data, 32);
@@ -550,10 +608,17 @@ namespace hw {
hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[OUT]] derived_pub", derived_pub_x.data, 32);
#endif
+ if ((this->mode == TRANSACTION_PARSE) && has_view_key) {
+ //If we are in TRANSACTION_PARSE, the given derivation has been retrieved uncrypted (wihtout the help
+ //of the device), so continue that way.
+ MDEBUG( "derive_subaddress_public_key : PARSE mode with known viewkey");
+ crypto::derive_subaddress_public_key(pub, derivation, output_index,derived_pub);
+ } else {
+
+ int offset =0;
+
reset_buffer();
- options = 0;
-
this->buffer_send[0] = 0x00;
this->buffer_send[1] = INS_DERIVE_SUBADDRESS_PUBLIC_KEY;
this->buffer_send[2] = 0x00;
@@ -561,7 +626,7 @@ namespace hw {
this->buffer_send[4] = 0x00;
offset = 5;
//options
- this->buffer_send[offset] = options;
+ this->buffer_send[offset] = 0;
offset += 1;
//pub
memmove(this->buffer_send+offset, pub.data, 32);
@@ -582,34 +647,27 @@ namespace hw {
//pub key
memmove(derived_pub.data, &this->buffer_recv[0], 32);
-
- #ifdef DEBUG_HWDEVICE
- hw::ledger::check32("derive_subaddress_public_key", "derived_pub", derived_pub_x.data, derived_pub.data);
- #endif
-
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
}
+ #ifdef DEBUG_HWDEVICE
+ hw::ledger::check32("derive_subaddress_public_key", "derived_pub", derived_pub_x.data, derived_pub.data);
+ #endif
+
return true;
}
crypto::public_key device_ledger::get_subaddress_spend_public_key(const cryptonote::account_keys& keys, const cryptonote::subaddress_index &index) {
- crypto::public_key D;
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ crypto::public_key D;
+ int offset;
#ifdef DEBUG_HWDEVICE
const cryptonote::account_keys keys_x = hw::ledger::decrypt(keys);
const cryptonote::subaddress_index index_x = index;
crypto::public_key D_x;
- hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_view_secret_key ", keys_x.m_view_secret_key.data,32);
- hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_spend_secret_key", keys_x.m_spend_secret_key.data,32);
+ hw::ledger::log_hexbuffer("get_subaddress_spend_public_key: [[IN]] keys.m_view_secret_key ", keys_x.m_view_secret_key.data,32);
+ hw::ledger::log_hexbuffer("get_subaddress_spend_public_key: [[IN]] keys.m_spend_secret_key", keys_x.m_spend_secret_key.data,32);
hw::ledger::log_message ("get_subaddress_spend_public_key: [[IN]] index ", std::to_string(index_x.major)+"."+std::to_string(index_x.minor));
- this->controle_device->get_subaddress_spend_public_key(keys_x, index_x, D_x);
+ D_x = this->controle_device->get_subaddress_spend_public_key(keys_x, index_x);
hw::ledger::log_hexbuffer("get_subaddress_spend_public_key: [[OUT]] derivation ", D_x.data, 32);
#endif
@@ -644,12 +702,7 @@ namespace hw {
hw::ledger::check32("get_subaddress_spend_public_key", "D", D_x.data, D.data);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return D;
+ return D;
}
std::vector<crypto::public_key> device_ledger::get_subaddress_spend_public_keys(const cryptonote::account_keys &keys, uint32_t account, uint32_t begin, uint32_t end) {
@@ -665,24 +718,22 @@ namespace hw {
}
cryptonote::account_public_address device_ledger::get_subaddress(const cryptonote::account_keys& keys, const cryptonote::subaddress_index &index) {
- cryptonote::account_public_address address;
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ cryptonote::account_public_address address;
+ int offset;
#ifdef DEBUG_HWDEVICE
const cryptonote::account_keys keys_x = hw::ledger::decrypt(keys);
const cryptonote::subaddress_index index_x = index;
cryptonote::account_public_address address_x;
- hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_view_secret_key ", keys_x.m_view_secret_key.data, 32);
- hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_view_public_key", keys_x.m_account_address.m_view_public_key.data, 32);
- hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_view_secret_key ", keys_x.m_view_secret_key.data, 32);
- hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_spend_public_key", keys_x.m_account_address.m_spend_public_key.data, 32);
+ hw::ledger::log_hexbuffer("get_subaddress: [[IN]] keys.m_view_secret_key ", keys_x.m_view_secret_key.data, 32);
+ hw::ledger::log_hexbuffer("get_subaddress: [[IN]] keys.m_view_public_key", keys_x.m_account_address.m_view_public_key.data, 32);
+ hw::ledger::log_hexbuffer("get_subaddress: [[IN]] keys.m_view_secret_key ", keys_x.m_view_secret_key.data, 32);
+ hw::ledger::log_hexbuffer("get_subaddress: [[IN]] keys.m_spend_public_key", keys_x.m_account_address.m_spend_public_key.data, 32);
hw::ledger::log_message ("get_subaddress: [[IN]] index ", std::to_string(index_x.major)+"."+std::to_string(index_x.minor));
- this->controle_device->get_subaddress(keys_x, index_x, address_x);
- hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_view_public_key ", address_x.m_view_public_key.data, 32);
- hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_spend_public_key", address_x.m_spend_public_key.data, 32);
+ address_x = this->controle_device->get_subaddress(keys_x, index_x);
+ hw::ledger::log_hexbuffer("get_subaddress: [[OUT]] keys.m_view_public_key ", address_x.m_view_public_key.data, 32);
+ hw::ledger::log_hexbuffer("get_subaddress: [[OUT]] keys.m_spend_public_key", address_x.m_spend_public_key.data, 32);
#endif
if (index.is_zero()) {
@@ -717,20 +768,13 @@ namespace hw {
hw::ledger::check32("get_subaddress", "address.m_spend_public_key.data", address_x.m_spend_public_key.data, address.m_spend_public_key.data);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return address;
+ return address;
}
crypto::secret_key device_ledger::get_subaddress_secret_key(const crypto::secret_key &sec, const cryptonote::subaddress_index &index) {
- crypto::secret_key sub_sec;
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ crypto::secret_key sub_sec;
+ int offset;
#ifdef DEBUG_HWDEVICE
const crypto::secret_key sec_x = hw::ledger::decrypt(sec);
@@ -738,7 +782,7 @@ namespace hw {
crypto::secret_key sub_sec_x;
hw::ledger::log_message ("get_subaddress_secret_key: [[IN]] index ", std::to_string(index.major)+"."+std::to_string(index.minor));
hw::ledger::log_hexbuffer("get_subaddress_secret_key: [[IN]] sec ", sec_x.data, 32);
- this->controle_device->get_subaddress_secret_key(sec_x, index_x, sub_sec_x);
+ sub_sec_x = this->controle_device->get_subaddress_secret_key(sec_x, index_x);
hw::ledger::log_hexbuffer("get_subaddress_secret_key: [[OUT]] sub_sec", sub_sec_x.data, 32);
#endif
@@ -751,7 +795,7 @@ namespace hw {
this->buffer_send[4] = 0x00;
offset = 5;
//options
- this->buffer_send[offset] = options;
+ this->buffer_send[offset] = 0;
offset += 1;
//sec
memmove(this->buffer_send+offset, sec.data, 32);
@@ -772,12 +816,7 @@ namespace hw {
hw::ledger::check32("get_subaddress_secret_key", "sub_sec", sub_sec_x.data, sub_sec_clear.data);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return sub_sec;
+ return sub_sec;
}
/* ======================================================================= */
@@ -785,10 +824,9 @@ namespace hw {
/* ======================================================================= */
bool device_ledger::verify_keys(const crypto::secret_key &secret_key, const crypto::public_key &public_key) {
- lock_device();
- try {
- int offset =0,sw;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ int offset, sw;
+
reset_buffer();
this->buffer_send[0] = 0x00;
this->buffer_send[1] = INS_VERIFY_KEY;
@@ -816,20 +854,12 @@ namespace hw {
this->buffer_recv[2] << 8 |
this->buffer_recv[3] << 0 ;
- unlock_device();
return verified == 1;
- }catch (...) {
- unlock_device();
- throw;
- }
- return false;
}
bool device_ledger::scalarmultKey(rct::key & aP, const rct::key &P, const rct::key &a) {
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ int offset;
#ifdef DEBUG_HWDEVICE
const rct::key P_x = P;
@@ -843,8 +873,6 @@ namespace hw {
reset_buffer();
- options = 0;
-
this->buffer_send[0] = 0x00;
this->buffer_send[1] = INS_SECRET_SCAL_MUL_KEY;
this->buffer_send[2] = 0x00;
@@ -852,7 +880,7 @@ namespace hw {
this->buffer_send[4] = 0x00;
offset = 5;
//options
- this->buffer_send[offset] = options;
+ this->buffer_send[offset] = 0;
offset += 1;
//pub
memmove(this->buffer_send+offset, P.bytes, 32);
@@ -873,19 +901,12 @@ namespace hw {
hw::ledger::check32("scalarmultKey", "mulkey", (char*)aP_x.bytes, (char*)aP.bytes);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
bool device_ledger::scalarmultBase(rct::key &aG, const rct::key &a) {
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ int offset;
#ifdef DEBUG_HWDEVICE
const rct::key a_x = hw::ledger::decrypt(a);
@@ -897,8 +918,6 @@ namespace hw {
reset_buffer();
- options = 0;
-
this->buffer_send[0] = 0x00;
this->buffer_send[1] = INS_SECRET_SCAL_MUL_BASE;
this->buffer_send[2] = 0x00;
@@ -906,7 +925,7 @@ namespace hw {
this->buffer_send[4] = 0x00;
offset = 5;
//options
- this->buffer_send[offset] = options;
+ this->buffer_send[offset] = 0;
offset += 1;
//sec
memmove(this->buffer_send+offset, a.bytes, 32);
@@ -923,20 +942,12 @@ namespace hw {
hw::ledger::check32("scalarmultBase", "mulkey", (char*)aG_x.bytes, (char*)aG.bytes);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
bool device_ledger::sc_secret_add( crypto::secret_key &r, const crypto::secret_key &a, const crypto::secret_key &b) {
-
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ int offset;
#ifdef DEBUG_HWDEVICE
const crypto::secret_key a_x = hw::ledger::decrypt(a);
@@ -947,8 +958,6 @@ namespace hw {
reset_buffer();
- options = 0;
-
this->buffer_send[0] = 0x00;
this->buffer_send[1] = INS_SECRET_KEY_ADD;
this->buffer_send[2] = 0x00;
@@ -956,7 +965,7 @@ namespace hw {
this->buffer_send[4] = 0x00;
offset = 5;
//options
- this->buffer_send[offset] = options;
+ this->buffer_send[offset] = 0;
offset += 1;
//sec key
memmove(this->buffer_send+offset, a.data, 32);
@@ -977,23 +986,16 @@ namespace hw {
hw::ledger::check32("sc_secret_add", "r", r_x.data, r_clear.data);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
crypto::secret_key device_ledger::generate_keys(crypto::public_key &pub, crypto::secret_key &sec, const crypto::secret_key& recovery_key, bool recover) {
- if (recover) {
- throw std::runtime_error("device generate key does not support recover");
- }
+ AUTO_LOCK_CMD();
+ if (recover) {
+ throw std::runtime_error("device generate key does not support recover");
+ }
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ int offset;
#ifdef DEBUG_HWDEVICE
bool recover_x = recover;
@@ -1004,8 +1006,6 @@ namespace hw {
reset_buffer();
- options = 0;
-
this->buffer_send[0] = 0x00;
this->buffer_send[1] = INS_GENERATE_KEYPAIR;
this->buffer_send[2] = 0x00;
@@ -1013,7 +1013,7 @@ namespace hw {
this->buffer_send[4] = 0x00;
offset = 5;
//options
- this->buffer_send[offset] = options;
+ this->buffer_send[offset] = 0;
offset += 1;
this->buffer_send[4] = offset-5;
@@ -1031,20 +1031,13 @@ namespace hw {
hw::ledger::check32("generate_keys", "pub", pub_x.data, pub.data);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return sec;
+ return sec;
}
bool device_ledger::generate_key_derivation(const crypto::public_key &pub, const crypto::secret_key &sec, crypto::key_derivation &derivation) {
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ bool r = false;
#ifdef DEBUG_HWDEVICE
const crypto::public_key pub_x = pub;
@@ -1056,6 +1049,17 @@ namespace hw {
hw::ledger::log_hexbuffer("generate_key_derivation: [[OUT]] derivation", derivation_x.data, 32);
#endif
+ if ((this->mode == TRANSACTION_PARSE) && has_view_key) {
+ //A derivation is resquested in PASRE mode and we have the view key,
+ //so do that wihtout the device and return the derivation unencrypted.
+ MDEBUG( "generate_key_derivation : PARSE mode with known viewkey");
+ //Note derivation in PARSE mode can only happen with viewkey, so assert it!
+ assert(is_fake_view_key(sec));
+ r = crypto::generate_key_derivation(pub, this->viewkey, derivation);
+ } else {
+
+ int offset;
+
reset_buffer();
this->buffer_send[0] = 0x00;
@@ -1065,7 +1069,7 @@ namespace hw {
this->buffer_send[4] = 0x00;
offset = 5;
//options
- this->buffer_send[offset] = options;
+ this->buffer_send[offset] = 0;
offset += 1;
//pub
memmove(this->buffer_send+offset, pub.data, 32);
@@ -1080,25 +1084,42 @@ namespace hw {
//derivattion data
memmove(derivation.data, &this->buffer_recv[0], 32);
+ r = true;
+ }
+ #ifdef DEBUG_HWDEVICE
+ crypto::key_derivation derivation_clear ;
+ if ((this->mode == TRANSACTION_PARSE) && has_view_key) {
+ derivation_clear = derivation;
+ }else {
+ derivation_clear = hw::ledger::decrypt(derivation);
+ }
+ hw::ledger::check32("generate_key_derivation", "derivation", derivation_x.data, derivation_clear.data);
+ #endif
- #ifdef DEBUG_HWDEVICE
- crypto::key_derivation derivation_clear = hw::ledger::decrypt(derivation);
- hw::ledger::check32("generate_key_derivation", "derivation", derivation_x.data, derivation_clear.data);
- #endif
+ return r;
+ }
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
+ bool device_ledger::conceal_derivation(crypto::key_derivation &derivation, const crypto::public_key &tx_pub_key, const std::vector<crypto::public_key> &additional_tx_pub_keys, const crypto::key_derivation &main_derivation, const std::vector<crypto::key_derivation> &additional_derivations) {
+ const crypto::public_key *pkey=NULL;
+ if (derivation == main_derivation) {
+ pkey = &tx_pub_key;
+ MDEBUG("conceal derivation with main tx pub key");
+ } else {
+ for(size_t n=0; n < additional_derivations.size();++n) {
+ if(derivation == additional_derivations[n]) {
+ pkey = &additional_tx_pub_keys[n];
+ MDEBUG("conceal derivation with additionnal tx pub key");
+ break;
+ }
+ }
}
- return true;
- }
+ ASSERT_X(pkey, "Mismatched derivation on scan info");
+ return this->generate_key_derivation(*pkey, crypto::null_skey, derivation);
+ }
bool device_ledger::derivation_to_scalar(const crypto::key_derivation &derivation, const size_t output_index, crypto::ec_scalar &res) {
- lock_device();
- try {
+ AUTO_LOCK_CMD();
int offset;
- unsigned char options;
#ifdef DEBUG_HWDEVICE
const crypto::key_derivation derivation_x = hw::ledger::decrypt(derivation);
@@ -1112,8 +1133,6 @@ namespace hw {
reset_buffer();
- options = 0;
-
this->buffer_send[0] = 0x00;
this->buffer_send[1] = INS_DERIVATION_TO_SCALAR;
this->buffer_send[2] = 0x00;
@@ -1121,7 +1140,7 @@ namespace hw {
this->buffer_send[4] = 0x00;
offset = 5;
//options
- this->buffer_send[offset] = options;
+ this->buffer_send[offset] = 0;
offset += 1;
//derivattion
memmove(this->buffer_send+offset, derivation.data, 32);
@@ -1145,19 +1164,12 @@ namespace hw {
hw::ledger::check32("derivation_to_scalar", "res", res_x.data, res_clear.data);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
bool device_ledger::derive_secret_key(const crypto::key_derivation &derivation, const std::size_t output_index, const crypto::secret_key &sec, crypto::secret_key &derived_sec) {
- lock_device();
- try {
+ AUTO_LOCK_CMD();
int offset;
- unsigned char options;
#ifdef DEBUG_HWDEVICE
const crypto::key_derivation derivation_x = hw::ledger::decrypt(derivation);
@@ -1173,8 +1185,6 @@ namespace hw {
reset_buffer();
- options = 0;
-
this->buffer_send[0] = 0x00;
this->buffer_send[1] = INS_DERIVE_SECRET_KEY;
this->buffer_send[2] = 0x00;
@@ -1182,7 +1192,7 @@ namespace hw {
this->buffer_send[4] = 0x00;
offset = 5;
//options
- this->buffer_send[offset] = options;
+ this->buffer_send[offset] = 0;
offset += 1;
//derivation
memmove(this->buffer_send+offset, derivation.data, 32);
@@ -1209,20 +1219,13 @@ namespace hw {
hw::ledger::check32("derive_secret_key", "derived_sec", derived_sec_x.data, derived_sec_clear.data);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
bool device_ledger::derive_public_key(const crypto::key_derivation &derivation, const std::size_t output_index, const crypto::public_key &pub, crypto::public_key &derived_pub){
- lock_device();
- try {
+ AUTO_LOCK_CMD();
int offset;
- unsigned char options;
-
+
#ifdef DEBUG_HWDEVICE
const crypto::key_derivation derivation_x = hw::ledger::decrypt(derivation);
const std::size_t output_index_x = output_index;
@@ -1237,8 +1240,6 @@ namespace hw {
reset_buffer();
- options = 0;
-
this->buffer_send[0] = 0x00;
this->buffer_send[1] = INS_DERIVE_PUBLIC_KEY;
this->buffer_send[2] = 0x00;
@@ -1246,7 +1247,7 @@ namespace hw {
this->buffer_send[4] = 0x00;
offset = 5;
//options
- this->buffer_send[offset] = options;
+ this->buffer_send[offset] = 0;
offset += 1;
//derivation
memmove(this->buffer_send+offset, derivation.data, 32);
@@ -1272,19 +1273,12 @@ namespace hw {
hw::ledger::check32("derive_public_key", "derived_pub", derived_pub_x.data, derived_pub.data);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
bool device_ledger::secret_key_to_public_key(const crypto::secret_key &sec, crypto::public_key &pub) {
- lock_device();
- try {
+ AUTO_LOCK_CMD();
int offset;
- unsigned char options;
#ifdef DEBUG_HWDEVICE
const crypto::secret_key sec_x = hw::ledger::decrypt(sec);
@@ -1299,8 +1293,6 @@ namespace hw {
reset_buffer();
- options = 0;
-
this->buffer_send[0] = 0x00;
this->buffer_send[1] = INS_SECRET_KEY_TO_PUBLIC_KEY;
this->buffer_send[2] = 0x00;
@@ -1308,7 +1300,7 @@ namespace hw {
this->buffer_send[4] = 0x00;
offset = 5;
//options
- this->buffer_send[offset] = options;
+ this->buffer_send[offset] = 0;
offset += 1;
//sec key
memmove(this->buffer_send+offset, sec.data, 32);
@@ -1325,19 +1317,12 @@ namespace hw {
hw::ledger::check32("secret_key_to_public_key", "pub", pub_x.data, pub.data);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
bool device_ledger::generate_key_image(const crypto::public_key &pub, const crypto::secret_key &sec, crypto::key_image &image){
- lock_device();
- try {
+ AUTO_LOCK_CMD();
int offset;
- unsigned char options;
#ifdef DEBUG_HWDEVICE
const crypto::public_key pub_x = pub;
@@ -1351,8 +1336,6 @@ namespace hw {
reset_buffer();
- options = 0;
-
this->buffer_send[0] = 0x00;
this->buffer_send[1] = INS_GEN_KEY_IMAGE;
this->buffer_send[2] = 0x00;
@@ -1360,7 +1343,7 @@ namespace hw {
this->buffer_send[4] = 0x00;
offset = 5;
//options
- this->buffer_send[offset] = options;
+ this->buffer_send[offset] = 0;
offset += 1;
//pub
memmove(this->buffer_send+offset, pub.data, 32);
@@ -1380,12 +1363,7 @@ namespace hw {
hw::ledger::check32("generate_key_image", "image", image_x.data, image.data);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
/* ======================================================================= */
@@ -1393,12 +1371,9 @@ namespace hw {
/* ======================================================================= */
bool device_ledger::open_tx(crypto::secret_key &tx_key) {
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ int offset;
- lock_tx();
reset_buffer();
key_map.clear();
@@ -1423,57 +1398,19 @@ namespace hw {
this->exchange();
memmove(tx_key.data, &this->buffer_recv[32], 32);
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
- }
-
- bool device_ledger::set_signature_mode(unsigned int sig_mode) {
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
-
- reset_buffer();
-
- this->buffer_send[0] = 0x00;
- this->buffer_send[1] = INS_SET_SIGNATURE_MODE;
- this->buffer_send[2] = 0x01;
- this->buffer_send[3] = 0x00;
- this->buffer_send[4] = 0x00;
- offset = 5;
- //options
- this->buffer_send[offset] = 0x00;
- offset += 1;
- //account
- this->buffer_send[offset] = sig_mode;
- offset += 1;
-
- this->buffer_send[4] = offset-5;
- this->length_send = offset;
- this->exchange();
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+
+ return true;
}
bool device_ledger::encrypt_payment_id(crypto::hash8 &payment_id, const crypto::public_key &public_key, const crypto::secret_key &secret_key) {
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ int offset;
#ifdef DEBUG_HWDEVICE
const crypto::public_key public_key_x = public_key;
const crypto::secret_key secret_key_x = hw::ledger::decrypt(secret_key);
crypto::hash8 payment_id_x = payment_id;
- this->controle_device->encrypt_payment_id(public_key_x, secret_key_x, payment_id_x);
+ this->controle_device->encrypt_payment_id(payment_id_x, public_key_x, secret_key_x);
#endif
reset_buffer();
@@ -1506,32 +1443,19 @@ namespace hw {
hw::ledger::check8("stealth", "payment_id", payment_id_x.data, payment_id.data);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
bool device_ledger::add_output_key_mapping(const crypto::public_key &Aout, const crypto::public_key &Bout, const bool is_subaddress, const size_t real_output_index,
const rct::key &amount_key, const crypto::public_key &out_eph_public_key) {
- lock_device();
- try {
+ AUTO_LOCK_CMD();
key_map.add(ABPkeys(rct::pk2rct(Aout),rct::pk2rct(Bout), is_subaddress, real_output_index, rct::pk2rct(out_eph_public_key), amount_key));
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
bool device_ledger::ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & AKout) {
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ int offset;
#ifdef DEBUG_HWDEVICE
const rct::key AKout_x = hw::ledger::decrypt(AKout);
@@ -1574,19 +1498,12 @@ namespace hw {
hw::ledger::log_hexbuffer("Blind AKV input", (char*)&this->buffer_recv[64], 3*32);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
bool device_ledger::ecdhDecode(rct::ecdhTuple & masked, const rct::key & AKout) {
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ int offset;
#ifdef DEBUG_HWDEVICE
const rct::key AKout_x = hw::ledger::decrypt(AKout);
@@ -1627,21 +1544,13 @@ namespace hw {
hw::ledger::check32("ecdhDecode", "mask", (char*)masked_x.mask.bytes,(char*) masked.mask.bytes);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
bool device_ledger::mlsag_prehash(const std::string &blob, size_t inputs_size, size_t outputs_size,
const rct::keyV &hashes, const rct::ctkeyV &outPk,
rct::key &prehash) {
-
- lock_device();
- try {
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
unsigned int data_offset, C_offset, kv_offset, i;
const char *data;
@@ -1834,21 +1743,15 @@ namespace hw {
hw::ledger::check32("mlsag_prehash", "prehash", (char*)prehash_x.bytes, (char*)prehash.bytes);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
bool device_ledger::mlsag_prepare(const rct::key &H, const rct::key &xx,
rct::key &a, rct::key &aG, rct::key &aHP, rct::key &II) {
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ int offset;
+ unsigned char options;
#ifdef DEBUG_HWDEVICE
const rct::key H_x = H;
@@ -1897,19 +1800,13 @@ namespace hw {
hw::ledger::check32("mlsag_prepare", "II", (char*)II_x.bytes, (char*)II.bytes);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
bool device_ledger::mlsag_prepare(rct::key &a, rct::key &aG) {
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ int offset;
+ unsigned char options;
#ifdef DEBUG_HWDEVICE
rct::key a_x;
@@ -1941,19 +1838,13 @@ namespace hw {
hw::ledger::check32("mlsag_prepare", "AG", (char*)aG_x.bytes, (char*)aG.bytes);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
bool device_ledger::mlsag_hash(const rct::keyV &long_message, rct::key &c) {
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ int offset;
+ unsigned char options;
size_t cnt;
#ifdef DEBUG_HWDEVICE
@@ -1991,20 +1882,12 @@ namespace hw {
hw::ledger::check32("mlsag_hash", "c", (char*)c_x.bytes, (char*)c.bytes);
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
-
+ return true;
}
bool device_ledger::mlsag_sign(const rct::key &c, const rct::keyV &xx, const rct::keyV &alpha, const size_t rows, const size_t dsRows, rct::keyV &ss) {
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ int offset;
CHECK_AND_ASSERT_THROW_MES(dsRows<=rows, "dsRows greater than rows");
CHECK_AND_ASSERT_THROW_MES(xx.size() == rows, "xx size does not match rows");
@@ -2061,19 +1944,12 @@ namespace hw {
}
#endif
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
bool device_ledger::close_tx() {
- lock_device();
- try {
- int offset =0;
- unsigned char options = 0;
+ AUTO_LOCK_CMD();
+ int offset;
reset_buffer();
@@ -2091,13 +1967,7 @@ namespace hw {
this->length_send = offset;
this->exchange();
- unlock_tx();
- unlock_device();
- }catch (...) {
- unlock_device();
- throw;
- }
- return true;
+ return true;
}
/* ---------------------------------------------------------- */
diff --git a/src/device/device_ledger.hpp b/src/device/device_ledger.hpp
index e06c5f72c..f1fcaab87 100644
--- a/src/device/device_ledger.hpp
+++ b/src/device/device_ledger.hpp
@@ -32,11 +32,11 @@
#include <cstddef>
#include <string>
-#include <mutex>
#include "device.hpp"
#include <PCSC/winscard.h>
#include <PCSC/wintypes.h>
-
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/recursive_mutex.hpp>
namespace hw {
@@ -80,13 +80,11 @@ namespace hw {
class device_ledger : public hw::device {
private:
- mutable std::mutex device_locker;
- mutable std::mutex tx_locker;
- void lock_device() ;
- void unlock_device() ;
- void lock_tx() ;
- void unlock_tx() ;
-
+ // Locker for concurrent access
+ mutable boost::recursive_mutex device_locker;
+ mutable boost::mutex command_locker;
+
+ //PCSC management
std::string full_name;
SCARDCONTEXT hContext;
SCARDHANDLE hCard;
@@ -95,15 +93,21 @@ namespace hw {
DWORD length_recv;
BYTE buffer_recv[BUFFER_RECV_SIZE];
unsigned int id;
-
- Keymap key_map;
-
-
void logCMD(void);
void logRESP(void);
unsigned int exchange(unsigned int ok=0x9000, unsigned int mask=0xFFFF);
void reset_buffer(void);
+ // hw running mode
+ device_mode mode;
+ // map public destination key to ephemeral destination key
+ Keymap key_map;
+
+ // To speed up blockchain parsing the view key maybe handle here.
+ crypto::secret_key viewkey;
+ bool has_view_key;
+
+ //extra debug
#ifdef DEBUG_HWDEVICE
device *controle_device;
#endif
@@ -130,6 +134,15 @@ namespace hw {
bool connect(void) override;
bool disconnect() override;
+ bool set_mode(device_mode mode) override;
+
+ /* ======================================================================= */
+ /* LOCKER */
+ /* ======================================================================= */
+ void lock(void) override;
+ void unlock(void) override;
+ bool try_lock(void) override;
+
/* ======================================================================= */
/* WALLET & ADDRESS */
/* ======================================================================= */
@@ -156,6 +169,7 @@ namespace hw {
bool sc_secret_add(crypto::secret_key &r, const crypto::secret_key &a, const crypto::secret_key &b) override;
crypto::secret_key generate_keys(crypto::public_key &pub, crypto::secret_key &sec, const crypto::secret_key& recovery_key = crypto::secret_key(), bool recover = false) override;
bool generate_key_derivation(const crypto::public_key &pub, const crypto::secret_key &sec, crypto::key_derivation &derivation) override;
+ bool conceal_derivation(crypto::key_derivation &derivation, const crypto::public_key &tx_pub_key, const std::vector<crypto::public_key> &additional_tx_pub_keys, const crypto::key_derivation &main_derivation, const std::vector<crypto::key_derivation> &additional_derivations) override;
bool derivation_to_scalar(const crypto::key_derivation &derivation, const size_t output_index, crypto::ec_scalar &res) override;
bool derive_secret_key(const crypto::key_derivation &derivation, const std::size_t output_index, const crypto::secret_key &sec, crypto::secret_key &derived_sec) override;
bool derive_public_key(const crypto::key_derivation &derivation, const std::size_t output_index, const crypto::public_key &pub, crypto::public_key &derived_pub) override;
@@ -168,8 +182,6 @@ namespace hw {
bool open_tx(crypto::secret_key &tx_key) override;
- bool set_signature_mode(unsigned int sig_mode) override;
-
bool encrypt_payment_id(crypto::hash8 &payment_id, const crypto::public_key &public_key, const crypto::secret_key &secret_key) override;
bool ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & sharedSec) override;
@@ -190,10 +202,9 @@ namespace hw {
};
-
#ifdef DEBUG_HWDEVICE
- extern crypto::secret_key viewkey;
- extern crypto::secret_key spendkey;
+ extern crypto::secret_key dbg_viewkey;
+ extern crypto::secret_key dbg_spendkey;
#endif
#endif //WITH_DEVICE_LEDGER
diff --git a/src/device/log.cpp b/src/device/log.cpp
index a2ad0f4f4..cbbcfc953 100644
--- a/src/device/log.cpp
+++ b/src/device/log.cpp
@@ -56,8 +56,8 @@ namespace hw {
}
#ifdef DEBUG_HWDEVICE
- extern crypto::secret_key viewkey;
- extern crypto::secret_key spendkey;
+ extern crypto::secret_key dbg_viewkey;
+ extern crypto::secret_key dbg_spendkey;
void decrypt(char* buf, size_t len) {
@@ -69,7 +69,7 @@ namespace hw {
if (buf[i] != 0) break;
}
if (i == 32) {
- memmove(buf, hw::ledger::viewkey.data, 32);
+ memmove(buf, hw::ledger::dbg_viewkey.data, 32);
return;
}
//spend key?
@@ -77,7 +77,7 @@ namespace hw {
if (buf[i] != (char)0xff) break;
}
if (i == 32) {
- memmove(buf, hw::ledger::spendkey.data, 32);
+ memmove(buf, hw::ledger::dbg_spendkey.data, 32);
return;
}
}
@@ -161,4 +161,4 @@ namespace hw {
}
#endif //WITH_DEVICE_LEDGER
-} \ No newline at end of file
+}
diff --git a/src/p2p/net_node.cpp b/src/p2p/net_node.cpp
index bde6fc88e..c9ca63f43 100644
--- a/src/p2p/net_node.cpp
+++ b/src/p2p/net_node.cpp
@@ -39,7 +39,7 @@ namespace nodetool
, "Port for p2p network protocol"
, std::to_string(config::P2P_DEFAULT_PORT)
, {{ &cryptonote::arg_testnet_on, &cryptonote::arg_stagenet_on }}
- , [](std::array<bool, 2> testnet_stagenet, bool defaulted, std::string val) {
+ , [](std::array<bool, 2> testnet_stagenet, bool defaulted, std::string val)->std::string {
if (testnet_stagenet[0] && defaulted)
return std::to_string(config::testnet::P2P_DEFAULT_PORT);
else if (testnet_stagenet[1] && defaulted)
diff --git a/src/p2p/net_node.h b/src/p2p/net_node.h
index 3010b43ad..4606f66ee 100644
--- a/src/p2p/net_node.h
+++ b/src/p2p/net_node.h
@@ -334,8 +334,8 @@ namespace nodetool
cryptonote::network_type m_nettype;
};
- const int64_t default_limit_up = 2048;
- const int64_t default_limit_down = 8192;
+ const int64_t default_limit_up = 2048; // kB/s
+ const int64_t default_limit_down = 8192; // kB/s
extern const command_line::arg_descriptor<std::string> arg_p2p_bind_ip;
extern const command_line::arg_descriptor<std::string, false, true, 2> arg_p2p_bind_port;
extern const command_line::arg_descriptor<uint32_t> arg_p2p_external_port;
diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl
index 54875e619..9b21705ec 100644
--- a/src/p2p/net_node.inl
+++ b/src/p2p/net_node.inl
@@ -49,16 +49,9 @@
#include "storages/levin_abstract_invoke2.h"
#include "cryptonote_core/cryptonote_core.h"
-// We have to look for miniupnpc headers in different places, dependent on if its compiled or external
-#ifdef UPNP_STATIC
- #include <miniupnpc/miniupnpc.h>
- #include <miniupnpc/upnpcommands.h>
- #include <miniupnpc/upnperrors.h>
-#else
- #include "miniupnpc.h"
- #include "upnpcommands.h"
- #include "upnperrors.h"
-#endif
+#include <miniupnp/miniupnpc/miniupnpc.h>
+#include <miniupnp/miniupnpc/upnpcommands.h>
+#include <miniupnp/miniupnpc/upnperrors.h>
#undef MONERO_DEFAULT_LOG_CATEGORY
#define MONERO_DEFAULT_LOG_CATEGORY "net.p2p"
@@ -397,8 +390,8 @@ namespace nodetool
full_addrs.insert("163.172.182.165:18080");
full_addrs.insert("161.67.132.39:18080");
full_addrs.insert("198.74.231.92:18080");
- full_addrs.insert("195.154.123.123:28080");
- full_addrs.insert("212.83.172.165:28080");
+ full_addrs.insert("195.154.123.123:18080");
+ full_addrs.insert("212.83.172.165:18080");
}
return full_addrs;
}
@@ -490,7 +483,7 @@ namespace nodetool
if (result.size())
{
for (const auto& addr_string : result)
- full_addrs.insert(addr_string + ":18080");
+ full_addrs.insert(addr_string + ":" + std::to_string(m_nettype == cryptonote::TESTNET ? ::config::testnet::P2P_DEFAULT_PORT : m_nettype == cryptonote::STAGENET ? ::config::stagenet::P2P_DEFAULT_PORT : ::config::P2P_DEFAULT_PORT));
}
++i;
}
diff --git a/src/ringct/rctSigs.cpp b/src/ringct/rctSigs.cpp
index 4ecf62cec..777b4d13a 100644
--- a/src/ringct/rctSigs.cpp
+++ b/src/ringct/rctSigs.cpp
@@ -42,6 +42,8 @@ using namespace std;
#undef MONERO_DEFAULT_LOG_CATEGORY
#define MONERO_DEFAULT_LOG_CATEGORY "ringct"
+#define CHECK_AND_ASSERT_MES_L1(expr, ret, message) {if(!(expr)) {MCERROR("verify", message); return ret;}}
+
namespace rct {
bool is_simple(int type)
{
@@ -135,8 +137,8 @@ namespace rct {
bool verifyBorromean(const boroSig &bb, const key64 P1, const key64 P2) {
ge_p3 P1_p3[64], P2_p3[64];
for (size_t i = 0 ; i < 64 ; ++i) {
- CHECK_AND_ASSERT_MES(ge_frombytes_vartime(&P1_p3[i], P1[i].bytes) == 0, false, "point conv failed");
- CHECK_AND_ASSERT_MES(ge_frombytes_vartime(&P2_p3[i], P2[i].bytes) == 0, false, "point conv failed");
+ CHECK_AND_ASSERT_MES_L1(ge_frombytes_vartime(&P1_p3[i], P1[i].bytes) == 0, false, "point conv failed");
+ CHECK_AND_ASSERT_MES_L1(ge_frombytes_vartime(&P2_p3[i], P2[i].bytes) == 0, false, "point conv failed");
}
return verifyBorromean(bb, P1_p3, P2_p3);
}
@@ -356,9 +358,9 @@ namespace rct {
ge_cached cached;
ge_p3 p3;
ge_p1p1 p1;
- CHECK_AND_ASSERT_MES(ge_frombytes_vartime(&p3, H2[i].bytes) == 0, false, "point conv failed");
+ CHECK_AND_ASSERT_MES_L1(ge_frombytes_vartime(&p3, H2[i].bytes) == 0, false, "point conv failed");
ge_p3_to_cached(&cached, &p3);
- CHECK_AND_ASSERT_MES(ge_frombytes_vartime(&asCi[i], as.Ci[i].bytes) == 0, false, "point conv failed");
+ CHECK_AND_ASSERT_MES_L1(ge_frombytes_vartime(&asCi[i], as.Ci[i].bytes) == 0, false, "point conv failed");
ge_sub(&p1, &asCi[i], &cached);
ge_p3_to_cached(&cached, &asCi[i]);
ge_p1p1_to_p3(&CiH[i], &p1);
diff --git a/src/rpc/core_rpc_server.cpp b/src/rpc/core_rpc_server.cpp
index c3d1a9d11..e28914d96 100644
--- a/src/rpc/core_rpc_server.cpp
+++ b/src/rpc/core_rpc_server.cpp
@@ -47,6 +47,7 @@ using namespace epee;
#include "rpc/rpc_args.h"
#include "core_rpc_server_error_codes.h"
#include "p2p/net_node.h"
+#include "get_output_distribution_cache.h"
#include "version.h"
#undef MONERO_DEFAULT_LOG_CATEGORY
@@ -209,6 +210,15 @@ namespace cryptonote
return true;
}
//------------------------------------------------------------------------------------------------------------------------------
+ static cryptonote::blobdata get_pruned_tx_blob(cryptonote::transaction &tx)
+ {
+ std::stringstream ss;
+ binary_archive<true> ba(ss);
+ bool r = tx.serialize_base(ba);
+ CHECK_AND_ASSERT_MES(r, cryptonote::blobdata(), "Failed to serialize rct signatures base");
+ return ss.str();
+ }
+ //------------------------------------------------------------------------------------------------------------------------------
static cryptonote::blobdata get_pruned_tx_blob(const cryptonote::blobdata &blobdata)
{
cryptonote::transaction tx;
@@ -216,14 +226,9 @@ namespace cryptonote
if (!cryptonote::parse_and_validate_tx_from_blob(blobdata, tx))
{
MERROR("Failed to parse and validate tx from blob");
- return blobdata;
+ return cryptonote::blobdata();
}
-
- std::stringstream ss;
- binary_archive<true> ba(ss);
- bool r = tx.serialize_base(ba);
- CHECK_AND_ASSERT_MES(r, blobdata, "Failed to serialize rct signatures base");
- return ss.str();
+ return get_pruned_tx_blob(tx);
}
//------------------------------------------------------------------------------------------------------------------------------
bool core_rpc_server::on_get_blocks(const COMMAND_RPC_GET_BLOCKS_FAST::request& req, COMMAND_RPC_GET_BLOCKS_FAST::response& res)
@@ -633,7 +638,7 @@ namespace cryptonote
crypto::hash tx_hash = *vhi++;
e.tx_hash = *txhi++;
- blobdata blob = t_serializable_object_to_blob(tx);
+ blobdata blob = req.prune ? get_pruned_tx_blob(tx) : t_serializable_object_to_blob(tx);
e.as_hex = string_tools::buff_to_hex_nodelimer(blob);
if (req.decode_as_json)
e.as_json = obj_to_json_str(tx);
@@ -1724,7 +1729,7 @@ namespace cryptonote
std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> histogram;
try
{
- histogram = m_core.get_blockchain_storage().get_output_histogram(req.amounts, req.unlocked, req.recent_cutoff);
+ histogram = m_core.get_blockchain_storage().get_output_histogram(req.amounts, req.unlocked, req.recent_cutoff, req.min_count);
}
catch (const std::exception &e)
{
@@ -2078,24 +2083,72 @@ namespace cryptonote
//------------------------------------------------------------------------------------------------------------------------------
bool core_rpc_server::on_get_output_distribution(const COMMAND_RPC_GET_OUTPUT_DISTRIBUTION::request& req, COMMAND_RPC_GET_OUTPUT_DISTRIBUTION::response& res, epee::json_rpc::error& error_resp)
{
+ PERF_TIMER(on_get_output_distribution);
try
{
for (uint64_t amount: req.amounts)
{
+ static struct D
+ {
+ boost::mutex mutex;
+ std::vector<uint64_t> cached_distribution;
+ uint64_t cached_from, cached_to, cached_start_height, cached_base;
+ bool cached;
+ D(): cached_from(0), cached_to(0), cached_start_height(0), cached_base(0), cached(false) {}
+ } d;
+ boost::unique_lock<boost::mutex> lock(d.mutex);
+
+ if (d.cached && amount == 0 && d.cached_from == req.from_height && d.cached_to == req.to_height)
+ {
+ res.distributions.push_back({amount, d.cached_start_height, d.cached_distribution, d.cached_base});
+ continue;
+ }
+
+ // this is a slow operation, so we have precomputed caches of common cases
+ bool found = false;
+ for (const auto &slot: get_output_distribution_cache)
+ {
+ if (slot.amount == amount && slot.from_height == req.from_height && slot.to_height == req.to_height)
+ {
+ res.distributions.push_back({amount, slot.start_height, slot.distribution, slot.base});
+ found = true;
+ break;
+ }
+ }
+ if (found)
+ continue;
+
std::vector<uint64_t> distribution;
uint64_t start_height, base;
- if (!m_core.get_output_distribution(amount, req.from_height, start_height, distribution, base))
+ if (!m_core.get_output_distribution(amount, req.from_height, req.to_height, start_height, distribution, base))
{
error_resp.code = CORE_RPC_ERROR_CODE_INTERNAL_ERROR;
error_resp.message = "Failed to get rct distribution";
return false;
}
+ if (req.to_height > 0 && req.to_height >= req.from_height)
+ {
+ uint64_t offset = std::max(req.from_height, start_height);
+ if (offset <= req.to_height && req.to_height - offset + 1 < distribution.size())
+ distribution.resize(req.to_height - offset + 1);
+ }
if (req.cumulative)
{
distribution[0] += base;
for (size_t n = 1; n < distribution.size(); ++n)
distribution[n] += distribution[n-1];
}
+
+ if (amount == 0)
+ {
+ d.cached_from = req.from_height;
+ d.cached_to = req.to_height;
+ d.cached_distribution = distribution;
+ d.cached_start_height = start_height;
+ d.cached_base = base;
+ d.cached = true;
+ }
+
res.distributions.push_back({amount, start_height, std::move(distribution), base});
}
}
@@ -2117,7 +2170,7 @@ namespace cryptonote
, "Port for RPC server"
, std::to_string(config::RPC_DEFAULT_PORT)
, {{ &cryptonote::arg_testnet_on, &cryptonote::arg_stagenet_on }}
- , [](std::array<bool, 2> testnet_stagenet, bool defaulted, std::string val) {
+ , [](std::array<bool, 2> testnet_stagenet, bool defaulted, std::string val)->std::string {
if (testnet_stagenet[0] && defaulted)
return std::to_string(config::testnet::RPC_DEFAULT_PORT);
else if (testnet_stagenet[1] && defaulted)
diff --git a/src/rpc/core_rpc_server.h b/src/rpc/core_rpc_server.h
index a5755e062..86e41e047 100644
--- a/src/rpc/core_rpc_server.h
+++ b/src/rpc/core_rpc_server.h
@@ -153,7 +153,7 @@ namespace cryptonote
MAP_JON_RPC_WE_IF("relay_tx", on_relay_tx, COMMAND_RPC_RELAY_TX, !m_restricted)
MAP_JON_RPC_WE_IF("sync_info", on_sync_info, COMMAND_RPC_SYNC_INFO, !m_restricted)
MAP_JON_RPC_WE("get_txpool_backlog", on_get_txpool_backlog, COMMAND_RPC_GET_TRANSACTION_POOL_BACKLOG)
- MAP_JON_RPC_WE_IF("get_output_distribution", on_get_output_distribution, COMMAND_RPC_GET_OUTPUT_DISTRIBUTION, !m_restricted)
+ MAP_JON_RPC_WE("get_output_distribution", on_get_output_distribution, COMMAND_RPC_GET_OUTPUT_DISTRIBUTION)
END_JSON_RPC_MAP()
END_URI_MAP2()
diff --git a/src/rpc/core_rpc_server_commands_defs.h b/src/rpc/core_rpc_server_commands_defs.h
index 660fb7889..250c88e90 100644
--- a/src/rpc/core_rpc_server_commands_defs.h
+++ b/src/rpc/core_rpc_server_commands_defs.h
@@ -563,10 +563,12 @@ namespace cryptonote
{
std::list<std::string> txs_hashes;
bool decode_as_json;
+ bool prune;
BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(txs_hashes)
KV_SERIALIZE(decode_as_json)
+ KV_SERIALIZE_OPT(prune, false)
END_KV_SERIALIZE_MAP()
};
@@ -1703,7 +1705,7 @@ namespace cryptonote
{
struct request
{
- int64_t limit_down;
+ int64_t limit_down; // all limits (for get and set) are kB/s
int64_t limit_up;
BEGIN_KV_SERIALIZE_MAP()
@@ -2210,11 +2212,13 @@ namespace cryptonote
{
std::vector<uint64_t> amounts;
uint64_t from_height;
+ uint64_t to_height;
bool cumulative;
BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(amounts)
KV_SERIALIZE_OPT(from_height, (uint64_t)0)
+ KV_SERIALIZE_OPT(to_height, (uint64_t)0)
KV_SERIALIZE_OPT(cumulative, false)
END_KV_SERIALIZE_MAP()
};
diff --git a/src/rpc/get_output_distribution_cache.h b/src/rpc/get_output_distribution_cache.h
new file mode 100644
index 000000000..6495e7d4c
--- /dev/null
+++ b/src/rpc/get_output_distribution_cache.h
@@ -0,0 +1,113 @@
+static const struct
+{
+ uint64_t amount;
+ uint64_t from_height;
+ uint64_t to_height;
+ uint64_t start_height;
+ uint64_t base;
+ std::vector<uint64_t> distribution;
+}
+get_output_distribution_cache[] =
+{
+ {
+ 0,
+ 1544704,
+ 1546001,
+ 1544704,
+ 5143500,
+ {
+ 5, 38, 37, 33, 39, 7, 1, 1, 5, 9, 7, 5, 17, 5, 3, 9, 3, 17, 5, 17, 1, 1, 15, 13, 3, 10, 5, 3, 34, 1, 45, 7,
+ 5, 17, 5, 22, 3, 1, 17, 16, 5, 1, 3, 43, 5, 13, 3, 23, 9, 7, 9, 13, 1, 11, 1, 17, 1, 3, 16, 11, 5, 11, 7, 7,
+ 33, 11, 7, 1, 5, 1, 21, 19, 1, 17, 1, 49, 17, 3, 3, 9, 35, 46, 46, 39, 26, 33, 21, 3, 23, 3, 9, 37, 1, 33, 11, 32,
+ 1, 13, 16, 12, 3, 21, 1, 18, 3, 19, 1, 25, 5, 3, 18, 7, 17, 5, 9, 15, 7, 7, 11, 9, 9, 17, 5, 16, 1, 3, 13, 3,
+ 5, 5, 5, 13, 5, 9, 5, 13, 3, 17, 15, 36, 13, 3, 20, 12, 6, 23, 17, 10, 22, 23, 1, 7, 21, 6, 23, 1, 3, 19, 13, 1,
+ 3, 43, 35, 13, 1, 31, 7, 3, 17, 1, 15, 5, 11, 15, 24, 1, 18, 13, 5, 15, 1, 29, 3, 3, 13, 3, 15, 7, 17, 3, 1, 1,
+ 17, 1, 1, 45, 39, 27, 45, 46, 34, 7, 3, 3, 9, 3, 3, 11, 7, 5, 9, 25, 19, 3, 33, 1, 5, 17, 1, 45, 4, 1, 45, 11,
+ 44, 32, 3, 1, 3, 7, 17, 15, 5, 45, 35, 41, 1, 35, 3, 3, 19, 1, 9, 17, 29, 29, 3, 1, 13, 1, 3, 47, 21, 13, 7, 1,
+ 7, 5, 1, 11, 1, 40, 9, 7, 3, 3, 13, 25, 1, 47, 5, 7, 3, 7, 31, 40, 34, 6, 3, 15, 3, 31, 5, 13, 27, 9, 12, 21,
+ 3, 1, 19, 1, 19, 5, 47, 49, 47, 42, 50, 34, 29, 23, 1, 5, 9, 16, 11, 7, 1, 19, 7, 5, 1, 15, 1, 1, 9, 13, 9, 5,
+ 27, 3, 3, 29, 1, 33, 3, 9, 5, 35, 5, 1, 17, 7, 3, 39, 3, 28, 19, 1, 1, 9, 1, 3, 27, 1, 37, 3, 1, 1, 16, 3,
+ 25, 11, 5, 3, 33, 45, 17, 11, 7, 22, 9, 1, 5, 5, 5, 15, 1, 15, 9, 7, 11, 13, 37, 49, 46, 38, 11, 1, 25, 1, 13, 18,
+ 3, 7, 39, 3, 37, 19, 35, 3, 1, 3, 19, 1, 3, 15, 21, 3, 27, 1, 45, 48, 1, 13, 29, 9, 1, 1, 46, 43, 5, 15, 3, 7,
+ 29, 26, 5, 5, 21, 37, 17, 21, 3, 13, 1, 5, 1, 17, 5, 31, 13, 1, 11, 3, 46, 9, 3, 7, 1, 1, 41, 1, 21, 1, 5, 12,
+ 7, 13, 9, 25, 1, 47, 47, 48, 48, 48, 48, 48, 47, 48, 45, 45, 33, 52, 50, 46, 45, 47, 35, 41, 38, 35, 42, 38, 34, 41, 39, 35,
+ 51, 51, 45, 43, 49, 52, 53, 45, 42, 46, 37, 53, 49, 41, 46, 49, 46, 47, 48, 37, 41, 33, 43, 38, 15, 3, 3, 27, 11, 5, 23, 13,
+ 1, 1, 37, 3, 15, 3, 30, 13, 3, 45, 12, 3, 5, 11, 1, 1, 21, 9, 11, 19, 1, 1, 1, 25, 5, 21, 3, 1, 32, 44, 3, 33,
+ 11, 7, 5, 23, 1, 37, 47, 48, 48, 48, 48, 48, 48, 46, 47, 47, 50, 45, 49, 50, 46, 47, 49, 45, 51, 49, 50, 49, 49, 46, 47, 48,
+ 46, 48, 46, 50, 46, 43, 46, 46, 48, 47, 46, 47, 45, 49, 46, 43, 50, 45, 45, 49, 45, 48, 45, 49, 48, 45, 45, 51, 45, 51, 45, 46,
+ 52, 45, 45, 51, 51, 52, 44, 45, 52, 50, 50, 46, 47, 51, 51, 46, 47, 47, 47, 50, 47, 51, 48, 49, 51, 50, 48, 48, 48, 50, 49, 49,
+ 52, 52, 49, 50, 49, 49, 49, 51, 52, 49, 52, 50, 49, 47, 29, 15, 39, 17, 31, 5, 40, 5, 18, 23, 25, 7, 35, 26, 5, 31, 49, 22,
+ 3, 17, 7, 49, 7, 49, 47, 12, 44, 46, 36, 15, 3, 1, 47, 13, 35, 40, 5, 21, 19, 39, 21, 33, 31, 29, 1, 1, 37, 1, 15, 47,
+ 7, 7, 47, 41, 13, 3, 47, 31, 9, 33, 13, 43, 29, 5, 1, 9, 33, 7, 27, 15, 15, 25, 5, 43, 22, 31, 7, 1, 47, 1, 15, 27,
+ 3, 27, 45, 15, 1, 36, 17, 1, 23, 39, 38, 45, 7, 7, 19, 7, 11, 47, 33, 16, 3, 45, 45, 45, 9, 27, 3, 3, 21, 3, 7, 21,
+ 7, 3, 43, 1, 17, 1, 45, 37, 46, 5, 5, 13, 46, 40, 48, 48, 45, 34, 1, 46, 19, 25, 9, 7, 47, 23, 37, 31, 3, 25, 13, 46,
+ 31, 25, 5, 46, 35, 52, 11, 23, 27, 4, 15, 11, 11, 11, 9, 34, 7, 9, 15, 34, 9, 27, 37, 28, 25, 45, 13, 30, 5, 25, 15, 7,
+ 3, 19, 27, 1, 7, 11, 1, 32, 3, 45, 11, 9, 21, 25, 9, 13, 13, 1, 7, 1, 33, 11, 5, 3, 3, 27, 27, 5, 3, 37, 17, 17,
+ 3, 7, 5, 13, 1, 3, 44, 45, 26, 25, 1, 13, 3, 13, 3, 11, 1, 11, 7, 45, 3, 3, 1, 43, 1, 19, 3, 1, 15, 5, 39, 7,
+ 7, 1, 9, 1, 11, 19, 3, 35, 29, 7, 15, 11, 40, 7, 44, 38, 34, 7, 9, 7, 1, 27, 1, 9, 5, 45, 1, 21, 3, 1, 5, 9,
+ 3, 21, 23, 33, 3, 1, 7, 3, 3, 7, 41, 9, 7, 1, 5, 31, 9, 7, 1, 1, 11, 41, 51, 20, 9, 47, 39, 17, 9, 35, 1, 41,
+ 1, 19, 1, 19, 15, 1, 13, 5, 23, 15, 9, 15, 17, 1, 15, 27, 33, 31, 29, 7, 13, 1, 5, 45, 5, 1, 1, 11, 1, 13, 3, 7,
+ 9, 1, 13, 39, 3, 33, 5, 3, 7, 7, 5, 29, 11, 1, 7, 1, 15, 3, 13, 3, 15, 3, 3, 1, 5, 1, 9, 1, 44, 49, 24, 25,
+ 1, 1, 34, 22, 7, 5, 5, 5, 10, 9, 13, 3, 9, 1, 9, 19, 7, 43, 48, 7, 11, 7, 3, 3, 7, 21, 1, 1, 3, 3, 11, 31,
+ 1, 1, 13, 22, 23, 7, 27, 9, 3, 3, 21, 1, 35, 21, 9, 11, 13, 39, 1, 3, 7, 23, 3, 28, 3, 45, 47, 38, 32, 37, 34, 1,
+ 23, 3, 3, 1, 19, 19, 1, 5, 13, 1, 5, 11, 38, 3, 1, 36, 13, 1, 1, 23, 5, 17, 11, 1, 13, 1, 3, 7, 11, 3, 33, 7,
+ 19, 5, 5, 1, 1, 3, 5, 41, 1, 3, 25, 1, 7, 7, 9, 3, 11, 3, 13, 5, 7, 1, 3, 9, 1, 1, 43, 47, 47, 47, 17, 7,
+ 17, 3, 19, 1, 9, 9, 33, 22, 1, 25, 1, 3, 3, 32, 5, 1, 23, 9, 5, 1, 31, 5, 9, 1, 3, 7, 19, 1, 12, 11, 5, 1,
+ 1, 9, 25, 15, 15, 13, 5, 3, 15, 1, 17, 1, 1, 5, 5, 41, 11, 15, 7, 3, 21, 21, 35, 22, 46, 35, 3, 27, 5, 3, 45, 22,
+ 27, 1, 19, 9, 1, 25, 1, 29, 3, 5, 25, 17, 27, 5, 19, 5, 25, 7, 19, 1, 9, 21, 3, 7, 29, 27, 17, 3, 3, 15, 7, 19,
+ 5, 25, 1, 23, 45, 4, 31, 1, 37, 14, 29, 3, 29, 1, 23, 29, 19, 11, 1, 13, 13, 9, 1, 25, 1, 33, 1, 37, 37, 23, 7, 21,
+ 7, 3, 13, 7, 3, 7, 21, 11, 9, 1, 31, 3, 1, 7, 39, 46, 3, 30,
+ },
+ },
+ {
+ 0,
+ 1562704,
+ 1564001,
+ 1562704,
+ 5521986,
+ {
+ 35, 45, 23, 3, 44, 47, 44, 3, 17, 35, 7, 11, 7, 29, 43, 27, 11, 7, 5, 31, 13, 9, 45, 45, 7, 42, 17, 15, 19, 11, 45, 19,
+ 45, 46, 45, 46, 32, 34, 43, 34, 46, 47, 45, 30, 17, 45, 46, 36, 35, 38, 19, 9, 23, 17, 3, 19, 31, 41, 35, 24, 15, 45, 15, 5,
+ 11, 5, 19, 11, 11, 7, 15, 19, 45, 34, 7, 7, 29, 1, 9, 36, 7, 44, 45, 33, 25, 8, 17, 7, 44, 43, 48, 45, 42, 46, 40, 44,
+ 1, 43, 45, 46, 46, 35, 19, 19, 23, 5, 13, 19, 7, 16, 9, 3, 25, 34, 3, 27, 9, 39, 3, 43, 21, 1, 45, 45, 39, 25, 23, 13,
+ 39, 39, 3, 45, 43, 46, 44, 40, 39, 33, 45, 47, 38, 45, 45, 39, 47, 47, 45, 46, 35, 45, 43, 47, 45, 40, 34, 42, 42, 48, 49, 47,
+ 47, 48, 47, 45, 43, 48, 37, 48, 41, 45, 48, 34, 42, 44, 9, 19, 27, 1, 47, 47, 43, 25, 29, 5, 5, 21, 39, 35, 43, 37, 13, 45,
+ 25, 31, 26, 47, 45, 23, 23, 39, 32, 25, 44, 47, 35, 47, 15, 17, 7, 9, 5, 35, 31, 3, 45, 47, 46, 13, 17, 48, 45, 9, 13, 45,
+ 45, 31, 1, 53, 44, 46, 39, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 47, 47, 47, 47, 47, 47, 47, 53, 49, 45, 45, 50,
+ 50, 27, 43, 46, 47, 46, 45, 48, 36, 42, 42, 46, 45, 47, 41, 45, 43, 47, 38, 48, 47, 33, 11, 45, 46, 34, 42, 32, 3, 45, 37, 45,
+ 15, 3, 45, 29, 31, 9, 5, 3, 27, 5, 21, 25, 7, 15, 46, 34, 5, 3, 17, 3, 9, 13, 7, 11, 3, 1, 34, 13, 7, 45, 33, 26,
+ 9, 5, 9, 41, 43, 34, 3, 35, 3, 17, 37, 11, 17, 3, 15, 27, 15, 45, 46, 13, 26, 16, 11, 7, 5, 45, 38, 45, 45, 22, 44, 44,
+ 43, 6, 11, 35, 15, 44, 17, 27, 13, 3, 40, 5, 9, 7, 35, 19, 5, 5, 1, 28, 33, 15, 45, 5, 29, 3, 31, 12, 5, 32, 24, 3,
+ 23, 13, 47, 45, 42, 46, 39, 21, 21, 1, 44, 44, 47, 41, 5, 1, 11, 36, 20, 5, 45, 39, 45, 45, 44, 45, 32, 22, 40, 11, 38, 1,
+ 45, 46, 37, 9, 23, 9, 15, 44, 7, 16, 38, 46, 11, 14, 24, 19, 19, 7, 26, 25, 45, 37, 17, 1, 35, 1, 3, 28, 3, 11, 22, 13,
+ 3, 1, 7, 38, 5, 3, 1, 26, 1, 3, 43, 44, 46, 45, 21, 11, 1, 44, 27, 1, 11, 26, 10, 44, 45, 45, 45, 47, 47, 45, 48, 45,
+ 38, 9, 5, 44, 46, 27, 3, 12, 1, 11, 3, 44, 43, 1, 5, 2, 46, 17, 13, 19, 1, 12, 7, 23, 1, 17, 6, 13, 3, 5, 27, 7,
+ 46, 36, 19, 25, 1, 1, 3, 8, 15, 3, 45, 45, 45, 37, 6, 15, 3, 5, 38, 14, 41, 1, 13, 45, 45, 39, 44, 29, 43, 48, 51, 50,
+ 37, 5, 17, 46, 47, 31, 5, 42, 49, 38, 39, 24, 7, 11, 44, 35, 21, 6, 15, 5, 47, 13, 28, 45, 34, 27, 24, 15, 35, 13, 7, 25,
+ 43, 13, 14, 5, 3, 5, 46, 45, 45, 35, 5, 21, 28, 3, 13, 4, 30, 19, 45, 45, 40, 37, 5, 40, 17, 9, 3, 9, 13, 4, 17, 33,
+ 44, 39, 17, 45, 28, 5, 11, 45, 19, 45, 21, 44, 31, 43, 49, 48, 15, 3, 1, 44, 45, 43, 11, 1, 1, 27, 43, 45, 39, 3, 1, 3,
+ 5, 31, 1, 43, 23, 19, 7, 5, 45, 31, 11, 7, 3, 9, 5, 7, 13, 43, 47, 45, 46, 47, 14, 3, 25, 45, 7, 17, 32, 21, 3, 17,
+ 5, 11, 31, 40, 45, 20, 45, 45, 32, 38, 47, 38, 45, 41, 49, 30, 45, 5, 36, 31, 22, 3, 46, 45, 13, 21, 23, 5, 46, 45, 33, 19,
+ 25, 1, 7, 13, 5, 44, 23, 29, 23, 24, 7, 5, 37, 13, 29, 13, 7, 17, 7, 43, 3, 21, 7, 44, 1, 19, 15, 9, 34, 43, 26, 3,
+ 17, 5, 6, 5, 7, 3, 33, 35, 43, 41, 48, 47, 30, 45, 19, 7, 5, 33, 11, 34, 25, 1, 21, 11, 29, 7, 1, 4, 5, 10, 14, 3,
+ 44, 11, 47, 45, 33, 3, 9, 7, 40, 23, 9, 1, 3, 1, 7, 5, 9, 9, 6, 11, 45, 41, 45, 19, 5, 11, 10, 39, 9, 19, 3, 11,
+ 43, 42, 1, 13, 35, 5, 32, 7, 5, 5, 43, 37, 3, 32, 17, 3, 23, 1, 13, 45, 17, 1, 21, 45, 43, 46, 49, 47, 45, 30, 9, 31,
+ 19, 42, 19, 44, 17, 14, 19, 25, 1, 7, 5, 45, 19, 13, 7, 3, 1, 1, 9, 21, 37, 9, 11, 1, 3, 37, 27, 13, 5, 21, 33, 3,
+ 27, 9, 27, 1, 39, 1, 46, 21, 10, 13, 21, 40, 22, 35, 41, 9, 33, 3, 17, 8, 45, 46, 42, 46, 47, 47, 47, 48, 48, 47, 43, 48,
+ 37, 39, 50, 35, 3, 40, 45, 40, 46, 36, 34, 28, 9, 9, 37, 9, 5, 7, 13, 31, 1, 7, 3, 3, 44, 45, 25, 15, 1, 21, 43, 25,
+ 1, 38, 34, 42, 31, 23, 33, 35, 37, 20, 7, 15, 3, 7, 7, 27, 45, 45, 48, 47, 45, 44, 47, 23, 25, 36, 11, 3, 18, 24, 27, 13,
+ 41, 13, 5, 5, 7, 19, 15, 7, 5, 14, 45, 45, 37, 1, 5, 17, 21, 41, 17, 37, 53, 41, 45, 45, 45, 45, 45, 45, 45, 45, 43, 47,
+ 47, 48, 53, 47, 47, 47, 49, 27, 45, 47, 47, 47, 47, 45, 45, 45, 47, 43, 48, 34, 34, 43, 46, 15, 37, 21, 5, 27, 11, 1, 9, 7,
+ 19, 15, 1, 1, 19, 3, 36, 27, 29, 13, 21, 9, 17, 5, 16, 45, 23, 34, 3, 1, 7, 25, 28, 13, 29, 15, 11, 19, 17, 1, 27, 23,
+ 31, 19, 41, 41, 40, 47, 28, 31, 26, 26, 36, 17, 5, 1, 23, 1, 45, 34, 49, 51, 34, 43, 37, 5, 41, 15, 5, 21, 1, 7, 9, 19,
+ 5, 11, 39, 19, 45, 45, 38, 17, 9, 1, 15, 11, 5, 13, 47, 46, 48, 45, 19, 32, 7, 19, 5, 7, 23, 29, 5, 45, 41, 37, 1, 5,
+ 27, 5, 5, 7, 19, 9, 1, 35, 48, 38, 38, 39, 42, 43, 21, 23, 43, 41, 7, 3, 7, 13, 1, 46, 47, 46, 23, 46, 45, 25, 7, 9,
+ 21, 7, 41, 13, 20, 1, 21, 15, 37, 5, 40, 45, 45, 5, 45, 46, 15, 33, 46, 12, 13, 7, 24, 7, 5, 30, 7, 46, 13, 8, 44, 35,
+ 45, 33, 40, 36, 47, 47, 29, 43, 36, 43, 45, 42, 36, 19, 7, 7, 43, 3, 44, 25, 48, 29, 11, 45, 30, 1, 17, 13, 25, 1, 48, 45,
+ 45, 45, 44, 49, 37, 9, 21, 17, 15, 7, 15, 25, 1, 1, 9, 43, 33, 11, 3, 29, 45, 45, 9, 7, 7, 27, 47, 45, 47, 48, 45, 47,
+ 26, 1, 43, 15, 45, 17, 1, 5, 35, 31, 9, 3, 9, 19, 9, 21, 43, 5, 27, 1, 5, 9, 4, 34, 19, 3, 7, 11, 45, 46, 45, 45,
+ 46, 47, 47, 44, 45, 43, 27, 9, 17, 15, 19, 44, 45, 46, 47, 47, 45, 45,
+ }
+ }
+};
+
diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp
index 879ba095c..81896ca55 100644
--- a/src/simplewallet/simplewallet.cpp
+++ b/src/simplewallet/simplewallet.cpp
@@ -62,6 +62,7 @@
#include "ringct/rctSigs.h"
#include "multisig/multisig.h"
#include "wallet/wallet_args.h"
+#include "version.h"
#include <stdexcept>
#ifdef WIN32
@@ -759,7 +760,7 @@ bool simple_wallet::print_fee_info(const std::vector<std::string> &args/* = std:
}
const uint64_t per_kb_fee = m_wallet->get_per_kb_fee();
const uint64_t typical_size_kb = 13;
- message_writer() << (boost::format(tr("Current fee is %s monero per kB")) % print_money(per_kb_fee)).str();
+ message_writer() << (boost::format(tr("Current fee is %s %s per kB")) % print_money(per_kb_fee) % cryptonote::get_unit(cryptonote::get_default_decimal_point())).str();
std::vector<uint64_t> fees;
for (uint32_t priority = 1; priority <= 4; ++priority)
@@ -1585,6 +1586,12 @@ bool simple_wallet::save_known_rings(const std::vector<std::string> &args)
return true;
}
+bool simple_wallet::version(const std::vector<std::string> &args)
+{
+ message_writer() << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")";
+ return true;
+}
+
bool simple_wallet::set_always_confirm_transfers(const std::vector<std::string> &args/* = std::vector<std::string>()*/)
{
const auto pwd_container = get_and_verify_password();
@@ -1651,6 +1658,9 @@ bool simple_wallet::set_default_ring_size(const std::vector<std::string> &args/*
return true;
}
+ if (ring_size != 0 && ring_size != DEFAULT_MIX+1)
+ message_writer() << tr("WARNING: this is a non default ring size, which may harm your privacy. Default is recommended.");
+
const auto pwd_container = get_and_verify_password();
if (pwd_container)
{
@@ -2072,8 +2082,8 @@ simple_wallet::simple_wallet()
tr("Donate <amount> to the development team (donate.getmonero.org)."));
m_cmd_binder.set_handler("sign_transfer",
boost::bind(&simple_wallet::sign_transfer, this, _1),
- tr("sign_transfer <file>"),
- tr("Sign a transaction from a <file>."));
+ tr("sign_transfer [export]"),
+ tr("Sign a transaction from a file."));
m_cmd_binder.set_handler("submit_transfer",
boost::bind(&simple_wallet::submit_transfer, this, _1),
tr("Submit a signed transaction from a file."));
@@ -2333,6 +2343,10 @@ simple_wallet::simple_wallet()
boost::bind(&simple_wallet::blackballed, this, _1),
tr("blackballed <output public key>"),
tr("Checks whether an output is blackballed"));
+ m_cmd_binder.set_handler("version",
+ boost::bind(&simple_wallet::version, this, _1),
+ tr("version"),
+ tr("Returns version information"));
m_cmd_binder.set_handler("help",
boost::bind(&simple_wallet::help, this, _1),
tr("help [<command>]"),
@@ -2975,6 +2989,22 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
// create wallet
bool r = new_wallet(vm, "Ledger");
CHECK_AND_ASSERT_MES(r, false, tr("account creation failed"));
+ // if no block_height is specified, assume its a new account and start it "now"
+ if(m_wallet->get_refresh_from_block_height() == 0) {
+ {
+ tools::scoped_message_writer wrt = tools::msg_writer();
+ wrt << tr("No restore height is specified.");
+ wrt << tr("Assumed you are creating a new account, restore will be done from current estimated blockchain height.");
+ wrt << tr("Use --restore-height if you want to restore an already setup account from a specific height");
+ }
+ std::string confirm = input_line(tr("Is this okay? (Y/Yes/N/No): "));
+ if (std::cin.eof() || !command_line::is_yes(confirm))
+ CHECK_AND_ASSERT_MES(false, false, tr("account creation aborted"));
+
+ m_wallet->set_refresh_from_block_height(m_wallet->estimate_blockchain_height()-1);
+ m_wallet->explicit_refresh_from_block_height(true);
+ m_restore_height = m_wallet->get_refresh_from_block_height();
+ }
}
else
{
@@ -2991,7 +3021,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
CHECK_AND_ASSERT_MES(r, false, tr("account creation failed"));
}
- if (m_restoring && m_generate_from_json.empty())
+ if (m_restoring && m_generate_from_json.empty() && m_generate_from_device.empty())
{
m_wallet->explicit_refresh_from_block_height(!command_line::is_arg_defaulted(vm, arg_restore_height));
}
@@ -3105,6 +3135,9 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
if (!is_daemon_trusted())
message_writer() << (boost::format(tr("Warning: using an untrusted daemon at %s, privacy will be lessened")) % m_wallet->get_daemon_address()).str();
+ if (m_wallet->get_ring_database().empty())
+ fail_msg_writer() << tr("Failed to initialize ring database: privacy enhancing features will be inactive");
+
m_wallet->callback(this);
return true;
@@ -3392,7 +3425,7 @@ bool simple_wallet::new_wallet(const boost::program_options::variables_map& vm,
try
{
m_wallet->restore(m_wallet_file, std::move(rc.second).password(), device_name);
- message_writer(console_color_white, true) << tr("Generated new on device wallet: ")
+ message_writer(console_color_white, true) << tr("Generated new wallet on hw device: ")
<< m_wallet->get_account().get_public_address_str(m_wallet->nettype());
}
catch (const std::exception& e)
@@ -3804,7 +3837,7 @@ void simple_wallet::on_skip_transaction(uint64_t height, const crypto::hash &txi
//----------------------------------------------------------------------------------------------------
bool simple_wallet::refresh_main(uint64_t start_height, bool reset, bool is_init)
{
- if (!try_connect_to_daemon())
+ if (!try_connect_to_daemon(is_init))
return true;
LOCK_IDLE_SCOPE();
@@ -4588,6 +4621,23 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
if (!print_ring_members(ptx_vector, prompt))
return true;
}
+ bool default_ring_size = true;
+ for (const auto &ptx: ptx_vector)
+ {
+ for (const auto &vin: ptx.tx.vin)
+ {
+ if (vin.type() == typeid(txin_to_key))
+ {
+ const txin_to_key& in_to_key = boost::get<txin_to_key>(vin);
+ if (in_to_key.key_offsets.size() != DEFAULT_MIX + 1)
+ default_ring_size = false;
+ }
+ }
+ }
+ if (m_wallet->confirm_non_default_ring_size() && !default_ring_size)
+ {
+ prompt << tr("WARNING: this is a non default ring size, which may harm your privacy. Default is recommended.");
+ }
prompt << ENDL << tr("Is this okay? (Y/Yes/N/No): ");
std::string accepted = input_line(prompt.str());
@@ -7466,7 +7516,7 @@ int main(int argc, char* argv[])
const auto vm = wallet_args::main(
argc, argv,
"monero-wallet-cli [--wallet-file=<file>|--generate-new-wallet=<file>] [<COMMAND>]",
- sw::tr("This is the command line monero wallet. It needs to connect to a monero\ndaemon to work correctly."),
+ sw::tr("This is the command line monero wallet. It needs to connect to a monero\ndaemon to work correctly.\nWARNING: Do not reuse your Monero keys on an another fork, UNLESS this fork has key reuse mitigations built in. Doing so will harm your privacy."),
desc_params,
positional_options,
[](const std::string &s, bool emphasis){ tools::scoped_message_writer(emphasis ? epee::console_color_white : epee::console_color_default, true) << s; },
diff --git a/src/simplewallet/simplewallet.h b/src/simplewallet/simplewallet.h
index ef4ecb1fd..7a788d432 100644
--- a/src/simplewallet/simplewallet.h
+++ b/src/simplewallet/simplewallet.h
@@ -218,6 +218,7 @@ namespace cryptonote
bool blackball(const std::vector<std::string>& args);
bool unblackball(const std::vector<std::string>& args);
bool blackballed(const std::vector<std::string>& args);
+ bool version(const std::vector<std::string>& args);
uint64_t get_daemon_blockchain_height(std::string& err);
bool try_connect_to_daemon(bool silent = false, uint32_t* version = nullptr);
diff --git a/src/version.cpp.in b/src/version.cpp.in
index f83a85d9d..9fed91d99 100644
--- a/src/version.cpp.in
+++ b/src/version.cpp.in
@@ -1,5 +1,5 @@
#define DEF_MONERO_VERSION_TAG "@VERSIONTAG@"
-#define DEF_MONERO_VERSION "0.12.0.0-master"
+#define DEF_MONERO_VERSION "0.12.1.0-master"
#define DEF_MONERO_RELEASE_NAME "Lithium Luna"
#define DEF_MONERO_VERSION_FULL DEF_MONERO_VERSION "-" DEF_MONERO_VERSION_TAG
diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp
index b02884f67..367011eaa 100644
--- a/src/wallet/api/wallet.cpp
+++ b/src/wallet/api/wallet.cpp
@@ -60,7 +60,7 @@ namespace Monero {
namespace {
// copy-pasted from simplewallet
- static const size_t DEFAULT_MIXIN = 4;
+ static const size_t DEFAULT_MIXIN = 6;
static const int DEFAULT_REFRESH_INTERVAL_MILLIS = 1000 * 10;
// limit maximum refresh interval as one minute
static const int MAX_REFRESH_INTERVAL_MILLIS = 1000 * 60 * 1;
@@ -305,14 +305,14 @@ uint64_t Wallet::maximumAllowedAmount()
return std::numeric_limits<uint64_t>::max();
}
-void Wallet::init(const char *argv0, const char *default_log_base_name) {
+void Wallet::init(const char *argv0, const char *default_log_base_name, const std::string &log_path, bool console) {
#ifdef WIN32
// Activate UTF-8 support for Boost filesystem classes on Windows
std::locale::global(boost::locale::generator().generate(""));
boost::filesystem::path::imbue(std::locale());
#endif
epee::string_tools::set_module_name_and_folder(argv0);
- mlog_configure(mlog_get_default_log_path(default_log_base_name), true);
+ mlog_configure(log_path.empty() ? mlog_get_default_log_path(default_log_base_name) : log_path.c_str(), console);
}
void Wallet::debug(const std::string &category, const std::string &str) {
diff --git a/src/wallet/api/wallet2_api.h b/src/wallet/api/wallet2_api.h
index d4e41c5aa..4fbc7298a 100644
--- a/src/wallet/api/wallet2_api.h
+++ b/src/wallet/api/wallet2_api.h
@@ -556,7 +556,8 @@ struct Wallet
}
static uint64_t maximumAllowedAmount();
// Easylogger wrapper
- static void init(const char *argv0, const char *default_log_base_name);
+ static void init(const char *argv0, const char *default_log_base_name) { init(argv0, default_log_base_name, "", true); }
+ static void init(const char *argv0, const char *default_log_base_name, const std::string &log_path, bool console);
static void debug(const std::string &category, const std::string &str);
static void info(const std::string &category, const std::string &str);
static void warning(const std::string &category, const std::string &str);
@@ -956,25 +957,25 @@ struct WalletManager
virtual void setDaemonAddress(const std::string &address) = 0;
//! returns whether the daemon can be reached, and its version number
- virtual bool connected(uint32_t *version = NULL) const = 0;
+ virtual bool connected(uint32_t *version = NULL) = 0;
//! returns current blockchain height
- virtual uint64_t blockchainHeight() const = 0;
+ virtual uint64_t blockchainHeight() = 0;
//! returns current blockchain target height
- virtual uint64_t blockchainTargetHeight() const = 0;
+ virtual uint64_t blockchainTargetHeight() = 0;
//! returns current network difficulty
- virtual uint64_t networkDifficulty() const = 0;
+ virtual uint64_t networkDifficulty() = 0;
//! returns current mining hash rate (0 if not mining)
- virtual double miningHashRate() const = 0;
+ virtual double miningHashRate() = 0;
//! returns current block target
- virtual uint64_t blockTarget() const = 0;
+ virtual uint64_t blockTarget() = 0;
//! returns true iff mining
- virtual bool isMining() const = 0;
+ virtual bool isMining() = 0;
//! starts mining with the set number of threads
virtual bool startMining(const std::string &address, uint32_t threads = 1, bool background_mining = false, bool ignore_battery = true) = 0;
diff --git a/src/wallet/api/wallet_manager.cpp b/src/wallet/api/wallet_manager.cpp
index 80f5780b5..a63716576 100644
--- a/src/wallet/api/wallet_manager.cpp
+++ b/src/wallet/api/wallet_manager.cpp
@@ -47,15 +47,6 @@ namespace epee {
unsigned int g_test_dbg_lock_sleep = 0;
}
-namespace {
- template<typename Request, typename Response>
- bool connect_and_invoke(const std::string& address, const std::string& path, const Request& request, Response& response)
- {
- epee::net_utils::http::http_simple_client client{};
- return client.set_server(address, boost::none) && epee::net_utils::invoke_http_json(path, request, response, client);
- }
-}
-
namespace Monero {
Wallet *WalletManagerImpl::createWallet(const std::string &path, const std::string &password,
@@ -193,16 +184,19 @@ std::string WalletManagerImpl::errorString() const
void WalletManagerImpl::setDaemonAddress(const std::string &address)
{
m_daemonAddress = address;
+ if(m_http_client.is_connected())
+ m_http_client.disconnect();
+ m_http_client.set_server(address, boost::none);
}
-bool WalletManagerImpl::connected(uint32_t *version) const
+bool WalletManagerImpl::connected(uint32_t *version)
{
epee::json_rpc::request<cryptonote::COMMAND_RPC_GET_VERSION::request> req_t = AUTO_VAL_INIT(req_t);
epee::json_rpc::response<cryptonote::COMMAND_RPC_GET_VERSION::response, std::string> resp_t = AUTO_VAL_INIT(resp_t);
req_t.jsonrpc = "2.0";
req_t.id = epee::serialization::storage_entry(0);
req_t.method = "get_version";
- if (!connect_and_invoke(m_daemonAddress, "/json_rpc", req_t, resp_t))
+ if (!epee::net_utils::invoke_http_json("/json_rpc", req_t, resp_t, m_http_client))
return false;
if (version)
@@ -210,65 +204,65 @@ bool WalletManagerImpl::connected(uint32_t *version) const
return true;
}
-uint64_t WalletManagerImpl::blockchainHeight() const
+uint64_t WalletManagerImpl::blockchainHeight()
{
cryptonote::COMMAND_RPC_GET_INFO::request ireq;
cryptonote::COMMAND_RPC_GET_INFO::response ires;
- if (!connect_and_invoke(m_daemonAddress, "/getinfo", ireq, ires))
+ if (!epee::net_utils::invoke_http_json("/getinfo", ireq, ires, m_http_client))
return 0;
return ires.height;
}
-uint64_t WalletManagerImpl::blockchainTargetHeight() const
+uint64_t WalletManagerImpl::blockchainTargetHeight()
{
cryptonote::COMMAND_RPC_GET_INFO::request ireq;
cryptonote::COMMAND_RPC_GET_INFO::response ires;
- if (!connect_and_invoke(m_daemonAddress, "/getinfo", ireq, ires))
+ if (!epee::net_utils::invoke_http_json("/getinfo", ireq, ires, m_http_client))
return 0;
return ires.target_height >= ires.height ? ires.target_height : ires.height;
}
-uint64_t WalletManagerImpl::networkDifficulty() const
+uint64_t WalletManagerImpl::networkDifficulty()
{
cryptonote::COMMAND_RPC_GET_INFO::request ireq;
cryptonote::COMMAND_RPC_GET_INFO::response ires;
- if (!connect_and_invoke(m_daemonAddress, "/getinfo", ireq, ires))
+ if (!epee::net_utils::invoke_http_json("/getinfo", ireq, ires, m_http_client))
return 0;
return ires.difficulty;
}
-double WalletManagerImpl::miningHashRate() const
+double WalletManagerImpl::miningHashRate()
{
cryptonote::COMMAND_RPC_MINING_STATUS::request mreq;
cryptonote::COMMAND_RPC_MINING_STATUS::response mres;
epee::net_utils::http::http_simple_client http_client;
- if (!connect_and_invoke(m_daemonAddress, "/mining_status", mreq, mres))
+ if (!epee::net_utils::invoke_http_json("/mining_status", mreq, mres, m_http_client))
return 0.0;
if (!mres.active)
return 0.0;
return mres.speed;
}
-uint64_t WalletManagerImpl::blockTarget() const
+uint64_t WalletManagerImpl::blockTarget()
{
cryptonote::COMMAND_RPC_GET_INFO::request ireq;
cryptonote::COMMAND_RPC_GET_INFO::response ires;
- if (!connect_and_invoke(m_daemonAddress, "/getinfo", ireq, ires))
+ if (!epee::net_utils::invoke_http_json("/getinfo", ireq, ires, m_http_client))
return 0;
return ires.target;
}
-bool WalletManagerImpl::isMining() const
+bool WalletManagerImpl::isMining()
{
cryptonote::COMMAND_RPC_MINING_STATUS::request mreq;
cryptonote::COMMAND_RPC_MINING_STATUS::response mres;
- if (!connect_and_invoke(m_daemonAddress, "/mining_status", mreq, mres))
+ if (!epee::net_utils::invoke_http_json("/mining_status", mreq, mres, m_http_client))
return false;
return mres.active;
}
@@ -283,7 +277,7 @@ bool WalletManagerImpl::startMining(const std::string &address, uint32_t threads
mreq.ignore_battery = ignore_battery;
mreq.do_background_mining = background_mining;
- if (!connect_and_invoke(m_daemonAddress, "/start_mining", mreq, mres))
+ if (!epee::net_utils::invoke_http_json("/start_mining", mreq, mres, m_http_client))
return false;
return mres.status == CORE_RPC_STATUS_OK;
}
@@ -293,7 +287,7 @@ bool WalletManagerImpl::stopMining()
cryptonote::COMMAND_RPC_STOP_MINING::request mreq;
cryptonote::COMMAND_RPC_STOP_MINING::response mres;
- if (!connect_and_invoke(m_daemonAddress, "/stop_mining", mreq, mres))
+ if (!epee::net_utils::invoke_http_json("/stop_mining", mreq, mres, m_http_client))
return false;
return mres.status == CORE_RPC_STATUS_OK;
}
diff --git a/src/wallet/api/wallet_manager.h b/src/wallet/api/wallet_manager.h
index 409a6d499..26238b658 100644
--- a/src/wallet/api/wallet_manager.h
+++ b/src/wallet/api/wallet_manager.h
@@ -30,6 +30,7 @@
#include "wallet/api/wallet2_api.h"
+#include "net/http_client.h"
#include <string>
namespace Monero {
@@ -69,13 +70,13 @@ public:
std::vector<std::string> findWallets(const std::string &path);
std::string errorString() const;
void setDaemonAddress(const std::string &address);
- bool connected(uint32_t *version = NULL) const;
- uint64_t blockchainHeight() const;
- uint64_t blockchainTargetHeight() const;
- uint64_t networkDifficulty() const;
- double miningHashRate() const;
- uint64_t blockTarget() const;
- bool isMining() const;
+ bool connected(uint32_t *version = NULL);
+ uint64_t blockchainHeight();
+ uint64_t blockchainTargetHeight();
+ uint64_t networkDifficulty();
+ double miningHashRate();
+ uint64_t blockTarget();
+ bool isMining();
bool startMining(const std::string &address, uint32_t threads = 1, bool background_mining = false, bool ignore_battery = true);
bool stopMining();
std::string resolveOpenAlias(const std::string &address, bool &dnssec_valid) const;
@@ -84,6 +85,7 @@ private:
WalletManagerImpl() {}
friend struct WalletManagerFactory;
std::string m_daemonAddress;
+ epee::net_utils::http::http_simple_client m_http_client;
std::string m_errorString;
};
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 4b7e6dd93..d11c99378 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -110,7 +110,7 @@ using namespace cryptonote;
#define MULTISIG_EXPORT_FILE_MAGIC "Monero multisig export\001"
-#define SEGREGATION_FORK_HEIGHT 1564965
+#define SEGREGATION_FORK_HEIGHT 1546000
#define TESTNET_SEGREGATION_FORK_HEIGHT 1000000
#define STAGENET_SEGREGATION_FORK_HEIGHT 1000000
#define SEGREGATION_FORK_VICINITY 1500 /* blocks */
@@ -145,7 +145,7 @@ struct options {
"shared-ringdb-dir", tools::wallet2::tr("Set shared ring database path"),
get_default_ringdb_path(),
testnet,
- [](bool testnet, bool defaulted, std::string val) {
+ [](bool testnet, bool defaulted, std::string val)->std::string {
if (testnet)
return (boost::filesystem::path(val) / "testnet").string();
return val;
@@ -653,6 +653,7 @@ wallet2::wallet2(network_type nettype, bool restricted):
m_refresh_from_block_height(0),
m_explicit_refresh_from_block_height(true),
m_confirm_missing_payment_id(true),
+ m_confirm_non_default_ring_size(true),
m_ask_password(true),
m_min_output_count(0),
m_min_output_value(0),
@@ -1007,13 +1008,16 @@ void wallet2::set_unspent(size_t idx)
//----------------------------------------------------------------------------------------------------
void wallet2::check_acc_out_precomp(const tx_out &o, const crypto::key_derivation &derivation, const std::vector<crypto::key_derivation> &additional_derivations, size_t i, tx_scan_info_t &tx_scan_info) const
{
+ hw::device &hwdev = m_account.get_device();
+ boost::unique_lock<hw::device> hwdev_lock (hwdev);
+ hwdev.set_mode(hw::device::TRANSACTION_PARSE);
if (o.target.type() != typeid(txout_to_key))
{
tx_scan_info.error = true;
LOG_ERROR("wrong type id in transaction out");
return;
}
- tx_scan_info.received = is_out_to_acc_precomp(m_subaddresses, boost::get<txout_to_key>(o.target).key, derivation, additional_derivations, i, m_account.get_device());
+ tx_scan_info.received = is_out_to_acc_precomp(m_subaddresses, boost::get<txout_to_key>(o.target).key, derivation, additional_derivations, i, hwdev);
if(tx_scan_info.received)
{
tx_scan_info.money_transfered = o.amount; // may be 0 for ringct outputs
@@ -1080,9 +1084,15 @@ void wallet2::scan_output(const cryptonote::transaction &tx, const crypto::publi
//----------------------------------------------------------------------------------------------------
void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote::transaction& tx, const std::vector<uint64_t> &o_indices, uint64_t height, uint64_t ts, bool miner_tx, bool pool, bool double_spend_seen)
{
- // In this function, tx (probably) only contains the base information
- // (that is, the prunable stuff may or may not be included)
+ //ensure device is let in NONE mode in any case
+ hw::device &hwdev = m_account.get_device();
+
+ boost::unique_lock<hw::device> hwdev_lock (hwdev);
+ hw::reset_mode rst(hwdev);
+ hwdev_lock.unlock();
+ // In this function, tx (probably) only contains the base information
+ // (that is, the prunable stuff may or may not be included)
if (!miner_tx && !pool)
process_unconfirmed(txid, tx, height);
std::vector<size_t> outs;
@@ -1119,8 +1129,10 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
tools::threadpool& tpool = tools::threadpool::getInstance();
tools::threadpool::waiter waiter;
const cryptonote::account_keys& keys = m_account.get_keys();
- hw::device &hwdev = m_account.get_device();
crypto::key_derivation derivation;
+
+ hwdev_lock.lock();
+ hwdev.set_mode(hw::device::TRANSACTION_PARSE);
if (!hwdev.generate_key_derivation(tx_pub_key, keys.m_view_secret_key, derivation))
{
MWARNING("Failed to generate key derivation from tx pubkey, skipping");
@@ -1140,6 +1152,7 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
additional_derivations.pop_back();
}
}
+ hwdev_lock.unlock();
if (miner_tx && m_refresh_type == RefreshNoCoinbase)
{
@@ -1161,16 +1174,19 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
std::ref(tx_scan_info[i])));
}
waiter.wait();
-
// then scan all outputs from 0
+ hwdev_lock.lock();
+ hwdev.set_mode(hw::device::NONE);
for (size_t i = 0; i < tx.vout.size(); ++i)
{
THROW_WALLET_EXCEPTION_IF(tx_scan_info[i].error, error::acc_outs_lookup_error, tx, tx_pub_key, m_account.get_keys());
if (tx_scan_info[i].received)
{
+ hwdev.conceal_derivation(tx_scan_info[i].received->derivation, tx_pub_key, additional_tx_pub_keys, derivation, additional_derivations);
scan_output(tx, tx_pub_key, i, tx_scan_info[i], num_vouts_received, tx_money_got_in_outs, outs);
}
}
+ hwdev_lock.unlock();
}
}
else if (tx.vout.size() > 1 && tools::threadpool::getInstance().get_max_concurrency() > 1)
@@ -1181,14 +1197,19 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
std::ref(tx_scan_info[i])));
}
waiter.wait();
+
+ hwdev_lock.lock();
+ hwdev.set_mode(hw::device::NONE);
for (size_t i = 0; i < tx.vout.size(); ++i)
{
THROW_WALLET_EXCEPTION_IF(tx_scan_info[i].error, error::acc_outs_lookup_error, tx, tx_pub_key, m_account.get_keys());
if (tx_scan_info[i].received)
{
+ hwdev.conceal_derivation(tx_scan_info[i].received->derivation, tx_pub_key, additional_tx_pub_keys, derivation, additional_derivations);
scan_output(tx, tx_pub_key, i, tx_scan_info[i], num_vouts_received, tx_money_got_in_outs, outs);
}
}
+ hwdev_lock.unlock();
}
else
{
@@ -1198,7 +1219,11 @@ void wallet2::process_new_transaction(const crypto::hash &txid, const cryptonote
THROW_WALLET_EXCEPTION_IF(tx_scan_info[i].error, error::acc_outs_lookup_error, tx, tx_pub_key, m_account.get_keys());
if (tx_scan_info[i].received)
{
+ hwdev_lock.lock();
+ hwdev.set_mode(hw::device::NONE);
+ hwdev.conceal_derivation(tx_scan_info[i].received->derivation, tx_pub_key, additional_tx_pub_keys, derivation, additional_derivations);
scan_output(tx, tx_pub_key, i, tx_scan_info[i], num_vouts_received, tx_money_got_in_outs, outs);
+ hwdev_lock.unlock();
}
}
}
@@ -2010,6 +2035,7 @@ void wallet2::update_pool_state(bool refreshed)
req.txs_hashes.push_back(epee::string_tools::pod_to_hex(p.first));
MDEBUG("asking for " << txids.size() << " transactions");
req.decode_as_json = false;
+ req.prune = false;
m_daemon_rpc_mutex.lock();
bool r = epee::net_utils::invoke_http_json("/gettransactions", req, res, m_http_client, rpc_timeout);
m_daemon_rpc_mutex.unlock();
@@ -2395,7 +2421,7 @@ void wallet2::detach_blockchain(uint64_t height)
// size 1 2 3 4 5 6 7 8 9
// block 0 1 2 3 4 5 6 7 8
// C
- THROW_WALLET_EXCEPTION_IF(height <= m_checkpoints.get_max_height() && m_blockchain.size() > m_checkpoints.get_max_height(),
+ THROW_WALLET_EXCEPTION_IF(height < m_blockchain.offset() && m_blockchain.size() > m_blockchain.offset(),
error::wallet_internal_error, "Daemon claims reorg below last checkpoint");
size_t transfers_detached = 0;
@@ -2560,6 +2586,9 @@ bool wallet2::store_keys(const std::string& keys_file_name, const epee::wipeable
value2.SetInt(m_confirm_missing_payment_id ? 1 :0);
json.AddMember("confirm_missing_payment_id", value2, json.GetAllocator());
+ value2.SetInt(m_confirm_non_default_ring_size ? 1 :0);
+ json.AddMember("confirm_non_default_ring_size", value2, json.GetAllocator());
+
value2.SetInt(m_ask_password ? 1 :0);
json.AddMember("ask_password", value2, json.GetAllocator());
@@ -2599,6 +2628,12 @@ bool wallet2::store_keys(const std::string& keys_file_name, const epee::wipeable
value2.SetUint(m_segregation_height);
json.AddMember("segregation_height", value2, json.GetAllocator());
+ value2.SetUint(m_subaddress_lookahead_major);
+ json.AddMember("subaddress_lookahead_major", value2, json.GetAllocator());
+
+ value2.SetUint(m_subaddress_lookahead_minor);
+ json.AddMember("subaddress_lookahead_minor", value2, json.GetAllocator());
+
// Serialize the JSON object
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
@@ -2661,6 +2696,7 @@ bool wallet2::load_keys(const std::string& keys_file_name, const epee::wipeable_
m_auto_refresh = true;
m_refresh_type = RefreshType::RefreshDefault;
m_confirm_missing_payment_id = true;
+ m_confirm_non_default_ring_size = true;
m_ask_password = true;
m_min_output_count = 0;
m_min_output_value = 0;
@@ -2669,6 +2705,11 @@ bool wallet2::load_keys(const std::string& keys_file_name, const epee::wipeable_
m_confirm_backlog_threshold = 0;
m_confirm_export_overwrite = true;
m_auto_low_priority = true;
+ m_segregate_pre_fork_outputs = true;
+ m_key_reuse_mitigation2 = true;
+ m_segregation_height = 0;
+ m_subaddress_lookahead_major = SUBADDRESS_LOOKAHEAD_MAJOR;
+ m_subaddress_lookahead_minor = SUBADDRESS_LOOKAHEAD_MINOR;
m_key_on_device = false;
}
else if(json.IsObject())
@@ -2761,6 +2802,8 @@ bool wallet2::load_keys(const std::string& keys_file_name, const epee::wipeable_
m_refresh_from_block_height = field_refresh_height;
GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, confirm_missing_payment_id, int, Int, false, true);
m_confirm_missing_payment_id = field_confirm_missing_payment_id;
+ GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, confirm_non_default_ring_size, int, Int, false, true);
+ m_confirm_non_default_ring_size = field_confirm_non_default_ring_size;
GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, ask_password, int, Int, false, true);
m_ask_password = field_ask_password;
GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, default_decimal_point, int, Int, false, CRYPTONOTE_DISPLAY_DECIMAL_POINT);
@@ -2785,6 +2828,16 @@ bool wallet2::load_keys(const std::string& keys_file_name, const epee::wipeable_
(boost::format("%s wallet cannot be opened as %s wallet")
% (field_nettype == 0 ? "Mainnet" : field_nettype == 1 ? "Testnet" : "Stagenet")
% (m_nettype == MAINNET ? "mainnet" : m_nettype == TESTNET ? "testnet" : "stagenet")).str());
+ GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, segregate_pre_fork_outputs, int, Int, false, true);
+ m_segregate_pre_fork_outputs = field_segregate_pre_fork_outputs;
+ GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, key_reuse_mitigation2, int, Int, false, true);
+ m_key_reuse_mitigation2 = field_key_reuse_mitigation2;
+ GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, segregation_height, int, Uint, false, 0);
+ m_segregation_height = field_segregation_height;
+ GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, subaddress_lookahead_major, uint32_t, Uint, false, SUBADDRESS_LOOKAHEAD_MAJOR);
+ m_subaddress_lookahead_major = field_subaddress_lookahead_major;
+ GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, subaddress_lookahead_minor, uint32_t, Uint, false, SUBADDRESS_LOOKAHEAD_MINOR);
+ m_subaddress_lookahead_minor = field_subaddress_lookahead_minor;
}
else
{
@@ -2830,6 +2883,7 @@ bool wallet2::verify_password(const epee::wipeable_string& password) const
* \param keys_file_name Keys file to verify password for
* \param password Password to verify
* \param no_spend_key If set = only verify view keys, otherwise also spend keys
+ * \param hwdev The hardware device to use
* \return true if password is correct
*
* for verification only
@@ -2880,9 +2934,10 @@ bool wallet2::verify_password(const std::string& keys_file_name, const epee::wip
/*!
* \brief Generates a wallet or restores one.
- * \param wallet_ Name of wallet file
- * \param password Password of wallet file
- * \param multisig_data The multisig restore info and keys
+ * \param wallet_ Name of wallet file
+ * \param password Password of wallet file
+ * \param multisig_data The multisig restore info and keys
+ * \param create_address_file Whether to create an address file
*/
void wallet2::generate(const std::string& wallet_, const epee::wipeable_string& password,
const std::string& multisig_data, bool create_address_file)
@@ -2975,12 +3030,13 @@ void wallet2::generate(const std::string& wallet_, const epee::wipeable_string&
/*!
* \brief Generates a wallet or restores one.
- * \param wallet_ Name of wallet file
- * \param password Password of wallet file
- * \param recovery_param If it is a restore, the recovery key
- * \param recover Whether it is a restore
- * \param two_random Whether it is a non-deterministic wallet
- * \return The secret key of the generated wallet
+ * \param wallet_ Name of wallet file
+ * \param password Password of wallet file
+ * \param recovery_param If it is a restore, the recovery key
+ * \param recover Whether it is a restore
+ * \param two_random Whether it is a non-deterministic wallet
+ * \param create_address_file Whether to create an address file
+ * \return The secret key of the generated wallet
*/
crypto::secret_key wallet2::generate(const std::string& wallet_, const epee::wipeable_string& password,
const crypto::secret_key& recovery_param, bool recover, bool two_random, bool create_address_file)
@@ -3076,9 +3132,11 @@ crypto::secret_key wallet2::generate(const std::string& wallet_, const epee::wip
/*!
* \brief Creates a watch only wallet from a public address and a view secret key.
-* \param wallet_ Name of wallet file
-* \param password Password of wallet file
-* \param viewkey view secret key
+* \param wallet_ Name of wallet file
+* \param password Password of wallet file
+* \param account_public_address The account's public address
+* \param viewkey view secret key
+* \param create_address_file Whether to create an address file
*/
void wallet2::generate(const std::string& wallet_, const epee::wipeable_string& password,
const cryptonote::account_public_address &account_public_address,
@@ -3125,10 +3183,12 @@ void wallet2::generate(const std::string& wallet_, const epee::wipeable_string&
/*!
* \brief Creates a wallet from a public address and a spend/view secret key pair.
-* \param wallet_ Name of wallet file
-* \param password Password of wallet file
-* \param spendkey spend secret key
-* \param viewkey view secret key
+* \param wallet_ Name of wallet file
+* \param password Password of wallet file
+* \param account_public_address The account's public address
+* \param spendkey spend secret key
+* \param viewkey view secret key
+* \param create_address_file Whether to create an address file
*/
void wallet2::generate(const std::string& wallet_, const epee::wipeable_string& password,
const cryptonote::account_public_address &account_public_address,
@@ -3575,8 +3635,9 @@ void wallet2::rewrite(const std::string& wallet_name, const epee::wipeable_strin
}
/*!
* \brief Writes to a file named based on the normal wallet (doesn't generate key, assumes it's already there)
- * \param wallet_name Base name of wallet file
- * \param password Password for wallet file
+ * \param wallet_name Base name of wallet file
+ * \param password Password for wallet file
+ * \param new_keys_filename [OUT] Name of new keys file
*/
void wallet2::write_watch_only_wallet(const std::string& wallet_name, const epee::wipeable_string& password, std::string &new_keys_filename)
{
@@ -3822,6 +3883,11 @@ void wallet2::load(const std::string& wallet_, const epee::wipeable_string& pass
void wallet2::trim_hashchain()
{
uint64_t height = m_checkpoints.get_max_height();
+
+ for (const transfer_details &td: m_transfers)
+ if (td.m_block_height < height)
+ height = td.m_block_height;
+
if (!m_blockchain.empty() && m_blockchain.size() == m_blockchain.offset())
{
MINFO("Fixing empty hashchain");
@@ -5097,7 +5163,7 @@ bool wallet2::sign_multisig_tx(multisig_tx_set &exported_txs, std::vector<crypto
rct::multisig_out msout = ptx.multisig_sigs.front().msout;
auto sources = sd.sources;
const bool bulletproof = sd.use_rct && (ptx.tx.rct_signatures.type == rct::RCTTypeFullBulletproof || ptx.tx.rct_signatures.type == rct::RCTTypeSimpleBulletproof);
- bool r = cryptonote::construct_tx_with_tx_key(m_account.get_keys(), m_subaddresses, sources, sd.splitted_dsts, ptx.change_dts.addr, sd.extra, tx, sd.unlock_time, ptx.tx_key, ptx.additional_tx_keys, sd.use_rct, bulletproof, &msout);
+ bool r = cryptonote::construct_tx_with_tx_key(m_account.get_keys(), m_subaddresses, sources, sd.splitted_dsts, ptx.change_dts.addr, sd.extra, tx, sd.unlock_time, ptx.tx_key, ptx.additional_tx_keys, sd.use_rct, bulletproof, &msout, false);
THROW_WALLET_EXCEPTION_IF(!r, error::tx_not_constructed, sd.sources, sd.splitted_dsts, sd.unlock_time, m_nettype);
THROW_WALLET_EXCEPTION_IF(get_transaction_prefix_hash (tx) != get_transaction_prefix_hash(ptx.tx),
@@ -5467,45 +5533,61 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions(std::vector<crypto
}
}
-void wallet2::set_ring_database(const std::string &filename)
+bool wallet2::set_ring_database(const std::string &filename)
{
m_ring_database = filename;
MINFO("ringdb path set to " << filename);
m_ringdb.reset();
- cryptonote::block b;
- generate_genesis(b);
if (!m_ring_database.empty())
- m_ringdb.reset(new tools::ringdb(m_ring_database, epee::string_tools::pod_to_hex(get_block_hash(b))));
+ {
+ try
+ {
+ cryptonote::block b;
+ generate_genesis(b);
+ m_ringdb.reset(new tools::ringdb(m_ring_database, epee::string_tools::pod_to_hex(get_block_hash(b))));
+ }
+ catch (const std::exception &e)
+ {
+ MERROR("Failed to initialize ringdb: " << e.what());
+ m_ring_database = "";
+ return false;
+ }
+ }
+ return true;
}
bool wallet2::add_rings(const crypto::chacha_key &key, const cryptonote::transaction_prefix &tx)
{
if (!m_ringdb)
- return true;
- return m_ringdb->add_rings(key, tx);
+ return false;
+ try { return m_ringdb->add_rings(key, tx); }
+ catch (const std::exception &e) { return false; }
}
bool wallet2::add_rings(const cryptonote::transaction_prefix &tx)
{
crypto::chacha_key key;
generate_chacha_key_from_secret_keys(key);
- return add_rings(key, tx);
+ try { return add_rings(key, tx); }
+ catch (const std::exception &e) { return false; }
}
bool wallet2::remove_rings(const cryptonote::transaction_prefix &tx)
{
if (!m_ringdb)
- return true;
+ return false;
crypto::chacha_key key;
generate_chacha_key_from_secret_keys(key);
- return m_ringdb->remove_rings(key, tx);
+ try { return m_ringdb->remove_rings(key, tx); }
+ catch (const std::exception &e) { return false; }
}
bool wallet2::get_ring(const crypto::chacha_key &key, const crypto::key_image &key_image, std::vector<uint64_t> &outs)
{
if (!m_ringdb)
- return true;
- return m_ringdb->get_ring(key, key_image, outs);
+ return false;
+ try { return m_ringdb->get_ring(key, key_image, outs); }
+ catch (const std::exception &e) { return false; }
}
bool wallet2::get_rings(const crypto::hash &txid, std::vector<std::pair<crypto::key_image, std::vector<uint64_t>>> &outs)
@@ -5536,18 +5618,20 @@ bool wallet2::get_ring(const crypto::key_image &key_image, std::vector<uint64_t>
crypto::chacha_key key;
generate_chacha_key_from_secret_keys(key);
- return get_ring(key, key_image, outs);
+ try { return get_ring(key, key_image, outs); }
+ catch (const std::exception &e) { return false; }
}
bool wallet2::set_ring(const crypto::key_image &key_image, const std::vector<uint64_t> &outs, bool relative)
{
if (!m_ringdb)
- return true;
+ return false;
crypto::chacha_key key;
generate_chacha_key_from_secret_keys(key);
- return m_ringdb->set_ring(key, key_image, outs, relative);
+ try { return m_ringdb->set_ring(key, key_image, outs, relative); }
+ catch (const std::exception &e) { return false; }
}
bool wallet2::find_and_save_rings(bool force)
@@ -5555,7 +5639,7 @@ bool wallet2::find_and_save_rings(bool force)
if (!force && m_ring_history_saved)
return true;
if (!m_ringdb)
- return true;
+ return false;
COMMAND_RPC_GET_TRANSACTIONS::request req = AUTO_VAL_INIT(req);
COMMAND_RPC_GET_TRANSACTIONS::response res = AUTO_VAL_INIT(res);
@@ -5563,39 +5647,49 @@ bool wallet2::find_and_save_rings(bool force)
MDEBUG("Finding and saving rings...");
// get payments we made
+ std::vector<crypto::hash> txs_hashes;
std::list<std::pair<crypto::hash,wallet2::confirmed_transfer_details>> payments;
get_payments_out(payments, 0, std::numeric_limits<uint64_t>::max(), boost::none, std::set<uint32_t>());
for (const std::pair<crypto::hash,wallet2::confirmed_transfer_details> &entry: payments)
{
const crypto::hash &txid = entry.first;
- req.txs_hashes.push_back(epee::string_tools::pod_to_hex(txid));
+ txs_hashes.push_back(txid);
}
- MDEBUG("Found " << std::to_string(req.txs_hashes.size()) << " transactions");
-
- // get those transactions from the daemon
- req.decode_as_json = false;
- bool r;
- {
- const boost::lock_guard<boost::mutex> lock{m_daemon_rpc_mutex};
- r = epee::net_utils::invoke_http_json("/gettransactions", req, res, m_http_client, rpc_timeout);
- }
- THROW_WALLET_EXCEPTION_IF(!r, error::no_connection_to_daemon, "gettransactions");
- THROW_WALLET_EXCEPTION_IF(res.status == CORE_RPC_STATUS_BUSY, error::daemon_busy, "gettransactions");
- THROW_WALLET_EXCEPTION_IF(res.status != CORE_RPC_STATUS_OK, error::wallet_internal_error, "gettransactions");
- THROW_WALLET_EXCEPTION_IF(res.txs.size() != req.txs_hashes.size(), error::wallet_internal_error,
- "daemon returned wrong response for gettransactions, wrong txs count = " +
- std::to_string(res.txs.size()) + ", expected " + std::to_string(req.txs_hashes.size()));
-
- MDEBUG("Scanning " << res.txs.size() << " transactions");
+ MDEBUG("Found " << std::to_string(txs_hashes.size()) << " transactions");
crypto::chacha_key key;
generate_chacha_key_from_secret_keys(key);
- auto it = req.txs_hashes.begin();
- for (size_t i = 0; i < res.txs.size(); ++i, ++it)
+ // get those transactions from the daemon
+ static const size_t SLICE_SIZE = 200;
+ for (size_t slice = 0; slice < txs_hashes.size(); slice += SLICE_SIZE)
{
+ req.decode_as_json = false;
+ req.prune = true;
+ req.txs_hashes.clear();
+ size_t ntxes = slice + SLICE_SIZE > txs_hashes.size() ? txs_hashes.size() - slice : SLICE_SIZE;
+ for (size_t s = slice; s < slice + ntxes; ++s)
+ req.txs_hashes.push_back(epee::string_tools::pod_to_hex(txs_hashes[s]));
+ bool r;
+ {
+ const boost::lock_guard<boost::mutex> lock{m_daemon_rpc_mutex};
+ r = epee::net_utils::invoke_http_json("/gettransactions", req, res, m_http_client, rpc_timeout);
+ }
+ THROW_WALLET_EXCEPTION_IF(!r, error::no_connection_to_daemon, "gettransactions");
+ THROW_WALLET_EXCEPTION_IF(res.status == CORE_RPC_STATUS_BUSY, error::daemon_busy, "gettransactions");
+ THROW_WALLET_EXCEPTION_IF(res.status != CORE_RPC_STATUS_OK, error::wallet_internal_error, "gettransactions");
+ THROW_WALLET_EXCEPTION_IF(res.txs.size() != req.txs_hashes.size(), error::wallet_internal_error,
+ "daemon returned wrong response for gettransactions, wrong txs count = " +
+ std::to_string(res.txs.size()) + ", expected " + std::to_string(req.txs_hashes.size()));
+
+ MDEBUG("Scanning " << res.txs.size() << " transactions");
+ THROW_WALLET_EXCEPTION_IF(slice + res.txs.size() > txs_hashes.size(), error::wallet_internal_error, "Unexpected tx array size");
+ auto it = req.txs_hashes.begin();
+ for (size_t i = 0; i < res.txs.size(); ++i, ++it)
+ {
const auto &tx_info = res.txs[i];
+ THROW_WALLET_EXCEPTION_IF(tx_info.tx_hash != epee::string_tools::pod_to_hex(txs_hashes[slice + i]), error::wallet_internal_error, "Wrong txid received");
THROW_WALLET_EXCEPTION_IF(tx_info.tx_hash != *it, error::wallet_internal_error, "Wrong txid received");
cryptonote::blobdata bd;
THROW_WALLET_EXCEPTION_IF(!epee::string_tools::parse_hexstr_to_binbuff(tx_info.as_hex, bd), error::wallet_internal_error, "failed to parse tx from hexstr");
@@ -5604,9 +5698,10 @@ bool wallet2::find_and_save_rings(bool force)
THROW_WALLET_EXCEPTION_IF(!cryptonote::parse_and_validate_tx_from_blob(bd, tx, tx_hash, tx_prefix_hash), error::wallet_internal_error, "failed to parse tx from blob");
THROW_WALLET_EXCEPTION_IF(epee::string_tools::pod_to_hex(tx_hash) != tx_info.tx_hash, error::wallet_internal_error, "txid mismatch");
THROW_WALLET_EXCEPTION_IF(!add_rings(key, tx), error::wallet_internal_error, "Failed to save ring");
+ }
}
- MINFO("Found and saved rings for " << res.txs.size() << " transactions");
+ MINFO("Found and saved rings for " << txs_hashes.size() << " transactions");
m_ring_history_saved = true;
return true;
}
@@ -5614,34 +5709,41 @@ bool wallet2::find_and_save_rings(bool force)
bool wallet2::blackball_output(const crypto::public_key &output)
{
if (!m_ringdb)
- return true;
- return m_ringdb->blackball(output);
+ return false;
+ try { return m_ringdb->blackball(output); }
+ catch (const std::exception &e) { return false; }
}
bool wallet2::set_blackballed_outputs(const std::vector<crypto::public_key> &outputs, bool add)
{
if (!m_ringdb)
- return true;
- bool ret = true;
- if (!add)
- ret &= m_ringdb->clear_blackballs();
- for (const auto &output: outputs)
- ret &= m_ringdb->blackball(output);
- return ret;
+ return false;
+ try
+ {
+ bool ret = true;
+ if (!add)
+ ret &= m_ringdb->clear_blackballs();
+ for (const auto &output: outputs)
+ ret &= m_ringdb->blackball(output);
+ return ret;
+ }
+ catch (const std::exception &e) { return false; }
}
bool wallet2::unblackball_output(const crypto::public_key &output)
{
if (!m_ringdb)
- return true;
- return m_ringdb->unblackball(output);
+ return false;
+ try { return m_ringdb->unblackball(output); }
+ catch (const std::exception &e) { return false; }
}
bool wallet2::is_output_blackballed(const crypto::public_key &output) const
{
if (!m_ringdb)
- return true;
- return m_ringdb->blackballed(output);
+ return false;
+ try { return m_ringdb->blackballed(output); }
+ catch (const std::exception &e) { return false; }
}
bool wallet2::tx_add_fake_output(std::vector<std::vector<tools::wallet2::get_outs_entry>> &outs, uint64_t global_index, const crypto::public_key& output_public_key, const rct::key& mask, uint64_t real_index, bool unlocked) const
@@ -5785,6 +5887,7 @@ void wallet2::get_outs(std::vector<std::vector<tools::wallet2::get_outs_entry>>
boost::optional<std::string> result = m_node_rpc_proxy.get_height(height);
throw_on_rpc_response_error(result, "get_info");
bool is_shortly_after_segregation_fork = height >= segregation_fork_height && height < segregation_fork_height + SEGREGATION_FORK_VICINITY;
+ bool is_after_segregation_fork = height >= segregation_fork_height;
// get histogram for the amounts we need
cryptonote::COMMAND_RPC_GET_OUTPUT_HISTOGRAM::request req_t = AUTO_VAL_INIT(req_t);
@@ -5805,7 +5908,7 @@ void wallet2::get_outs(std::vector<std::vector<tools::wallet2::get_outs_entry>>
// if we want to segregate fake outs pre or post fork, get distribution
std::unordered_map<uint64_t, std::pair<uint64_t, uint64_t>> segregation_limit;
- if (m_segregate_pre_fork_outputs || m_key_reuse_mitigation2)
+ if (is_after_segregation_fork && (m_segregate_pre_fork_outputs || m_key_reuse_mitigation2))
{
cryptonote::COMMAND_RPC_GET_OUTPUT_DISTRIBUTION::request req_t = AUTO_VAL_INIT(req_t);
cryptonote::COMMAND_RPC_GET_OUTPUT_DISTRIBUTION::response resp_t = AUTO_VAL_INIT(resp_t);
@@ -5814,10 +5917,11 @@ void wallet2::get_outs(std::vector<std::vector<tools::wallet2::get_outs_entry>>
std::sort(req_t.amounts.begin(), req_t.amounts.end());
auto end = std::unique(req_t.amounts.begin(), req_t.amounts.end());
req_t.amounts.resize(std::distance(req_t.amounts.begin(), end));
- req_t.from_height = segregation_fork_height >= RECENT_OUTPUT_ZONE ? height >= (segregation_fork_height ? segregation_fork_height : height) - RECENT_OUTPUT_BLOCKS : 0;
+ req_t.from_height = std::max<uint64_t>(segregation_fork_height, RECENT_OUTPUT_BLOCKS) - RECENT_OUTPUT_BLOCKS;
+ req_t.to_height = segregation_fork_height + 1;
req_t.cumulative = true;
m_daemon_rpc_mutex.lock();
- bool r = net_utils::invoke_http_json_rpc("/json_rpc", "get_output_distribution", req_t, resp_t, m_http_client, rpc_timeout);
+ bool r = net_utils::invoke_http_json_rpc("/json_rpc", "get_output_distribution", req_t, resp_t, m_http_client, rpc_timeout * 1000);
m_daemon_rpc_mutex.unlock();
THROW_WALLET_EXCEPTION_IF(!r, error::no_connection_to_daemon, "transfer_selected");
THROW_WALLET_EXCEPTION_IF(resp_t.status == CORE_RPC_STATUS_BUSY, error::daemon_busy, "get_output_distribution");
@@ -5834,6 +5938,7 @@ void wallet2::get_outs(std::vector<std::vector<tools::wallet2::get_outs_entry>>
{
THROW_WALLET_EXCEPTION_IF(d.start_height > segregation_fork_height, error::get_output_distribution, "Distribution start_height too high");
THROW_WALLET_EXCEPTION_IF(segregation_fork_height - d.start_height >= d.distribution.size(), error::get_output_distribution, "Distribution size too small");
+ THROW_WALLET_EXCEPTION_IF(segregation_fork_height - RECENT_OUTPUT_BLOCKS - d.start_height >= d.distribution.size(), error::get_output_distribution, "Distribution size too small");
THROW_WALLET_EXCEPTION_IF(segregation_fork_height <= RECENT_OUTPUT_BLOCKS, error::wallet_internal_error, "Fork height too low");
THROW_WALLET_EXCEPTION_IF(segregation_fork_height - RECENT_OUTPUT_BLOCKS < d.start_height, error::get_output_distribution, "Bad start height");
uint64_t till_fork = d.distribution[segregation_fork_height - d.start_height];
@@ -5872,7 +5977,7 @@ void wallet2::get_outs(std::vector<std::vector<tools::wallet2::get_outs_entry>>
float pre_fork_num_out_ratio = 0.0f;
float post_fork_num_out_ratio = 0.0f;
- if (m_segregate_pre_fork_outputs && output_is_pre_fork)
+ if (is_after_segregation_fork && m_segregate_pre_fork_outputs && output_is_pre_fork)
{
num_outs = segregation_limit[amount].first;
num_recent_outs = segregation_limit[amount].second;
@@ -5892,7 +5997,7 @@ void wallet2::get_outs(std::vector<std::vector<tools::wallet2::get_outs_entry>>
break;
}
}
- if (m_key_reuse_mitigation2)
+ if (is_after_segregation_fork && m_key_reuse_mitigation2)
{
if (output_is_pre_fork)
{
@@ -6107,7 +6212,7 @@ void wallet2::get_outs(std::vector<std::vector<tools::wallet2::get_outs_entry>>
uint64_t num_outs = 0;
const uint64_t amount = td.is_rct() ? 0 : td.amount();
const bool output_is_pre_fork = td.m_block_height < segregation_fork_height;
- if (m_segregate_pre_fork_outputs && output_is_pre_fork)
+ if (is_after_segregation_fork && m_segregate_pre_fork_outputs && output_is_pre_fork)
num_outs = segregation_limit[amount].first;
else for (const auto &he: resp_t.histogram)
{
@@ -6573,7 +6678,7 @@ void wallet2::transfer_selected_rct(std::vector<cryptonote::tx_destination_entry
LOG_PRINT_L2("Creating supplementary multisig transaction");
cryptonote::transaction ms_tx;
auto sources_copy_copy = sources_copy;
- bool r = cryptonote::construct_tx_with_tx_key(m_account.get_keys(), m_subaddresses, sources_copy_copy, splitted_dsts, change_dts.addr, extra, ms_tx, unlock_time,tx_key, additional_tx_keys, true, bulletproof, &msout);
+ bool r = cryptonote::construct_tx_with_tx_key(m_account.get_keys(), m_subaddresses, sources_copy_copy, splitted_dsts, change_dts.addr, extra, ms_tx, unlock_time,tx_key, additional_tx_keys, true, bulletproof, &msout, false);
LOG_PRINT_L2("constructed tx, r="<<r);
THROW_WALLET_EXCEPTION_IF(!r, error::tx_not_constructed, sources, splitted_dsts, unlock_time, m_nettype);
THROW_WALLET_EXCEPTION_IF(upper_transaction_size_limit <= get_object_blobsize(tx), error::tx_too_big, tx, upper_transaction_size_limit);
@@ -7224,6 +7329,11 @@ bool wallet2::light_wallet_key_image_is_ours(const crypto::key_image& key_image,
// usable balance.
std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryptonote::tx_destination_entry> dsts, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, uint32_t subaddr_account, std::set<uint32_t> subaddr_indices, bool trusted_daemon)
{
+ //ensure device is let in NONE mode in any case
+ hw::device &hwdev = m_account.get_device();
+ boost::unique_lock<hw::device> hwdev_lock (hwdev);
+ hw::reset_mode rst(hwdev);
+
if(m_light_wallet) {
// Populate m_transfers
light_wallet_get_unspent_outs();
@@ -7441,8 +7551,8 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryp
unsigned int original_output_index = 0;
std::vector<size_t>* unused_transfers_indices = &unused_transfers_indices_per_subaddr[0].second;
std::vector<size_t>* unused_dust_indices = &unused_dust_indices_per_subaddr[0].second;
- hw::device &hwdev = m_account.get_device();
- hwdev.set_signature_mode(hw::device::SIGNATURE_FAKE);
+
+ hwdev.set_mode(hw::device::TRANSACTION_CREATE_FAKE);
while ((!dsts.empty() && dsts[0].amount > 0) || adding_fee || !preferred_inputs.empty() || should_pick_a_second_output(use_rct, txes.back().selected_transfers.size(), *unused_transfers_indices, *unused_dust_indices)) {
TX &tx = txes.back();
@@ -7671,7 +7781,7 @@ skip_tx:
LOG_PRINT_L1("Done creating " << txes.size() << " transactions, " << print_money(accumulated_fee) <<
" total fee, " << print_money(accumulated_change) << " total change");
- hwdev.set_signature_mode(hw::device::SIGNATURE_REAL);
+ hwdev.set_mode(hw::device::TRANSACTION_CREATE_REAL);
for (std::vector<TX>::iterator i = txes.begin(); i != txes.end(); ++i)
{
TX &tx = *i;
@@ -7802,6 +7912,11 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_single(const crypt
std::vector<wallet2::pending_tx> wallet2::create_transactions_from(const cryptonote::account_public_address &address, bool is_subaddress, std::vector<size_t> unused_transfers_indices, std::vector<size_t> unused_dust_indices, const size_t fake_outs_count, const uint64_t unlock_time, uint32_t priority, const std::vector<uint8_t>& extra, bool trusted_daemon)
{
+ //ensure device is let in NONE mode in any case
+ hw::device &hwdev = m_account.get_device();
+ boost::unique_lock<hw::device> hwdev_lock (hwdev);
+ hw::reset_mode rst(hwdev);
+
uint64_t accumulated_fee, accumulated_outputs, accumulated_change;
struct TX {
std::vector<size_t> selected_transfers;
@@ -7834,8 +7949,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_from(const crypton
needed_fee = 0;
// while we have something to send
- hw::device &hwdev = m_account.get_device();
- hwdev.set_signature_mode(hw::device::SIGNATURE_FAKE);
+ hwdev.set_mode(hw::device::TRANSACTION_CREATE_FAKE);
while (!unused_dust_indices.empty() || !unused_transfers_indices.empty()) {
TX &tx = txes.back();
@@ -7921,7 +8035,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_from(const crypton
LOG_PRINT_L1("Done creating " << txes.size() << " transactions, " << print_money(accumulated_fee) <<
" total fee, " << print_money(accumulated_change) << " total change");
- hwdev.set_signature_mode(hw::device::SIGNATURE_REAL);
+ hwdev.set_mode(hw::device::TRANSACTION_CREATE_REAL);
for (std::vector<TX>::iterator i = txes.begin(); i != txes.end(); ++i)
{
TX &tx = *i;
@@ -8036,6 +8150,7 @@ std::vector<size_t> wallet2::select_available_outputs_from_histogram(uint64_t co
req_t.min_count = count;
req_t.max_count = 0;
req_t.unlocked = unlocked;
+ req_t.recent_cutoff = 0;
bool r = net_utils::invoke_http_json_rpc("/json_rpc", "get_output_histogram", req_t, resp_t, m_http_client, rpc_timeout);
m_daemon_rpc_mutex.unlock();
THROW_WALLET_EXCEPTION_IF(!r, error::no_connection_to_daemon, "select_available_outputs_from_histogram");
@@ -8072,6 +8187,8 @@ uint64_t wallet2::get_num_rct_outputs()
req_t.amounts.push_back(0);
req_t.min_count = 0;
req_t.max_count = 0;
+ req_t.unlocked = true;
+ req_t.recent_cutoff = 0;
bool r = net_utils::invoke_http_json_rpc("/json_rpc", "get_output_histogram", req_t, resp_t, m_http_client, rpc_timeout);
m_daemon_rpc_mutex.unlock();
THROW_WALLET_EXCEPTION_IF(!r, error::no_connection_to_daemon, "get_num_rct_outputs");
@@ -8092,14 +8209,14 @@ const wallet2::transfer_details &wallet2::get_transfer_details(size_t idx) const
std::vector<size_t> wallet2::select_available_unmixable_outputs(bool trusted_daemon)
{
// request all outputs with less than 3 instances
- const size_t min_mixin = use_fork_rules(6, 10) ? 4 : 2; // v6 increases min mixin from 2 to 4
+ const size_t min_mixin = use_fork_rules(7, 10) ? 6 : use_fork_rules(6, 10) ? 4 : 2; // v6 increases min mixin from 2 to 4, v7 to 6
return select_available_outputs_from_histogram(min_mixin + 1, false, true, false, trusted_daemon);
}
//----------------------------------------------------------------------------------------------------
std::vector<size_t> wallet2::select_available_mixable_outputs(bool trusted_daemon)
{
// request all outputs with at least 3 instances, so we can use mixin 2 with
- const size_t min_mixin = use_fork_rules(6, 10) ? 4 : 2; // v6 increases min mixin from 2 to 4
+ const size_t min_mixin = use_fork_rules(7, 10) ? 6 : use_fork_rules(6, 10) ? 4 : 2; // v6 increases min mixin from 2 to 4, v7 to 6
return select_available_outputs_from_histogram(min_mixin + 1, true, true, true, trusted_daemon);
}
//----------------------------------------------------------------------------------------------------
@@ -8155,6 +8272,7 @@ std::string wallet2::get_spend_proof(const crypto::hash &txid, const std::string
COMMAND_RPC_GET_TRANSACTIONS::request req = AUTO_VAL_INIT(req);
req.txs_hashes.push_back(epee::string_tools::pod_to_hex(txid));
req.decode_as_json = false;
+ req.prune = false;
COMMAND_RPC_GET_TRANSACTIONS::response res = AUTO_VAL_INIT(res);
bool r;
{
@@ -8274,6 +8392,7 @@ bool wallet2::check_spend_proof(const crypto::hash &txid, const std::string &mes
COMMAND_RPC_GET_TRANSACTIONS::request req = AUTO_VAL_INIT(req);
req.txs_hashes.push_back(epee::string_tools::pod_to_hex(txid));
req.decode_as_json = false;
+ req.prune = false;
COMMAND_RPC_GET_TRANSACTIONS::response res = AUTO_VAL_INIT(res);
bool r;
{
@@ -8396,6 +8515,8 @@ void wallet2::check_tx_key_helper(const crypto::hash &txid, const crypto::key_de
COMMAND_RPC_GET_TRANSACTIONS::request req;
COMMAND_RPC_GET_TRANSACTIONS::response res;
req.txs_hashes.push_back(epee::string_tools::pod_to_hex(txid));
+ req.decode_as_json = false;
+ req.prune = false;
m_daemon_rpc_mutex.lock();
bool ok = epee::net_utils::invoke_http_json("/gettransactions", req, res, m_http_client);
m_daemon_rpc_mutex.unlock();
@@ -8532,6 +8653,8 @@ std::string wallet2::get_tx_proof(const crypto::hash &txid, const cryptonote::ac
COMMAND_RPC_GET_TRANSACTIONS::request req;
COMMAND_RPC_GET_TRANSACTIONS::response res;
req.txs_hashes.push_back(epee::string_tools::pod_to_hex(txid));
+ req.decode_as_json = false;
+ req.prune = false;
m_daemon_rpc_mutex.lock();
bool ok = net_utils::invoke_http_json("/gettransactions", req, res, m_http_client);
m_daemon_rpc_mutex.unlock();
@@ -8642,6 +8765,8 @@ bool wallet2::check_tx_proof(const crypto::hash &txid, const cryptonote::account
COMMAND_RPC_GET_TRANSACTIONS::request req;
COMMAND_RPC_GET_TRANSACTIONS::response res;
req.txs_hashes.push_back(epee::string_tools::pod_to_hex(txid));
+ req.decode_as_json = false;
+ req.prune = false;
m_daemon_rpc_mutex.lock();
bool ok = net_utils::invoke_http_json("/gettransactions", req, res, m_http_client);
m_daemon_rpc_mutex.unlock();
@@ -8875,6 +9000,8 @@ bool wallet2::check_reserve_proof(const cryptonote::account_public_address &addr
COMMAND_RPC_GET_TRANSACTIONS::response gettx_res;
for (size_t i = 0; i < proofs.size(); ++i)
gettx_req.txs_hashes.push_back(epee::string_tools::pod_to_hex(proofs[i].txid));
+ gettx_req.decode_as_json = false;
+ gettx_req.prune = false;
m_daemon_rpc_mutex.lock();
bool ok = net_utils::invoke_http_json("/gettransactions", gettx_req, gettx_res, m_http_client);
m_daemon_rpc_mutex.unlock();
@@ -9449,6 +9576,7 @@ uint64_t wallet2::import_key_images(const std::vector<std::pair<crypto::key_imag
COMMAND_RPC_GET_TRANSACTIONS::request gettxs_req;
COMMAND_RPC_GET_TRANSACTIONS::response gettxs_res;
gettxs_req.decode_as_json = false;
+ gettxs_req.prune = false;
for (const crypto::hash& spent_txid : spent_txids)
gettxs_req.txs_hashes.push_back(epee::string_tools::pod_to_hex(spent_txid));
m_daemon_rpc_mutex.lock();
diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h
index abc7bb538..61e6927bc 100644
--- a/src/wallet/wallet2.h
+++ b/src/wallet/wallet2.h
@@ -477,21 +477,23 @@ namespace tools
bool two_random = false, bool create_address_file = false);
/*!
* \brief Creates a wallet from a public address and a spend/view secret key pair.
- * \param wallet_ Name of wallet file
- * \param password Password of wallet file
- * \param viewkey view secret key
- * \param spendkey spend secret key
- * \param create_address_file Whether to create an address file
+ * \param wallet_ Name of wallet file
+ * \param password Password of wallet file
+ * \param account_public_address The account's public address
+ * \param spendkey spend secret key
+ * \param viewkey view secret key
+ * \param create_address_file Whether to create an address file
*/
void generate(const std::string& wallet, const epee::wipeable_string& password,
const cryptonote::account_public_address &account_public_address,
const crypto::secret_key& spendkey, const crypto::secret_key& viewkey, bool create_address_file = false);
/*!
* \brief Creates a watch only wallet from a public address and a view secret key.
- * \param wallet_ Name of wallet file
- * \param password Password of wallet file
- * \param viewkey view secret key
- * \param create_address_file Whether to create an address file
+ * \param wallet_ Name of wallet file
+ * \param password Password of wallet file
+ * \param account_public_address The account's public address
+ * \param viewkey view secret key
+ * \param create_address_file Whether to create an address file
*/
void generate(const std::string& wallet, const epee::wipeable_string& password,
const cryptonote::account_public_address &account_public_address,
@@ -561,9 +563,9 @@ namespace tools
void load(const std::string& wallet, const epee::wipeable_string& password);
void store();
/*!
- * \brief store_to - stores wallet to another file(s), deleting old ones
- * \param path - path to the wallet file (keys and address filenames will be generated based on this filename)
- * \param password - password to protect new wallet (TODO: probably better save the password in the wallet object?)
+ * \brief store_to Stores wallet to another file(s), deleting old ones
+ * \param path Path to the wallet file (keys and address filenames will be generated based on this filename)
+ * \param password Password to protect new wallet (TODO: probably better save the password in the wallet object?)
*/
void store_to(const std::string &path, const epee::wipeable_string &password);
@@ -874,6 +876,8 @@ namespace tools
void key_reuse_mitigation2(bool value) { m_key_reuse_mitigation2 = value; }
uint64_t segregation_height() const { return m_segregation_height; }
void segregation_height(uint64_t height) { m_segregation_height = height; }
+ bool confirm_non_default_ring_size() const { return m_confirm_non_default_ring_size; }
+ void confirm_non_default_ring_size(bool always) { m_confirm_non_default_ring_size = always; }
bool get_tx_key(const crypto::hash &txid, crypto::secret_key &tx_key, std::vector<crypto::secret_key> &additional_tx_keys) const;
void check_tx_key(const crypto::hash &txid, const crypto::secret_key &tx_key, const std::vector<crypto::secret_key> &additional_tx_keys, const cryptonote::account_public_address &address, uint64_t &received, bool &in_pool, uint64_t &confirmations);
@@ -957,7 +961,7 @@ namespace tools
/*!
* \brief Set the label of the given tag.
* \param tag Tag's name (which must be non-empty).
- * \param label Tag's description.
+ * \param description Tag's description.
*/
void set_account_tag_description(const std::string& tag, const std::string& description);
@@ -1061,7 +1065,7 @@ namespace tools
return epee::net_utils::invoke_http_json_rpc(uri, method_name, req, res, m_http_client, timeout, http_method, req_id);
}
- void set_ring_database(const std::string &filename);
+ bool set_ring_database(const std::string &filename);
const std::string get_ring_database() const { return m_ring_database; }
bool get_ring(const crypto::key_image &key_image, std::vector<uint64_t> &outs);
bool get_rings(const crypto::hash &txid, std::vector<std::pair<crypto::key_image, std::vector<uint64_t>>> &outs);
@@ -1194,6 +1198,7 @@ namespace tools
// m_refresh_from_block_height was defaulted to zero.*/
bool m_explicit_refresh_from_block_height;
bool m_confirm_missing_payment_id;
+ bool m_confirm_non_default_ring_size;
bool m_ask_password;
uint32_t m_min_output_count;
uint64_t m_min_output_value;
diff --git a/tests/core_proxy/core_proxy.h b/tests/core_proxy/core_proxy.h
index 59f8d5239..6684c134c 100644
--- a/tests/core_proxy/core_proxy.h
+++ b/tests/core_proxy/core_proxy.h
@@ -97,6 +97,7 @@ namespace tests
bool get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata, cryptonote::block>>& blocks, std::list<cryptonote::blobdata>& txs) const { return false; }
bool get_transactions(const std::vector<crypto::hash>& txs_ids, std::list<cryptonote::transaction>& txs, std::list<crypto::hash>& missed_txs) const { return false; }
bool get_block_by_hash(const crypto::hash &h, cryptonote::block &blk, bool *orphan = NULL) const { return false; }
+ uint8_t get_ideal_hard_fork_version() const { return 0; }
uint8_t get_ideal_hard_fork_version(uint64_t height) const { return 0; }
uint8_t get_hard_fork_version(uint64_t height) const { return 0; }
cryptonote::difficulty_type get_block_cumulative_difficulty(uint64_t height) const { return 0; }
diff --git a/tests/unit_tests/CMakeLists.txt b/tests/unit_tests/CMakeLists.txt
index 9c58536c9..249dbdbe8 100644
--- a/tests/unit_tests/CMakeLists.txt
+++ b/tests/unit_tests/CMakeLists.txt
@@ -103,6 +103,8 @@ if (NOT MSVC)
COMPILE_FLAGS " -Wno-undef -Wno-sign-compare")
endif ()
+SET_PROPERTY(SOURCE main.cpp PROPERTY COMPILE_FLAGS -DDEFAULT_DATA_DIR="\\"${CMAKE_SOURCE_DIR}/tests/data\\"")
+
SET_PROPERTY(SOURCE memwipe.cpp PROPERTY COMPILE_FLAGS -Ofast)
add_test(
diff --git a/tests/unit_tests/ban.cpp b/tests/unit_tests/ban.cpp
index 688656cbc..e56a89971 100644
--- a/tests/unit_tests/ban.cpp
+++ b/tests/unit_tests/ban.cpp
@@ -76,6 +76,7 @@ public:
bool get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata, cryptonote::block>>& blocks, std::list<cryptonote::blobdata>& txs) const { return false; }
bool get_transactions(const std::vector<crypto::hash>& txs_ids, std::list<cryptonote::transaction>& txs, std::list<crypto::hash>& missed_txs) const { return false; }
bool get_block_by_hash(const crypto::hash &h, cryptonote::block &blk, bool *orphan = NULL) const { return false; }
+ uint8_t get_ideal_hard_fork_version() const { return 0; }
uint8_t get_ideal_hard_fork_version(uint64_t height) const { return 0; }
uint8_t get_hard_fork_version(uint64_t height) const { return 0; }
cryptonote::difficulty_type get_block_cumulative_difficulty(uint64_t height) const { return 0; }
diff --git a/tests/unit_tests/hardfork.cpp b/tests/unit_tests/hardfork.cpp
index 3e2199217..f60b18eef 100644
--- a/tests/unit_tests/hardfork.cpp
+++ b/tests/unit_tests/hardfork.cpp
@@ -112,7 +112,8 @@ public:
virtual bool for_all_outputs(std::function<bool(uint64_t amount, const crypto::hash &tx_hash, uint64_t height, size_t tx_idx)> f) const { return true; }
virtual bool for_all_outputs(uint64_t amount, const std::function<bool(uint64_t height)> &f) const { return true; }
virtual bool is_read_only() const { return false; }
- virtual std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff) const { return std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>>(); }
+ virtual std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff, uint64_t min_count) const { return std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>>(); }
+ virtual bool get_output_distribution(uint64_t amount, uint64_t from_height, uint64_t to_height, std::vector<uint64_t> &distribution, uint64_t &base) const { return false; }
virtual void add_txpool_tx(const transaction &tx, const txpool_tx_meta_t& details) {}
virtual void update_txpool_tx(const crypto::hash &txid, const txpool_tx_meta_t& details) {}
diff --git a/tests/unit_tests/main.cpp b/tests/unit_tests/main.cpp
index 85c6cbed5..13b62cbb4 100644
--- a/tests/unit_tests/main.cpp
+++ b/tests/unit_tests/main.cpp
@@ -61,8 +61,8 @@ int main(int argc, char** argv)
::testing::InitGoogleTest(&argc, argv);
po::options_description desc_options("Command line options");
- const command_line::arg_descriptor<std::string> arg_data_dir = { "data-dir", "Data files directory" };
- command_line::add_arg(desc_options, arg_data_dir, "");
+ const command_line::arg_descriptor<std::string> arg_data_dir = { "data-dir", "Data files directory", DEFAULT_DATA_DIR };
+ command_line::add_arg(desc_options, arg_data_dir);
po::variables_map vm;
bool r = command_line::handle_error_helper(desc_options, [&]()
@@ -74,12 +74,7 @@ int main(int argc, char** argv)
if (! r)
return 1;
- if (command_line::is_arg_defaulted(vm, arg_data_dir))
- unit_test::data_dir = boost::filesystem::canonical(boost::filesystem::path(epee::string_tools::get_current_module_folder()))
- .parent_path().parent_path().parent_path().parent_path()
- .append("tests").append("data");
- else
- unit_test::data_dir = command_line::get_arg(vm, arg_data_dir);
+ unit_test::data_dir = command_line::get_arg(vm, arg_data_dir);
return RUN_ALL_TESTS();
}