diff options
Diffstat (limited to '')
-rw-r--r-- | external/miniupnpc/CMakeLists.txt | 4 | ||||
-rw-r--r-- | external/miniupnpc/listdevices.c | 110 | ||||
-rw-r--r-- | external/miniupnpc/miniupnpc_declspec.h | 21 | ||||
-rwxr-xr-x | external/miniupnpc/pymoduletest3.py | 52 | ||||
-rw-r--r-- | external/miniupnpc/testdesc/linksys_WAG200G_desc.values | 14 | ||||
-rw-r--r-- | external/miniupnpc/testdesc/linksys_WAG200G_desc.xml | 110 | ||||
-rw-r--r-- | external/miniupnpc/testdesc/new_LiveBox_desc.values | 20 | ||||
-rw-r--r-- | external/miniupnpc/testdesc/new_LiveBox_desc.xml | 90 | ||||
-rw-r--r-- | external/miniupnpc/testportlistingparse.c | 151 | ||||
-rw-r--r-- | external/miniupnpc/upnpdev.c | 23 | ||||
-rw-r--r-- | external/miniupnpc/upnpdev.h | 36 |
11 files changed, 629 insertions, 2 deletions
diff --git a/external/miniupnpc/CMakeLists.txt b/external/miniupnpc/CMakeLists.txt index dacb1f692..f6cf592af 100644 --- a/external/miniupnpc/CMakeLists.txt +++ b/external/miniupnpc/CMakeLists.txt @@ -18,7 +18,7 @@ endif() option (UPNPC_BUILD_STATIC "Build static library" TRUE) option (UPNPC_BUILD_SHARED "Build shared library" TRUE) if (NOT WIN32) - option (UPNPC_BUILD_TESTS "Build test executables" TRUE) + option (UPNPC_BUILD_TESTS "Build test executables" FALSE) endif (NOT WIN32) option (NO_GETADDRINFO "Define NO_GETADDRINFO" FALSE) @@ -62,7 +62,7 @@ if (CMAKE_COMPILER_IS_GNUC) endif (NOT CONFIGURED) endif () -configure_file (${CMAKE_SOURCE_DIR}/miniupnpcstrings.h.cmake ${CMAKE_BINARY_DIR}/miniupnpcstrings.h) +configure_file (miniupnpcstrings.h.cmake ${CMAKE_BINARY_DIR}/miniupnpcstrings.h) include_directories (${CMAKE_BINARY_DIR}) set (MINIUPNPC_SOURCES diff --git a/external/miniupnpc/listdevices.c b/external/miniupnpc/listdevices.c new file mode 100644 index 000000000..a72fb8b9f --- /dev/null +++ b/external/miniupnpc/listdevices.c @@ -0,0 +1,110 @@ +/* $Id: listdevices.c,v 1.6 2015/07/23 20:40:08 nanard Exp $ */ +/* Project : miniupnp + * Author : Thomas Bernard + * Copyright (c) 2013-2015 Thomas Bernard + * This software is subject to the conditions detailed in the + * LICENCE file provided in this distribution. */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#ifdef _WIN32 +#include <winsock2.h> +#endif /* _WIN32 */ +#include "miniupnpc.h" + +int main(int argc, char * * argv) +{ + const char * searched_device = NULL; + const char * * searched_devices = NULL; + const char * multicastif = 0; + const char * minissdpdpath = 0; + int ipv6 = 0; + unsigned char ttl = 2; + int error = 0; + struct UPNPDev * devlist = 0; + struct UPNPDev * dev; + int i; + +#ifdef _WIN32 + WSADATA wsaData; + int nResult = WSAStartup(MAKEWORD(2,2), &wsaData); + if(nResult != NO_ERROR) + { + fprintf(stderr, "WSAStartup() failed.\n"); + return -1; + } +#endif + + for(i = 1; i < argc; i++) { + if(strcmp(argv[i], "-6") == 0) + ipv6 = 1; + else if(strcmp(argv[i], "-d") == 0) { + if(++i >= argc) { + fprintf(stderr, "%s option needs one argument\n", "-d"); + return 1; + } + searched_device = argv[i]; + } else if(strcmp(argv[i], "-t") == 0) { + if(++i >= argc) { + fprintf(stderr, "%s option needs one argument\n", "-t"); + return 1; + } + ttl = (unsigned char)atoi(argv[i]); + } else if(strcmp(argv[i], "-l") == 0) { + if(++i >= argc) { + fprintf(stderr, "-l option needs at least one argument\n"); + return 1; + } + searched_devices = (const char * *)(argv + i); + break; + } else if(strcmp(argv[i], "-m") == 0) { + if(++i >= argc) { + fprintf(stderr, "-m option needs one argument\n"); + return 1; + } + multicastif = argv[i]; + } else { + printf("usage : %s [options] [-l <device1> <device2> ...]\n", argv[0]); + printf("options :\n"); + printf(" -6 : use IPv6\n"); + printf(" -m address/ifname : network interface to use for multicast\n"); + printf(" -d <device string> : search only for this type of device\n"); + printf(" -l <device1> <device2> ... : search only for theses types of device\n"); + printf(" -t ttl : set multicast TTL. Default value is 2.\n"); + printf(" -h : this help\n"); + return 1; + } + } + + if(searched_device) { + printf("searching UPnP device type %s\n", searched_device); + devlist = upnpDiscoverDevice(searched_device, + 2000, multicastif, minissdpdpath, + 0/*localport*/, ipv6, ttl, &error); + } else if(searched_devices) { + printf("searching UPnP device types :\n"); + for(i = 0; searched_devices[i]; i++) + printf("\t%s\n", searched_devices[i]); + devlist = upnpDiscoverDevices(searched_devices, + 2000, multicastif, minissdpdpath, + 0/*localport*/, ipv6, ttl, &error, 1); + } else { + printf("searching all UPnP devices\n"); + devlist = upnpDiscoverAll(2000, multicastif, minissdpdpath, + 0/*localport*/, ipv6, ttl, &error); + } + if(devlist) { + for(dev = devlist, i = 1; dev != NULL; dev = dev->pNext, i++) { + printf("%3d: %-48s\n", i, dev->st); + printf(" %s\n", dev->descURL); + printf(" %s\n", dev->usn); + } + freeUPNPDevlist(devlist); + } else { + printf("no device found.\n"); + } + + return 0; +} + diff --git a/external/miniupnpc/miniupnpc_declspec.h b/external/miniupnpc/miniupnpc_declspec.h new file mode 100644 index 000000000..40adb922e --- /dev/null +++ b/external/miniupnpc/miniupnpc_declspec.h @@ -0,0 +1,21 @@ +#ifndef MINIUPNPC_DECLSPEC_H_INCLUDED +#define MINIUPNPC_DECLSPEC_H_INCLUDED + +#if defined(_WIN32) && !defined(MINIUPNP_STATICLIB) + /* for windows dll */ + #ifdef MINIUPNP_EXPORTS + #define MINIUPNP_LIBSPEC __declspec(dllexport) + #else + #define MINIUPNP_LIBSPEC __declspec(dllimport) + #endif +#else + #if defined(__GNUC__) && __GNUC__ >= 4 + /* fix dynlib for OS X 10.9.2 and Apple LLVM version 5.0 */ + #define MINIUPNP_LIBSPEC __attribute__ ((visibility ("default"))) + #else + #define MINIUPNP_LIBSPEC + #endif +#endif + +#endif /* MINIUPNPC_DECLSPEC_H_INCLUDED */ + diff --git a/external/miniupnpc/pymoduletest3.py b/external/miniupnpc/pymoduletest3.py new file mode 100755 index 000000000..d4cf1e22f --- /dev/null +++ b/external/miniupnpc/pymoduletest3.py @@ -0,0 +1,52 @@ +#! /usr/bin/python3 +# MiniUPnP project +# Author : Thomas Bernard +# This Sample code is public domain. +# website : http://miniupnp.tuxfamily.org/ + +# import the python miniupnpc module +import miniupnpc +import sys + +# create the object +u = miniupnpc.UPnP() +print('inital(default) values :') +print(' discoverdelay', u.discoverdelay) +print(' lanaddr', u.lanaddr) +print(' multicastif', u.multicastif) +print(' minissdpdsocket', u.minissdpdsocket) +u.discoverdelay = 200; +#u.minissdpdsocket = '../minissdpd/minissdpd.sock' +# discovery process, it usualy takes several seconds (2 seconds or more) +print('Discovering... delay=%ums' % u.discoverdelay) +print(u.discover(), 'device(s) detected') +# select an igd +try: + u.selectigd() +except Exception as e: + print('Exception :', e) + sys.exit(1) +# display information about the IGD and the internet connection +print('local ip address :', u.lanaddr) +print('external ip address :', u.externalipaddress()) +print(u.statusinfo(), u.connectiontype()) + +#print u.addportmapping(64000, 'TCP', +# '192.168.1.166', 63000, 'port mapping test', '') +#print u.deleteportmapping(64000, 'TCP') + +port = 0 +proto = 'UDP' +# list the redirections : +i = 0 +while True: + p = u.getgenericportmapping(i) + if p==None: + break + print(i, p) + (port, proto, (ihost,iport), desc, c, d, e) = p + #print port, desc + i = i + 1 + +print(u.getspecificportmapping(port, proto)) + diff --git a/external/miniupnpc/testdesc/linksys_WAG200G_desc.values b/external/miniupnpc/testdesc/linksys_WAG200G_desc.values new file mode 100644 index 000000000..cf4222187 --- /dev/null +++ b/external/miniupnpc/testdesc/linksys_WAG200G_desc.values @@ -0,0 +1,14 @@ +# values for linksys_WAG200G_desc.xml + +CIF: + servicetype = urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1 + controlurl = /upnp/control/WANCommonIFC1 + eventsuburl = /upnp/event/WANCommonIFC1 + scpdurl = /cmnicfg.xml + +first: + servicetype = urn:schemas-upnp-org:service:WANPPPConnection:1 + controlurl = /upnp/control/WANPPPConn1 + eventsuburl = /upnp/event/WANPPPConn1 + scpdurl = /pppcfg.xml + diff --git a/external/miniupnpc/testdesc/linksys_WAG200G_desc.xml b/external/miniupnpc/testdesc/linksys_WAG200G_desc.xml new file mode 100644 index 000000000..d428d73b0 --- /dev/null +++ b/external/miniupnpc/testdesc/linksys_WAG200G_desc.xml @@ -0,0 +1,110 @@ +<?xml version="1.0"?> +<root xmlns="urn:schemas-upnp-org:device-1-0"> +<specVersion> +<major>1</major> +<minor>0</minor> +</specVersion> +<URLBase>http://192.168.1.1:49152</URLBase> +<device> +<deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType> +<friendlyName>LINKSYS WAG200G Gateway</friendlyName> +<manufacturer>LINKSYS</manufacturer> +<manufacturerURL>http://www.linksys.com</manufacturerURL> +<modelDescription>LINKSYS WAG200G Gateway</modelDescription> +<modelName>Wireless-G ADSL Home Gateway</modelName> +<modelNumber>WAG200G</modelNumber> +<modelURL>http://www.linksys.com</modelURL> +<serialNumber>123456789</serialNumber> +<UDN>uuid:8ca2eb37-1dd2-11b2-86f1-001a709b5aa8</UDN> +<UPC>WAG200G</UPC> +<serviceList> +<service> +<serviceType>urn:schemas-upnp-org:service:Layer3Forwarding:1</serviceType> +<serviceId>urn:upnp-org:serviceId:L3Forwarding1</serviceId> +<controlURL>/upnp/control/L3Forwarding1</controlURL> +<eventSubURL>/upnp/event/L3Forwarding1</eventSubURL> +<SCPDURL>/l3frwd.xml</SCPDURL> +</service> +</serviceList> +<deviceList> +<device> +<deviceType>urn:schemas-upnp-org:device:WANDevice:1</deviceType> +<friendlyName>WANDevice</friendlyName> +<manufacturer>LINKSYS</manufacturer> +<manufacturerURL>http://www.linksys.com/</manufacturerURL> +<modelDescription>Residential Gateway</modelDescription> +<modelName>Internet Connection Sharing</modelName> +<modelNumber>1</modelNumber> +<modelURL>http://www.linksys.com/</modelURL> +<serialNumber>0000001</serialNumber> +<UDN>uuid:8ca2eb36-1dd2-11b2-86f1-001a709b5aa8</UDN> +<UPC>WAG200G</UPC> +<serviceList> +<service> +<serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType> +<serviceId>urn:upnp-org:serviceId:WANCommonIFC1</serviceId> +<controlURL>/upnp/control/WANCommonIFC1</controlURL> +<eventSubURL>/upnp/event/WANCommonIFC1</eventSubURL> +<SCPDURL>/cmnicfg.xml</SCPDURL> +</service> +</serviceList> +<deviceList> +<device> +<deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:1</deviceType> +<friendlyName>WANConnectionDevice</friendlyName> +<manufacturer>LINKSYS</manufacturer> +<manufacturerURL>http://www.linksys.com/</manufacturerURL> +<modelDescription>Residential Gateway</modelDescription> +<modelName>Internet Connection Sharing</modelName> +<modelNumber>1</modelNumber> +<modelURL>http://www.linksys.com/</modelURL> +<serialNumber>0000001</serialNumber> +<UDN>uuid:8ca2eb37-1dd2-11b2-86f0-001a709b5aa8</UDN> +<UPC>WAG200G</UPC> +<serviceList> +<service> +<serviceType>urn:schemas-upnp-org:service:WANEthernetLinkConfig:1</serviceType> +<serviceId>urn:upnp-org:serviceId:WANEthLinkC1</serviceId> +<controlURL>/upnp/control/WANEthLinkC1</controlURL> +<eventSubURL>/upnp/event/WANEthLinkC1</eventSubURL> +<SCPDURL>/wanelcfg.xml</SCPDURL> +</service> +<service> +<serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType> +<serviceId>urn:upnp-org:serviceId:WANPPPConn1</serviceId> +<controlURL>/upnp/control/WANPPPConn1</controlURL> +<eventSubURL>/upnp/event/WANPPPConn1</eventSubURL> +<SCPDURL>/pppcfg.xml</SCPDURL> +</service> +</serviceList> +</device> +</deviceList> +</device> +<device> +<deviceType>urn:schemas-upnp-org:device:LANDevice:1</deviceType> +<friendlyName>LANDevice</friendlyName> +<manufacturer>LINKSYS</manufacturer> +<manufacturerURL>http://www.linksys.com/</manufacturerURL> +<modelDescription>Residential Gateway</modelDescription> +<modelName>Residential Gateway</modelName> +<modelNumber>1</modelNumber> +<modelURL>http://www.linksys.com/</modelURL> +<serialNumber>0000001</serialNumber> +<UDN>uuid:8ca2eb36-1dd2-11b2-86f0-001a709b5aa +8</UDN> +<UPC>WAG200G</UPC> +<serviceList> +<service> +<serviceType>urn:schemas-upnp-org:service:LANHostConfigManagement:1</serviceType> +<serviceId>urn:upnp-org:serviceId:LANHostCfg1</serviceId> +<controlURL>/upnp/control/LANHostCfg1</controlURL> +<eventSubURL>/upnp/event/LANHostCfg1</eventSubURL> +<SCPDURL>/lanhostc.xml</SCPDURL> +</service> +</serviceList> +</device> +</deviceList> +<presentationURL>http://192.168.1.1/index.htm</presentationURL> +</device> +</root> + diff --git a/external/miniupnpc/testdesc/new_LiveBox_desc.values b/external/miniupnpc/testdesc/new_LiveBox_desc.values new file mode 100644 index 000000000..c55552e58 --- /dev/null +++ b/external/miniupnpc/testdesc/new_LiveBox_desc.values @@ -0,0 +1,20 @@ +# values for new_LiveBox_desc.xml + +CIF: + servicetype = urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1 + controlurl = /87895a19/upnp/control/WANCommonIFC1 + eventsuburl = /87895a19/upnp/control/WANCommonIFC1 + scpdurl = /87895a19/gateicfgSCPD.xml + +first: + servicetype = urn:schemas-upnp-org:service:WANPPPConnection:2 + controlurl = /87895a19/upnp/control/WANIPConn1 + eventsuburl = /87895a19/upnp/control/WANIPConn1 + scpdurl = /87895a19/gateconnSCPD_PPP.xml + +IPv6FC: + servicetype = urn:schemas-upnp-org:service:WANIPv6FirewallControl:1 + controlurl = /87895a19/upnp/control/WANIPv6FwCtrl1 + eventsuburl = /87895a19/upnp/control/WANIPv6FwCtrl1 + scpdurl = /87895a19/wanipv6fwctrlSCPD.xml + diff --git a/external/miniupnpc/testdesc/new_LiveBox_desc.xml b/external/miniupnpc/testdesc/new_LiveBox_desc.xml new file mode 100644 index 000000000..620eb55af --- /dev/null +++ b/external/miniupnpc/testdesc/new_LiveBox_desc.xml @@ -0,0 +1,90 @@ +<?xml version="1.0"?>
+<root xmlns="urn:schemas-upnp-org:device-1-0">
+ <specVersion>
+ <major>1</major>
+ <minor>0</minor>
+ </specVersion>
+ <device>
+ <pnpx:X_hardwareId xmlns:pnpx="http://schemas.microsoft.com/windows/pnpx/2005/11">VEN_0129&DEV_0000&SUBSYS_03&REV_250417</pnpx:X_hardwareId>
+ <pnpx:X_compatibleId xmlns:pnpx="http://schemas.microsoft.com/windows/pnpx/2005/11">GenericUmPass</pnpx:X_compatibleId>
+ <pnpx:X_deviceCategory xmlns:pnpx="http://schemas.microsoft.com/windows/pnpx/2005/11">NetworkInfrastructure.Gateway</pnpx:X_deviceCategory>
+ <df:X_deviceCategory xmlns:df="http://schemas.microsoft.com/windows/2008/09/devicefoundation">Network.Gateway</df:X_deviceCategory>
+ <deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:2</deviceType>
+ <friendlyName>Orange Livebox</friendlyName>
+ <manufacturer>Sagemcom</manufacturer>
+ <manufacturerURL>http://www.sagemcom.com/</manufacturerURL>
+ <modelName>Residential Livebox,(DSL,WAN Ethernet)</modelName>
+ <UDN>uuid:87895a19-50f9-3736-a87f-115c230155f8</UDN>
+ <modelDescription>Sagemcom,fr,SG30_sip-fr-4.28.35.1</modelDescription>
+ <modelNumber>3</modelNumber>
+ <serialNumber>LK14129DP441489</serialNumber>
+ <presentationURL>http://192.168.1.1</presentationURL>
+ <UPC></UPC>
+ <iconList>
+ <icon>
+ <mimetype>image/png</mimetype>
+ <width>16</width>
+ <height>16</height>
+ <depth>8</depth>
+ <url>/87895a19/ligd.png</url>
+ </icon>
+ </iconList>
+ <deviceList>
+ <device>
+ <deviceType>urn:schemas-upnp-org:device:WANDevice:2</deviceType>
+ <friendlyName>WANDevice</friendlyName>
+ <manufacturer>Sagemcom</manufacturer>
+ <manufacturerURL>http://www.sagemcom.com/</manufacturerURL>
+ <modelDescription>WAN Device on Sagemcom,fr,SG30_sip-fr-4.28.35.1</modelDescription>
+ <modelName>Residential Livebox,(DSL,WAN Ethernet)</modelName>
+ <modelNumber>3</modelNumber>
+ <modelURL>http://www.sagemcom.com/</modelURL>
+ <serialNumber>LK14129DP441489</serialNumber>
+ <presentationURL>http://192.168.1.1</presentationURL>
+ <UDN>uuid:e2397374-53d8-3fc6-8306-593ba1a34625</UDN>
+ <UPC></UPC>
+ <serviceList>
+ <service>
+ <serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType>
+ <serviceId>urn:upnp-org:serviceId:WANCommonIFC1</serviceId>
+ <controlURL>/87895a19/upnp/control/WANCommonIFC1</controlURL>
+ <eventSubURL>/87895a19/upnp/control/WANCommonIFC1</eventSubURL>
+ <SCPDURL>/87895a19/gateicfgSCPD.xml</SCPDURL>
+ </service>
+ </serviceList>
+ <deviceList>
+ <device>
+ <deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:2</deviceType>
+ <friendlyName>WANConnectionDevice</friendlyName>
+ <manufacturer>Sagemcom</manufacturer>
+ <manufacturerURL>http://www.sagemcom.com/</manufacturerURL>
+ <modelDescription>WanConnectionDevice on Sagemcom,fr,SG30_sip-fr-4.28.35.1</modelDescription>
+ <modelName>Residential Livebox,(DSL,WAN Ethernet)</modelName>
+ <modelNumber>3</modelNumber>
+ <modelURL>http://www.sagemcom.com/</modelURL>
+ <serialNumber>LK14129DP441489</serialNumber>
+ <presentationURL>http://192.168.1.1</presentationURL>
+ <UDN>uuid:44598a08-288e-32c9-8a4d-d3c008ede331</UDN>
+ <UPC></UPC>
+ <serviceList>
+ <service>
+ <serviceType>urn:schemas-upnp-org:service:WANPPPConnection:2</serviceType>
+ <serviceId>urn:upnp-org:serviceId:WANIPConn1</serviceId>
+ <controlURL>/87895a19/upnp/control/WANIPConn1</controlURL>
+ <eventSubURL>/87895a19/upnp/control/WANIPConn1</eventSubURL>
+ <SCPDURL>/87895a19/gateconnSCPD_PPP.xml</SCPDURL>
+ </service>
+ <service>
+ <serviceType>urn:schemas-upnp-org:service:WANIPv6FirewallControl:1</serviceType>
+ <serviceId>urn:upnp-org:serviceId:WANIPv6FwCtrl1</serviceId>
+ <controlURL>/87895a19/upnp/control/WANIPv6FwCtrl1</controlURL>
+ <eventSubURL>/87895a19/upnp/control/WANIPv6FwCtrl1</eventSubURL>
+ <SCPDURL>/87895a19/wanipv6fwctrlSCPD.xml</SCPDURL>
+ </service>
+ </serviceList>
+ </device>
+ </deviceList>
+ </device>
+ </deviceList>
+ </device>
+</root>
\ No newline at end of file diff --git a/external/miniupnpc/testportlistingparse.c b/external/miniupnpc/testportlistingparse.c new file mode 100644 index 000000000..bd9247dca --- /dev/null +++ b/external/miniupnpc/testportlistingparse.c @@ -0,0 +1,151 @@ +/* $Id: testportlistingparse.c,v 1.2 2014/11/01 10:37:32 nanard Exp $ */ +/* Project : miniupnp + * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ + * Author : Thomas Bernard + * Copyright (c) 2014 Thomas Bernard + * This software is subject to the conditions detailed in the + * LICENCE file provided in this distribution. + * */ + +#include <string.h> +#include <stdio.h> +#include "portlistingparse.h" + +struct port_mapping { + unsigned int leasetime; + unsigned short externalport; + unsigned short internalport; + const char * remotehost; + const char * client; + const char * proto; + const char * desc; + unsigned char enabled; +}; + +/* return the number of differences */ +int test(const char * portListingXml, int portListingXmlLen, + const struct port_mapping * ref, int count) +{ + int i; + int r = 0; + struct PortMappingParserData data; + struct PortMapping * pm; + + memset(&data, 0, sizeof(data)); + ParsePortListing(portListingXml, portListingXmlLen, &data); + for(i = 0, pm = data.l_head; + (pm != NULL) && (i < count); + i++, pm = pm->l_next) { + printf("%2d %s %5hu->%s:%-5hu '%s' '%s' %u\n", + i, pm->protocol, pm->externalPort, pm->internalClient, + pm->internalPort, + pm->description, pm->remoteHost, + (unsigned)pm->leaseTime); + if(0 != strcmp(pm->protocol, ref[i].proto)) { + printf("protocol : '%s' != '%s'\n", pm->protocol, ref[i].proto); + r++; + } + if(pm->externalPort != ref[i].externalport) { + printf("externalPort : %hu != %hu\n", + pm->externalPort, ref[i].externalport); + r++; + } + if(0 != strcmp(pm->internalClient, ref[i].client)) { + printf("client : '%s' != '%s'\n", + pm->internalClient, ref[i].client); + r++; + } + if(pm->internalPort != ref[i].internalport) { + printf("internalPort : %hu != %hu\n", + pm->internalPort, ref[i].internalport); + r++; + } + if(0 != strcmp(pm->description, ref[i].desc)) { + printf("description : '%s' != '%s'\n", + pm->description, ref[i].desc); + r++; + } + if(0 != strcmp(pm->remoteHost, ref[i].remotehost)) { + printf("remoteHost : '%s' != '%s'\n", + pm->remoteHost, ref[i].remotehost); + r++; + } + if((unsigned)pm->leaseTime != ref[i].leasetime) { + printf("leaseTime : %u != %u\n", + (unsigned)pm->leaseTime, ref[i].leasetime); + r++; + } + if(pm->enabled != ref[i].enabled) { + printf("enabled : %d != %d\n", + (int)pm->enabled, (int)ref[i].enabled); + r++; + } + } + if((i != count) || (pm != NULL)) { + printf("count mismatch : i=%d count=%d pm=%p\n", i, count, pm); + r++; + } + FreePortListing(&data); + return r; +} + +const char test_document[] = +"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"<p:PortMappingList xmlns:p=\"urn:schemas-upnp-org:gw:WANIPConnection\"\n" +"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n" +"xsi:schemaLocation=\"urn:schemas-upnp-org:gw:WANIPConnection " +"http://www.upnp.org/schemas/gw/WANIPConnection-v2.xsd\">\n" +" <p:PortMappingEntry>\n" +" <p:NewRemoteHost></p:NewRemoteHost>\n" +" <p:NewExternalPort>5002</p:NewExternalPort>\n" +" <p:NewProtocol>UDP</p:NewProtocol>\n" +" <p:NewInternalPort>4001</p:NewInternalPort>\n" +" <p:NewInternalClient>192.168.1.123</p:NewInternalClient>\n" +" <p:NewEnabled>1</p:NewEnabled>\n" +" <p:NewDescription>xxx</p:NewDescription>\n" +" <p:NewLeaseTime>0</p:NewLeaseTime>\n" +" </p:PortMappingEntry>\n" +" <p:PortMappingEntry>\n" +" <p:NewRemoteHost>202.233.2.1</p:NewRemoteHost>\n" +" <p:NewExternalPort>2345</p:NewExternalPort>\n" +" <p:NewProtocol>TCP</p:NewProtocol>\n" +" <p:NewInternalPort>2349</p:NewInternalPort>\n" +" <p:NewInternalClient>192.168.1.137</p:NewInternalClient>\n" +" <p:NewEnabled>1</p:NewEnabled>\n" +" <p:NewDescription>dooom</p:NewDescription>\n" +" <p:NewLeaseTime>346</p:NewLeaseTime>\n" +" </p:PortMappingEntry>\n" +" <p:PortMappingEntry>\n" +" <p:NewRemoteHost>134.231.2.11</p:NewRemoteHost>\n" +" <p:NewExternalPort>12345</p:NewExternalPort>\n" +" <p:NewProtocol>TCP</p:NewProtocol>\n" +" <p:NewInternalPort>12345</p:NewInternalPort>\n" +" <p:NewInternalClient>192.168.1.137</p:NewInternalClient>\n" +" <p:NewEnabled>1</p:NewEnabled>\n" +" <p:NewDescription>dooom A</p:NewDescription>\n" +" <p:NewLeaseTime>347</p:NewLeaseTime>\n" +" </p:PortMappingEntry>\n" +"</p:PortMappingList>"; + +#define PORT_MAPPINGS_COUNT 3 +const struct port_mapping port_mappings[PORT_MAPPINGS_COUNT] = { +{347, 12345, 12345, "134.231.2.11", "192.168.1.137", "TCP", "dooom A", 1}, +{346, 2345, 2349, "202.233.2.1", "192.168.1.137", "TCP", "dooom", 1}, +{0, 5002, 4001, "", "192.168.1.123", "UDP", "xxx", 1} +}; + +/* --- main --- */ +int main(void) +{ + int r; + r = test(test_document, sizeof(test_document) - 1, + port_mappings, PORT_MAPPINGS_COUNT); + if(r == 0) { + printf("test of portlistingparse OK\n"); + return 0; + } else { + printf("test FAILED (%d differences counted)\n", r); + return 1; + } +} + diff --git a/external/miniupnpc/upnpdev.c b/external/miniupnpc/upnpdev.c new file mode 100644 index 000000000..d89a9934c --- /dev/null +++ b/external/miniupnpc/upnpdev.c @@ -0,0 +1,23 @@ +/* $Id: upnpdev.c,v 1.1 2015/08/28 12:14:19 nanard Exp $ */ +/* Project : miniupnp + * Web : http://miniupnp.free.fr/ + * Author : Thomas BERNARD + * copyright (c) 2005-2015 Thomas Bernard + * This software is subjet to the conditions detailed in the + * provided LICENSE file. */ +#include <stdlib.h> +#include "upnpdev.h" + +/* freeUPNPDevlist() should be used to + * free the chained list returned by upnpDiscover() */ +void freeUPNPDevlist(struct UPNPDev * devlist) +{ + struct UPNPDev * next; + while(devlist) + { + next = devlist->pNext; + free(devlist); + devlist = next; + } +} + diff --git a/external/miniupnpc/upnpdev.h b/external/miniupnpc/upnpdev.h new file mode 100644 index 000000000..f49fbe17c --- /dev/null +++ b/external/miniupnpc/upnpdev.h @@ -0,0 +1,36 @@ +/* $Id: upnpdev.h,v 1.1 2015/08/28 12:14:19 nanard Exp $ */ +/* Project : miniupnp + * Web : http://miniupnp.free.fr/ + * Author : Thomas BERNARD + * copyright (c) 2005-2015 Thomas Bernard + * This software is subjet to the conditions detailed in the + * provided LICENSE file. */ +#ifndef UPNPDEV_H_INCLUDED +#define UPNPDEV_H_INCLUDED + +#include "miniupnpc_declspec.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct UPNPDev { + struct UPNPDev * pNext; + char * descURL; + char * st; + unsigned int scope_id; + char * usn; + char buffer[3]; +}; + +/* freeUPNPDevlist() + * free list returned by upnpDiscover() */ +MINIUPNP_LIBSPEC void freeUPNPDevlist(struct UPNPDev * devlist); + + +#ifdef __cplusplus +} +#endif + + +#endif /* UPNPDEV_H_INCLUDED */ |