Merge pull request #169

1160505 fixed checkpointing bug (Riccardo Spagni)
c4d6658 quick hacky fix for broken TXT reads (Riccardo Spagni)
2322a94 cleaned up OpenAlias messages in simplewallet (Riccardo Spagni)
1663089 MoneroPulse log wording tweaks (Riccardo Spagni)
1d515b8 boost 1.56 kindly (and officially) patched in msys2 by Alexey Pavlov (Riccardo Spagni)
e3d2400 forgot to add connection context to log line (Riccardo Spagni)
6f7ed13 moved checkpoint log level (Riccardo Spagni)
3e644c2 moved file checkpointing log output to log1 (Riccardo Spagni)
0e1b7c9 moved non-critical p2p errors to l2 (Riccardo Spagni)
a3332e7 remove dangling upnp port mappings, updated miniupnpc (Riccardo Spagni)
6b9a7fc fixed unbound static lib on mingw as libunbound.dll.a (Riccardo Spagni)
bba217a remove pthreads, successfully tested on gcc 4.9.1 without pthreads (Riccardo Spagni)
18281f4 remove dangling upnp port mappings, updated miniupnpc (Riccardo Spagni)
9130e41 fixed unbound static lib on mingw as libunbound.dll.a (Riccardo Spagni)
8c37823 remove pthreads, successfully tested on gcc 4.9.1 without pthreads (Riccardo Spagni)
This commit is contained in:
Riccardo Spagni 2014-10-04 07:46:49 +02:00
commit faca0db9c5
No known key found for this signature in database
GPG key ID: 55432DF31CCD4FCD
82 changed files with 780 additions and 257 deletions

View file

@ -77,7 +77,7 @@ Alternatively, it can be built in an easier and more automated fashion using Hom
### On Windows: ### On Windows:
Dependencies: mingw-w64, msys2, CMake 2.8.6 or later, libunbound 1.4.16 or later (note: Unbound is not a dependency, libunbound is), and Boost 1.53 or 1.55 (except 1.54, [more details here](http://goo.gl/RrCFmA), and 1.56 as it causes an internal compiler error on mingw-w64). Dependencies: mingw-w64, msys2, CMake 2.8.6 or later, libunbound 1.4.16 or later (note: Unbound is not a dependency, libunbound is), and Boost 1.53 or 1.55 (except 1.54, [more details here](http://goo.gl/RrCFmA)).
**Preparing the Build Environment** **Preparing the Build Environment**
@ -90,8 +90,7 @@ pacman -Su --ignoregroup base
pacman -Su pacman -Su
``` ```
* For those of you already familiar with pacman, you can run the normal `pacman -Syu` to update, but you may get errors and need to restart MSYS2 if pacman's dependencies are updated. * For those of you already familiar with pacman, you can run the normal `pacman -Syu` to update, but you may get errors and need to restart MSYS2 if pacman's dependencies are updated.
* Install dependencies: `pacman -S mingw-w64-x86_64-gcc make mingw-w64-x86_64-cmake mingw-w64-x86_64-unbound` (note: in future, once the boost 1.56 mingw-w64 issues are fixed, you can add `mingw-w64-x86_64-boost` to that list to have it installed as well) * Install dependencies: `pacman -S mingw-w64-x86_64-gcc make mingw-w64-x86_64-cmake mingw-w64-x86_64-unbound mingw-w64-x86_64-boost`
* Download the [boost 1.55 msys2 package](http://downloads.sourceforge.net/project/msys2/REPOS/MINGW/x86_64/mingw-w64-x86_64-boost-1.55.0-7-any.pkg.tar.xz), and install it by running `pacman -U mingw-w64-x86_64-boost-1.55.0-7-any.pkg.tar.xz`
**Building** **Building**

View file

@ -37,7 +37,15 @@ FIND_PATH(UNBOUND_INCLUDE_DIR
/usr/ /usr/
) )
if(STATIC)
if(MINGW)
find_library(UNBOUND_LIBRARIES libunbound.dll.a)
else()
find_library(UNBOUND_LIBRARIES libunbound.a)
endif()
else()
find_library(UNBOUND_LIBRARIES unbound) find_library(UNBOUND_LIBRARIES unbound)
endif()
IF(UNBOUND_INCLUDE_DIR) IF(UNBOUND_INCLUDE_DIR)
MESSAGE(STATUS "Found libunbound include (unbound.h) in ${UNBOUND_INCLUDE_DIR}") MESSAGE(STATUS "Found libunbound include (unbound.h) in ${UNBOUND_INCLUDE_DIR}")

View file

@ -641,7 +641,7 @@ public:
if(!m_pservice_endpoint->do_send(in_buff.data(), (int)in_buff.size())) if(!m_pservice_endpoint->do_send(in_buff.data(), (int)in_buff.size()))
{ {
LOG_ERROR("Failed to do_send()"); LOG_ERROR_CC(m_connection_context, "Failed to do_send()");
return -1; return -1;
} }
CRITICAL_REGION_END(); CRITICAL_REGION_END();

View file

@ -143,7 +143,7 @@ namespace net_utils
#define LOG_PRINT_CC_YELLOW(ct, message, log_level) LOG_PRINT_YELLOW("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level) #define LOG_PRINT_CC_YELLOW(ct, message, log_level) LOG_PRINT_YELLOW("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level)
#define LOG_PRINT_CC_CYAN(ct, message, log_level) LOG_PRINT_CYAN("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level) #define LOG_PRINT_CC_CYAN(ct, message, log_level) LOG_PRINT_CYAN("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level)
#define LOG_PRINT_CC_MAGENTA(ct, message, log_level) LOG_PRINT_MAGENTA("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level) #define LOG_PRINT_CC_MAGENTA(ct, message, log_level) LOG_PRINT_MAGENTA("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level)
#define LOG_ERROR_CC(ct, message) LOG_PRINT_RED("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, LOG_LEVEL_1) #define LOG_ERROR_CC(ct, message) LOG_PRINT_RED("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, LOG_LEVEL_2)
#define LOG_PRINT_CC_L0(ct, message) LOG_PRINT_L0("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message) #define LOG_PRINT_CC_L0(ct, message) LOG_PRINT_L0("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message)
#define LOG_PRINT_CC_L1(ct, message) LOG_PRINT_L1("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message) #define LOG_PRINT_CC_L1(ct, message) LOG_PRINT_L1("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message)

25
external/miniupnpc/.gitignore vendored Normal file
View file

@ -0,0 +1,25 @@
deb_dist/
build/
*.o
*.a
*.so
*.dll
*.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

12
external/miniupnpc/CMakeLists.txt vendored Executable file → Normal file
View file

@ -36,7 +36,7 @@ else (NOT WIN32)
endif (NOT WIN32) endif (NOT WIN32)
if (CMAKE_SYSTEM_NAME STREQUAL "Darwin") if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
add_definitions (-DMACOSX -D_DARWIN_C_SOURCE) add_definitions (-D_DARWIN_C_SOURCE)
endif () endif ()
# Set compiler specific build flags # Set compiler specific build flags
@ -86,16 +86,14 @@ endif (NOT WIN32 AND NOT CMAKE_SYSTEM_NAME STREQUAL "AmigaOS")
if (WIN32) if (WIN32)
set_source_files_properties (${MINIUPNPC_SOURCES} PROPERTIES set_source_files_properties (${MINIUPNPC_SOURCES} PROPERTIES
COMPILE_DEFINITIONS STATICLIB COMPILE_DEFINITIONS MINIUPNP_STATICLIB
COMPILE_DEFINITIONS MINIUPNP_EXPORTS COMPILE_DEFINITIONS MINIUPNP_EXPORTS
) )
endif (WIN32) endif (WIN32)
if (WIN32) if (WIN32)
# find_library (WINSOCK2_LIBRARY NAMES ws2_32 WS2_32 Ws2_32) find_library (WINSOCK2_LIBRARY NAMES ws2_32 WS2_32 Ws2_32)
# find_library (IPHLPAPI_LIBRARY NAMES iphlpapi) find_library (IPHLPAPI_LIBRARY NAMES iphlpapi)
set(WINSOCK2_LIBRARY ws2_32)
set(IPHLPAPI_LIBRARY iphlpapi)
set (LDLIBS ${WINSOCK2_LIBRARY} ${IPHLPAPI_LIBRARY} ${LDLIBS}) set (LDLIBS ${WINSOCK2_LIBRARY} ${IPHLPAPI_LIBRARY} ${LDLIBS})
#elseif (CMAKE_SYSTEM_NAME STREQUAL "Solaris") #elseif (CMAKE_SYSTEM_NAME STREQUAL "Solaris")
# find_library (SOCKET_LIBRARY NAMES socket) # find_library (SOCKET_LIBRARY NAMES socket)
@ -167,6 +165,8 @@ install (FILES
igd_desc_parse.h igd_desc_parse.h
upnpreplyparse.h upnpreplyparse.h
upnperrors.h upnperrors.h
miniupnpctypes.h
portlistingparse.h
declspec.h declspec.h
DESTINATION include/miniupnpc DESTINATION include/miniupnpc
) )

17
external/miniupnpc/Changelog.txt vendored Executable file → Normal file
View file

@ -1,6 +1,21 @@
$Id: Changelog.txt,v 1.193 2014/02/05 17:26:45 nanard Exp $ $Id: Changelog.txt,v 1.198 2014/09/11 14:13:31 nanard Exp $
miniUPnP client Changelog. miniUPnP client Changelog.
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: 2014/02/05:
handle EINPROGRESS after connect() handle EINPROGRESS after connect()

2
external/miniupnpc/LICENSE vendored Executable file → Normal file
View file

@ -1,5 +1,5 @@
MiniUPnPc MiniUPnPc
Copyright (c) 2005-2011, Thomas BERNARD Copyright (c) 2005-2014, Thomas BERNARD
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without

0
external/miniupnpc/MANIFEST.in vendored Executable file → Normal file
View file

6
external/miniupnpc/Makefile vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
# $Id: Makefile,v 1.107 2014/01/31 14:19:12 nanard Exp $ # $Id: Makefile,v 1.110 2014/09/06 08:24:12 nanard Exp $
# MiniUPnP Project # MiniUPnP Project
# http://miniupnp.free.fr/ # http://miniupnp.free.fr/
# http://miniupnp.tuxfamily.org/ # http://miniupnp.tuxfamily.org/
@ -85,7 +85,7 @@ LIBRARY = libminiupnpc.a
ifeq ($(OS), Darwin) ifeq ($(OS), Darwin)
SHAREDLIBRARY = libminiupnpc.dylib SHAREDLIBRARY = libminiupnpc.dylib
SONAME = $(basename $(SHAREDLIBRARY)).$(APIVERSION).dylib SONAME = $(basename $(SHAREDLIBRARY)).$(APIVERSION).dylib
CFLAGS := -DMACOSX -D_DARWIN_C_SOURCE $(CFLAGS) CFLAGS := -D_DARWIN_C_SOURCE $(CFLAGS)
else else
ifeq ($(JARSUFFIX), win32) ifeq ($(JARSUFFIX), win32)
SHAREDLIBRARY = miniupnpc.dll SHAREDLIBRARY = miniupnpc.dll
@ -174,9 +174,11 @@ validateupnpreplyparse: testupnpreplyparse testupnpreplyparse.sh
clean: clean:
$(RM) $(LIBRARY) $(SHAREDLIBRARY) $(EXECUTABLES) $(OBJS) miniupnpcstrings.h $(RM) $(LIBRARY) $(SHAREDLIBRARY) $(EXECUTABLES) $(OBJS) miniupnpcstrings.h
$(RM) $(EXECUTABLES_ADDTESTS)
# clean python stuff # clean python stuff
$(RM) pythonmodule pythonmodule3 $(RM) pythonmodule pythonmodule3
$(RM) validateminixml validateminiwget validateupnpreplyparse $(RM) validateminixml validateminiwget validateupnpreplyparse
$(RM) minihttptestserver minihttptestserver.o
$(RM) -r build/ dist/ $(RM) -r build/ dist/
#python setup.py clean #python setup.py clean
# clean jnaerator stuff # clean jnaerator stuff

4
external/miniupnpc/Makefile.mingw vendored Executable file → Normal file
View file

@ -50,11 +50,11 @@ dll/upnpc.o: upnpc.o
echo $@ generated with $< echo $@ generated with $<
.c.o: .c.o:
$(CC) $(CFLAGS) -DSTATICLIB -c -o $@ $< $(CC) $(CFLAGS) -DMINIUPNP_STATICLIB -c -o $@ $<
$(CC) $(CFLAGS) -DMINIUPNP_EXPORTS -c -o dll/$@ $< $(CC) $(CFLAGS) -DMINIUPNP_EXPORTS -c -o dll/$@ $<
upnpc.o: upnpc.o:
$(CC) $(CFLAGS) -DSTATICLIB -c -o $@ $< $(CC) $(CFLAGS) -DMINIUPNP_STATICLIB -c -o $@ $<
$(CC) $(CFLAGS) -c -o dll/$@ $< $(CC) $(CFLAGS) -c -o dll/$@ $<
# --enable-stdcall-fixup # --enable-stdcall-fixup

0
external/miniupnpc/README vendored Executable file → Normal file
View file

0
external/miniupnpc/VERSION vendored Executable file → Normal file
View file

0
external/miniupnpc/apiversions.txt vendored Executable file → Normal file
View file

0
external/miniupnpc/bsdqueue.h vendored Executable file → Normal file
View file

2
external/miniupnpc/codelength.h vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: codelength.h,v 1.4 2012/09/27 15:40:29 nanard Exp $ */ /* $Id: codelength.h,v 1.3 2011/07/30 13:10:05 nanard Exp $ */
/* Project : miniupnp /* Project : miniupnp
* Author : Thomas BERNARD * Author : Thomas BERNARD
* copyright (c) 2005-2011 Thomas Bernard * copyright (c) 2005-2011 Thomas Bernard

3
external/miniupnpc/connecthostport.c vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: connecthostport.c,v 1.13 2014/03/31 12:36:36 nanard Exp $ */ /* $Id: connecthostport.c,v 1.12 2014/02/05 17:26:46 nanard Exp $ */
/* Project : miniupnp /* Project : miniupnp
* Author : Thomas Bernard * Author : Thomas Bernard
* Copyright (c) 2010-2014 Thomas Bernard * Copyright (c) 2010-2014 Thomas Bernard
@ -35,7 +35,6 @@
#ifndef USE_GETHOSTBYNAME #ifndef USE_GETHOSTBYNAME
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/select.h>
#endif /* #ifndef USE_GETHOSTBYNAME */ #endif /* #ifndef USE_GETHOSTBYNAME */
#endif /* #else _WIN32 */ #endif /* #else _WIN32 */

2
external/miniupnpc/connecthostport.h vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: connecthostport.h,v 1.3 2012/09/27 15:42:10 nanard Exp $ */ /* $Id: connecthostport.h,v 1.2 2012/06/23 22:32:33 nanard Exp $ */
/* Project: miniupnp /* Project: miniupnp
* http://miniupnp.free.fr/ * http://miniupnp.free.fr/
* Author: Thomas Bernard * Author: Thomas Bernard

10
external/miniupnpc/declspec.h vendored Executable file → Normal file
View file

@ -1,19 +1,19 @@
#ifndef DECLSPEC_H_INCLUDED #ifndef DECLSPEC_H_INCLUDED
#define DECLSPEC_H_INCLUDED #define DECLSPEC_H_INCLUDED
#if defined(_WIN32) && !defined(STATICLIB) #if defined(_WIN32) && !defined(MINIUPNP_STATICLIB)
/* for windows dll */ /* for windows dll */
#ifdef MINIUPNP_EXPORTS #ifdef MINIUPNP_EXPORTS
#define LIBSPEC __declspec(dllexport) #define MINIUPNP_LIBSPEC __declspec(dllexport)
#else #else
#define LIBSPEC __declspec(dllimport) #define MINIUPNP_LIBSPEC __declspec(dllimport)
#endif #endif
#else #else
#if defined(__GNUC__) && __GNUC__ >= 4 #if defined(__GNUC__) && __GNUC__ >= 4
/* fix dynlib for OS X 10.9.2 and Apple LLVM version 5.0 */ /* fix dynlib for OS X 10.9.2 and Apple LLVM version 5.0 */
#define LIBSPEC __attribute__ ((visibility ("default"))) #define MINIUPNP_LIBSPEC __attribute__ ((visibility ("default")))
#else #else
#define LIBSPEC #define MINIUPNP_LIBSPEC
#endif #endif
#endif #endif

29
external/miniupnpc/igd_desc_parse.c vendored Executable file → Normal file
View file

@ -1,8 +1,8 @@
/* $Id: igd_desc_parse.c,v 1.14 2011/04/11 09:19:24 nanard Exp $ */ /* $Id: igd_desc_parse.c,v 1.15 2014/07/01 13:01:17 nanard Exp $ */
/* Project : miniupnp /* Project : miniupnp
* http://miniupnp.free.fr/ * http://miniupnp.free.fr/
* Author : Thomas Bernard * Author : Thomas Bernard
* Copyright (c) 2005-2010 Thomas Bernard * Copyright (c) 2005-2014 Thomas Bernard
* This software is subject to the conditions detailed in the * This software is subject to the conditions detailed in the
* LICENCE file provided in this distribution. */ * LICENCE file provided in this distribution. */
@ -26,6 +26,8 @@ void IGDstartelt(void * d, const char * name, int l)
} }
} }
#define COMPARE(str, cstr) (0==memcmp(str, cstr, sizeof(cstr) - 1))
/* End element handler : /* End element handler :
* update nesting level counter and update parser state if * update nesting level counter and update parser state if
* service element is parsed */ * service element is parsed */
@ -36,23 +38,16 @@ void IGDendelt(void * d, const char * name, int l)
/*printf("endelt %2d %.*s\n", datas->level, l, name);*/ /*printf("endelt %2d %.*s\n", datas->level, l, name);*/
if( (l==7) && !memcmp(name, "service", l) ) if( (l==7) && !memcmp(name, "service", l) )
{ {
/* if(COMPARE(datas->tmp.servicetype,
if( datas->state < 1 "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:")) {
&& !strcmp(datas->servicetype,
// "urn:schemas-upnp-org:service:WANIPConnection:1") )
"urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1"))
datas->state ++;
*/
if(0==strcmp(datas->tmp.servicetype,
"urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1")) {
memcpy(&datas->CIF, &datas->tmp, sizeof(struct IGDdatas_service)); memcpy(&datas->CIF, &datas->tmp, sizeof(struct IGDdatas_service));
} else if(0==strcmp(datas->tmp.servicetype, } else if(COMPARE(datas->tmp.servicetype,
"urn:schemas-upnp-org:service:WANIPv6FirewallControl:1")) { "urn:schemas-upnp-org:service:WANIPv6FirewallControl:")) {
memcpy(&datas->IPv6FC, &datas->tmp, sizeof(struct IGDdatas_service)); memcpy(&datas->IPv6FC, &datas->tmp, sizeof(struct IGDdatas_service));
} else if(0==strcmp(datas->tmp.servicetype, } else if(COMPARE(datas->tmp.servicetype,
"urn:schemas-upnp-org:service:WANIPConnection:1") "urn:schemas-upnp-org:service:WANIPConnection:")
|| 0==strcmp(datas->tmp.servicetype, || COMPARE(datas->tmp.servicetype,
"urn:schemas-upnp-org:service:WANPPPConnection:1") ) { "urn:schemas-upnp-org:service:WANPPPConnection:") ) {
if(datas->first.servicetype[0] == '\0') { if(datas->first.servicetype[0] == '\0') {
memcpy(&datas->first, &datas->tmp, sizeof(struct IGDdatas_service)); memcpy(&datas->first, &datas->tmp, sizeof(struct IGDdatas_service));
} else { } else {

2
external/miniupnpc/igd_desc_parse.h vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: igd_desc_parse.h,v 1.11 2012/10/16 16:49:02 nanard Exp $ */ /* $Id: igd_desc_parse.h,v 1.10 2011/04/11 09:19:24 nanard Exp $ */
/* Project : miniupnp /* Project : miniupnp
* http://miniupnp.free.fr/ * http://miniupnp.free.fr/
* Author : Thomas Bernard * Author : Thomas Bernard

2
external/miniupnpc/java/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
*.class
*.jar

0
external/miniupnpc/java/JavaBridgeTest.java vendored Executable file → Normal file
View file

0
external/miniupnpc/man3/miniupnpc.3 vendored Executable file → Normal file
View file

0
external/miniupnpc/mingw32make.bat vendored Executable file → Normal file
View file

173
external/miniupnpc/minihttptestserver.c vendored Executable file → Normal file
View file

@ -1,7 +1,7 @@
/* $Id: minihttptestserver.c,v 1.13 2012/05/29 13:03:07 nanard Exp $ */ /* $Id: minihttptestserver.c,v 1.16 2014/04/01 15:08:28 nanard Exp $ */
/* Project : miniUPnP /* Project : miniUPnP
* Author : Thomas Bernard * Author : Thomas Bernard
* Copyright (c) 2011-2012 Thomas Bernard * Copyright (c) 2011-2014 Thomas Bernard
* This software is subject to the conditions detailed in the * This software is subject to the conditions detailed in the
* LICENCE file provided in this distribution. * LICENCE file provided in this distribution.
* */ * */
@ -28,20 +28,20 @@ volatile sig_atomic_t child_to_wait_for = 0;
*/ */
void handle_signal_chld(int sig) void handle_signal_chld(int sig)
{ {
printf("handle_signal_chld(%d)\n", sig); (void)sig;
/* printf("handle_signal_chld(%d)\n", sig); */
++child_to_wait_for; ++child_to_wait_for;
} }
/** /**
* signal handler for SIGINT (CRTL C) * signal handler for SIGINT (CRTL C)
*/ */
#if 0
void handle_signal_int(int sig) void handle_signal_int(int sig)
{ {
printf("handle_signal_int(%d)\n", sig); (void)sig;
/* printf("handle_signal_int(%d)\n", sig); */
quit = 1; quit = 1;
} }
#endif
/** /**
* build a text/plain content of the specified length * build a text/plain content of the specified length
@ -94,7 +94,8 @@ void build_crap(char * p, int n)
* build chunked response. * build chunked response.
* return a malloc'ed buffer * return a malloc'ed buffer
*/ */
char * build_chunked_response(int content_length, int * response_len) { char * build_chunked_response(int content_length, int * response_len)
{
char * response_buffer; char * response_buffer;
char * content_buffer; char * content_buffer;
int buffer_length; int buffer_length;
@ -141,7 +142,115 @@ char * build_chunked_response(int content_length, int * response_len) {
return response_buffer; return response_buffer;
} }
enum modes { MODE_INVALID, MODE_CHUNKED, MODE_ADDCRAP, MODE_NORMAL }; /* 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 struct {
const enum modes mode; const enum modes mode;
const char * text; const char * text;
@ -149,6 +258,7 @@ const struct {
{MODE_CHUNKED, "chunked"}, {MODE_CHUNKED, "chunked"},
{MODE_ADDCRAP, "addcrap"}, {MODE_ADDCRAP, "addcrap"},
{MODE_NORMAL, "normal"}, {MODE_NORMAL, "normal"},
{MODE_FAVICON, "favicon.ico"},
{MODE_INVALID, NULL} {MODE_INVALID, NULL}
}; };
@ -201,6 +311,8 @@ void handle_http_connection(int c)
request_buffer + request_len, request_buffer + request_len,
sizeof(request_buffer) - request_len); sizeof(request_buffer) - request_len);
if(n < 0) { if(n < 0) {
if(errno == EINTR)
continue;
perror("read"); perror("read");
return; return;
} else if(n==0) { } else if(n==0) {
@ -219,6 +331,7 @@ void handle_http_connection(int c)
} }
if(!headers_found) { if(!headers_found) {
/* error */ /* error */
printf("no HTTP header found in the request\n");
return; return;
} }
printf("headers :\n%.*s", request_len, request_buffer); printf("headers :\n%.*s", request_len, request_buffer);
@ -292,6 +405,8 @@ void handle_http_connection(int c)
case MODE_ADDCRAP: case MODE_ADDCRAP:
response_len = content_length+256; response_len = content_length+256;
response_buffer = malloc(response_len); response_buffer = malloc(response_len);
if(!response_buffer)
break;
n = snprintf(response_buffer, response_len, n = snprintf(response_buffer, response_len,
"HTTP/1.1 200 OK\r\n" "HTTP/1.1 200 OK\r\n"
"Server: minihttptestserver\r\n" "Server: minihttptestserver\r\n"
@ -303,9 +418,27 @@ void handle_http_connection(int c)
build_content(response_buffer + n, content_length); build_content(response_buffer + n, content_length);
build_crap(response_buffer + n + content_length, CRAP_LENGTH); build_crap(response_buffer + n + content_length, CRAP_LENGTH);
break; 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: default:
response_len = content_length+256; response_len = content_length+256;
response_buffer = malloc(response_len); response_buffer = malloc(response_len);
if(!response_buffer)
break;
n = snprintf(response_buffer, response_len, n = snprintf(response_buffer, response_len,
"HTTP/1.1 200 OK\r\n" "HTTP/1.1 200 OK\r\n"
"Server: minihttptestserver\r\n" "Server: minihttptestserver\r\n"
@ -338,6 +471,7 @@ int main(int argc, char * * argv) {
int child = 0; int child = 0;
int status; int status;
const char * expected_file_name = NULL; const char * expected_file_name = NULL;
struct sigaction sa;
for(i = 1; i < argc; i++) { for(i = 1; i < argc; i++) {
if(argv[i][0] == '-') { if(argv[i][0] == '-') {
@ -364,10 +498,21 @@ int main(int argc, char * * argv) {
} }
srand(time(NULL)); srand(time(NULL));
signal(SIGCHLD, handle_signal_chld);
#if 0 memset(&sa, 0, sizeof(struct sigaction));
signal(SIGINT, handle_signal_int);
#endif /*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); s = socket(ipv6 ? AF_INET6 : AF_INET, SOCK_STREAM, 0);
if(s < 0) { if(s < 0) {
@ -442,12 +587,12 @@ int main(int argc, char * * argv) {
} }
--child_to_wait_for; --child_to_wait_for;
} }
/* TODO : add a select() call in order to handle the case
* when a signal is caught */
client_addrlen = sizeof(struct sockaddr_storage); client_addrlen = sizeof(struct sockaddr_storage);
c = accept(s, (struct sockaddr *)&client_addr, c = accept(s, (struct sockaddr *)&client_addr,
&client_addrlen); &client_addrlen);
if(c < 0) { if(c < 0) {
if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)
continue;
perror("accept"); perror("accept");
return 1; return 1;
} }

0
external/miniupnpc/minisoap.c vendored Executable file → Normal file
View file

2
external/miniupnpc/minisoap.h vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: minisoap.h,v 1.5 2012/09/27 15:42:10 nanard Exp $ */ /* $Id: minisoap.h,v 1.4 2010/04/12 20:39:41 nanard Exp $ */
/* Project : miniupnp /* Project : miniupnp
* Author : Thomas Bernard * Author : Thomas Bernard
* Copyright (c) 2005 Thomas Bernard * Copyright (c) 2005 Thomas Bernard

4
external/miniupnpc/minissdpc.c vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: minissdpc.c,v 1.16 2012/03/05 19:42:46 nanard Exp $ */ /* $Id: minissdpc.c,v 1.15 2012/01/21 13:30:31 nanard Exp $ */
/* Project : miniupnp /* Project : miniupnp
* Web : http://miniupnp.free.fr/ * Web : http://miniupnp.free.fr/
* Author : Thomas BERNARD * Author : Thomas BERNARD
@ -46,7 +46,7 @@ getDevicesFromMiniSSDPD(const char * devtype, const char * socketpath)
{ {
struct UPNPDev * tmp; struct UPNPDev * tmp;
struct UPNPDev * devlist = NULL; struct UPNPDev * devlist = NULL;
unsigned char buffer[2048]; unsigned char buffer[4*1024]; /* is that enough ? */
ssize_t n; ssize_t n;
unsigned char * p; unsigned char * p;
unsigned char * url; unsigned char * url;

2
external/miniupnpc/minissdpc.h vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: minissdpc.h,v 1.2 2012/09/27 15:42:10 nanard Exp $ */ /* $Id: minissdpc.h,v 1.1 2007/08/31 15:15:33 nanard Exp $ */
/* Project: miniupnp /* Project: miniupnp
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* Author: Thomas Bernard * Author: Thomas Bernard

21
external/miniupnpc/miniupnpc.c vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: miniupnpc.c,v 1.117 2014/01/31 14:19:13 nanard Exp $ */ /* $Id: miniupnpc.c,v 1.116 2014/01/31 14:09:03 nanard Exp $ */
/* Project : miniupnp /* Project : miniupnp
* Web : http://miniupnp.free.fr/ * Web : http://miniupnp.free.fr/
* Author : Thomas BERNARD * Author : Thomas BERNARD
@ -6,7 +6,7 @@
* This software is subjet to the conditions detailed in the * This software is subjet to the conditions detailed in the
* provided LICENSE file. */ * provided LICENSE file. */
#define __EXTENSIONS__ 1 #define __EXTENSIONS__ 1
#if !defined(MACOSX) && !defined(__sun) #if !defined(__APPLE__) && !defined(__sun)
#if !defined(_XOPEN_SOURCE) && !defined(__OpenBSD__) && !defined(__NetBSD__) #if !defined(_XOPEN_SOURCE) && !defined(__OpenBSD__) && !defined(__NetBSD__)
#ifndef __cplusplus #ifndef __cplusplus
#define _XOPEN_SOURCE 600 #define _XOPEN_SOURCE 600
@ -17,7 +17,7 @@
#endif #endif
#endif #endif
#if !defined(__DragonFly__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(MACOSX) && !defined(_WIN32) && !defined(__CYGWIN__) && !defined(__sun) #if !defined(__DragonFly__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__APPLE__) && !defined(_WIN32) && !defined(__CYGWIN__) && !defined(__sun) && !defined(__GNU__) && !defined(__FreeBSD_kernel__)
#define HAS_IP_MREQN #define HAS_IP_MREQN
#endif #endif
@ -70,6 +70,9 @@
/* Amiga OS specific stuff */ /* Amiga OS specific stuff */
#define TIMEVAL struct timeval #define TIMEVAL struct timeval
#endif #endif
#ifdef __GNU__
#define MAXHOSTNAMELEN 64
#endif
#if defined(HAS_IP_MREQN) && defined(NEED_STRUCT_IP_MREQN) #if defined(HAS_IP_MREQN) && defined(NEED_STRUCT_IP_MREQN)
@ -106,7 +109,7 @@ struct ip_mreqn
#define SERVICEPREFIX2 'u' #define SERVICEPREFIX2 'u'
/* root description parsing */ /* root description parsing */
LIBSPEC void parserootdesc(const char * buffer, int bufsize, struct IGDdatas * data) MINIUPNP_LIBSPEC void parserootdesc(const char * buffer, int bufsize, struct IGDdatas * data)
{ {
struct xmlparser parser; struct xmlparser parser;
/* xmlparser object */ /* xmlparser object */
@ -335,7 +338,7 @@ parseMSEARCHReply(const char * reply, int size,
* no devices was found. * no devices was found.
* It is up to the caller to free the chained list * It is up to the caller to free the chained list
* delay is in millisecond (poll) */ * delay is in millisecond (poll) */
LIBSPEC struct UPNPDev * MINIUPNP_LIBSPEC struct UPNPDev *
upnpDiscover(int delay, const char * multicastif, upnpDiscover(int delay, const char * multicastif,
const char * minissdpdsock, int sameport, const char * minissdpdsock, int sameport,
int ipv6, int ipv6,
@ -718,7 +721,7 @@ upnpDiscover(int delay, const char * multicastif,
/* freeUPNPDevlist() should be used to /* freeUPNPDevlist() should be used to
* free the chained list returned by upnpDiscover() */ * free the chained list returned by upnpDiscover() */
LIBSPEC void freeUPNPDevlist(struct UPNPDev * devlist) MINIUPNP_LIBSPEC void freeUPNPDevlist(struct UPNPDev * devlist)
{ {
struct UPNPDev * next; struct UPNPDev * next;
while(devlist) while(devlist)
@ -754,7 +757,7 @@ url_cpy_or_cat(char * dst, const char * src, int n)
/* Prepare the Urls for usage... /* Prepare the Urls for usage...
*/ */
LIBSPEC void MINIUPNP_LIBSPEC void
GetUPNPUrls(struct UPNPUrls * urls, struct IGDdatas * data, GetUPNPUrls(struct UPNPUrls * urls, struct IGDdatas * data,
const char * descURL, unsigned int scope_id) const char * descURL, unsigned int scope_id)
{ {
@ -844,7 +847,7 @@ GetUPNPUrls(struct UPNPUrls * urls, struct IGDdatas * data,
#endif #endif
} }
LIBSPEC void MINIUPNP_LIBSPEC void
FreeUPNPUrls(struct UPNPUrls * urls) FreeUPNPUrls(struct UPNPUrls * urls)
{ {
if(!urls) if(!urls)
@ -891,7 +894,7 @@ UPNPIGD_IsConnected(struct UPNPUrls * urls, struct IGDdatas * data)
* passed as parameters are set. Donc forget to call FreeUPNPUrls(urls) to * passed as parameters are set. Donc forget to call FreeUPNPUrls(urls) to
* free allocated memory. * free allocated memory.
*/ */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetValidIGD(struct UPNPDev * devlist, UPNP_GetValidIGD(struct UPNPDev * devlist,
struct UPNPUrls * urls, struct UPNPUrls * urls,
struct IGDdatas * data, struct IGDdatas * data,

2
external/miniupnpc/miniupnpc.def vendored Executable file → Normal file
View file

@ -24,7 +24,9 @@ EXPORTS
UPNP_GetExternalIPAddress UPNP_GetExternalIPAddress
UPNP_GetLinkLayerMaxBitRates UPNP_GetLinkLayerMaxBitRates
UPNP_AddPortMapping UPNP_AddPortMapping
UPNP_AddAnyPortMapping
UPNP_DeletePortMapping UPNP_DeletePortMapping
UPNP_DeletePortMappingRange
UPNP_GetPortMappingNumberOfEntries UPNP_GetPortMappingNumberOfEntries
UPNP_GetSpecificPortMappingEntry UPNP_GetSpecificPortMappingEntry
UPNP_GetGenericPortMappingEntry UPNP_GetGenericPortMappingEntry

20
external/miniupnpc/miniupnpc.h vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: miniupnpc.h,v 1.35 2014/01/31 13:26:34 nanard Exp $ */ /* $Id: miniupnpc.h,v 1.34 2014/01/31 13:18:25 nanard Exp $ */
/* Project: miniupnp /* Project: miniupnp
* http://miniupnp.free.fr/ * http://miniupnp.free.fr/
* Author: Thomas Bernard * Author: Thomas Bernard
@ -18,7 +18,7 @@
#define UPNPDISCOVER_MEMORY_ERROR (-102) #define UPNPDISCOVER_MEMORY_ERROR (-102)
/* versions : */ /* versions : */
#define MINIUPNPC_VERSION "1.9.20140401" #define MINIUPNPC_VERSION "1.9"
#define MINIUPNPC_API_VERSION 10 #define MINIUPNPC_API_VERSION 10
#ifdef __cplusplus #ifdef __cplusplus
@ -54,19 +54,19 @@ struct UPNPDev {
* multicast interface for sending SSDP discover packets. * multicast interface for sending SSDP discover packets.
* If sameport is not null, SSDP packets will be sent from the source port * If sameport is not null, SSDP packets will be sent from the source port
* 1900 (same as destination port) otherwise system assign a source port. */ * 1900 (same as destination port) otherwise system assign a source port. */
LIBSPEC struct UPNPDev * MINIUPNP_LIBSPEC struct UPNPDev *
upnpDiscover(int delay, const char * multicastif, upnpDiscover(int delay, const char * multicastif,
const char * minissdpdsock, int sameport, const char * minissdpdsock, int sameport,
int ipv6, int ipv6,
int * error); int * error);
/* freeUPNPDevlist() /* freeUPNPDevlist()
* free list returned by upnpDiscover() */ * free list returned by upnpDiscover() */
LIBSPEC void freeUPNPDevlist(struct UPNPDev * devlist); MINIUPNP_LIBSPEC void freeUPNPDevlist(struct UPNPDev * devlist);
/* parserootdesc() : /* parserootdesc() :
* parse root XML description of a UPnP device and fill the IGDdatas * parse root XML description of a UPnP device and fill the IGDdatas
* structure. */ * structure. */
LIBSPEC void parserootdesc(const char *, int, struct IGDdatas *); MINIUPNP_LIBSPEC void parserootdesc(const char *, int, struct IGDdatas *);
/* structure used to get fast access to urls /* structure used to get fast access to urls
* controlURL: controlURL of the WANIPConnection * controlURL: controlURL of the WANIPConnection
@ -94,7 +94,7 @@ struct UPNPUrls {
* passed as parameters are set. Donc forget to call FreeUPNPUrls(urls) to * passed as parameters are set. Donc forget to call FreeUPNPUrls(urls) to
* free allocated memory. * free allocated memory.
*/ */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetValidIGD(struct UPNPDev * devlist, UPNP_GetValidIGD(struct UPNPDev * devlist,
struct UPNPUrls * urls, struct UPNPUrls * urls,
struct IGDdatas * data, struct IGDdatas * data,
@ -105,21 +105,21 @@ UPNP_GetValidIGD(struct UPNPDev * devlist,
* return value : * return value :
* 0 - Not ok * 0 - Not ok
* 1 - OK */ * 1 - OK */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetIGDFromUrl(const char * rootdescurl, UPNP_GetIGDFromUrl(const char * rootdescurl,
struct UPNPUrls * urls, struct UPNPUrls * urls,
struct IGDdatas * data, struct IGDdatas * data,
char * lanaddr, int lanaddrlen); char * lanaddr, int lanaddrlen);
LIBSPEC void MINIUPNP_LIBSPEC void
GetUPNPUrls(struct UPNPUrls *, struct IGDdatas *, GetUPNPUrls(struct UPNPUrls *, struct IGDdatas *,
const char *, unsigned int); const char *, unsigned int);
LIBSPEC void MINIUPNP_LIBSPEC void
FreeUPNPUrls(struct UPNPUrls *); FreeUPNPUrls(struct UPNPUrls *);
/* return 0 or 1 */ /* return 0 or 1 */
LIBSPEC int UPNPIGD_IsConnected(struct UPNPUrls *, struct IGDdatas *); MINIUPNP_LIBSPEC int UPNPIGD_IsConnected(struct UPNPUrls *, struct IGDdatas *);
#ifdef __cplusplus #ifdef __cplusplus

81
external/miniupnpc/miniupnpcmodule.c vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: miniupnpcmodule.c,v 1.22 2014/01/31 13:18:25 nanard Exp $*/ /* $Id: miniupnpcmodule.c,v 1.24 2014/06/10 09:48:11 nanard Exp $*/
/* Project : miniupnp /* Project : miniupnp
* Author : Thomas BERNARD * Author : Thomas BERNARD
* website : http://miniupnp.tuxfamily.org/ * website : http://miniupnp.tuxfamily.org/
@ -6,7 +6,7 @@
* This software is subjet to the conditions detailed in the * This software is subjet to the conditions detailed in the
* provided LICENCE file. */ * provided LICENCE file. */
#include <Python.h> #include <Python.h>
#define STATICLIB #define MINIUPNP_STATICLIB
#include "structmember.h" #include "structmember.h"
#include "miniupnpc.h" #include "miniupnpc.h"
#include "upnpcommands.h" #include "upnpcommands.h"
@ -265,6 +265,42 @@ Py_END_ALLOW_THREADS
} }
} }
/* AddAnyPortMapping(externalPort, protocol, internalHost, internalPort, desc,
* remoteHost)
* protocol is 'UDP' or 'TCP' */
static PyObject *
UPnP_addanyportmapping(UPnPObject *self, PyObject *args)
{
char extPort[6];
unsigned short ePort;
char inPort[6];
unsigned short iPort;
char reservedPort[6];
const char * proto;
const char * host;
const char * desc;
const char * remoteHost;
const char * leaseDuration = "0";
int r;
if (!PyArg_ParseTuple(args, "HssHss", &ePort, &proto, &host, &iPort, &desc, &remoteHost))
return NULL;
Py_BEGIN_ALLOW_THREADS
sprintf(extPort, "%hu", ePort);
sprintf(inPort, "%hu", iPort);
r = UPNP_AddAnyPortMapping(self->urls.controlURL, self->data.first.servicetype,
extPort, inPort, host, desc, proto,
remoteHost, leaseDuration, reservedPort);
Py_END_ALLOW_THREADS
if(r==UPNPCOMMAND_SUCCESS) {
return Py_BuildValue("i", atoi(reservedPort));
} else {
/* TODO: have our own exception type ! */
PyErr_SetString(PyExc_Exception, strupnperror(r));
return NULL;
}
}
/* DeletePortMapping(extPort, proto, removeHost='') /* DeletePortMapping(extPort, proto, removeHost='')
* proto = 'UDP', 'TCP' */ * proto = 'UDP', 'TCP' */
static PyObject * static PyObject *
@ -291,6 +327,37 @@ Py_END_ALLOW_THREADS
} }
} }
/* 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 * static PyObject *
UPnP_getportmappingnumberofentries(UPnPObject *self) UPnP_getportmappingnumberofentries(UPnPObject *self)
{ {
@ -429,9 +496,15 @@ static PyMethodDef UPnP_methods[] = {
{"addportmapping", (PyCFunction)UPnP_addportmapping, METH_VARARGS, {"addportmapping", (PyCFunction)UPnP_addportmapping, METH_VARARGS,
"add a port mapping" "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, {"deleteportmapping", (PyCFunction)UPnP_deleteportmapping, METH_VARARGS,
"delete a port mapping" "delete a port mapping"
}, },
{"deleteportmappingrange", (PyCFunction)UPnP_deleteportmappingrange, METH_VARARGS,
"delete a range of port mappings"
},
{"getportmappingnumberofentries", (PyCFunction)UPnP_getportmappingnumberofentries, METH_NOARGS, {"getportmappingnumberofentries", (PyCFunction)UPnP_getportmappingnumberofentries, METH_NOARGS,
"-- non standard --" "-- non standard --"
}, },
@ -526,7 +599,11 @@ initminiupnpc(void)
UPnPType.tp_new = PyType_GenericNew; UPnPType.tp_new = PyType_GenericNew;
#endif #endif
if (PyType_Ready(&UPnPType) < 0) if (PyType_Ready(&UPnPType) < 0)
#if PY_MAJOR_VERSION >= 3
return 0;
#else
return; return;
#endif
#if PY_MAJOR_VERSION >= 3 #if PY_MAJOR_VERSION >= 3
m = PyModule_Create(&moduledef); m = PyModule_Create(&moduledef);

0
external/miniupnpc/miniupnpcstrings.h.cmake vendored Executable file → Normal file
View file

2
external/miniupnpc/miniupnpcstrings.h.in vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: miniupnpcstrings.h.in,v 1.5 2012/10/16 16:48:26 nanard Exp $ */ /* $Id: miniupnpcstrings.h.in,v 1.4 2011/01/04 11:41:53 nanard Exp $ */
/* Project: miniupnp /* Project: miniupnp
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* Author: Thomas Bernard * Author: Thomas Bernard

2
external/miniupnpc/miniupnpctypes.h vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: miniupnpctypes.h,v 1.2 2012/09/27 15:42:10 nanard Exp $ */ /* $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 /* Miniupnp project : http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org
* Author : Thomas Bernard * Author : Thomas Bernard
* Copyright (c) 2011 Thomas Bernard * Copyright (c) 2011 Thomas Bernard

10
external/miniupnpc/miniwget.c vendored Executable file → Normal file
View file

@ -15,7 +15,6 @@
#include <ws2tcpip.h> #include <ws2tcpip.h>
#include <io.h> #include <io.h>
#define MAXHOSTNAMELEN 64 #define MAXHOSTNAMELEN 64
#define MIN(x,y) (((x)<(y))?(x):(y))
#define snprintf _snprintf #define snprintf _snprintf
#define socklen_t int #define socklen_t int
#ifndef strncasecmp #ifndef strncasecmp
@ -40,9 +39,14 @@
#include <netdb.h> #include <netdb.h>
#define closesocket close #define closesocket close
#endif /* #else _WIN32 */ #endif /* #else _WIN32 */
#if defined(__sun) || defined(sun) #ifdef __GNU__
#define MAXHOSTNAMELEN 64
#endif /* __GNU__ */
#ifndef MIN
#define MIN(x,y) (((x)<(y))?(x):(y)) #define MIN(x,y) (((x)<(y))?(x):(y))
#endif #endif /* MIN */
#include "miniupnpcstrings.h" #include "miniupnpcstrings.h"
#include "miniwget.h" #include "miniwget.h"

8
external/miniupnpc/miniwget.h vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: miniwget.h,v 1.8 2012/09/27 15:42:10 nanard Exp $ */ /* $Id: miniwget.h,v 1.7 2012/06/23 22:35:59 nanard Exp $ */
/* Project : miniupnp /* Project : miniupnp
* Author : Thomas Bernard * Author : Thomas Bernard
* Copyright (c) 2005-2012 Thomas Bernard * Copyright (c) 2005-2012 Thomas Bernard
@ -14,11 +14,11 @@
extern "C" { extern "C" {
#endif #endif
LIBSPEC void * getHTTPResponse(int s, int * size); MINIUPNP_LIBSPEC void * getHTTPResponse(int s, int * size);
LIBSPEC void * miniwget(const char *, int *, unsigned int); MINIUPNP_LIBSPEC void * miniwget(const char *, int *, unsigned int);
LIBSPEC void * miniwget_getaddr(const char *, int *, char *, int, unsigned int); MINIUPNP_LIBSPEC void * miniwget_getaddr(const char *, int *, char *, int, unsigned int);
int parseURL(const char *, char *, unsigned short *, char * *, unsigned int *); int parseURL(const char *, char *, unsigned short *, char * *, unsigned int *);

2
external/miniupnpc/minixml.c vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: minixml.c,v 1.11 2014/02/03 15:54:12 nanard Exp $ */ /* $Id: minixml.c,v 1.10 2012/03/05 19:42:47 nanard Exp $ */
/* minixml.c : the minimum size a xml parser can be ! */ /* minixml.c : the minimum size a xml parser can be ! */
/* Project : miniupnp /* Project : miniupnp
* webpage: http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * webpage: http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/

2
external/miniupnpc/minixml.h vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: minixml.h,v 1.7 2012/09/27 15:42:10 nanard Exp $ */ /* $Id: minixml.h,v 1.6 2006/11/30 11:47:21 nanard Exp $ */
/* minimal xml parser /* minimal xml parser
* *
* Project : miniupnp * Project : miniupnp

0
external/miniupnpc/minixmlvalid.c vendored Executable file → Normal file
View file

0
external/miniupnpc/msvc/miniupnpc.sln vendored Executable file → Normal file
View file

4
external/miniupnpc/msvc/miniupnpc.vcproj vendored Executable file → Normal file
View file

@ -41,7 +41,7 @@
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;WIN32;STATICLIB;DEBUG" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;MINIUPNP_STATICLIB;DEBUG"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="3" RuntimeLibrary="3"
@ -104,7 +104,7 @@
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="2" Optimization="2"
EnableIntrinsicFunctions="true" EnableIntrinsicFunctions="true"
PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;WIN32;STATICLIB" PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;MINIUPNP_STATICLIB"
RuntimeLibrary="2" RuntimeLibrary="2"
EnableFunctionLevelLinking="true" EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"

4
external/miniupnpc/msvc/upnpc-static.vcproj vendored Executable file → Normal file
View file

@ -41,7 +41,7 @@
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;STATICLIB;DEBUG;_CRT_SECURE_NO_WARNINGS" PreprocessorDefinitions="_DEBUG;_CONSOLE;MINIUPNP_STATICLIB;DEBUG;_CRT_SECURE_NO_WARNINGS"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="3" RuntimeLibrary="3"
@ -115,7 +115,7 @@
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="2" Optimization="2"
EnableIntrinsicFunctions="true" EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;STATICLIB" PreprocessorDefinitions="NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;MINIUPNP_STATICLIB"
RuntimeLibrary="2" RuntimeLibrary="2"
EnableFunctionLevelLinking="true" EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"

0
external/miniupnpc/portlistingparse.c vendored Executable file → Normal file
View file

6
external/miniupnpc/portlistingparse.h vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: portlistingparse.h,v 1.7 2012/09/27 15:42:10 nanard Exp $ */ /* $Id: portlistingparse.h,v 1.5 2012/01/21 13:30:33 nanard Exp $ */
/* MiniUPnP project /* MiniUPnP project
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* (c) 2011-2012 Thomas Bernard * (c) 2011-2012 Thomas Bernard
@ -57,11 +57,11 @@ struct PortMappingParserData {
portMappingElt curelt; portMappingElt curelt;
}; };
LIBSPEC void MINIUPNP_LIBSPEC void
ParsePortListing(const char * buffer, int bufsize, ParsePortListing(const char * buffer, int bufsize,
struct PortMappingParserData * pdata); struct PortMappingParserData * pdata);
LIBSPEC void MINIUPNP_LIBSPEC void
FreePortListing(struct PortMappingParserData * pdata); FreePortListing(struct PortMappingParserData * pdata);
#ifdef __cplusplus #ifdef __cplusplus

7
external/miniupnpc/receivedata.c vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: receivedata.c,v 1.5 2013/10/07 09:48:36 nanard Exp $ */ /* $Id: receivedata.c,v 1.4 2012/06/23 22:34:47 nanard Exp $ */
/* Project : miniupnp /* Project : miniupnp
* Website : http://miniupnp.free.fr/ * Website : http://miniupnp.free.fr/
* Author : Thomas Bernard * Author : Thomas Bernard
@ -40,12 +40,7 @@ receivedata(int socket,
int timeout, unsigned int * scope_id) int timeout, unsigned int * scope_id)
{ {
#if MINIUPNPC_GET_SRC_ADDR #if MINIUPNPC_GET_SRC_ADDR
#ifdef DEBUG
/* to shut up valgrind about uninit value */
struct sockaddr_storage src_addr = {0};
#else
struct sockaddr_storage src_addr; struct sockaddr_storage src_addr;
#endif
socklen_t src_addr_len = sizeof(src_addr); socklen_t src_addr_len = sizeof(src_addr);
#endif #endif
int n; int n;

2
external/miniupnpc/receivedata.h vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: receivedata.h,v 1.4 2012/09/27 15:42:10 nanard Exp $ */ /* $Id: receivedata.h,v 1.3 2012/06/23 22:34:47 nanard Exp $ */
/* Project: miniupnp /* Project: miniupnp
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* Author: Thomas Bernard * Author: Thomas Bernard

10
external/miniupnpc/setup.py vendored Executable file → Normal file
View file

@ -1,6 +1,6 @@
#! /usr/bin/python #! /usr/bin/python
# $Id: setup.py,v 1.9 2012/05/23 08:50:10 nanard Exp $ # $Id: setup.py,v 1.9 2012/05/23 08:50:10 nanard Exp $
# the MiniUPnP Project (c) 2007-2012 Thomas Bernard # the MiniUPnP Project (c) 2007-2014 Thomas Bernard
# http://miniupnp.tuxfamily.org/ or http://miniupnp.free.fr/ # http://miniupnp.tuxfamily.org/ or http://miniupnp.free.fr/
# #
# python script to build the miniupnpc module under unix # python script to build the miniupnpc module under unix
@ -10,7 +10,13 @@ from distutils.core import setup, Extension
from distutils import sysconfig from distutils import sysconfig
sysconfig.get_config_vars()["OPT"] = '' sysconfig.get_config_vars()["OPT"] = ''
sysconfig.get_config_vars()["CFLAGS"] = '' sysconfig.get_config_vars()["CFLAGS"] = ''
setup(name="miniupnpc", version="1.7", 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=[ ext_modules=[
Extension(name="miniupnpc", sources=["miniupnpcmodule.c"], Extension(name="miniupnpc", sources=["miniupnpcmodule.c"],
extra_objects=["libminiupnpc.a"]) extra_objects=["libminiupnpc.a"])

10
external/miniupnpc/setupmingw32.py vendored Executable file → Normal file
View file

@ -1,6 +1,6 @@
#! /usr/bin/python #! /usr/bin/python
# $Id: setupmingw32.py,v 1.8 2012/05/23 08:50:10 nanard Exp $ # $Id: setupmingw32.py,v 1.8 2012/05/23 08:50:10 nanard Exp $
# the MiniUPnP Project (c) 2007-2012 Thomas Bernard # the MiniUPnP Project (c) 2007-2014 Thomas Bernard
# http://miniupnp.tuxfamily.org/ or http://miniupnp.free.fr/ # http://miniupnp.tuxfamily.org/ or http://miniupnp.free.fr/
# #
# python script to build the miniupnpc module under windows (using mingw32) # python script to build the miniupnpc module under windows (using mingw32)
@ -9,7 +9,13 @@ from distutils.core import setup, Extension
from distutils import sysconfig from distutils import sysconfig
sysconfig.get_config_vars()["OPT"] = '' sysconfig.get_config_vars()["OPT"] = ''
sysconfig.get_config_vars()["CFLAGS"] = '' sysconfig.get_config_vars()["CFLAGS"] = ''
setup(name="miniupnpc", version="1.7", 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=[ ext_modules=[
Extension(name="miniupnpc", sources=["miniupnpcmodule.c"], Extension(name="miniupnpc", sources=["miniupnpcmodule.c"],
libraries=["ws2_32", "iphlpapi"], libraries=["ws2_32", "iphlpapi"],

0
external/miniupnpc/testigddescparse.c vendored Executable file → Normal file
View file

0
external/miniupnpc/testminiwget.c vendored Executable file → Normal file
View file

0
external/miniupnpc/testminixml.c vendored Executable file → Normal file
View file

0
external/miniupnpc/testreplyparse/DeletePortMapping.namevalue vendored Executable file → Normal file
View file

0
external/miniupnpc/testreplyparse/DeletePortMapping.xml vendored Executable file → Normal file
View file

0
external/miniupnpc/testreplyparse/GetExternalIPAddress.namevalue vendored Executable file → Normal file
View file

0
external/miniupnpc/testreplyparse/GetExternalIPAddress.xml vendored Executable file → Normal file
View file

View file

View file

View file

View file

View file

0
external/miniupnpc/testreplyparse/SetDefaultConnectionService.xml vendored Executable file → Normal file
View file

0
external/miniupnpc/testreplyparse/readme.txt vendored Executable file → Normal file
View file

0
external/miniupnpc/testupnpreplyparse.c vendored Executable file → Normal file
View file

89
external/miniupnpc/upnpc.c vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: upnpc.c,v 1.102 2014/02/05 17:27:14 nanard Exp $ */ /* $Id: upnpc.c,v 1.104 2014/09/11 14:13:30 nanard Exp $ */
/* Project : miniupnp /* Project : miniupnp
* Author : Thomas Bernard * Author : Thomas Bernard
* Copyright (c) 2005-2014 Thomas Bernard * Copyright (c) 2005-2014 Thomas Bernard
@ -229,11 +229,13 @@ static void SetRedirectAndTest(struct UPNPUrls * urls,
const char * eport, const char * eport,
const char * proto, const char * proto,
const char * leaseDuration, const char * leaseDuration,
const char * description) const char * description,
int addAny)
{ {
char externalIPAddress[40]; char externalIPAddress[40];
char intClient[40]; char intClient[40];
char intPort[6]; char intPort[6];
char reservedPort[6];
char duration[16]; char duration[16];
int r; int r;
@ -249,20 +251,31 @@ static void SetRedirectAndTest(struct UPNPUrls * urls,
return; return;
} }
UPNP_GetExternalIPAddress(urls->controlURL, r = UPNP_GetExternalIPAddress(urls->controlURL,
data->first.servicetype, data->first.servicetype,
externalIPAddress); externalIPAddress);
if(externalIPAddress[0]) if(r!=UPNPCOMMAND_SUCCESS)
printf("ExternalIPAddress = %s\n", externalIPAddress);
else
printf("GetExternalIPAddress failed.\n"); 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, r = UPNP_AddPortMapping(urls->controlURL, data->first.servicetype,
eport, iport, iaddr, description, eport, iport, iaddr, description,
proto, 0, leaseDuration); proto, 0, leaseDuration);
if(r!=UPNPCOMMAND_SUCCESS) if(r!=UPNPCOMMAND_SUCCESS)
printf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n", printf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n",
eport, iport, iaddr, r, strupnperror(r)); eport, iport, iaddr, r, strupnperror(r));
}
r = UPNP_GetSpecificPortMappingEntry(urls->controlURL, r = UPNP_GetSpecificPortMappingEntry(urls->controlURL,
data->first.servicetype, data->first.servicetype,
@ -272,8 +285,7 @@ static void SetRedirectAndTest(struct UPNPUrls * urls,
if(r!=UPNPCOMMAND_SUCCESS) if(r!=UPNPCOMMAND_SUCCESS)
printf("GetSpecificPortMappingEntry() failed with code %d (%s)\n", printf("GetSpecificPortMappingEntry() failed with code %d (%s)\n",
r, strupnperror(r)); r, strupnperror(r));
else {
if(intClient[0]) {
printf("InternalIP:Port = %s:%s\n", intClient, intPort); printf("InternalIP:Port = %s:%s\n", intClient, intPort);
printf("external %s:%s %s is redirected to internal %s:%s (duration=%s)\n", printf("external %s:%s %s is redirected to internal %s:%s (duration=%s)\n",
externalIPAddress, eport, proto, intClient, intPort, duration); externalIPAddress, eport, proto, intClient, intPort, duration);
@ -284,7 +296,8 @@ static void
RemoveRedirect(struct UPNPUrls * urls, RemoveRedirect(struct UPNPUrls * urls,
struct IGDdatas * data, struct IGDdatas * data,
const char * eport, const char * eport,
const char * proto) const char * proto,
const char * remoteHost)
{ {
int r; int r;
if(!proto || !eport) if(!proto || !eport)
@ -298,10 +311,36 @@ RemoveRedirect(struct UPNPUrls * urls,
fprintf(stderr, "protocol invalid\n"); fprintf(stderr, "protocol invalid\n");
return; return;
} }
r = UPNP_DeletePortMapping(urls->controlURL, data->first.servicetype, eport, proto, 0); r = UPNP_DeletePortMapping(urls->controlURL, data->first.servicetype, eport, proto, remoteHost);
printf("UPNP_DeletePortMapping() returned : %d\n", r); printf("UPNP_DeletePortMapping() returned : %d\n", r);
} }
static void
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;
}
proto = protofix(proto);
if(!proto)
{
fprintf(stderr, "protocol invalid\n");
return;
}
r = UPNP_DeletePortMappingRange(urls->controlURL, data->first.servicetype, ePortStart, ePortEnd, proto, manage);
printf("UPNP_DeletePortMappingRange() returned : %d\n", r);
}
/* IGD:2, functions for service WANIPv6FirewallControl:1 */ /* IGD:2, functions for service WANIPv6FirewallControl:1 */
static void GetFirewallStatus(struct UPNPUrls * urls, struct IGDdatas * data) static void GetFirewallStatus(struct UPNPUrls * urls, struct IGDdatas * data)
{ {
@ -546,10 +585,12 @@ int main(int argc, char ** argv)
|| (command == 'D' && commandargc<1)) || (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, "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 [port2 protocol2] [...]\n\t\tDelete 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] -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\n", argv[0]);
fprintf(stderr, " \t%s [options] -L\n\t\tList redirections (using GetListOfPortMappings, IGD v2)\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 protocol1 [port2 protocol2] [...]\n\t\tAdd all redirections to the current host\n", argv[0]); fprintf(stderr, " \t%s [options] -r port1 protocol1 [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] -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] -U uniqueID new_lease_time\n\t\tUpdate Pinhole (for IGD:2 only)\n", argv[0]);
@ -634,13 +675,25 @@ int main(int argc, char ** argv)
commandargv[0], commandargv[1], commandargv[0], commandargv[1],
commandargv[2], commandargv[3], commandargv[2], commandargv[3],
(commandargc > 4)?commandargv[4]:"0", (commandargc > 4)?commandargv[4]:"0",
description); description, 0);
break; break;
case 'd': case 'd':
for(i=0; i<commandargc; i+=2) RemoveRedirect(&urls, &data, commandargv[0], commandargv[1],
{ commandargc > 2 ? commandargv[2] : NULL);
RemoveRedirect(&urls, &data, commandargv[i], commandargv[i+1]); break;
} case 'n': /* aNy */
SetRedirectAndTest(&urls, &data,
commandargv[0], commandargv[1],
commandargv[2], commandargv[3],
(commandargc > 4)?commandargv[4]:"0",
description, 1);
break;
case 'N':
if (commandargc < 3)
fprintf(stderr, "too few arguments\n");
RemoveRedirectRange(&urls, &data, commandargv[0], commandargv[1], commandargv[2],
commandargc > 3 ? commandargv[3] : NULL);
break; break;
case 's': case 's':
GetConnectionStatus(&urls, &data); GetConnectionStatus(&urls, &data);
@ -652,7 +705,7 @@ int main(int argc, char ** argv)
SetRedirectAndTest(&urls, &data, SetRedirectAndTest(&urls, &data,
lanaddr, commandargv[i], lanaddr, commandargv[i],
commandargv[i], commandargv[i+1], "0", commandargv[i], commandargv[i+1], "0",
description); description, 0);
} }
break; break;
case 'A': case 'A':

155
external/miniupnpc/upnpcommands.c vendored Executable file → Normal file
View file

@ -20,7 +20,7 @@ my_atoui(const char * s)
/* /*
* */ * */
LIBSPEC UNSIGNED_INTEGER MINIUPNP_LIBSPEC UNSIGNED_INTEGER
UPNP_GetTotalBytesSent(const char * controlURL, UPNP_GetTotalBytesSent(const char * controlURL,
const char * servicetype) const char * servicetype)
{ {
@ -44,7 +44,7 @@ UPNP_GetTotalBytesSent(const char * controlURL,
/* /*
* */ * */
LIBSPEC UNSIGNED_INTEGER MINIUPNP_LIBSPEC UNSIGNED_INTEGER
UPNP_GetTotalBytesReceived(const char * controlURL, UPNP_GetTotalBytesReceived(const char * controlURL,
const char * servicetype) const char * servicetype)
{ {
@ -68,7 +68,7 @@ UPNP_GetTotalBytesReceived(const char * controlURL,
/* /*
* */ * */
LIBSPEC UNSIGNED_INTEGER MINIUPNP_LIBSPEC UNSIGNED_INTEGER
UPNP_GetTotalPacketsSent(const char * controlURL, UPNP_GetTotalPacketsSent(const char * controlURL,
const char * servicetype) const char * servicetype)
{ {
@ -92,7 +92,7 @@ UPNP_GetTotalPacketsSent(const char * controlURL,
/* /*
* */ * */
LIBSPEC UNSIGNED_INTEGER MINIUPNP_LIBSPEC UNSIGNED_INTEGER
UPNP_GetTotalPacketsReceived(const char * controlURL, UPNP_GetTotalPacketsReceived(const char * controlURL,
const char * servicetype) const char * servicetype)
{ {
@ -116,7 +116,7 @@ UPNP_GetTotalPacketsReceived(const char * controlURL,
/* UPNP_GetStatusInfo() call the corresponding UPNP method /* UPNP_GetStatusInfo() call the corresponding UPNP method
* returns the current status and uptime */ * returns the current status and uptime */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetStatusInfo(const char * controlURL, UPNP_GetStatusInfo(const char * controlURL,
const char * servicetype, const char * servicetype,
char * status, char * status,
@ -181,7 +181,7 @@ UPNP_GetStatusInfo(const char * controlURL,
/* UPNP_GetConnectionTypeInfo() call the corresponding UPNP method /* UPNP_GetConnectionTypeInfo() call the corresponding UPNP method
* returns the connection type */ * returns the connection type */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetConnectionTypeInfo(const char * controlURL, UPNP_GetConnectionTypeInfo(const char * controlURL,
const char * servicetype, const char * servicetype,
char * connectionType) char * connectionType)
@ -224,7 +224,7 @@ UPNP_GetConnectionTypeInfo(const char * controlURL,
* One of the values can be null * One of the values can be null
* Note : GetLinkLayerMaxBitRates belongs to WANPPPConnection:1 only * Note : GetLinkLayerMaxBitRates belongs to WANPPPConnection:1 only
* We can use the GetCommonLinkProperties from WANCommonInterfaceConfig:1 */ * We can use the GetCommonLinkProperties from WANCommonInterfaceConfig:1 */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetLinkLayerMaxBitRates(const char * controlURL, UPNP_GetLinkLayerMaxBitRates(const char * controlURL,
const char * servicetype, const char * servicetype,
unsigned int * bitrateDown, unsigned int * bitrateDown,
@ -293,7 +293,7 @@ UPNP_GetLinkLayerMaxBitRates(const char * controlURL,
* 402 Invalid Args - See UPnP Device Architecture section on Control. * 402 Invalid Args - See UPnP Device Architecture section on Control.
* 501 Action Failed - See UPnP Device Architecture section on Control. * 501 Action Failed - See UPnP Device Architecture section on Control.
*/ */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetExternalIPAddress(const char * controlURL, UPNP_GetExternalIPAddress(const char * controlURL,
const char * servicetype, const char * servicetype,
char * extIpAdd) char * extIpAdd)
@ -333,7 +333,7 @@ UPNP_GetExternalIPAddress(const char * controlURL,
return ret; return ret;
} }
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_AddPortMapping(const char * controlURL, const char * servicetype, UPNP_AddPortMapping(const char * controlURL, const char * servicetype,
const char * extPort, const char * extPort,
const char * inPort, const char * inPort,
@ -394,7 +394,74 @@ UPNP_AddPortMapping(const char * controlURL, const char * servicetype,
return ret; return ret;
} }
LIBSPEC int 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));
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";
if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
"AddAnyPortMapping", AddPortMappingArgs,
&bufsize))) {
free(AddPortMappingArgs);
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);
free(AddPortMappingArgs);
return ret;
}
MINIUPNP_LIBSPEC int
UPNP_DeletePortMapping(const char * controlURL, const char * servicetype, UPNP_DeletePortMapping(const char * controlURL, const char * servicetype,
const char * extPort, const char * proto, const char * extPort, const char * proto,
const char * remoteHost) const char * remoteHost)
@ -438,7 +505,53 @@ UPNP_DeletePortMapping(const char * controlURL, const char * servicetype,
return ret; return ret;
} }
LIBSPEC int 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));
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;
if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
"DeletePortMappingRange",
DeletePortMappingArgs, &bufsize))) {
free(DeletePortMappingArgs);
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);
free(DeletePortMappingArgs);
return ret;
}
MINIUPNP_LIBSPEC int
UPNP_GetGenericPortMappingEntry(const char * controlURL, UPNP_GetGenericPortMappingEntry(const char * controlURL,
const char * servicetype, const char * servicetype,
const char * index, const char * index,
@ -533,7 +646,7 @@ UPNP_GetGenericPortMappingEntry(const char * controlURL,
return r; return r;
} }
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetPortMappingNumberOfEntries(const char * controlURL, UPNP_GetPortMappingNumberOfEntries(const char * controlURL,
const char * servicetype, const char * servicetype,
unsigned int * numEntries) unsigned int * numEntries)
@ -574,7 +687,7 @@ UPNP_GetPortMappingNumberOfEntries(const char * controlURL,
/* UPNP_GetSpecificPortMappingEntry retrieves an existing port mapping /* UPNP_GetSpecificPortMappingEntry retrieves an existing port mapping
* the result is returned in the intClient and intPort strings * the result is returned in the intClient and intPort strings
* please provide 16 and 6 bytes of data */ * please provide 16 and 6 bytes of data */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetSpecificPortMappingEntry(const char * controlURL, UPNP_GetSpecificPortMappingEntry(const char * controlURL,
const char * servicetype, const char * servicetype,
const char * extPort, const char * extPort,
@ -666,7 +779,7 @@ UPNP_GetSpecificPortMappingEntry(const char * controlURL,
* 733 InconsistantParameters - NewStartPort and NewEndPort values are not * 733 InconsistantParameters - NewStartPort and NewEndPort values are not
* consistent. * consistent.
*/ */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetListOfPortMappings(const char * controlURL, UPNP_GetListOfPortMappings(const char * controlURL,
const char * servicetype, const char * servicetype,
const char * startPort, const char * startPort,
@ -748,7 +861,7 @@ UPNP_GetListOfPortMappings(const char * controlURL,
} }
/* IGD:2, functions for service WANIPv6FirewallControl:1 */ /* IGD:2, functions for service WANIPv6FirewallControl:1 */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetFirewallStatus(const char * controlURL, UPNP_GetFirewallStatus(const char * controlURL,
const char * servicetype, const char * servicetype,
int * firewallEnabled, int * firewallEnabled,
@ -792,7 +905,7 @@ UPNP_GetFirewallStatus(const char * controlURL,
return ret; return ret;
} }
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype, UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype,
const char * remoteHost, const char * remoteHost,
const char * remotePort, const char * remotePort,
@ -847,7 +960,7 @@ UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype
return ret; return ret;
} }
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_AddPinhole(const char * controlURL, const char * servicetype, UPNP_AddPinhole(const char * controlURL, const char * servicetype,
const char * remoteHost, const char * remoteHost,
const char * remotePort, const char * remotePort,
@ -926,7 +1039,7 @@ UPNP_AddPinhole(const char * controlURL, const char * servicetype,
return ret; return ret;
} }
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_UpdatePinhole(const char * controlURL, const char * servicetype, UPNP_UpdatePinhole(const char * controlURL, const char * servicetype,
const char * uniqueID, const char * uniqueID,
const char * leaseTime) const char * leaseTime)
@ -968,7 +1081,7 @@ UPNP_UpdatePinhole(const char * controlURL, const char * servicetype,
return ret; return ret;
} }
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_DeletePinhole(const char * controlURL, const char * servicetype, const char * uniqueID) UPNP_DeletePinhole(const char * controlURL, const char * servicetype, const char * uniqueID)
{ {
/*struct NameValueParserData pdata;*/ /*struct NameValueParserData pdata;*/
@ -1007,7 +1120,7 @@ UPNP_DeletePinhole(const char * controlURL, const char * servicetype, const char
return ret; return ret;
} }
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_CheckPinholeWorking(const char * controlURL, const char * servicetype, UPNP_CheckPinholeWorking(const char * controlURL, const char * servicetype,
const char * uniqueID, int * isWorking) const char * uniqueID, int * isWorking)
{ {
@ -1052,7 +1165,7 @@ UPNP_CheckPinholeWorking(const char * controlURL, const char * servicetype,
return ret; return ret;
} }
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetPinholePackets(const char * controlURL, const char * servicetype, UPNP_GetPinholePackets(const char * controlURL, const char * servicetype,
const char * uniqueID, int * packets) const char * uniqueID, int * packets)
{ {

96
external/miniupnpc/upnpcommands.h vendored Executable file → Normal file
View file

@ -17,24 +17,25 @@
#define UPNPCOMMAND_UNKNOWN_ERROR (-1) #define UPNPCOMMAND_UNKNOWN_ERROR (-1)
#define UPNPCOMMAND_INVALID_ARGS (-2) #define UPNPCOMMAND_INVALID_ARGS (-2)
#define UPNPCOMMAND_HTTP_ERROR (-3) #define UPNPCOMMAND_HTTP_ERROR (-3)
#define UPNPCOMMAND_INVALID_RESPONSE (-4)
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
LIBSPEC UNSIGNED_INTEGER MINIUPNP_LIBSPEC UNSIGNED_INTEGER
UPNP_GetTotalBytesSent(const char * controlURL, UPNP_GetTotalBytesSent(const char * controlURL,
const char * servicetype); const char * servicetype);
LIBSPEC UNSIGNED_INTEGER MINIUPNP_LIBSPEC UNSIGNED_INTEGER
UPNP_GetTotalBytesReceived(const char * controlURL, UPNP_GetTotalBytesReceived(const char * controlURL,
const char * servicetype); const char * servicetype);
LIBSPEC UNSIGNED_INTEGER MINIUPNP_LIBSPEC UNSIGNED_INTEGER
UPNP_GetTotalPacketsSent(const char * controlURL, UPNP_GetTotalPacketsSent(const char * controlURL,
const char * servicetype); const char * servicetype);
LIBSPEC UNSIGNED_INTEGER MINIUPNP_LIBSPEC UNSIGNED_INTEGER
UPNP_GetTotalPacketsReceived(const char * controlURL, UPNP_GetTotalPacketsReceived(const char * controlURL,
const char * servicetype); const char * servicetype);
@ -43,7 +44,7 @@ UPNP_GetTotalPacketsReceived(const char * controlURL,
* Return values : * Return values :
* UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
* or a UPnP Error code */ * or a UPnP Error code */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetStatusInfo(const char * controlURL, UPNP_GetStatusInfo(const char * controlURL,
const char * servicetype, const char * servicetype,
char * status, char * status,
@ -55,7 +56,7 @@ UPNP_GetStatusInfo(const char * controlURL,
* Return Values : * Return Values :
* UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
* or a UPnP Error code */ * or a UPnP Error code */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetConnectionTypeInfo(const char * controlURL, UPNP_GetConnectionTypeInfo(const char * controlURL,
const char * servicetype, const char * servicetype,
char * connectionType); char * connectionType);
@ -71,7 +72,7 @@ UPNP_GetConnectionTypeInfo(const char * controlURL,
* possible UPnP Errors : * possible UPnP Errors :
* 402 Invalid Args - See UPnP Device Architecture section on Control. * 402 Invalid Args - See UPnP Device Architecture section on Control.
* 501 Action Failed - See UPnP Device Architecture section on Control. */ * 501 Action Failed - See UPnP Device Architecture section on Control. */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetExternalIPAddress(const char * controlURL, UPNP_GetExternalIPAddress(const char * controlURL,
const char * servicetype, const char * servicetype,
char * extIpAdd); char * extIpAdd);
@ -82,7 +83,7 @@ UPNP_GetExternalIPAddress(const char * controlURL,
* return values : * return values :
* UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
* or a UPnP Error Code. */ * or a UPnP Error Code. */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetLinkLayerMaxBitRates(const char* controlURL, UPNP_GetLinkLayerMaxBitRates(const char* controlURL,
const char* servicetype, const char* servicetype,
unsigned int * bitrateDown, unsigned int * bitrateDown,
@ -121,7 +122,7 @@ UPNP_GetLinkLayerMaxBitRates(const char* controlURL,
* due to conflict with other mechanisms. * due to conflict with other mechanisms.
* 732 WildCardNotPermittedInIntPort - The internal port cannot be wild-carded * 732 WildCardNotPermittedInIntPort - The internal port cannot be wild-carded
*/ */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_AddPortMapping(const char * controlURL, const char * servicetype, UPNP_AddPortMapping(const char * controlURL, const char * servicetype,
const char * extPort, const char * extPort,
const char * inPort, const char * inPort,
@ -131,6 +132,40 @@ UPNP_AddPortMapping(const char * controlURL, const char * servicetype,
const char * remoteHost, const char * remoteHost,
const char * leaseDuration); 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() /* UPNP_DeletePortMapping()
* Use same argument values as what was used for AddPortMapping(). * Use same argument values as what was used for AddPortMapping().
* remoteHost is usually NULL because IGD don't support it. * remoteHost is usually NULL because IGD don't support it.
@ -143,14 +178,33 @@ UPNP_AddPortMapping(const char * controlURL, const char * servicetype,
* 606 Action not authorized - The action requested REQUIRES authorization * 606 Action not authorized - The action requested REQUIRES authorization
* and the sender was not authorized. * and the sender was not authorized.
* 714 NoSuchEntryInArray - The specified value does not exist in the array */ * 714 NoSuchEntryInArray - The specified value does not exist in the array */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_DeletePortMapping(const char * controlURL, const char * servicetype, UPNP_DeletePortMapping(const char * controlURL, const char * servicetype,
const char * extPort, const char * proto, const char * extPort, const char * proto,
const char * remoteHost); 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() /* UPNP_GetPortMappingNumberOfEntries()
* not supported by all routers */ * not supported by all routers */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetPortMappingNumberOfEntries(const char* controlURL, UPNP_GetPortMappingNumberOfEntries(const char* controlURL,
const char* servicetype, const char* servicetype,
unsigned int * num); unsigned int * num);
@ -178,7 +232,7 @@ UPNP_GetPortMappingNumberOfEntries(const char* controlURL,
* and the sender was not authorized. * and the sender was not authorized.
* 714 NoSuchEntryInArray - The specified value does not exist in the array. * 714 NoSuchEntryInArray - The specified value does not exist in the array.
*/ */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetSpecificPortMappingEntry(const char * controlURL, UPNP_GetSpecificPortMappingEntry(const char * controlURL,
const char * servicetype, const char * servicetype,
const char * extPort, const char * extPort,
@ -212,7 +266,7 @@ UPNP_GetSpecificPortMappingEntry(const char * controlURL,
* and the sender was not authorized. * and the sender was not authorized.
* 713 SpecifiedArrayIndexInvalid - The specified array index is out of bounds * 713 SpecifiedArrayIndexInvalid - The specified array index is out of bounds
*/ */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetGenericPortMappingEntry(const char * controlURL, UPNP_GetGenericPortMappingEntry(const char * controlURL,
const char * servicetype, const char * servicetype,
const char * index, const char * index,
@ -234,7 +288,7 @@ UPNP_GetGenericPortMappingEntry(const char * controlURL,
* 733 InconsistantParameters - NewStartPort and NewEndPort values are not * 733 InconsistantParameters - NewStartPort and NewEndPort values are not
* consistent. * consistent.
*/ */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetListOfPortMappings(const char * controlURL, UPNP_GetListOfPortMappings(const char * controlURL,
const char * servicetype, const char * servicetype,
const char * startPort, const char * startPort,
@ -244,13 +298,13 @@ UPNP_GetListOfPortMappings(const char * controlURL,
struct PortMappingParserData * data); struct PortMappingParserData * data);
/* IGD:2, functions for service WANIPv6FirewallControl:1 */ /* IGD:2, functions for service WANIPv6FirewallControl:1 */
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetFirewallStatus(const char * controlURL, UPNP_GetFirewallStatus(const char * controlURL,
const char * servicetype, const char * servicetype,
int * firewallEnabled, int * firewallEnabled,
int * inboundPinholeAllowed); int * inboundPinholeAllowed);
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype, UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype,
const char * remoteHost, const char * remoteHost,
const char * remotePort, const char * remotePort,
@ -259,7 +313,7 @@ UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype
const char * proto, const char * proto,
int * opTimeout); int * opTimeout);
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_AddPinhole(const char * controlURL, const char * servicetype, UPNP_AddPinhole(const char * controlURL, const char * servicetype,
const char * remoteHost, const char * remoteHost,
const char * remotePort, const char * remotePort,
@ -269,19 +323,19 @@ UPNP_AddPinhole(const char * controlURL, const char * servicetype,
const char * leaseTime, const char * leaseTime,
char * uniqueID); char * uniqueID);
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_UpdatePinhole(const char * controlURL, const char * servicetype, UPNP_UpdatePinhole(const char * controlURL, const char * servicetype,
const char * uniqueID, const char * uniqueID,
const char * leaseTime); const char * leaseTime);
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_DeletePinhole(const char * controlURL, const char * servicetype, const char * uniqueID); UPNP_DeletePinhole(const char * controlURL, const char * servicetype, const char * uniqueID);
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_CheckPinholeWorking(const char * controlURL, const char * servicetype, UPNP_CheckPinholeWorking(const char * controlURL, const char * servicetype,
const char * uniqueID, int * isWorking); const char * uniqueID, int * isWorking);
LIBSPEC int MINIUPNP_LIBSPEC int
UPNP_GetPinholePackets(const char * controlURL, const char * servicetype, UPNP_GetPinholePackets(const char * controlURL, const char * servicetype,
const char * uniqueID, int * packets); const char * uniqueID, int * packets);

5
external/miniupnpc/upnperrors.c vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: upnperrors.c,v 1.6 2012/03/15 01:02:03 nanard Exp $ */ /* $Id: upnperrors.c,v 1.5 2011/04/10 11:19:36 nanard Exp $ */
/* Project : miniupnp /* Project : miniupnp
* Author : Thomas BERNARD * Author : Thomas BERNARD
* copyright (c) 2007 Thomas Bernard * copyright (c) 2007 Thomas Bernard
@ -24,6 +24,9 @@ const char * strupnperror(int err)
case UPNPCOMMAND_INVALID_ARGS: case UPNPCOMMAND_INVALID_ARGS:
s = "Miniupnpc Invalid Arguments"; s = "Miniupnpc Invalid Arguments";
break; break;
case UPNPCOMMAND_INVALID_RESPONSE:
s = "Miniupnpc Invalid response";
break;
case UPNPDISCOVER_SOCKET_ERROR: case UPNPDISCOVER_SOCKET_ERROR:
s = "Miniupnpc Socket error"; s = "Miniupnpc Socket error";
break; break;

4
external/miniupnpc/upnperrors.h vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: upnperrors.h,v 1.4 2012/09/27 15:42:11 nanard Exp $ */ /* $Id: upnperrors.h,v 1.2 2008/07/02 23:31:15 nanard Exp $ */
/* (c) 2007 Thomas Bernard /* (c) 2007 Thomas Bernard
* All rights reserved. * All rights reserved.
* MiniUPnP Project. * MiniUPnP Project.
@ -17,7 +17,7 @@ extern "C" {
/* strupnperror() /* strupnperror()
* Return a string description of the UPnP error code * Return a string description of the UPnP error code
* or NULL for undefinded errors */ * or NULL for undefinded errors */
LIBSPEC const char * strupnperror(int err); MINIUPNP_LIBSPEC const char * strupnperror(int err);
#ifdef __cplusplus #ifdef __cplusplus
} }

0
external/miniupnpc/upnpreplyparse.c vendored Executable file → Normal file
View file

0
external/miniupnpc/upnpreplyparse.h vendored Executable file → Normal file
View file

2
external/miniupnpc/wingenminiupnpcstrings.c vendored Executable file → Normal file
View file

@ -1,4 +1,4 @@
/* $Id: wingenminiupnpcstrings.c,v 1.3 2012/03/05 19:42:48 nanard Exp $ */ /* $Id: wingenminiupnpcstrings.c,v 1.2 2011/01/11 15:31:13 nanard Exp $ */
/* Project: miniupnp /* Project: miniupnp
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
* Author: Thomas Bernard * Author: Thomas Bernard

View file

@ -60,13 +60,13 @@ add_library(cryptonote_core ${CRYPTONOTE_CORE})
add_executable(daemon ${DAEMON} ${P2P} ${CRYPTONOTE_PROTOCOL}) add_executable(daemon ${DAEMON} ${P2P} ${CRYPTONOTE_PROTOCOL})
add_executable(connectivity_tool ${CONN_TOOL}) add_executable(connectivity_tool ${CONN_TOOL})
add_executable(simpleminer ${MINER}) add_executable(simpleminer ${MINER})
target_link_libraries(daemon rpc cryptonote_core crypto common ${UNBOUND_LIBRARIES} ${UPNP_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) target_link_libraries(daemon rpc cryptonote_core crypto common ${UNBOUND_LIBRARIES} ${UPNP_LIBRARIES} ${Boost_LIBRARIES})
target_link_libraries(connectivity_tool cryptonote_core crypto common ${UNBOUND_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) target_link_libraries(connectivity_tool cryptonote_core crypto common ${UNBOUND_LIBRARIES} ${Boost_LIBRARIES})
target_link_libraries(simpleminer cryptonote_core crypto common ${UNBOUND_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) target_link_libraries(simpleminer cryptonote_core crypto common ${UNBOUND_LIBRARIES} ${Boost_LIBRARIES})
add_library(rpc ${RPC}) add_library(rpc ${RPC})
add_library(wallet ${WALLET}) add_library(wallet ${WALLET})
add_executable(simplewallet ${SIMPLEWALLET} ) add_executable(simplewallet ${SIMPLEWALLET} )
target_link_libraries(simplewallet wallet rpc cryptonote_core crypto common ${UNBOUND_LIBRARIES} ${UPNP_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) target_link_libraries(simplewallet wallet rpc cryptonote_core crypto common ${UNBOUND_LIBRARIES} ${UPNP_LIBRARIES} ${Boost_LIBRARIES})
add_dependencies(daemon version) add_dependencies(daemon version)
add_dependencies(rpc version) add_dependencies(rpc version)
add_dependencies(simplewallet version) add_dependencies(simplewallet version)

View file

@ -31,6 +31,10 @@
#include <sstream> #include <sstream>
#include <unbound.h> #include <unbound.h>
#include <stdlib.h>
#include "include_base_utils.h"
using namespace epee;
namespace tools namespace tools
{ {
@ -206,7 +210,11 @@ std::vector<std::string> DNSResolver::get_txt_record(const std::string& url, boo
{ {
for (size_t i=0; result.ptr->data[i] != NULL; i++) for (size_t i=0; result.ptr->data[i] != NULL; i++)
{ {
records.push_back(result.ptr->data[i]); // plz fix this, but this does NOT work and spills over into parts of memory it shouldn't: records.push_back(result.ptr->data[i]);
char *restxt;
restxt = (char*) calloc(result.ptr->len[i]+1, 1);
memcpy(restxt, result.ptr->data[i]+1, result.ptr->len[i]-1);
records.push_back(restxt);
} }
} }
} }

View file

@ -1794,18 +1794,18 @@ void blockchain_storage::check_against_checkpoints(checkpoints& points, bool enf
continue; continue;
} }
if (!m_checkpoints.check_block(pt.first, get_block_hash(m_blocks[pt.first].bl))) if (!points.check_block(pt.first, get_block_hash(m_blocks[pt.first].bl)))
{ {
// if asked to enforce checkpoints, roll back to a couple of blocks before the checkpoint // if asked to enforce checkpoints, roll back to a couple of blocks before the checkpoint
if (enforce) if (enforce)
{ {
LOG_ERROR("Checkpoint failed when adding new checkpoints, rolling back!"); LOG_ERROR("Local blockchain failed to pass a checkpoint, rolling back!");
std::list<block> empty; std::list<block> empty;
rollback_blockchain_switching(empty, pt.first - 2); rollback_blockchain_switching(empty, pt.first - 2);
} }
else else
{ {
LOG_ERROR("Checkpoint failed when adding new checkpoints, this could be very bad."); LOG_ERROR("WARNING: local blockchain failed to pass a MoneroPulse checkpoint, and you could be on a fork. You should either sync up from scratch, OR download a fresh blockchain bootstrap, OR enable checkpoint enforcing with the --enforce-dns-checkpointing command-line option");
} }
} }
} }

View file

@ -69,7 +69,7 @@ namespace cryptonote
if(it->second == h) if(it->second == h)
{ {
LOG_PRINT_GREEN("CHECKPOINT PASSED FOR HEIGHT " << height << " " << h, LOG_LEVEL_0); LOG_PRINT_GREEN("CHECKPOINT PASSED FOR HEIGHT " << height << " " << h, LOG_LEVEL_1);
return true; return true;
}else }else
{ {

View file

@ -84,14 +84,14 @@ bool load_checkpoints_from_json(cryptonote::checkpoints& checkpoints, std::strin
boost::system::error_code errcode; boost::system::error_code errcode;
if (! (boost::filesystem::exists(json_hashfile_fullpath, errcode))) if (! (boost::filesystem::exists(json_hashfile_fullpath, errcode)))
{ {
LOG_PRINT_L0("Blockchain checkpoints file not found"); LOG_PRINT_L1("Blockchain checkpoints file not found");
return true; return true;
} }
LOG_PRINT_L0("Adding checkpoints from blockchain hashfile"); LOG_PRINT_L1("Adding checkpoints from blockchain hashfile");
uint64_t prev_max_height = checkpoints.get_max_height(); uint64_t prev_max_height = checkpoints.get_max_height();
LOG_PRINT_L0("Hard-coded max checkpoint height is " << prev_max_height); LOG_PRINT_L1("Hard-coded max checkpoint height is " << prev_max_height);
t_hash_json hashes; t_hash_json hashes;
epee::serialization::load_t_from_json_file(hashes, json_hashfile_fullpath); epee::serialization::load_t_from_json_file(hashes, json_hashfile_fullpath);
for (std::vector<t_hashline>::const_iterator it = hashes.hashlines.begin(); it != hashes.hashlines.end(); ) for (std::vector<t_hashline>::const_iterator it = hashes.hashlines.begin(); it != hashes.hashlines.end(); )
@ -99,10 +99,10 @@ bool load_checkpoints_from_json(cryptonote::checkpoints& checkpoints, std::strin
uint64_t height; uint64_t height;
height = it->height; height = it->height;
if (height <= prev_max_height) { if (height <= prev_max_height) {
LOG_PRINT_L0("ignoring checkpoint height " << height); LOG_PRINT_L1("ignoring checkpoint height " << height);
} else { } else {
std::string blockhash = it->hash; std::string blockhash = it->hash;
LOG_PRINT_L0("Adding checkpoint height " << height << ", hash=" << blockhash); LOG_PRINT_L1("Adding checkpoint height " << height << ", hash=" << blockhash);
ADD_CHECKPOINT(height, blockhash); ADD_CHECKPOINT(height, blockhash);
} }
++it; ++it;
@ -113,6 +113,7 @@ bool load_checkpoints_from_json(cryptonote::checkpoints& checkpoints, std::strin
bool load_checkpoints_from_dns(cryptonote::checkpoints& checkpoints) bool load_checkpoints_from_dns(cryptonote::checkpoints& checkpoints)
{ {
// All four MoneroPulse domains have DNSSEC on and valid
static const std::vector<std::string> dns_urls = { "checkpoints.moneropulse.se" static const std::vector<std::string> dns_urls = { "checkpoints.moneropulse.se"
, "checkpoints.moneropulse.org" , "checkpoints.moneropulse.org"
, "checkpoints.moneropulse.net" , "checkpoints.moneropulse.net"
@ -144,13 +145,13 @@ bool load_checkpoints_from_dns(cryptonote::checkpoints& checkpoints)
if (records.size() == 0) if (records.size() == 0)
{ {
LOG_PRINT_L1("Fetching checkpoints from DNS TXT records failed, no TXT records available."); LOG_PRINT_L1("Fetching MoneroPulse checkpoints failed, no TXT records available.");
return true; return true;
} }
if (avail && !valid) if (avail && !valid)
{ {
LOG_PRINT_L0("DNSSEC present and failed validation for query last url, and all other urls either failed validation or returned no records"); LOG_PRINT_L0("WARNING: MoneroPulse failed DNSSEC validation and/or returned no records");
return true; return true;
} }

View file

@ -48,9 +48,11 @@
#ifdef UPNP_STATIC #ifdef UPNP_STATIC
#include <miniupnpc/miniupnpc.h> #include <miniupnpc/miniupnpc.h>
#include <miniupnpc/upnpcommands.h> #include <miniupnpc/upnpcommands.h>
#include <miniupnpc/upnperrors.h>
#else #else
#include "miniupnpc.h" #include "miniupnpc.h"
#include "upnpcommands.h" #include "upnpcommands.h"
#include "upnperrors.h"
#endif #endif
#define NET_MAKE_IP(b1,b2,b3,b4) ((LPARAM)(((DWORD)(b1)<<24)+((DWORD)(b2)<<16)+((DWORD)(b3)<<8)+((DWORD)(b4)))) #define NET_MAKE_IP(b1,b2,b3,b4) ((LPARAM)(((DWORD)(b1)<<24)+((DWORD)(b2)<<16)+((DWORD)(b3)<<8)+((DWORD)(b4))))
@ -326,8 +328,14 @@ namespace nodetool
if (result == 1) { if (result == 1) {
std::ostringstream portString; std::ostringstream portString;
portString << m_listenning_port; portString << m_listenning_port;
if (UPNP_AddPortMapping(urls.controlURL, igdData.first.servicetype, portString.str().c_str(), portString.str().c_str(), lanAddress, CRYPTONOTE_NAME, "TCP", 0, "0") != 0) {
LOG_ERROR("UPNP_AddPortMapping failed."); // Delete the port mapping before we create it, just in case we have dangling port mapping from the daemon not being shut down correctly
UPNP_DeletePortMapping(urls.controlURL, igdData.first.servicetype, portString.str().c_str(), "TCP", 0);
int portMappingResult;
portMappingResult = UPNP_AddPortMapping(urls.controlURL, igdData.first.servicetype, portString.str().c_str(), portString.str().c_str(), lanAddress, CRYPTONOTE_NAME, "TCP", 0, "0");
if (portMappingResult != 0) {
LOG_ERROR("UPNP_AddPortMapping failed, error: " << strupnperror(portMappingResult));
} else { } else {
LOG_PRINT_GREEN("Added IGD port mapping.", LOG_LEVEL_0); LOG_PRINT_GREEN("Added IGD port mapping.", LOG_LEVEL_0);
} }

View file

@ -929,11 +929,11 @@ bool simple_wallet::transfer(const std::vector<std::string> &args_)
std::string dnssec_str; std::string dnssec_str;
if (dnssec_ok) if (dnssec_ok)
{ {
dnssec_str = "DNSSEC validation PASSED!"; dnssec_str = "DNSSEC validation passed";
} }
else else
{ {
dnssec_str = "DNSSEC validation FAILED!"; dnssec_str = "WARNING: DNSSEC validation was unsuccessful, this address may not be correct!";
} }
std::stringstream prompt; std::stringstream prompt;
prompt << "For URL: " << url prompt << "For URL: " << url
@ -947,13 +947,13 @@ bool simple_wallet::transfer(const std::vector<std::string> &args_)
std::string confirm_dns_ok = command_line::input_line(prompt.str()); std::string confirm_dns_ok = command_line::input_line(prompt.str());
if (confirm_dns_ok != "Y" && confirm_dns_ok != "y" && confirm_dns_ok != "Yes" && confirm_dns_ok != "yes") if (confirm_dns_ok != "Y" && confirm_dns_ok != "y" && confirm_dns_ok != "Yes" && confirm_dns_ok != "yes")
{ {
fail_msg_writer() << "User terminated transfer request, disagreed with dns result from url: " << url; fail_msg_writer() << "You have cancelled the transfer request";
return true; return true;
} }
} }
else else
{ {
fail_msg_writer() << "Failed to get a monero address from: " << local_args[i]; fail_msg_writer() << "Failed to get a Monero address from: " << local_args[i];
return true; return true;
} }
} }
@ -963,7 +963,7 @@ bool simple_wallet::transfer(const std::vector<std::string> &args_)
} }
else else
{ {
fail_msg_writer() << "wrong address: " << local_args[i]; fail_msg_writer() << "Wrong address: " << local_args[i];
return true; return true;
} }
} }

View file

@ -61,16 +61,16 @@ add_executable(unit_tests ${UNIT_TESTS})
add_executable(net_load_tests_clt net_load_tests/clt.cpp) add_executable(net_load_tests_clt net_load_tests/clt.cpp)
add_executable(net_load_tests_srv net_load_tests/srv.cpp) add_executable(net_load_tests_srv net_load_tests/srv.cpp)
target_link_libraries(core_proxy cryptonote_core common crypto ${UNBOUND_LIBRARIES} ${UPNP_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) target_link_libraries(core_proxy cryptonote_core common crypto ${UNBOUND_LIBRARIES} ${UPNP_LIBRARIES} ${Boost_LIBRARIES})
target_link_libraries(coretests cryptonote_core common crypto ${UNBOUND_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) target_link_libraries(coretests cryptonote_core common crypto ${UNBOUND_LIBRARIES} ${Boost_LIBRARIES})
target_link_libraries(difficulty-tests cryptonote_core) target_link_libraries(difficulty-tests cryptonote_core)
target_link_libraries(functional_tests cryptonote_core wallet common crypto ${UNBOUND_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) target_link_libraries(functional_tests cryptonote_core wallet common crypto ${UNBOUND_LIBRARIES} ${Boost_LIBRARIES})
target_link_libraries(hash-tests crypto) target_link_libraries(hash-tests crypto)
target_link_libraries(hash-target-tests crypto cryptonote_core) target_link_libraries(hash-target-tests crypto cryptonote_core)
target_link_libraries(performance_tests cryptonote_core common crypto ${UNBOUND_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) target_link_libraries(performance_tests cryptonote_core common crypto ${UNBOUND_LIBRARIES} ${Boost_LIBRARIES})
target_link_libraries(unit_tests gtest_main cryptonote_core wallet crypto common ${UNBOUND_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) target_link_libraries(unit_tests gtest_main cryptonote_core wallet crypto common ${UNBOUND_LIBRARIES} ${Boost_LIBRARIES})
target_link_libraries(net_load_tests_clt cryptonote_core common crypto gtest_main ${UNBOUND_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) target_link_libraries(net_load_tests_clt cryptonote_core common crypto gtest_main ${UNBOUND_LIBRARIES} ${Boost_LIBRARIES})
target_link_libraries(net_load_tests_srv cryptonote_core common crypto gtest_main ${UNBOUND_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) target_link_libraries(net_load_tests_srv cryptonote_core common crypto gtest_main ${UNBOUND_LIBRARIES} ${Boost_LIBRARIES})
if(NOT MSVC) if(NOT MSVC)
set_property(TARGET gtest gtest_main unit_tests net_load_tests_clt net_load_tests_srv APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-undef -Wno-sign-compare") set_property(TARGET gtest gtest_main unit_tests net_load_tests_clt net_load_tests_srv APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-undef -Wno-sign-compare")