Update miniupnpc library to latest master
(cherry picked from commit 78907d91f1
)
This commit is contained in:
parent
8901ff5e58
commit
eb29bd988c
|
@ -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()
|
||||||
|
|
|
@ -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).
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
|
@ -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;
|
||||||
}
|
}
|
|
@ -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__)) */
|
||||||
|
|
|
@ -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 {
|
|
@ -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
|
|
@ -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
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
|
@ -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)
|
||||||
{
|
{
|
|
@ -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
|
|
|
@ -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
|
|
||||||
|
|
Loading…
Reference in New Issue