Browse Source

Update miniupnpc library to latest master

(cherry picked from commit 78907d91f140dd047a2eebb2736ed1762897003d)
Fabio Alessandrelli 6 years ago
parent
commit
eb29bd988c
41 changed files with 196 additions and 743 deletions
  1. 2 1
      modules/upnp/SCsub
  2. 5 1
      thirdparty/README.md
  3. 2 2
      thirdparty/miniupnpc/LICENSE
  4. 0 45
      thirdparty/miniupnpc/miniupnpc.def
  5. 0 153
      thirdparty/miniupnpc/miniupnpc.h
  6. 0 0
      thirdparty/miniupnpc/miniupnpc/codelength.h
  7. 39 23
      thirdparty/miniupnpc/miniupnpc/connecthostport.c
  8. 0 0
      thirdparty/miniupnpc/miniupnpc/connecthostport.h
  9. 0 0
      thirdparty/miniupnpc/miniupnpc/igd_desc_parse.c
  10. 0 0
      thirdparty/miniupnpc/miniupnpc/igd_desc_parse.h
  11. 0 0
      thirdparty/miniupnpc/miniupnpc/listdevices.c
  12. 1 8
      thirdparty/miniupnpc/miniupnpc/minisoap.c
  13. 0 0
      thirdparty/miniupnpc/miniupnpc/minisoap.h
  14. 49 52
      thirdparty/miniupnpc/miniupnpc/minissdpc.c
  15. 3 3
      thirdparty/miniupnpc/miniupnpc/minissdpc.h
  16. 13 24
      thirdparty/miniupnpc/miniupnpc/miniupnpc.c
  17. 0 0
      thirdparty/miniupnpc/miniupnpc/miniupnpc_declspec.h
  18. 7 0
      thirdparty/miniupnpc/miniupnpc/miniupnpc_socketdef.h
  19. 26 8
      thirdparty/miniupnpc/miniupnpc/miniupnpcmodule.c
  20. 0 0
      thirdparty/miniupnpc/miniupnpc/miniupnpcstrings.h
  21. 0 0
      thirdparty/miniupnpc/miniupnpc/miniupnpctypes.h
  22. 4 5
      thirdparty/miniupnpc/miniupnpc/miniwget.c
  23. 0 0
      thirdparty/miniupnpc/miniupnpc/miniwget_private.h
  24. 0 0
      thirdparty/miniupnpc/miniupnpc/minixml.c
  25. 1 1
      thirdparty/miniupnpc/miniupnpc/minixml.h
  26. 0 0
      thirdparty/miniupnpc/miniupnpc/minixmlvalid.c
  27. 0 0
      thirdparty/miniupnpc/miniupnpc/portlistingparse.c
  28. 0 0
      thirdparty/miniupnpc/miniupnpc/portlistingparse.h
  29. 0 0
      thirdparty/miniupnpc/miniupnpc/receivedata.c
  30. 0 0
      thirdparty/miniupnpc/miniupnpc/receivedata.h
  31. 2 2
      thirdparty/miniupnpc/miniupnpc/upnpc.c
  32. 30 33
      thirdparty/miniupnpc/miniupnpc/upnpcommands.c
  33. 3 3
      thirdparty/miniupnpc/miniupnpc/upnpcommands.h
  34. 0 0
      thirdparty/miniupnpc/miniupnpc/upnpdev.c
  35. 0 0
      thirdparty/miniupnpc/miniupnpc/upnpdev.h
  36. 6 2
      thirdparty/miniupnpc/miniupnpc/upnperrors.c
  37. 0 0
      thirdparty/miniupnpc/miniupnpc/upnperrors.h
  38. 3 2
      thirdparty/miniupnpc/miniupnpc/upnpreplyparse.c
  39. 0 0
      thirdparty/miniupnpc/miniupnpc/upnpreplyparse.h
  40. 0 27
      thirdparty/miniupnpc/miniwget.h
  41. 0 348
      thirdparty/miniupnpc/upnpcommands.h

+ 2 - 1
modules/upnp/SCsub

@@ -23,10 +23,11 @@ if env['builtin_miniupnpc']:
         "portlistingparse.c",
         "portlistingparse.c",
         "upnpreplyparse.c",
         "upnpreplyparse.c",
     ]
     ]
-    thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources]
+    thirdparty_sources = [thirdparty_dir + "miniupnpc/" + file for file in thirdparty_sources]
 
 
     env_upnp.Append(CPPPATH=[thirdparty_dir])
     env_upnp.Append(CPPPATH=[thirdparty_dir])
     env_upnp.Append(CPPFLAGS=["-DMINIUPNP_STATICLIB"])
     env_upnp.Append(CPPFLAGS=["-DMINIUPNP_STATICLIB"])
+    env_upnp.Append(CPPFLAGS=["-DMINIUPNPC_SET_SOCKET_TIMEOUT"])
 
 
     env_thirdparty = env_upnp.Clone()
     env_thirdparty = env_upnp.Clone()
     env_thirdparty.disable_warnings()
     env_thirdparty.disable_warnings()

+ 5 - 1
thirdparty/README.md

@@ -297,9 +297,13 @@ File extracted from upstream release tarball `mbedtls-2.16.0-apache.tgz`:
 ## miniupnpc
 ## miniupnpc
 
 
 - Upstream: https://github.com/miniupnp/miniupnp/tree/master/miniupnpc
 - Upstream: https://github.com/miniupnp/miniupnp/tree/master/miniupnpc
-- Version: git (25615e0, 2018)
+- Version: git (3cf6efa, 2019)
 - License: BSD-3-Clause
 - License: BSD-3-Clause
 
 
+Extract only the `miniupnpc` folder inside `thirdparty/miniupnpc`.
+Exclude all non `.c` and `.h` files, plus all files beginning with `test`
+`minihttptestserver.c` and `wingenminiupnpcstrings.c`.
+
 The only modified file is miniupnpcstrings.h, which was created for Godot
 The only modified file is miniupnpcstrings.h, which was created for Godot
 (it is usually autogenerated by cmake).
 (it is usually autogenerated by cmake).
 
 

+ 2 - 2
thirdparty/miniupnpc/LICENSE

@@ -1,5 +1,5 @@
-MiniUPnPc
-Copyright (c) 2005-2016, Thomas BERNARD
+MiniUPnP Project
+Copyright (c) 2005-2019, 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 - 45
thirdparty/miniupnpc/miniupnpc.def

@@ -1,45 +0,0 @@
-LIBRARY
-; miniupnpc library
-   miniupnpc
-
-EXPORTS
-; miniupnpc
-   upnpDiscover
-   freeUPNPDevlist
-   parserootdesc
-   UPNP_GetValidIGD
-   UPNP_GetIGDFromUrl
-   GetUPNPUrls
-   FreeUPNPUrls
-; miniwget
-   miniwget
-   miniwget_getaddr
-; upnpcommands
-   UPNP_GetTotalBytesSent
-   UPNP_GetTotalBytesReceived
-   UPNP_GetTotalPacketsSent
-   UPNP_GetTotalPacketsReceived
-   UPNP_GetStatusInfo
-   UPNP_GetConnectionTypeInfo
-   UPNP_GetExternalIPAddress
-   UPNP_GetLinkLayerMaxBitRates
-   UPNP_AddPortMapping
-   UPNP_AddAnyPortMapping
-   UPNP_DeletePortMapping
-   UPNP_DeletePortMappingRange
-   UPNP_GetPortMappingNumberOfEntries
-   UPNP_GetSpecificPortMappingEntry
-   UPNP_GetGenericPortMappingEntry
-   UPNP_GetListOfPortMappings
-   UPNP_AddPinhole
-   UPNP_CheckPinholeWorking
-   UPNP_UpdatePinhole
-   UPNP_GetPinholePackets
-   UPNP_DeletePinhole
-   UPNP_GetFirewallStatus
-   UPNP_GetOutboundPinholeTimeout
-; upnperrors
-   strupnperror
-; portlistingparse
-   ParsePortListing
-   FreePortListing

+ 0 - 153
thirdparty/miniupnpc/miniupnpc.h

@@ -1,153 +0,0 @@
-/* $Id: miniupnpc.h,v 1.53 2018/05/07 11:05:16 nanard Exp $ */
-/* vim: tabstop=4 shiftwidth=4 noexpandtab
- * Project: miniupnp
- * http://miniupnp.free.fr/
- * Author: Thomas Bernard
- * Copyright (c) 2005-2018 Thomas Bernard
- * This software is subjects to the conditions detailed
- * in the LICENCE file provided within this distribution */
-#ifndef MINIUPNPC_H_INCLUDED
-#define MINIUPNPC_H_INCLUDED
-
-#include "miniupnpc_declspec.h"
-#include "igd_desc_parse.h"
-#include "upnpdev.h"
-
-/* error codes : */
-#define UPNPDISCOVER_SUCCESS (0)
-#define UPNPDISCOVER_UNKNOWN_ERROR (-1)
-#define UPNPDISCOVER_SOCKET_ERROR (-101)
-#define UPNPDISCOVER_MEMORY_ERROR (-102)
-
-/* versions : */
-#define MINIUPNPC_VERSION	"2.1"
-#define MINIUPNPC_API_VERSION	17
-
-/* Source port:
-   Using "1" as an alias for 1900 for backwards compatibility
-   (presuming one would have used that for the "sameport" parameter) */
-#define UPNP_LOCAL_PORT_ANY     0
-#define UPNP_LOCAL_PORT_SAME    1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Structures definitions : */
-struct UPNParg { const char * elt; const char * val; };
-
-char *
-simpleUPnPcommand(int, const char *, const char *,
-                  const char *, struct UPNParg *,
-                  int *);
-
-/* upnpDiscover()
- * discover UPnP devices on the network.
- * The discovered devices are returned as a chained list.
- * It is up to the caller to free the list with freeUPNPDevlist().
- * delay (in millisecond) is the maximum time for waiting any device
- * response.
- * If available, device list will be obtained from MiniSSDPd.
- * Default path for minissdpd socket will be used if minissdpdsock argument
- * is NULL.
- * If multicastif is not NULL, it will be used instead of the default
- * multicast interface for sending SSDP discover packets.
- * If localport is set to UPNP_LOCAL_PORT_SAME(1) SSDP packets will be sent
- * from the source port 1900 (same as destination port), if set to
- * UPNP_LOCAL_PORT_ANY(0) system assign a source port, any other value will
- * be attempted as the source port.
- * "searchalltypes" parameter is useful when searching several types,
- * if 0, the discovery will stop with the first type returning results.
- * TTL should default to 2. */
-MINIUPNP_LIBSPEC struct UPNPDev *
-upnpDiscover(int delay, const char * multicastif,
-             const char * minissdpdsock, int localport,
-             int ipv6, unsigned char ttl,
-             int * error);
-
-MINIUPNP_LIBSPEC struct UPNPDev *
-upnpDiscoverAll(int delay, const char * multicastif,
-                const char * minissdpdsock, int localport,
-                int ipv6, unsigned char ttl,
-                int * error);
-
-MINIUPNP_LIBSPEC struct UPNPDev *
-upnpDiscoverDevice(const char * device, int delay, const char * multicastif,
-                const char * minissdpdsock, int localport,
-                int ipv6, unsigned char ttl,
-                int * error);
-
-MINIUPNP_LIBSPEC struct UPNPDev *
-upnpDiscoverDevices(const char * const deviceTypes[],
-                    int delay, const char * multicastif,
-                    const char * minissdpdsock, int localport,
-                    int ipv6, unsigned char ttl,
-                    int * error,
-                    int searchalltypes);
-
-/* parserootdesc() :
- * parse root XML description of a UPnP device and fill the IGDdatas
- * structure. */
-MINIUPNP_LIBSPEC void parserootdesc(const char *, int, struct IGDdatas *);
-
-/* structure used to get fast access to urls
- * controlURL: controlURL of the WANIPConnection
- * ipcondescURL: url of the description of the WANIPConnection
- * controlURL_CIF: controlURL of the WANCommonInterfaceConfig
- * controlURL_6FC: controlURL of the WANIPv6FirewallControl
- */
-struct UPNPUrls {
-	char * controlURL;
-	char * ipcondescURL;
-	char * controlURL_CIF;
-	char * controlURL_6FC;
-	char * rootdescURL;
-};
-
-/* UPNP_GetValidIGD() :
- * return values :
- *     0 = NO IGD found
- *     1 = A valid connected IGD has been found
- *     2 = A valid IGD has been found but it reported as
- *         not connected
- *     3 = an UPnP device has been found but was not recognized as an IGD
- *
- * In any non zero return case, the urls and data structures
- * passed as parameters are set. Donc forget to call FreeUPNPUrls(urls) to
- * free allocated memory.
- */
-MINIUPNP_LIBSPEC int
-UPNP_GetValidIGD(struct UPNPDev * devlist,
-                 struct UPNPUrls * urls,
-				 struct IGDdatas * data,
-				 char * lanaddr, int lanaddrlen);
-
-/* UPNP_GetIGDFromUrl()
- * Used when skipping the discovery process.
- * When succeding, urls, data, and lanaddr arguments are set.
- * return value :
- *   0 - Not ok
- *   1 - OK */
-MINIUPNP_LIBSPEC int
-UPNP_GetIGDFromUrl(const char * rootdescurl,
-                   struct UPNPUrls * urls,
-                   struct IGDdatas * data,
-                   char * lanaddr, int lanaddrlen);
-
-MINIUPNP_LIBSPEC void
-GetUPNPUrls(struct UPNPUrls *, struct IGDdatas *,
-            const char *, unsigned int);
-
-MINIUPNP_LIBSPEC void
-FreeUPNPUrls(struct UPNPUrls *);
-
-/* return 0 or 1 */
-MINIUPNP_LIBSPEC int UPNPIGD_IsConnected(struct UPNPUrls *, struct IGDdatas *);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-

+ 0 - 0
thirdparty/miniupnpc/codelength.h → thirdparty/miniupnpc/miniupnpc/codelength.h


+ 39 - 23
thirdparty/miniupnpc/connecthostport.c → thirdparty/miniupnpc/miniupnpc/connecthostport.c

@@ -1,8 +1,8 @@
-/* $Id: connecthostport.c,v 1.15 2015/10/09 16:26:19 nanard Exp $ */
+/* $Id: connecthostport.c,v 1.21 2019/04/23 12:11:08 nanard Exp $ */
 /* vim: tabstop=4 shiftwidth=4 noexpandtab
 /* vim: tabstop=4 shiftwidth=4 noexpandtab
  * Project : miniupnp
  * Project : miniupnp
  * Author : Thomas Bernard
  * Author : Thomas Bernard
- * Copyright (c) 2010-2018 Thomas Bernard
+ * Copyright (c) 2010-2019 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. */
 
 
@@ -41,13 +41,6 @@
 #include <sys/select.h>
 #include <sys/select.h>
 #endif /* #else _WIN32 */
 #endif /* #else _WIN32 */
 
 
-/* definition of PRINT_SOCKET_ERROR */
-#ifdef _WIN32
-#define PRINT_SOCKET_ERROR(x)    fprintf(stderr, "Socket error: %s, %d\n", x, WSAGetLastError());
-#else
-#define PRINT_SOCKET_ERROR(x) perror(x)
-#endif
-
 #if defined(__amigaos__) || defined(__amigaos4__)
 #if defined(__amigaos__) || defined(__amigaos4__)
 #define herror(A) printf("%s\n", A)
 #define herror(A) printf("%s\n", A)
 #endif
 #endif
@@ -123,8 +116,22 @@ SOCKET connecthostport(const char * host, unsigned short port,
 		int err;
 		int err;
 		FD_ZERO(&wset);
 		FD_ZERO(&wset);
 		FD_SET(s, &wset);
 		FD_SET(s, &wset);
-		if((n = select(s + 1, NULL, &wset, NULL, NULL)) == -1 && errno == EINTR)
+#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
+		timeout.tv_sec = 3;
+		timeout.tv_usec = 0;
+		n = select(s + 1, NULL, &wset, NULL, &timeout);
+#else
+		n = select(s + 1, NULL, &wset, NULL, NULL);
+#endif
+		if(n == -1 && errno == EINTR)
 			continue;
 			continue;
+#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
+		if(n == 0) {
+			errno = ETIMEDOUT;
+			n = -1;
+			break;
+		}
+#endif
 		/*len = 0;*/
 		/*len = 0;*/
 		/*n = getpeername(s, NULL, &len);*/
 		/*n = getpeername(s, NULL, &len);*/
 		len = sizeof(err);
 		len = sizeof(err);
@@ -163,7 +170,7 @@ SOCKET connecthostport(const char * host, unsigned short port,
 		for(i = 0, j = 1; host[j] && (host[j] != ']') && i < MAXHOSTNAMELEN; i++, j++)
 		for(i = 0, j = 1; host[j] && (host[j] != ']') && i < MAXHOSTNAMELEN; i++, j++)
 		{
 		{
 			tmp_host[i] = host[j];
 			tmp_host[i] = host[j];
-			if(0 == memcmp(host+j, "%25", 3))	/* %25 is just url encoding for '%' */
+			if(0 == strncmp(host+j, "%25", 3))	/* %25 is just url encoding for '%' */
 				j+=2;							/* skip "25" */
 				j+=2;							/* skip "25" */
 		}
 		}
 		tmp_host[i] = '\0';
 		tmp_host[i] = '\0';
@@ -183,9 +190,11 @@ SOCKET connecthostport(const char * host, unsigned short port,
 #endif
 #endif
 		return INVALID_SOCKET;
 		return INVALID_SOCKET;
 	}
 	}
-	s = -1;
+	s = INVALID_SOCKET;
 	for(p = ai; p; p = p->ai_next)
 	for(p = ai; p; p = p->ai_next)
 	{
 	{
+		if(!ISINVALID(s))
+			closesocket(s);
 		s = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
 		s = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
 		if(ISINVALID(s))
 		if(ISINVALID(s))
 			continue;
 			continue;
@@ -208,7 +217,7 @@ SOCKET connecthostport(const char * host, unsigned short port,
 			PRINT_SOCKET_ERROR("setsockopt");
 			PRINT_SOCKET_ERROR("setsockopt");
 		}
 		}
 #endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */
 #endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */
-		n = connect(s, p->ai_addr, p->ai_addrlen);
+		n = connect(s, p->ai_addr, MSC_CAST_INT p->ai_addrlen);
 #ifdef MINIUPNPC_IGNORE_EINTR
 #ifdef MINIUPNPC_IGNORE_EINTR
 		/* EINTR The system call was interrupted by a signal that was caught
 		/* EINTR The system call was interrupted by a signal that was caught
 		 * EINPROGRESS The socket is nonblocking and the connection cannot
 		 * EINPROGRESS The socket is nonblocking and the connection cannot
@@ -220,8 +229,22 @@ SOCKET connecthostport(const char * host, unsigned short port,
 			int err;
 			int err;
 			FD_ZERO(&wset);
 			FD_ZERO(&wset);
 			FD_SET(s, &wset);
 			FD_SET(s, &wset);
-			if((n = select(s + 1, NULL, &wset, NULL, NULL)) == -1 && errno == EINTR)
+#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
+			timeout.tv_sec = 3;
+			timeout.tv_usec = 0;
+			n = select(s + 1, NULL, &wset, NULL, &timeout);
+#else
+			n = select(s + 1, NULL, &wset, NULL, NULL);
+#endif
+			if(n == -1 && errno == EINTR)
 				continue;
 				continue;
+#ifdef MINIUPNPC_SET_SOCKET_TIMEOUT
+			if(n == 0) {
+				errno = ETIMEDOUT;
+				n = -1;
+				break;
+			}
+#endif
 			/*len = 0;*/
 			/*len = 0;*/
 			/*n = getpeername(s, NULL, &len);*/
 			/*n = getpeername(s, NULL, &len);*/
 			len = sizeof(err);
 			len = sizeof(err);
@@ -237,15 +260,8 @@ SOCKET connecthostport(const char * host, unsigned short port,
 			}
 			}
 		}
 		}
 #endif /* #ifdef MINIUPNPC_IGNORE_EINTR */
 #endif /* #ifdef MINIUPNPC_IGNORE_EINTR */
-		if(n < 0)
-		{
-			closesocket(s);
-			continue;
-		}
-		else
-		{
+		if(n >= 0)	/* connect() was successful */
 			break;
 			break;
-		}
 	}
 	}
 	freeaddrinfo(ai);
 	freeaddrinfo(ai);
 	if(ISINVALID(s))
 	if(ISINVALID(s))
@@ -256,9 +272,9 @@ SOCKET connecthostport(const char * host, unsigned short port,
 	if(n < 0)
 	if(n < 0)
 	{
 	{
 		PRINT_SOCKET_ERROR("connect");
 		PRINT_SOCKET_ERROR("connect");
+		closesocket(s);
 		return INVALID_SOCKET;
 		return INVALID_SOCKET;
 	}
 	}
 #endif /* #ifdef USE_GETHOSTBYNAME */
 #endif /* #ifdef USE_GETHOSTBYNAME */
 	return s;
 	return s;
 }
 }
-

+ 0 - 0
thirdparty/miniupnpc/connecthostport.h → thirdparty/miniupnpc/miniupnpc/connecthostport.h


+ 0 - 0
thirdparty/miniupnpc/igd_desc_parse.c → thirdparty/miniupnpc/miniupnpc/igd_desc_parse.c


+ 0 - 0
thirdparty/miniupnpc/igd_desc_parse.h → thirdparty/miniupnpc/miniupnpc/igd_desc_parse.h


+ 0 - 0
thirdparty/miniupnpc/listdevices.c → thirdparty/miniupnpc/miniupnpc/listdevices.c


+ 1 - 8
thirdparty/miniupnpc/minisoap.c → thirdparty/miniupnpc/miniupnpc/minisoap.c

@@ -25,12 +25,6 @@
 /* only for malloc */
 /* only for malloc */
 #include <stdlib.h>
 #include <stdlib.h>
 
 
-#ifdef _WIN32
-#define PRINT_SOCKET_ERROR(x)    fprintf(stderr, "Socket error: %s, %d\n", x, WSAGetLastError());
-#else
-#define PRINT_SOCKET_ERROR(x) perror(x)
-#endif
-
 /* httpWrite sends the headers and the body to the socket
 /* httpWrite sends the headers and the body to the socket
  * and returns the number of bytes sent */
  * and returns the number of bytes sent */
 static int
 static int
@@ -79,11 +73,10 @@ int soapPostSubmit(SOCKET fd,
 				   const char * body,
 				   const char * body,
 				   const char * httpversion)
 				   const char * httpversion)
 {
 {
-	int bodysize;
 	char headerbuf[512];
 	char headerbuf[512];
 	int headerssize;
 	int headerssize;
 	char portstr[8];
 	char portstr[8];
-	bodysize = (int)strlen(body);
+	int bodysize = (int)strlen(body);
 	/* We are not using keep-alive HTTP connections.
 	/* We are not using keep-alive HTTP connections.
 	 * HTTP/1.1 needs the header Connection: close to do that.
 	 * HTTP/1.1 needs the header Connection: close to do that.
 	 * This is the default with HTTP/1.0
 	 * This is the default with HTTP/1.0

+ 0 - 0
thirdparty/miniupnpc/minisoap.h → thirdparty/miniupnpc/miniupnpc/minisoap.h


+ 49 - 52
thirdparty/miniupnpc/minissdpc.c → thirdparty/miniupnpc/miniupnpc/minissdpc.c

@@ -1,9 +1,9 @@
-/* $Id: minissdpc.c,v 1.32 2016/10/07 09:04:36 nanard Exp $ */
+/* $Id: minissdpc.c,v 1.40 2019/04/23 12:12:55 nanard Exp $ */
 /* vim: tabstop=4 shiftwidth=4 noexpandtab
 /* vim: tabstop=4 shiftwidth=4 noexpandtab
  * Project : miniupnp
  * Project : miniupnp
  * Web : http://miniupnp.free.fr/
  * Web : http://miniupnp.free.fr/
  * Author : Thomas BERNARD
  * Author : Thomas BERNARD
- * copyright (c) 2005-2018 Thomas Bernard
+ * copyright (c) 2005-2019 Thomas Bernard
  * 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 <syslog.h>*/
 /*#include <syslog.h>*/
@@ -381,6 +381,7 @@ free_tmp_and_return:
  * the last 4 arguments are filled during the parsing :
  * the last 4 arguments are filled during the parsing :
  *    - location/locationsize : "location:" field of the SSDP reply packet
  *    - location/locationsize : "location:" field of the SSDP reply packet
  *    - st/stsize : "st:" field of the SSDP reply packet.
  *    - st/stsize : "st:" field of the SSDP reply packet.
+ *    - usn/usnsize : "usn:" filed of the SSDP reply packet
  * The strings are NOT null terminated */
  * The strings are NOT null terminated */
 static void
 static void
 parseMSEARCHReply(const char * reply, int size,
 parseMSEARCHReply(const char * reply, int size,
@@ -418,17 +419,17 @@ parseMSEARCHReply(const char * reply, int size,
 					putchar('\n');*/
 					putchar('\n');*/
 					/* skip the colon and white spaces */
 					/* skip the colon and white spaces */
 					do { b++; } while(reply[b]==' ');
 					do { b++; } while(reply[b]==' ');
-					if(0==strncasecmp(reply+a, "location", 8))
+					if(0==strncasecmp(reply+a, "location:", 9))
 					{
 					{
 						*location = reply+b;
 						*location = reply+b;
 						*locationsize = i-b;
 						*locationsize = i-b;
 					}
 					}
-					else if(0==strncasecmp(reply+a, "st", 2))
+					else if(0==strncasecmp(reply+a, "st:", 3))
 					{
 					{
 						*st = reply+b;
 						*st = reply+b;
 						*stsize = i-b;
 						*stsize = i-b;
 					}
 					}
-					else if(0==strncasecmp(reply+a, "usn", 3))
+					else if(0==strncasecmp(reply+a, "usn:", 4))
 					{
 					{
 						*usn = reply+b;
 						*usn = reply+b;
 						*usnsize = i-b;
 						*usnsize = i-b;
@@ -471,7 +472,7 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
                     int searchalltypes)
                     int searchalltypes)
 {
 {
 	struct UPNPDev * tmp;
 	struct UPNPDev * tmp;
-	struct UPNPDev * devlist = 0;
+	struct UPNPDev * devlist = NULL;
 	unsigned int scope_id = 0;
 	unsigned int scope_id = 0;
 	int opt = 1;
 	int opt = 1;
 	static const char MSearchMsgFmt[] =
 	static const char MSearchMsgFmt[] =
@@ -491,7 +492,7 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
 	struct sockaddr_storage sockudp_w;
 	struct sockaddr_storage sockudp_w;
 #else
 #else
 	int rv;
 	int rv;
-	struct addrinfo hints, *servinfo, *p;
+	struct addrinfo hints, *servinfo;
 #endif
 #endif
 #ifdef _WIN32
 #ifdef _WIN32
 	unsigned long _ttl = (unsigned long)ttl;
 	unsigned long _ttl = (unsigned long)ttl;
@@ -545,51 +546,42 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
 		destAddr.sin_addr.s_addr = inet_addr("223.255.255.255");
 		destAddr.sin_addr.s_addr = inet_addr("223.255.255.255");
 		destAddr.sin_port = 0;
 		destAddr.sin_port = 0;
 		if (GetBestInterfaceEx((struct sockaddr *)&destAddr, &ifbestidx) == NO_ERROR) {
 		if (GetBestInterfaceEx((struct sockaddr *)&destAddr, &ifbestidx) == NO_ERROR) {
-			DWORD dwSize = 0;
-			DWORD dwRetVal = 0;
-			unsigned int i = 0;
-			ULONG flags = GAA_FLAG_INCLUDE_PREFIX;
-			ULONG family = AF_INET;
-			LPVOID lpMsgBuf = NULL;
+			DWORD dwRetVal = NO_ERROR;
 			PIP_ADAPTER_ADDRESSES pAddresses = NULL;
 			PIP_ADAPTER_ADDRESSES pAddresses = NULL;
-			ULONG outBufLen = 0;
-			ULONG Iterations = 0;
+			ULONG outBufLen = 15360;
+			int Iterations;
 			PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
 			PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
 			PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;
 			PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;
-			PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL;
-			PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL;
-			IP_ADAPTER_DNS_SERVER_ADDRESS *pDnServer = NULL;
-			IP_ADAPTER_PREFIX *pPrefix = NULL;
 
 
-			outBufLen = 15360;
-			do {
+			for (Iterations = 0; Iterations < 3; Iterations++) {
 				pAddresses = (IP_ADAPTER_ADDRESSES *) HeapAlloc(GetProcessHeap(), 0, outBufLen);
 				pAddresses = (IP_ADAPTER_ADDRESSES *) HeapAlloc(GetProcessHeap(), 0, outBufLen);
 				if (pAddresses == NULL) {
 				if (pAddresses == NULL) {
 					break;
 					break;
 				}
 				}
 
 
-				dwRetVal = GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);
+				dwRetVal = GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, pAddresses, &outBufLen);
 
 
-				if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
-					HeapFree(GetProcessHeap(), 0, pAddresses);
-					pAddresses = NULL;
-				} else {
+				if (dwRetVal != ERROR_BUFFER_OVERFLOW) {
 					break;
 					break;
 				}
 				}
-				Iterations++;
-			} while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (Iterations < 3));
+				HeapFree(GetProcessHeap(), 0, pAddresses);
+				pAddresses = NULL;
+			}
 
 
 			if (dwRetVal == NO_ERROR) {
 			if (dwRetVal == NO_ERROR) {
 				pCurrAddresses = pAddresses;
 				pCurrAddresses = pAddresses;
 				while (pCurrAddresses) {
 				while (pCurrAddresses) {
 #ifdef DEBUG
 #ifdef DEBUG
+					int i;
+					PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL;
+					PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL;
+
 					printf("\tIfIndex (IPv4 interface): %u\n", pCurrAddresses->IfIndex);
 					printf("\tIfIndex (IPv4 interface): %u\n", pCurrAddresses->IfIndex);
 					printf("\tAdapter name: %s\n", pCurrAddresses->AdapterName);
 					printf("\tAdapter name: %s\n", pCurrAddresses->AdapterName);
 					pUnicast = pCurrAddresses->FirstUnicastAddress;
 					pUnicast = pCurrAddresses->FirstUnicastAddress;
 					if (pUnicast != NULL) {
 					if (pUnicast != NULL) {
 						for (i = 0; pUnicast != NULL; i++) {
 						for (i = 0; pUnicast != NULL; i++) {
-							IPAddr.S_un.S_addr = (u_long) pUnicast->Address;
-							printf("\tIP Address[%d]:     \t%s\n", i, inet_ntoa(IPAddr) );
+							printf("\tIP Address[%d]:     \t%s\n", i, inet_ntoa(((PSOCKADDR_IN)pUnicast->Address.lpSockaddr)->sin_addr) );
 							pUnicast = pUnicast->Next;
 							pUnicast = pUnicast->Next;
 						}
 						}
 						printf("\tNumber of Unicast Addresses: %d\n", i);
 						printf("\tNumber of Unicast Addresses: %d\n", i);
@@ -597,8 +589,7 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
 					pAnycast = pCurrAddresses->FirstAnycastAddress;
 					pAnycast = pCurrAddresses->FirstAnycastAddress;
 					if (pAnycast) {
 					if (pAnycast) {
 						for (i = 0; pAnycast != NULL; i++) {
 						for (i = 0; pAnycast != NULL; i++) {
-							IPAddr.S_un.S_addr = (u_long) pAnyCast->Address;
-							printf("\tAnycast Address[%d]:     \t%s\n", i, inet_ntoa(IPAddr) );
+							printf("\tAnycast Address[%d]:     \t%s\n", i, inet_ntoa(((PSOCKADDR_IN)pAnycast->Address.lpSockaddr)->sin_addr) );
 							pAnycast = pAnycast->Next;
 							pAnycast = pAnycast->Next;
 						}
 						}
 						printf("\tNumber of Anycast Addresses: %d\n", i);
 						printf("\tNumber of Anycast Addresses: %d\n", i);
@@ -606,8 +597,8 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
 					pMulticast = pCurrAddresses->FirstMulticastAddress;
 					pMulticast = pCurrAddresses->FirstMulticastAddress;
 					if (pMulticast) {
 					if (pMulticast) {
 						for (i = 0; pMulticast != NULL; i++) {
 						for (i = 0; pMulticast != NULL; i++) {
-							IPAddr.S_un.S_addr = (u_long) pMultiCast->Address;
-							printf("\tMulticast Address[%d]:     \t%s\n", i, inet_ntoa(IPAddr) );
+							printf("\tMulticast Address[%d]:     \t%s\n", i, inet_ntoa(((PSOCKADDR_IN)pMulticast->Address.lpSockaddr)->sin_addr) );
+              pMulticast = pMulticast->Next;
 						}
 						}
 					}
 					}
 					printf("\n");
 					printf("\n");
@@ -647,7 +638,7 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
 		if(error)
 		if(error)
 			*error = MINISSDPC_SOCKET_ERROR;
 			*error = MINISSDPC_SOCKET_ERROR;
 		PRINT_SOCKET_ERROR("setsockopt(SO_REUSEADDR,...)");
 		PRINT_SOCKET_ERROR("setsockopt(SO_REUSEADDR,...)");
-		return NULL;
+		goto error;
 	}
 	}
 
 
 	if(ipv6) {
 	if(ipv6) {
@@ -692,7 +683,11 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
 #endif
 #endif
 		} else {
 		} else {
 			struct in_addr mc_if;
 			struct in_addr mc_if;
+#if defined(_WIN32) && (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
+			InetPtonA(AF_INET, multicastif, &mc_if);
+#else
 			mc_if.s_addr = inet_addr(multicastif); /* ex: 192.168.x.x */
 			mc_if.s_addr = inet_addr(multicastif); /* ex: 192.168.x.x */
+#endif
 			if(mc_if.s_addr != INADDR_NONE)
 			if(mc_if.s_addr != INADDR_NONE)
 			{
 			{
 				((struct sockaddr_in *)&sockudp_r)->sin_addr.s_addr = mc_if.s_addr;
 				((struct sockaddr_in *)&sockudp_r)->sin_addr.s_addr = mc_if.s_addr;
@@ -819,24 +814,26 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
 			fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
 			fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
 #endif
 #endif
 			break;
 			break;
-		}
-		for(p = servinfo; p; p = p->ai_next) {
-			n = sendto(sudp, bufr, n, 0, p->ai_addr, p->ai_addrlen);
-			if (n < 0) {
+		} else {
+			struct addrinfo *p;
+			for(p = servinfo; p; p = p->ai_next) {
+				n = sendto(sudp, bufr, n, 0, p->ai_addr, MSC_CAST_INT p->ai_addrlen);
+				if (n < 0) {
 #ifdef DEBUG
 #ifdef DEBUG
-				char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
-				if (getnameinfo(p->ai_addr, p->ai_addrlen, hbuf, sizeof(hbuf), sbuf,
-				                sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0) {
-					fprintf(stderr, "host:%s port:%s\n", hbuf, sbuf);
-				}
+					char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
+					if (getnameinfo(p->ai_addr, (socklen_t)p->ai_addrlen, hbuf, sizeof(hbuf), sbuf,
+					                sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0) {
+						fprintf(stderr, "host:%s port:%s\n", hbuf, sbuf);
+					}
 #endif
 #endif
-				PRINT_SOCKET_ERROR("sendto");
-				continue;
-			} else {
-				sentok = 1;
+					PRINT_SOCKET_ERROR("sendto");
+					continue;
+				} else {
+					sentok = 1;
+				}
 			}
 			}
+			freeaddrinfo(servinfo);
 		}
 		}
-		freeaddrinfo(servinfo);
 		if(!sentok) {
 		if(!sentok) {
 			if(error)
 			if(error)
 				*error = MINISSDPC_SOCKET_ERROR;
 				*error = MINISSDPC_SOCKET_ERROR;
@@ -877,11 +874,11 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
 					       stsize, st, usnsize, (usn?usn:""), urlsize, descURL);
 					       stsize, st, usnsize, (usn?usn:""), urlsize, descURL);
 #endif /* DEBUG */
 #endif /* DEBUG */
 					for(tmp=devlist; tmp; tmp = tmp->pNext) {
 					for(tmp=devlist; tmp; tmp = tmp->pNext) {
-						if(memcmp(tmp->descURL, descURL, urlsize) == 0 &&
+						if(strncmp(tmp->descURL, descURL, urlsize) == 0 &&
 						   tmp->descURL[urlsize] == '\0' &&
 						   tmp->descURL[urlsize] == '\0' &&
-						   memcmp(tmp->st, st, stsize) == 0 &&
+						   strncmp(tmp->st, st, stsize) == 0 &&
 						   tmp->st[stsize] == '\0' &&
 						   tmp->st[stsize] == '\0' &&
-						   (usnsize == 0 || memcmp(tmp->usn, usn, usnsize) == 0) &&
+						   (usnsize == 0 || strncmp(tmp->usn, usn, usnsize) == 0) &&
 						   tmp->usn[usnsize] == '\0')
 						   tmp->usn[usnsize] == '\0')
 							break;
 							break;
 					}
 					}

+ 3 - 3
thirdparty/miniupnpc/minissdpc.h → thirdparty/miniupnpc/miniupnpc/minissdpc.h

@@ -32,13 +32,13 @@ MINIUPNP_LIBSPEC int
 connectToMiniSSDPD(const char * socketpath);
 connectToMiniSSDPD(const char * socketpath);
 
 
 MINIUPNP_LIBSPEC int
 MINIUPNP_LIBSPEC int
-disconnectFromMiniSSDPD(int fd);
+disconnectFromMiniSSDPD(int s);
 
 
 MINIUPNP_LIBSPEC int
 MINIUPNP_LIBSPEC int
-requestDevicesFromMiniSSDPD(int fd, const char * devtype);
+requestDevicesFromMiniSSDPD(int s, const char * devtype);
 
 
 MINIUPNP_LIBSPEC struct UPNPDev *
 MINIUPNP_LIBSPEC struct UPNPDev *
-receiveDevicesFromMiniSSDPD(int fd, int * error);
+receiveDevicesFromMiniSSDPD(int s, int * error);
 
 
 #endif /* !(defined(_WIN32) || defined(__amigaos__) || defined(__amigaos4__)) */
 #endif /* !(defined(_WIN32) || defined(__amigaos__) || defined(__amigaos4__)) */
 
 

+ 13 - 24
thirdparty/miniupnpc/miniupnpc.c → thirdparty/miniupnpc/miniupnpc/miniupnpc.c

@@ -1,9 +1,9 @@
-/* $Id: miniupnpc.c,v 1.149 2016/02/09 09:50:46 nanard Exp $ */
+/* $Id: miniupnpc.c,v 1.154 2019/04/23 12:12:13 nanard Exp $ */
 /* vim: tabstop=4 shiftwidth=4 noexpandtab
 /* vim: tabstop=4 shiftwidth=4 noexpandtab
  * Project : miniupnp
  * Project : miniupnp
  * Web : http://miniupnp.free.fr/
  * Web : http://miniupnp.free.fr/
  * Author : Thomas BERNARD
  * Author : Thomas BERNARD
- * copyright (c) 2005-2018 Thomas Bernard
+ * copyright (c) 2005-2019 Thomas Bernard
  * 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. */
 #include <stdlib.h>
 #include <stdlib.h>
@@ -63,7 +63,7 @@
 #include "connecthostport.h"
 #include "connecthostport.h"
 
 
 /* compare the beginning of a string with a constant string */
 /* compare the beginning of a string with a constant string */
-#define COMPARE(str, cstr) (0==memcmp(str, cstr, sizeof(cstr) - 1))
+#define COMPARE(str, cstr) (0==strncmp(str, cstr, sizeof(cstr) - 1))
 
 
 #ifndef MAXHOSTNAMELEN
 #ifndef MAXHOSTNAMELEN
 #define MAXHOSTNAMELEN 64
 #define MAXHOSTNAMELEN 64
@@ -85,8 +85,7 @@ static int is_rfc1918addr(const char * addr)
 		return 1;
 		return 1;
 	/* 172.16.0.0      -   172.31.255.255  (172.16/12 prefix) */
 	/* 172.16.0.0      -   172.31.255.255  (172.16/12 prefix) */
 	if(COMPARE(addr, "172.")) {
 	if(COMPARE(addr, "172.")) {
-		int i = atoi(addr + 4);
-		if((16 <= i) && (i <= 31))
+		if((atoi(addr + 4) | 0x0f) == 0x1f)
 			return 1;
 			return 1;
 	}
 	}
 	return 0;
 	return 0;
@@ -416,7 +415,7 @@ static char *
 build_absolute_url(const char * baseurl, const char * descURL,
 build_absolute_url(const char * baseurl, const char * descURL,
                    const char * url, unsigned int scope_id)
                    const char * url, unsigned int scope_id)
 {
 {
-	int l, n;
+	size_t l, n;
 	char * s;
 	char * s;
 	const char * base;
 	const char * base;
 	char * p;
 	char * p;
@@ -459,7 +458,7 @@ build_absolute_url(const char * baseurl, const char * descURL,
 	memcpy(s, base, n);
 	memcpy(s, base, n);
 	if(scope_id != 0) {
 	if(scope_id != 0) {
 		s[n] = '\0';
 		s[n] = '\0';
-		if(0 == memcmp(s, "http://[fe80:", 13)) {
+		if(n > 13 && 0 == memcmp(s, "http://[fe80:", 13)) {
 			/* this is a linklocal IPv6 address */
 			/* this is a linklocal IPv6 address */
 			p = strchr(s, ']');
 			p = strchr(s, ']');
 			if(p) {
 			if(p) {
@@ -573,7 +572,6 @@ UPNP_GetValidIGD(struct UPNPDev * devlist,
 	int ndev = 0;
 	int ndev = 0;
 	int i;
 	int i;
 	int state = -1; /* state 1 : IGD connected. State 2 : IGD. State 3 : anything */
 	int state = -1; /* state 1 : IGD connected. State 2 : IGD. State 3 : anything */
-	int n_igd = 0;
 	char extIpAddr[16];
 	char extIpAddr[16];
 	char myLanAddr[40];
 	char myLanAddr[40];
 	int status_code = -1;
 	int status_code = -1;
@@ -588,12 +586,10 @@ UPNP_GetValidIGD(struct UPNPDev * devlist,
 	/* counting total number of devices in the list */
 	/* counting total number of devices in the list */
 	for(dev = devlist; dev; dev = dev->pNext)
 	for(dev = devlist; dev; dev = dev->pNext)
 		ndev++;
 		ndev++;
-	if(ndev > 0)
-	{
-		desc = calloc(ndev, sizeof(struct xml_desc));
-		if(!desc)
-			return -1; /* memory allocation error */
-	}
+	/* ndev is always > 0 */
+	desc = calloc(ndev, sizeof(struct xml_desc));
+	if(!desc)
+		return -1; /* memory allocation error */
 	/* Step 1 : downloading descriptions and testing type */
 	/* Step 1 : downloading descriptions and testing type */
 	for(dev = devlist, i = 0; dev; dev = dev->pNext, i++)
 	for(dev = devlist, i = 0; dev; dev = dev->pNext, i++)
 	{
 	{
@@ -617,7 +613,6 @@ UPNP_GetValidIGD(struct UPNPDev * devlist,
 			           "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:"))
 			           "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:"))
 			{
 			{
 				desc[i].is_igd = 1;
 				desc[i].is_igd = 1;
-				n_igd++;
 				if(lanaddr)
 				if(lanaddr)
 					strncpy(lanaddr, myLanAddr, lanaddrlen);
 					strncpy(lanaddr, myLanAddr, lanaddrlen);
 			}
 			}
@@ -685,14 +680,9 @@ UPNP_GetValidIGD(struct UPNPDev * devlist,
 	}
 	}
 	state = 0;
 	state = 0;
 free_and_return:
 free_and_return:
-	if(desc) {
-		for(i = 0; i < ndev; i++) {
-			if(desc[i].xml) {
-				free(desc[i].xml);
-			}
-		}
-		free(desc);
-	}
+	for(i = 0; i < ndev; i++)
+		free(desc[i].xml);
+	free(desc);
 	return state;
 	return state;
 }
 }
 
 
@@ -717,7 +707,6 @@ UPNP_GetIGDFromUrl(const char * rootdescurl,
 		memset(urls, 0, sizeof(struct UPNPUrls));
 		memset(urls, 0, sizeof(struct UPNPUrls));
 		parserootdesc(descXML, descXMLsize, data);
 		parserootdesc(descXML, descXMLsize, data);
 		free(descXML);
 		free(descXML);
-		descXML = NULL;
 		GetUPNPUrls(urls, data, rootdescurl, 0);
 		GetUPNPUrls(urls, data, rootdescurl, 0);
 		return 1;
 		return 1;
 	} else {
 	} else {

+ 0 - 0
thirdparty/miniupnpc/miniupnpc_declspec.h → thirdparty/miniupnpc/miniupnpc/miniupnpc_declspec.h


+ 7 - 0
thirdparty/miniupnpc/miniupnpc_socketdef.h → thirdparty/miniupnpc/miniupnpc/miniupnpc_socketdef.h

@@ -28,6 +28,13 @@
 
 
 #endif
 #endif
 
 
+#ifdef _MSC_VER
+#define MSC_CAST_INT (int)
+#else
+#define MSC_CAST_INT
+#endif
+
+/* definition of PRINT_SOCKET_ERROR */
 #ifdef _WIN32
 #ifdef _WIN32
 #define PRINT_SOCKET_ERROR(x)    fprintf(stderr, "Socket error: %s, %d\n", x, WSAGetLastError());
 #define PRINT_SOCKET_ERROR(x)    fprintf(stderr, "Socket error: %s, %d\n", x, WSAGetLastError());
 #else
 #else

+ 26 - 8
thirdparty/miniupnpc/miniupnpcmodule.c → thirdparty/miniupnpc/miniupnpc/miniupnpcmodule.c

@@ -1,8 +1,9 @@
-/* $Id: miniupnpcmodule.c,v 1.24 2014/06/10 09:48:11 nanard Exp $*/
-/* Project : miniupnp
+/* $Id: miniupnpcmodule.c,v 1.34 2019/05/20 19:07:16 nanard Exp $*/
+/* vim: tabstop=4 shiftwidth=4 noexpandtab
+ * Project : miniupnp
  * Author : Thomas BERNARD
  * Author : Thomas BERNARD
  * website : https://miniupnp.tuxfamily.org/
  * website : https://miniupnp.tuxfamily.org/
- * copyright (c) 2007-2018 Thomas Bernard
+ * copyright (c) 2007-2019 Thomas Bernard
  * 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>
@@ -292,7 +293,7 @@ Py_END_ALLOW_THREADS
 }
 }
 
 
 /* AddPortMapping(externalPort, protocol, internalHost, internalPort, desc,
 /* AddPortMapping(externalPort, protocol, internalHost, internalPort, desc,
- *                remoteHost)
+ *                remoteHost, leaseDuration)
  * protocol is 'UDP' or 'TCP' */
  * protocol is 'UDP' or 'TCP' */
 static PyObject *
 static PyObject *
 UPnP_addportmapping(UPnPObject *self, PyObject *args)
 UPnP_addportmapping(UPnPObject *self, PyObject *args)
@@ -305,17 +306,24 @@ UPnP_addportmapping(UPnPObject *self, PyObject *args)
 	const char * host;
 	const char * host;
 	const char * desc;
 	const char * desc;
 	const char * remoteHost;
 	const char * remoteHost;
-	const char * leaseDuration = "0";
+	unsigned int intLeaseDuration = 0;
+	char strLeaseDuration[12];
 	int r;
 	int r;
-	if (!PyArg_ParseTuple(args, "HssHzz", &ePort, &proto,
-	                                     &host, &iPort, &desc, &remoteHost))
+#if (PY_MAJOR_VERSION >= 3) || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 3)
+	if (!PyArg_ParseTuple(args, "HssHzz|I", &ePort, &proto,
+	                                     &host, &iPort, &desc, &remoteHost, &intLeaseDuration))
+#else
+	if (!PyArg_ParseTuple(args, "HssHzz|i", &ePort, &proto,
+	                                     &host, &iPort, &desc, &remoteHost, (int *)&intLeaseDuration))
+#endif
         return NULL;
         return NULL;
 Py_BEGIN_ALLOW_THREADS
 Py_BEGIN_ALLOW_THREADS
 	sprintf(extPort, "%hu", ePort);
 	sprintf(extPort, "%hu", ePort);
 	sprintf(inPort, "%hu", iPort);
 	sprintf(inPort, "%hu", iPort);
+	sprintf(strLeaseDuration, "%u", intLeaseDuration);
 	r = UPNP_AddPortMapping(self->urls.controlURL, self->data.first.servicetype,
 	r = UPNP_AddPortMapping(self->urls.controlURL, self->data.first.servicetype,
 	                        extPort, inPort, host, desc, proto,
 	                        extPort, inPort, host, desc, proto,
-	                        remoteHost, leaseDuration);
+	                        remoteHost, strLeaseDuration);
 Py_END_ALLOW_THREADS
 Py_END_ALLOW_THREADS
 	if(r==UPNPCOMMAND_SUCCESS)
 	if(r==UPNPCOMMAND_SUCCESS)
 	{
 	{
@@ -676,6 +684,16 @@ initminiupnpc(void)
     /* initialize Winsock. */
     /* initialize Winsock. */
     WSADATA wsaData;
     WSADATA wsaData;
     int nResult = WSAStartup(MAKEWORD(2,2), &wsaData);
     int nResult = WSAStartup(MAKEWORD(2,2), &wsaData);
+	if (nResult != 0)
+	{
+		/* error code could be WSASYSNOTREADY WSASYSNOTREADY
+		 * WSASYSNOTREADY WSASYSNOTREADY WSASYSNOTREADY */
+#if PY_MAJOR_VERSION >= 3
+        return 0;
+#else
+        return;
+#endif
+	}
 
 
     UPnPType.tp_new = PyType_GenericNew;
     UPnPType.tp_new = PyType_GenericNew;
 #endif
 #endif

+ 0 - 0
thirdparty/miniupnpc/miniupnpcstrings.h → thirdparty/miniupnpc/miniupnpc/miniupnpcstrings.h


+ 0 - 0
thirdparty/miniupnpc/miniupnpctypes.h → thirdparty/miniupnpc/miniupnpc/miniupnpctypes.h


+ 4 - 5
thirdparty/miniupnpc/miniwget.c → thirdparty/miniupnpc/miniupnpc/miniwget.c

@@ -243,7 +243,7 @@ getHTTPResponse(SOCKET s, int * size, int * status_code)
 					/* reading chunk size */
 					/* reading chunk size */
 					if(chunksize_buf_index == 0) {
 					if(chunksize_buf_index == 0) {
 						/* skipping any leading CR LF */
 						/* skipping any leading CR LF */
-						if(i<n && buf[i] == '\r') i++;
+						if(buf[i] == '\r') i++;
 						if(i<n && buf[i] == '\n') i++;
 						if(i<n && buf[i] == '\n') i++;
 					}
 					}
 					while(i<n && isxdigit(buf[i])
 					while(i<n && isxdigit(buf[i])
@@ -350,7 +350,7 @@ getHTTPResponse(SOCKET s, int * size, int * status_code)
 		}
 		}
 	}
 	}
 end_of_stream:
 end_of_stream:
-	free(header_buf); header_buf = NULL;
+	free(header_buf);
 	*size = content_buf_used;
 	*size = content_buf_used;
 	if(content_buf_used == 0)
 	if(content_buf_used == 0)
 	{
 	{
@@ -371,7 +371,7 @@ miniwget3(const char * host,
           int * status_code)
           int * status_code)
 {
 {
 	char buf[2048];
 	char buf[2048];
-    SOCKET s;
+	SOCKET s;
 	int n;
 	int n;
 	int len;
 	int len;
 	int sent;
 	int sent;
@@ -559,7 +559,7 @@ parseURL(const char * url,
 #else
 #else
 			/* under windows, scope is numerical */
 			/* under windows, scope is numerical */
 			char tmp[8];
 			char tmp[8];
-			int l;
+			size_t l;
 			scope++;
 			scope++;
 			/* "%25" is just '%' in URL encoding */
 			/* "%25" is just '%' in URL encoding */
 			if(scope[0] == '2' && scope[1] == '5')
 			if(scope[0] == '2' && scope[1] == '5')
@@ -659,4 +659,3 @@ miniwget_getaddr(const char * url, int * size,
 #endif
 #endif
 	return miniwget2(hostname, port, path, size, addr, addrlen, scope_id, status_code);
 	return miniwget2(hostname, port, path, size, addr, addrlen, scope_id, status_code);
 }
 }
-

+ 0 - 0
thirdparty/miniupnpc/miniwget_private.h → thirdparty/miniupnpc/miniupnpc/miniwget_private.h


+ 0 - 0
thirdparty/miniupnpc/minixml.c → thirdparty/miniupnpc/miniupnpc/minixml.c


+ 1 - 1
thirdparty/miniupnpc/minixml.h → thirdparty/miniupnpc/miniupnpc/minixml.h

@@ -10,7 +10,7 @@
  * */
  * */
 #ifndef MINIXML_H_INCLUDED
 #ifndef MINIXML_H_INCLUDED
 #define MINIXML_H_INCLUDED
 #define MINIXML_H_INCLUDED
-#define IS_WHITE_SPACE(c) ((c==' ') || (c=='\t') || (c=='\r') || (c=='\n'))
+#define IS_WHITE_SPACE(c) ((c)==' ' || (c)=='\t' || (c)=='\r' || (c)=='\n')
 
 
 /* if a callback function pointer is set to NULL,
 /* if a callback function pointer is set to NULL,
  * the function is not called */
  * the function is not called */

+ 0 - 0
thirdparty/miniupnpc/minixmlvalid.c → thirdparty/miniupnpc/miniupnpc/minixmlvalid.c


+ 0 - 0
thirdparty/miniupnpc/portlistingparse.c → thirdparty/miniupnpc/miniupnpc/portlistingparse.c


+ 0 - 0
thirdparty/miniupnpc/portlistingparse.h → thirdparty/miniupnpc/miniupnpc/portlistingparse.h


+ 0 - 0
thirdparty/miniupnpc/receivedata.c → thirdparty/miniupnpc/miniupnpc/receivedata.c


+ 0 - 0
thirdparty/miniupnpc/receivedata.h → thirdparty/miniupnpc/miniupnpc/receivedata.h


+ 2 - 2
thirdparty/miniupnpc/upnpc.c → thirdparty/miniupnpc/miniupnpc/upnpc.c

@@ -1,7 +1,7 @@
 /* $Id: upnpc.c,v 1.119 2018/03/13 23:34:46 nanard Exp $ */
 /* $Id: upnpc.c,v 1.119 2018/03/13 23:34:46 nanard Exp $ */
 /* Project : miniupnp
 /* Project : miniupnp
  * Author : Thomas Bernard
  * Author : Thomas Bernard
- * Copyright (c) 2005-2018 Thomas Bernard
+ * Copyright (c) 2005-2019 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. */
 
 
@@ -579,7 +579,7 @@ int main(int argc, char ** argv)
 	}
 	}
 #endif
 #endif
     printf("upnpc : miniupnpc library test client, version %s.\n", MINIUPNPC_VERSION_STRING);
     printf("upnpc : miniupnpc library test client, version %s.\n", MINIUPNPC_VERSION_STRING);
-	printf(" (c) 2005-2018 Thomas Bernard.\n");
+	printf(" (c) 2005-2019 Thomas Bernard.\n");
     printf("Go to http://miniupnp.free.fr/ or https://miniupnp.tuxfamily.org/\n"
     printf("Go to http://miniupnp.free.fr/ or https://miniupnp.tuxfamily.org/\n"
 	       "for more information.\n");
 	       "for more information.\n");
 	/* command line processing */
 	/* command line processing */

+ 30 - 33
thirdparty/miniupnpc/upnpcommands.c → thirdparty/miniupnpc/miniupnpc/upnpcommands.c

@@ -1,4 +1,4 @@
-/* $Id: upnpcommands.c,v 1.49 2018/03/13 23:34:47 nanard Exp $ */
+/* $Id: upnpcommands.c,v 1.51 2019/04/23 11:45:15 nanard Exp $ */
 /* vim: tabstop=4 shiftwidth=4 noexpandtab
 /* vim: tabstop=4 shiftwidth=4 noexpandtab
  * Project : miniupnp
  * Project : miniupnp
  * Author : Thomas Bernard
  * Author : Thomas Bernard
@@ -33,11 +33,11 @@ UPNP_GetTotalBytesSent(const char * controlURL,
 	char * p;
 	char * p;
 	if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
 	if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
 	                                "GetTotalBytesSent", 0, &bufsize))) {
 	                                "GetTotalBytesSent", 0, &bufsize))) {
-		return UPNPCOMMAND_HTTP_ERROR;
+		return (UNSIGNED_INTEGER)UPNPCOMMAND_HTTP_ERROR;
 	}
 	}
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
 	/*DisplayNameValueList(buffer, bufsize);*/
 	/*DisplayNameValueList(buffer, bufsize);*/
-	free(buffer); buffer = NULL;
+	free(buffer);
 	p = GetValueFromNameValueList(&pdata, "NewTotalBytesSent");
 	p = GetValueFromNameValueList(&pdata, "NewTotalBytesSent");
 	r = my_atoui(p);
 	r = my_atoui(p);
 	ClearNameValueList(&pdata);
 	ClearNameValueList(&pdata);
@@ -57,11 +57,11 @@ UPNP_GetTotalBytesReceived(const char * controlURL,
 	char * p;
 	char * p;
 	if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
 	if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
 	                                "GetTotalBytesReceived", 0, &bufsize))) {
 	                                "GetTotalBytesReceived", 0, &bufsize))) {
-		return UPNPCOMMAND_HTTP_ERROR;
+		return (UNSIGNED_INTEGER)UPNPCOMMAND_HTTP_ERROR;
 	}
 	}
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
 	/*DisplayNameValueList(buffer, bufsize);*/
 	/*DisplayNameValueList(buffer, bufsize);*/
-	free(buffer); buffer = NULL;
+	free(buffer);
 	p = GetValueFromNameValueList(&pdata, "NewTotalBytesReceived");
 	p = GetValueFromNameValueList(&pdata, "NewTotalBytesReceived");
 	r = my_atoui(p);
 	r = my_atoui(p);
 	ClearNameValueList(&pdata);
 	ClearNameValueList(&pdata);
@@ -81,11 +81,11 @@ UPNP_GetTotalPacketsSent(const char * controlURL,
 	char * p;
 	char * p;
 	if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
 	if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
 	                                "GetTotalPacketsSent", 0, &bufsize))) {
 	                                "GetTotalPacketsSent", 0, &bufsize))) {
-		return UPNPCOMMAND_HTTP_ERROR;
+		return (UNSIGNED_INTEGER)UPNPCOMMAND_HTTP_ERROR;
 	}
 	}
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
 	/*DisplayNameValueList(buffer, bufsize);*/
 	/*DisplayNameValueList(buffer, bufsize);*/
-	free(buffer); buffer = NULL;
+	free(buffer);
 	p = GetValueFromNameValueList(&pdata, "NewTotalPacketsSent");
 	p = GetValueFromNameValueList(&pdata, "NewTotalPacketsSent");
 	r = my_atoui(p);
 	r = my_atoui(p);
 	ClearNameValueList(&pdata);
 	ClearNameValueList(&pdata);
@@ -105,11 +105,11 @@ UPNP_GetTotalPacketsReceived(const char * controlURL,
 	char * p;
 	char * p;
 	if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
 	if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
 	                                "GetTotalPacketsReceived", 0, &bufsize))) {
 	                                "GetTotalPacketsReceived", 0, &bufsize))) {
-		return UPNPCOMMAND_HTTP_ERROR;
+		return (UNSIGNED_INTEGER)UPNPCOMMAND_HTTP_ERROR;
 	}
 	}
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
 	/*DisplayNameValueList(buffer, bufsize);*/
 	/*DisplayNameValueList(buffer, bufsize);*/
-	free(buffer); buffer = NULL;
+	free(buffer);
 	p = GetValueFromNameValueList(&pdata, "NewTotalPacketsReceived");
 	p = GetValueFromNameValueList(&pdata, "NewTotalPacketsReceived");
 	r = my_atoui(p);
 	r = my_atoui(p);
 	ClearNameValueList(&pdata);
 	ClearNameValueList(&pdata);
@@ -142,7 +142,7 @@ UPNP_GetStatusInfo(const char * controlURL,
 	}
 	}
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
 	/*DisplayNameValueList(buffer, bufsize);*/
 	/*DisplayNameValueList(buffer, bufsize);*/
-	free(buffer); buffer = NULL;
+	free(buffer);
 	up = GetValueFromNameValueList(&pdata, "NewUptime");
 	up = GetValueFromNameValueList(&pdata, "NewUptime");
 	p = GetValueFromNameValueList(&pdata, "NewConnectionStatus");
 	p = GetValueFromNameValueList(&pdata, "NewConnectionStatus");
 	err = GetValueFromNameValueList(&pdata, "NewLastConnectionError");
 	err = GetValueFromNameValueList(&pdata, "NewLastConnectionError");
@@ -202,7 +202,7 @@ UPNP_GetConnectionTypeInfo(const char * controlURL,
 		return UPNPCOMMAND_HTTP_ERROR;
 		return UPNPCOMMAND_HTTP_ERROR;
 	}
 	}
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 	p = GetValueFromNameValueList(&pdata, "NewConnectionType");
 	p = GetValueFromNameValueList(&pdata, "NewConnectionType");
 	/*p = GetValueFromNameValueList(&pdata, "NewPossibleConnectionTypes");*/
 	/*p = GetValueFromNameValueList(&pdata, "NewPossibleConnectionTypes");*/
 	/* PossibleConnectionTypes will have several values.... */
 	/* PossibleConnectionTypes will have several values.... */
@@ -251,7 +251,7 @@ UPNP_GetLinkLayerMaxBitRates(const char * controlURL,
 	}
 	}
 	/*DisplayNameValueList(buffer, bufsize);*/
 	/*DisplayNameValueList(buffer, bufsize);*/
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 	/*down = GetValueFromNameValueList(&pdata, "NewDownstreamMaxBitRate");*/
 	/*down = GetValueFromNameValueList(&pdata, "NewDownstreamMaxBitRate");*/
 	/*up = GetValueFromNameValueList(&pdata, "NewUpstreamMaxBitRate");*/
 	/*up = GetValueFromNameValueList(&pdata, "NewUpstreamMaxBitRate");*/
 	down = GetValueFromNameValueList(&pdata, "NewLayer1DownstreamMaxBitRate");
 	down = GetValueFromNameValueList(&pdata, "NewLayer1DownstreamMaxBitRate");
@@ -315,7 +315,7 @@ UPNP_GetExternalIPAddress(const char * controlURL,
 	}
 	}
 	/*DisplayNameValueList(buffer, bufsize);*/
 	/*DisplayNameValueList(buffer, bufsize);*/
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 	/*printf("external ip = %s\n", GetValueFromNameValueList(&pdata, "NewExternalIPAddress") );*/
 	/*printf("external ip = %s\n", GetValueFromNameValueList(&pdata, "NewExternalIPAddress") );*/
 	p = GetValueFromNameValueList(&pdata, "NewExternalIPAddress");
 	p = GetValueFromNameValueList(&pdata, "NewExternalIPAddress");
 	if(p) {
 	if(p) {
@@ -385,7 +385,7 @@ UPNP_AddPortMapping(const char * controlURL, const char * servicetype,
 	/*buffer[bufsize] = '\0';*/
 	/*buffer[bufsize] = '\0';*/
 	/*puts(buffer);*/
 	/*puts(buffer);*/
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 	resVal = GetValueFromNameValueList(&pdata, "errorCode");
 	resVal = GetValueFromNameValueList(&pdata, "errorCode");
 	if(resVal) {
 	if(resVal) {
 		/*printf("AddPortMapping errorCode = '%s'\n", resVal); */
 		/*printf("AddPortMapping errorCode = '%s'\n", resVal); */
@@ -446,7 +446,7 @@ UPNP_AddAnyPortMapping(const char * controlURL, const char * servicetype,
 		return UPNPCOMMAND_HTTP_ERROR;
 		return UPNPCOMMAND_HTTP_ERROR;
 	}
 	}
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 	resVal = GetValueFromNameValueList(&pdata, "errorCode");
 	resVal = GetValueFromNameValueList(&pdata, "errorCode");
 	if(resVal) {
 	if(resVal) {
 		ret = UPNPCOMMAND_UNKNOWN_ERROR;
 		ret = UPNPCOMMAND_UNKNOWN_ERROR;
@@ -501,7 +501,7 @@ UPNP_DeletePortMapping(const char * controlURL, const char * servicetype,
 	}
 	}
 	/*DisplayNameValueList(buffer, bufsize);*/
 	/*DisplayNameValueList(buffer, bufsize);*/
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 	resVal = GetValueFromNameValueList(&pdata, "errorCode");
 	resVal = GetValueFromNameValueList(&pdata, "errorCode");
 	if(resVal) {
 	if(resVal) {
 		ret = UPNPCOMMAND_UNKNOWN_ERROR;
 		ret = UPNPCOMMAND_UNKNOWN_ERROR;
@@ -549,7 +549,7 @@ UPNP_DeletePortMappingRange(const char * controlURL, const char * servicetype,
 		return UPNPCOMMAND_HTTP_ERROR;
 		return UPNPCOMMAND_HTTP_ERROR;
 	}
 	}
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 	resVal = GetValueFromNameValueList(&pdata, "errorCode");
 	resVal = GetValueFromNameValueList(&pdata, "errorCode");
 	if(resVal) {
 	if(resVal) {
 		ret = UPNPCOMMAND_UNKNOWN_ERROR;
 		ret = UPNPCOMMAND_UNKNOWN_ERROR;
@@ -597,7 +597,7 @@ UPNP_GetGenericPortMappingEntry(const char * controlURL,
 		return UPNPCOMMAND_HTTP_ERROR;
 		return UPNPCOMMAND_HTTP_ERROR;
 	}
 	}
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 
 
 	p = GetValueFromNameValueList(&pdata, "NewRemoteHost");
 	p = GetValueFromNameValueList(&pdata, "NewRemoteHost");
 	if(p && rHost)
 	if(p && rHost)
@@ -677,7 +677,7 @@ UPNP_GetPortMappingNumberOfEntries(const char * controlURL,
 	DisplayNameValueList(buffer, bufsize);
 	DisplayNameValueList(buffer, bufsize);
 #endif
 #endif
  	ParseNameValue(buffer, bufsize, &pdata);
  	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 
 
  	p = GetValueFromNameValueList(&pdata, "NewPortMappingNumberOfEntries");
  	p = GetValueFromNameValueList(&pdata, "NewPortMappingNumberOfEntries");
  	if(numEntries && p) {
  	if(numEntries && p) {
@@ -739,7 +739,7 @@ UPNP_GetSpecificPortMappingEntry(const char * controlURL,
 	}
 	}
 	/*DisplayNameValueList(buffer, bufsize);*/
 	/*DisplayNameValueList(buffer, bufsize);*/
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 
 
 	p = GetValueFromNameValueList(&pdata, "NewInternalClient");
 	p = GetValueFromNameValueList(&pdata, "NewInternalClient");
 	if(p) {
 	if(p) {
@@ -836,7 +836,7 @@ UPNP_GetListOfPortMappings(const char * controlURL,
 
 
 	/*DisplayNameValueList(buffer, bufsize);*/
 	/*DisplayNameValueList(buffer, bufsize);*/
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 
 
 	/*p = GetValueFromNameValueList(&pdata, "NewPortListing");*/
 	/*p = GetValueFromNameValueList(&pdata, "NewPortListing");*/
 	/*if(p) {
 	/*if(p) {
@@ -898,7 +898,7 @@ UPNP_GetFirewallStatus(const char * controlURL,
 		return UPNPCOMMAND_HTTP_ERROR;
 		return UPNPCOMMAND_HTTP_ERROR;
 	}
 	}
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 	fe = GetValueFromNameValueList(&pdata, "FirewallEnabled");
 	fe = GetValueFromNameValueList(&pdata, "FirewallEnabled");
 	ipa = GetValueFromNameValueList(&pdata, "InboundPinholeAllowed");
 	ipa = GetValueFromNameValueList(&pdata, "InboundPinholeAllowed");
 	if(ipa && fe)
 	if(ipa && fe)
@@ -935,7 +935,6 @@ UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype
 	int bufsize;
 	int bufsize;
 	struct NameValueParserData pdata;
 	struct NameValueParserData pdata;
 	const char * resVal;
 	const char * resVal;
-	char * p;
 	int ret;
 	int ret;
 
 
 	if(!intPort || !intClient || !proto || !remotePort || !remoteHost)
 	if(!intPort || !intClient || !proto || !remotePort || !remoteHost)
@@ -960,7 +959,7 @@ UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype
 	if(!buffer)
 	if(!buffer)
 		return UPNPCOMMAND_HTTP_ERROR;
 		return UPNPCOMMAND_HTTP_ERROR;
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 	resVal = GetValueFromNameValueList(&pdata, "errorCode");
 	resVal = GetValueFromNameValueList(&pdata, "errorCode");
 	if(resVal)
 	if(resVal)
 	{
 	{
@@ -969,10 +968,10 @@ UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype
 	}
 	}
 	else
 	else
 	{
 	{
-		ret = UPNPCOMMAND_SUCCESS;
-		p = GetValueFromNameValueList(&pdata, "OutboundPinholeTimeout");
+		const char * p = GetValueFromNameValueList(&pdata, "OutboundPinholeTimeout");
 		if(p)
 		if(p)
 			*opTimeout = my_atoui(p);
 			*opTimeout = my_atoui(p);
+		ret = UPNPCOMMAND_SUCCESS;
 	}
 	}
 	ClearNameValueList(&pdata);
 	ClearNameValueList(&pdata);
 	return ret;
 	return ret;
@@ -1037,7 +1036,7 @@ UPNP_AddPinhole(const char * controlURL, const char * servicetype,
 	if(!buffer)
 	if(!buffer)
 		return UPNPCOMMAND_HTTP_ERROR;
 		return UPNPCOMMAND_HTTP_ERROR;
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 	p = GetValueFromNameValueList(&pdata, "UniqueID");
 	p = GetValueFromNameValueList(&pdata, "UniqueID");
 	if(p)
 	if(p)
 	{
 	{
@@ -1087,7 +1086,7 @@ UPNP_UpdatePinhole(const char * controlURL, const char * servicetype,
 	if(!buffer)
 	if(!buffer)
 		return UPNPCOMMAND_HTTP_ERROR;
 		return UPNPCOMMAND_HTTP_ERROR;
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 	resVal = GetValueFromNameValueList(&pdata, "errorCode");
 	resVal = GetValueFromNameValueList(&pdata, "errorCode");
 	if(resVal)
 	if(resVal)
 	{
 	{
@@ -1129,7 +1128,7 @@ UPNP_DeletePinhole(const char * controlURL, const char * servicetype, const char
 		return UPNPCOMMAND_HTTP_ERROR;
 		return UPNPCOMMAND_HTTP_ERROR;
 	/*DisplayNameValueList(buffer, bufsize);*/
 	/*DisplayNameValueList(buffer, bufsize);*/
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 	resVal = GetValueFromNameValueList(&pdata, "errorCode");
 	resVal = GetValueFromNameValueList(&pdata, "errorCode");
 	if(resVal)
 	if(resVal)
 	{
 	{
@@ -1171,7 +1170,7 @@ UPNP_CheckPinholeWorking(const char * controlURL, const char * servicetype,
 		return UPNPCOMMAND_HTTP_ERROR;
 		return UPNPCOMMAND_HTTP_ERROR;
 	}
 	}
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 
 
 	p = GetValueFromNameValueList(&pdata, "IsWorking");
 	p = GetValueFromNameValueList(&pdata, "IsWorking");
 	if(p)
 	if(p)
@@ -1218,7 +1217,7 @@ UPNP_GetPinholePackets(const char * controlURL, const char * servicetype,
 	if(!buffer)
 	if(!buffer)
 		return UPNPCOMMAND_HTTP_ERROR;
 		return UPNPCOMMAND_HTTP_ERROR;
 	ParseNameValue(buffer, bufsize, &pdata);
 	ParseNameValue(buffer, bufsize, &pdata);
-	free(buffer); buffer = NULL;
+	free(buffer);
 
 
 	p = GetValueFromNameValueList(&pdata, "PinholePackets");
 	p = GetValueFromNameValueList(&pdata, "PinholePackets");
 	if(p)
 	if(p)
@@ -1237,5 +1236,3 @@ UPNP_GetPinholePackets(const char * controlURL, const char * servicetype,
 	ClearNameValueList(&pdata);
 	ClearNameValueList(&pdata);
 	return ret;
 	return ret;
 }
 }
-
-

+ 3 - 3
thirdparty/miniupnpc/miniupnpc/upnpcommands.h

@@ -206,9 +206,9 @@ UPNP_DeletePortMappingRange(const char * controlURL, const char * servicetype,
 /* UPNP_GetPortMappingNumberOfEntries()
 /* UPNP_GetPortMappingNumberOfEntries()
  * not supported by all routers */
  * not supported by all routers */
 MINIUPNP_LIBSPEC int
 MINIUPNP_LIBSPEC int
-UPNP_GetPortMappingNumberOfEntries(const char* controlURL,
-                                   const char* servicetype,
-                                   unsigned int * num);
+UPNP_GetPortMappingNumberOfEntries(const char * controlURL,
+                                   const char * servicetype,
+                                   unsigned int * numEntries);
 
 
 /* UPNP_GetSpecificPortMappingEntry()
 /* UPNP_GetSpecificPortMappingEntry()
  *    retrieves an existing port mapping
  *    retrieves an existing port mapping

+ 0 - 0
thirdparty/miniupnpc/upnpdev.c → thirdparty/miniupnpc/miniupnpc/upnpdev.c


+ 0 - 0
thirdparty/miniupnpc/upnpdev.h → thirdparty/miniupnpc/miniupnpc/upnpdev.h


+ 6 - 2
thirdparty/miniupnpc/upnperrors.c → thirdparty/miniupnpc/miniupnpc/upnperrors.c

@@ -1,7 +1,7 @@
-/* $Id: upnperrors.c,v 1.5 2011/04/10 11:19:36 nanard Exp $ */
+/* $Id: upnperrors.c,v 1.9 2019/06/25 21:15:46 nanard Exp $ */
 /* Project : miniupnp
 /* Project : miniupnp
  * Author : Thomas BERNARD
  * Author : Thomas BERNARD
- * copyright (c) 2007 Thomas Bernard
+ * copyright (c) 2007-2019 Thomas Bernard
  * All Right reserved.
  * All Right reserved.
  * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
  * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
  * This software is subjet to the conditions detailed in the
  * This software is subjet to the conditions detailed in the
@@ -27,10 +27,14 @@ const char * strupnperror(int err)
 	case UPNPCOMMAND_INVALID_RESPONSE:
 	case UPNPCOMMAND_INVALID_RESPONSE:
 		s = "Miniupnpc Invalid response";
 		s = "Miniupnpc Invalid response";
 		break;
 		break;
+	case UPNPCOMMAND_HTTP_ERROR:
+		s = "Miniupnpc HTTP error";
+		break;
 	case UPNPDISCOVER_SOCKET_ERROR:
 	case UPNPDISCOVER_SOCKET_ERROR:
 		s = "Miniupnpc Socket error";
 		s = "Miniupnpc Socket error";
 		break;
 		break;
 	case UPNPDISCOVER_MEMORY_ERROR:
 	case UPNPDISCOVER_MEMORY_ERROR:
+	case UPNPCOMMAND_MEM_ALLOC_ERROR:
 		s = "Miniupnpc Memory allocation error";
 		s = "Miniupnpc Memory allocation error";
 		break;
 		break;
 	case 401:
 	case 401:

+ 0 - 0
thirdparty/miniupnpc/upnperrors.h → thirdparty/miniupnpc/miniupnpc/upnperrors.h


+ 3 - 2
thirdparty/miniupnpc/upnpreplyparse.c → thirdparty/miniupnpc/miniupnpc/upnpreplyparse.c

@@ -1,8 +1,8 @@
-/* $Id: upnpreplyparse.c,v 1.19 2015/07/15 10:29:11 nanard Exp $ */
+/* $Id: upnpreplyparse.c,v 1.20 2017/12/12 11:26:25 nanard Exp $ */
 /* vim: tabstop=4 shiftwidth=4 noexpandtab
 /* vim: tabstop=4 shiftwidth=4 noexpandtab
  * MiniUPnP project
  * MiniUPnP project
  * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
  * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
- * (c) 2006-2017 Thomas Bernard
+ * (c) 2006-2019 Thomas Bernard
  * This software is subject to the conditions detailed
  * This software is subject to the conditions detailed
  * in the LICENCE file provided within the distribution */
  * in the LICENCE file provided within the distribution */
 
 
@@ -78,6 +78,7 @@ NameValueParserGetData(void * d, const char * datas, int l)
 	if(strcmp(data->curelt, "NewPortListing") == 0)
 	if(strcmp(data->curelt, "NewPortListing") == 0)
 	{
 	{
 		/* specific case for NewPortListing which is a XML Document */
 		/* specific case for NewPortListing which is a XML Document */
+		free(data->portListing);
 		data->portListing = malloc(l + 1);
 		data->portListing = malloc(l + 1);
 		if(!data->portListing)
 		if(!data->portListing)
 		{
 		{

+ 0 - 0
thirdparty/miniupnpc/upnpreplyparse.h → thirdparty/miniupnpc/miniupnpc/upnpreplyparse.h


+ 0 - 27
thirdparty/miniupnpc/miniwget.h

@@ -1,27 +0,0 @@
-/* $Id: miniwget.h,v 1.12 2016/01/24 17:24:36 nanard Exp $ */
-/* Project : miniupnp
- * Author : Thomas Bernard
- * Copyright (c) 2005-2016 Thomas Bernard
- * This software is subject to the conditions detailed in the
- * LICENCE file provided in this distribution.
- * */
-#ifndef MINIWGET_H_INCLUDED
-#define MINIWGET_H_INCLUDED
-
-#include "miniupnpc_declspec.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-MINIUPNP_LIBSPEC void * miniwget(const char *, int *, unsigned int, int *);
-
-MINIUPNP_LIBSPEC void * miniwget_getaddr(const char *, int *, char *, int, unsigned int, int *);
-
-int parseURL(const char *, char *, unsigned short *, char * *, unsigned int *);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif

+ 0 - 348
thirdparty/miniupnpc/upnpcommands.h

@@ -1,348 +0,0 @@
-/* $Id: upnpcommands.h,v 1.32 2018/03/13 23:34:47 nanard Exp $ */
-/* Miniupnp project : http://miniupnp.free.fr/
- * Author : Thomas Bernard
- * Copyright (c) 2005-2018 Thomas Bernard
- * This software is subject to the conditions detailed in the
- * LICENCE file provided within this distribution */
-#ifndef UPNPCOMMANDS_H_INCLUDED
-#define UPNPCOMMANDS_H_INCLUDED
-
-#include "miniupnpc_declspec.h"
-#include "miniupnpctypes.h"
-
-/* MiniUPnPc return codes : */
-#define UPNPCOMMAND_SUCCESS (0)
-#define UPNPCOMMAND_UNKNOWN_ERROR (-1)
-#define UPNPCOMMAND_INVALID_ARGS (-2)
-#define UPNPCOMMAND_HTTP_ERROR (-3)
-#define UPNPCOMMAND_INVALID_RESPONSE (-4)
-#define UPNPCOMMAND_MEM_ALLOC_ERROR (-5)
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct PortMappingParserData;
-
-MINIUPNP_LIBSPEC UNSIGNED_INTEGER
-UPNP_GetTotalBytesSent(const char * controlURL,
-					const char * servicetype);
-
-MINIUPNP_LIBSPEC UNSIGNED_INTEGER
-UPNP_GetTotalBytesReceived(const char * controlURL,
-						const char * servicetype);
-
-MINIUPNP_LIBSPEC UNSIGNED_INTEGER
-UPNP_GetTotalPacketsSent(const char * controlURL,
-					const char * servicetype);
-
-MINIUPNP_LIBSPEC UNSIGNED_INTEGER
-UPNP_GetTotalPacketsReceived(const char * controlURL,
-					const char * servicetype);
-
-/* UPNP_GetStatusInfo()
- * status and lastconnerror are 64 byte buffers
- * Return values :
- * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
- * or a UPnP Error code */
-MINIUPNP_LIBSPEC int
-UPNP_GetStatusInfo(const char * controlURL,
-			       const char * servicetype,
-				   char * status,
-				   unsigned int * uptime,
-                   char * lastconnerror);
-
-/* UPNP_GetConnectionTypeInfo()
- * argument connectionType is a 64 character buffer
- * Return Values :
- * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
- * or a UPnP Error code */
-MINIUPNP_LIBSPEC int
-UPNP_GetConnectionTypeInfo(const char * controlURL,
-                           const char * servicetype,
-						   char * connectionType);
-
-/* UPNP_GetExternalIPAddress() call the corresponding UPNP method.
- * if the third arg is not null the value is copied to it.
- * at least 16 bytes must be available
- *
- * Return values :
- * 0 : SUCCESS
- * NON ZERO : ERROR Either an UPnP error code or an unknown error.
- *
- * possible UPnP Errors :
- * 402 Invalid Args - See UPnP Device Architecture section on Control.
- * 501 Action Failed - See UPnP Device Architecture section on Control. */
-MINIUPNP_LIBSPEC int
-UPNP_GetExternalIPAddress(const char * controlURL,
-                          const char * servicetype,
-                          char * extIpAdd);
-
-/* UPNP_GetLinkLayerMaxBitRates()
- * call WANCommonInterfaceConfig:1#GetCommonLinkProperties
- *
- * return values :
- * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
- * or a UPnP Error Code. */
-MINIUPNP_LIBSPEC int
-UPNP_GetLinkLayerMaxBitRates(const char* controlURL,
-							const char* servicetype,
-							unsigned int * bitrateDown,
-							unsigned int * bitrateUp);
-
-/* UPNP_AddPortMapping()
- * if desc is NULL, it will be defaulted to "libminiupnpc"
- * remoteHost is usually NULL because IGD don't support it.
- *
- * Return values :
- * 0 : SUCCESS
- * NON ZERO : ERROR. Either an UPnP error code or an unknown error.
- *
- * List of possible UPnP errors for AddPortMapping :
- * errorCode errorDescription (short) - Description (long)
- * 402 Invalid Args - See UPnP Device Architecture section on Control.
- * 501 Action Failed - See UPnP Device Architecture section on Control.
- * 606 Action not authorized - The action requested REQUIRES authorization and
- *                             the sender was not authorized.
- * 715 WildCardNotPermittedInSrcIP - The source IP address cannot be
- *                                   wild-carded
- * 716 WildCardNotPermittedInExtPort - The external port cannot be wild-carded
- * 718 ConflictInMappingEntry - The port mapping entry specified conflicts
- *                     with a mapping assigned previously to another client
- * 724 SamePortValuesRequired - Internal and External port values
- *                              must be the same
- * 725 OnlyPermanentLeasesSupported - The NAT implementation only supports
- *                  permanent lease times on port mappings
- * 726 RemoteHostOnlySupportsWildcard - RemoteHost must be a wildcard
- *                             and cannot be a specific IP address or DNS name
- * 727 ExternalPortOnlySupportsWildcard - ExternalPort must be a wildcard and
- *                                        cannot be a specific port value
- * 728 NoPortMapsAvailable - There are not enough free ports available to
- *                           complete port mapping.
- * 729 ConflictWithOtherMechanisms - Attempted port mapping is not allowed
- *                                   due to conflict with other mechanisms.
- * 732 WildCardNotPermittedInIntPort - The internal port cannot be wild-carded
- */
-MINIUPNP_LIBSPEC int
-UPNP_AddPortMapping(const char * controlURL, const char * servicetype,
-		    const char * extPort,
-		    const char * inPort,
-		    const char * inClient,
-		    const char * desc,
-		    const char * proto,
-		    const char * remoteHost,
-		    const char * leaseDuration);
-
-/* UPNP_AddAnyPortMapping()
- * if desc is NULL, it will be defaulted to "libminiupnpc"
- * remoteHost is usually NULL because IGD don't support it.
- *
- * Return values :
- * 0 : SUCCESS
- * NON ZERO : ERROR. Either an UPnP error code or an unknown error.
- *
- * List of possible UPnP errors for AddPortMapping :
- * errorCode errorDescription (short) - Description (long)
- * 402 Invalid Args - See UPnP Device Architecture section on Control.
- * 501 Action Failed - See UPnP Device Architecture section on Control.
- * 606 Action not authorized - The action requested REQUIRES authorization and
- *                             the sender was not authorized.
- * 715 WildCardNotPermittedInSrcIP - The source IP address cannot be
- *                                   wild-carded
- * 716 WildCardNotPermittedInExtPort - The external port cannot be wild-carded
- * 728 NoPortMapsAvailable - There are not enough free ports available to
- *                           complete port mapping.
- * 729 ConflictWithOtherMechanisms - Attempted port mapping is not allowed
- *                                   due to conflict with other mechanisms.
- * 732 WildCardNotPermittedInIntPort - The internal port cannot be wild-carded
- */
-MINIUPNP_LIBSPEC int
-UPNP_AddAnyPortMapping(const char * controlURL, const char * servicetype,
-		       const char * extPort,
-		       const char * inPort,
-		       const char * inClient,
-		       const char * desc,
-		       const char * proto,
-		       const char * remoteHost,
-		       const char * leaseDuration,
-		       char * reservedPort);
-
-/* UPNP_DeletePortMapping()
- * Use same argument values as what was used for AddPortMapping().
- * remoteHost is usually NULL because IGD don't support it.
- * Return Values :
- * 0 : SUCCESS
- * NON ZERO : error. Either an UPnP error code or an undefined error.
- *
- * List of possible UPnP errors for DeletePortMapping :
- * 402 Invalid Args - See UPnP Device Architecture section on Control.
- * 606 Action not authorized - The action requested REQUIRES authorization
- *                             and the sender was not authorized.
- * 714 NoSuchEntryInArray - The specified value does not exist in the array */
-MINIUPNP_LIBSPEC int
-UPNP_DeletePortMapping(const char * controlURL, const char * servicetype,
-		       const char * extPort, const char * proto,
-		       const char * remoteHost);
-
-/* UPNP_DeletePortRangeMapping()
- * Use same argument values as what was used for AddPortMapping().
- * remoteHost is usually NULL because IGD don't support it.
- * Return Values :
- * 0 : SUCCESS
- * NON ZERO : error. Either an UPnP error code or an undefined error.
- *
- * List of possible UPnP errors for DeletePortMapping :
- * 606 Action not authorized - The action requested REQUIRES authorization
- *                             and the sender was not authorized.
- * 730 PortMappingNotFound - This error message is returned if no port
- *			     mapping is found in the specified range.
- * 733 InconsistentParameters - NewStartPort and NewEndPort values are not consistent. */
-MINIUPNP_LIBSPEC int
-UPNP_DeletePortMappingRange(const char * controlURL, const char * servicetype,
-        		    const char * extPortStart, const char * extPortEnd,
-        		    const char * proto,
-        		    const char * manage);
-
-/* UPNP_GetPortMappingNumberOfEntries()
- * not supported by all routers */
-MINIUPNP_LIBSPEC int
-UPNP_GetPortMappingNumberOfEntries(const char* controlURL,
-                                   const char* servicetype,
-                                   unsigned int * num);
-
-/* UPNP_GetSpecificPortMappingEntry()
- *    retrieves an existing port mapping
- * params :
- *  in   extPort
- *  in   proto
- *  in   remoteHost
- *  out  intClient (16 bytes)
- *  out  intPort (6 bytes)
- *  out  desc (80 bytes)
- *  out  enabled (4 bytes)
- *  out  leaseDuration (16 bytes)
- *
- * return value :
- * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
- * or a UPnP Error Code.
- *
- * List of possible UPnP errors for _GetSpecificPortMappingEntry :
- * 402 Invalid Args - See UPnP Device Architecture section on Control.
- * 501 Action Failed - See UPnP Device Architecture section on Control.
- * 606 Action not authorized - The action requested REQUIRES authorization
- *                             and the sender was not authorized.
- * 714 NoSuchEntryInArray - The specified value does not exist in the array.
- */
-MINIUPNP_LIBSPEC int
-UPNP_GetSpecificPortMappingEntry(const char * controlURL,
-                                 const char * servicetype,
-                                 const char * extPort,
-                                 const char * proto,
-                                 const char * remoteHost,
-                                 char * intClient,
-                                 char * intPort,
-                                 char * desc,
-                                 char * enabled,
-                                 char * leaseDuration);
-
-/* UPNP_GetGenericPortMappingEntry()
- * params :
- *  in   index
- *  out  extPort (6 bytes)
- *  out  intClient (16 bytes)
- *  out  intPort (6 bytes)
- *  out  protocol (4 bytes)
- *  out  desc (80 bytes)
- *  out  enabled (4 bytes)
- *  out  rHost (64 bytes)
- *  out  duration (16 bytes)
- *
- * return value :
- * UPNPCOMMAND_SUCCESS, UPNPCOMMAND_INVALID_ARGS, UPNPCOMMAND_UNKNOWN_ERROR
- * or a UPnP Error Code.
- *
- * Possible UPNP Error codes :
- * 402 Invalid Args - See UPnP Device Architecture section on Control.
- * 606 Action not authorized - The action requested REQUIRES authorization
- *                             and the sender was not authorized.
- * 713 SpecifiedArrayIndexInvalid - The specified array index is out of bounds
- */
-MINIUPNP_LIBSPEC int
-UPNP_GetGenericPortMappingEntry(const char * controlURL,
-                                const char * servicetype,
-								const char * index,
-								char * extPort,
-								char * intClient,
-								char * intPort,
-								char * protocol,
-								char * desc,
-								char * enabled,
-								char * rHost,
-								char * duration);
-
-/* UPNP_GetListOfPortMappings()      Available in IGD v2
- *
- *
- * Possible UPNP Error codes :
- * 606 Action not Authorized
- * 730 PortMappingNotFound - no port mapping is found in the specified range.
- * 733 InconsistantParameters - NewStartPort and NewEndPort values are not
- *                              consistent.
- */
-MINIUPNP_LIBSPEC int
-UPNP_GetListOfPortMappings(const char * controlURL,
-                           const char * servicetype,
-                           const char * startPort,
-                           const char * endPort,
-                           const char * protocol,
-                           const char * numberOfPorts,
-                           struct PortMappingParserData * data);
-
-/* IGD:2, functions for service WANIPv6FirewallControl:1 */
-MINIUPNP_LIBSPEC int
-UPNP_GetFirewallStatus(const char * controlURL,
-				const char * servicetype,
-				int * firewallEnabled,
-				int * inboundPinholeAllowed);
-
-MINIUPNP_LIBSPEC int
-UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype,
-                    const char * remoteHost,
-                    const char * remotePort,
-                    const char * intClient,
-                    const char * intPort,
-                    const char * proto,
-                    int * opTimeout);
-
-MINIUPNP_LIBSPEC int
-UPNP_AddPinhole(const char * controlURL, const char * servicetype,
-                    const char * remoteHost,
-                    const char * remotePort,
-                    const char * intClient,
-                    const char * intPort,
-                    const char * proto,
-                    const char * leaseTime,
-                    char * uniqueID);
-
-MINIUPNP_LIBSPEC int
-UPNP_UpdatePinhole(const char * controlURL, const char * servicetype,
-                    const char * uniqueID,
-                    const char * leaseTime);
-
-MINIUPNP_LIBSPEC int
-UPNP_DeletePinhole(const char * controlURL, const char * servicetype, const char * uniqueID);
-
-MINIUPNP_LIBSPEC int
-UPNP_CheckPinholeWorking(const char * controlURL, const char * servicetype,
-                                 const char * uniqueID, int * isWorking);
-
-MINIUPNP_LIBSPEC int
-UPNP_GetPinholePackets(const char * controlURL, const char * servicetype,
-                                 const char * uniqueID, int * packets);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-