Update miniupnpc library to latest master

(cherry picked from commit 78907d91f1)
This commit is contained in:
Fabio Alessandrelli 2019-06-30 17:31:51 +02:00 committed by Rémi Verschelde
parent 8901ff5e58
commit eb29bd988c
41 changed files with 196 additions and 743 deletions

View File

@ -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()

View File

@ -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).

View File

@ -1,5 +1,5 @@
MiniUPnPc MiniUPnP Project
Copyright (c) 2005-2016, Thomas BERNARD 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

View File

@ -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

View File

@ -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

View File

@ -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) if(n >= 0) /* connect() was successful */
{
closesocket(s);
continue;
}
else
{
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;
} }

View File

@ -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

View File

@ -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 = NO_ERROR;
DWORD dwRetVal = 0;
unsigned int i = 0;
ULONG flags = GAA_FLAG_INCLUDE_PREFIX;
ULONG family = AF_INET;
LPVOID lpMsgBuf = NULL;
PIP_ADAPTER_ADDRESSES pAddresses = NULL; PIP_ADAPTER_ADDRESSES pAddresses = NULL;
ULONG outBufLen = 0; ULONG outBufLen = 15360;
ULONG Iterations = 0; 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; for (Iterations = 0; Iterations < 3; Iterations++) {
do {
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) { if (dwRetVal != ERROR_BUFFER_OVERFLOW) {
HeapFree(GetProcessHeap(), 0, pAddresses);
pAddresses = NULL;
} else {
break; break;
} }
Iterations++; HeapFree(GetProcessHeap(), 0, pAddresses);
} while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (Iterations < 3)); 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(((PSOCKADDR_IN)pUnicast->Address.lpSockaddr)->sin_addr) );
printf("\tIP Address[%d]: \t%s\n", i, inet_ntoa(IPAddr) );
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(((PSOCKADDR_IN)pAnycast->Address.lpSockaddr)->sin_addr) );
printf("\tAnycast Address[%d]: \t%s\n", i, inet_ntoa(IPAddr) );
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(((PSOCKADDR_IN)pMulticast->Address.lpSockaddr)->sin_addr) );
printf("\tMulticast Address[%d]: \t%s\n", i, inet_ntoa(IPAddr) ); 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;
} } else {
for(p = servinfo; p; p = p->ai_next) { struct addrinfo *p;
n = sendto(sudp, bufr, n, 0, p->ai_addr, p->ai_addrlen); for(p = servinfo; p; p = p->ai_next) {
if (n < 0) { 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]; char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
if (getnameinfo(p->ai_addr, p->ai_addrlen, hbuf, sizeof(hbuf), sbuf, if (getnameinfo(p->ai_addr, (socklen_t)p->ai_addrlen, hbuf, sizeof(hbuf), sbuf,
sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0) { sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0) {
fprintf(stderr, "host:%s port:%s\n", hbuf, sbuf); fprintf(stderr, "host:%s port:%s\n", hbuf, sbuf);
} }
#endif #endif
PRINT_SOCKET_ERROR("sendto"); PRINT_SOCKET_ERROR("sendto");
continue; continue;
} else { } else {
sentok = 1; 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;
} }

View File

@ -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__)) */

View File

@ -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((atoi(addr + 4) | 0x0f) == 0x1f)
if((16 <= i) && (i <= 31))
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) /* ndev is always > 0 */
{ desc = calloc(ndev, sizeof(struct xml_desc));
desc = calloc(ndev, sizeof(struct xml_desc)); if(!desc)
if(!desc) return -1; /* memory allocation error */
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++)
for(i = 0; i < ndev; i++) { free(desc[i].xml);
if(desc[i].xml) { free(desc);
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 {

View File

@ -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

View File

@ -1,8 +1,9 @@
/* $Id: miniupnpcmodule.c,v 1.24 2014/06/10 09:48:11 nanard Exp $*/ /* $Id: miniupnpcmodule.c,v 1.34 2019/05/20 19:07:16 nanard Exp $*/
/* Project : miniupnp /* 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, #if (PY_MAJOR_VERSION >= 3) || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 3)
&host, &iPort, &desc, &remoteHost)) 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

View File

@ -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);
} }

View File

@ -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 */

View File

@ -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 */

View File

@ -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; const char * p = GetValueFromNameValueList(&pdata, "OutboundPinholeTimeout");
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;
} }

View File

@ -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, UPNP_GetPortMappingNumberOfEntries(const char * controlURL,
const char* servicetype, const char * servicetype,
unsigned int * num); unsigned int * numEntries);
/* UPNP_GetSpecificPortMappingEntry() /* UPNP_GetSpecificPortMappingEntry()
* retrieves an existing port mapping * retrieves an existing port mapping

View File

@ -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:

View File

@ -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)
{ {

View File

@ -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

View File

@ -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