diff options
| author | Tobias Markmann <tm@ayena.de> | 2015-01-25 19:16:43 (GMT) | 
|---|---|---|
| committer | Swift Review <review@swift.im> | 2015-02-09 15:46:21 (GMT) | 
| commit | 415e2a0e26af19e00b7cafb58be72909ae1d8212 (patch) | |
| tree | 945996fd950a3800e17a7897efb45d915b2537fc /3rdParty/LibMiniUPnPc/src | |
| parent | 1c64e31945e80e927f87a0a94ec5ce0e00c40a7f (diff) | |
| download | swift-415e2a0e26af19e00b7cafb58be72909ae1d8212.zip swift-415e2a0e26af19e00b7cafb58be72909ae1d8212.tar.bz2  | |
Update libminiupnpc to version 1.9
Fixes to our build of libminiupnpc:
* do not build minissdpc.c on windows
* if size of ip_mreqn is not defined, add -DNEED_STRUCT_IP_MREQN to the
  CFLAGS
Test-Information:
Verified it still builds.
Change-Id: Idd3e19d6302cccc95fff0a01540b9abc1bc91e9e
Diffstat (limited to '3rdParty/LibMiniUPnPc/src')
30 files changed, 660 insertions, 338 deletions
diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/LICENSE b/3rdParty/LibMiniUPnPc/src/miniupnpc/LICENSE index 2434c86..ac89a75 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/LICENSE +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/LICENSE @@ -1,5 +1,5 @@  MiniUPnPc -Copyright (c) 2005-2011, Thomas BERNARD  +Copyright (c) 2005-2011, Thomas BERNARD  All rights reserved.  Redistribution and use in source and binary forms, with or without diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/bsdqueue.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/bsdqueue.h index 1fe0599..c6afe1f 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/bsdqueue.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/bsdqueue.h @@ -36,7 +36,7 @@  #define	_SYS_QUEUE_H_  /* - * This file defines five types of data structures: singly-linked lists,  + * This file defines five types of data structures: singly-linked lists,   * lists, simple queues, tail queues, and circular queues.   *   * @@ -95,7 +95,7 @@  struct name {								\  	struct type *slh_first;	/* first element */			\  } -  +  #define	SLIST_HEAD_INITIALIZER(head)					\  	{ NULL } @@ -107,7 +107,7 @@ struct name {								\  struct {								\  	struct type *sle_next;	/* next element */			\  } -  +  /*   * Singly-linked List access methods.   */ @@ -322,8 +322,8 @@ struct {								\  	struct type **tqe_prev;	/* address of previous next element */	\  } -/*  - * tail queue access methods  +/* + * tail queue access methods   */  #define	TAILQ_FIRST(head)		((head)->tqh_first)  #define	TAILQ_END(head)			NULL @@ -430,7 +430,7 @@ struct {								\  }  /* - * Circular queue access methods  + * Circular queue access methods   */  #define	CIRCLEQ_FIRST(head)		((head)->cqh_first)  #define	CIRCLEQ_LAST(head)		((head)->cqh_last) diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/codelength.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/codelength.h index f11e5e9..d342bd1 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/codelength.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/codelength.h @@ -1,18 +1,25 @@ -/* $Id: codelength.h,v 1.1 2008/10/06 22:04:06 nanard Exp $ */ +/* $Id: codelength.h,v 1.4 2012/09/27 15:40:29 nanard Exp $ */  /* Project : miniupnp   * Author : Thomas BERNARD - * copyright (c) 2005-2008 Thomas Bernard + * copyright (c) 2005-2011 Thomas Bernard   * This software is subjet to the conditions detailed in the   * provided LICENCE file. */ -#ifndef __CODELENGTH_H__ -#define __CODELENGTH_H__ +#ifndef CODELENGTH_H_INCLUDED +#define CODELENGTH_H_INCLUDED  /* Encode length by using 7bit per Byte :   * Most significant bit of each byte specifies that the   * following byte is part of the code */  #define DECODELENGTH(n, p) n = 0; \                             do { n = (n << 7) | (*p & 0x7f); } \ -                           while(*(p++)&0x80); +                           while((*(p++)&0x80) && (n<(1<<25))); + +#define DECODELENGTH_CHECKLIMIT(n, p, p_limit) \ +	n = 0; \ +	do { \ +		if((p) >= (p_limit)) break; \ +		n = (n << 7) | (*(p) & 0x7f); \ +	} while((*((p)++)&0x80) && (n<(1<<25)));  #define CODELENGTH(n, p) if(n>=268435456) *(p++) = (n >> 28) | 0x80; \                           if(n>=2097152) *(p++) = (n >> 21) | 0x80; \ diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/connecthostport.c b/3rdParty/LibMiniUPnPc/src/miniupnpc/connecthostport.c index 7afd2b1..aabc7a6 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/connecthostport.c +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/connecthostport.c @@ -1,7 +1,7 @@ -/* $Id: connecthostport.c,v 1.5 2011/04/09 08:49:50 nanard Exp $ */ +/* $Id: connecthostport.c,v 1.11 2013/08/01 21:21:25 nanard Exp $ */  /* Project : miniupnp   * Author : Thomas Bernard - * Copyright (c) 2010-2011 Thomas Bernard + * Copyright (c) 2010-2013 Thomas Bernard   * This software is subject to the conditions detailed in the   * LICENCE file provided in this distribution. */ @@ -13,7 +13,7 @@  #include <string.h>  #include <stdio.h> -#ifdef WIN32 +#ifdef _WIN32  #include <winsock2.h>  #include <ws2tcpip.h>  #include <io.h> @@ -21,12 +21,14 @@  #define snprintf _snprintf  #define herror  #define socklen_t int -#else /* #ifdef WIN32 */ +#else /* #ifdef _WIN32 */  #include <unistd.h>  #include <sys/param.h> +#include <sys/select.h>  #include <errno.h>  #define closesocket close  #include <netdb.h> +#include <netinet/in.h>  /* defining MINIUPNPC_IGNORE_EINTR enable the ignore of interruptions   * during the connect() call */  #define MINIUPNPC_IGNORE_EINTR @@ -34,10 +36,10 @@  #include <sys/types.h>  #include <sys/socket.h>  #endif /* #ifndef USE_GETHOSTBYNAME */ -#endif /* #else WIN32 */ +#endif /* #else _WIN32 */  /* definition of PRINT_SOCKET_ERROR */ -#ifdef WIN32 +#ifdef _WIN32  #define PRINT_SOCKET_ERROR(x)    printf("Socket error: %s, %d\n", x, WSAGetLastError());  #else  #define PRINT_SOCKET_ERROR(x) perror(x) @@ -49,10 +51,15 @@  #include "connecthostport.h" +#ifndef MAXHOSTNAMELEN +#define MAXHOSTNAMELEN 64 +#endif +  /* connecthostport()   * return a socket connected (TCP) to the host and port   * or -1 in case of error */ -int connecthostport(const char * host, unsigned short port) +int connecthostport(const char * host, unsigned short port, +                    unsigned int scope_id)  {  	int s, n;  #ifdef USE_GETHOSTBYNAME @@ -67,7 +74,7 @@ int connecthostport(const char * host, unsigned short port)  #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT  	struct timeval timeout;  #endif /* #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT */ -	 +  #ifdef USE_GETHOSTBYNAME  	hp = gethostbyname(host);  	if(hp == NULL) @@ -85,13 +92,13 @@ int connecthostport(const char * host, unsigned short port)  	}  #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT  	/* setting a 3 seconds timeout for the connect() call */ -	timeout.tv_sec = 5; +	timeout.tv_sec = 3;  	timeout.tv_usec = 0;  	if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)) < 0)  	{  		PRINT_SOCKET_ERROR("setsockopt");  	} -	timeout.tv_sec = 5; +	timeout.tv_sec = 3;  	timeout.tv_usec = 0;  	if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)) < 0)  	{ @@ -145,10 +152,12 @@ int connecthostport(const char * host, unsigned short port)  	if(host[0] == '[')  	{  		/* literal ip v6 address */ -		int i; -		for(i = 0; host[i+1] && (host[i+1] != ']') && i < MAXHOSTNAMELEN; i++) +		int i, j; +		for(i = 0, j = 1; host[j] && (host[j] != ']') && i < MAXHOSTNAMELEN; i++, j++)  		{ -			tmp_host[i] = host[i+1]; +			tmp_host[i] = host[j]; +			if(0 == memcmp(host+j, "%25", 3))	/* %25 is just url encoding for '%' */ +				j+=2;							/* skip "25" */  		}  		tmp_host[i] = '\0';  	} @@ -160,7 +169,7 @@ int connecthostport(const char * host, unsigned short port)  	n = getaddrinfo(tmp_host, port_str, &hints, &ai);  	if(n != 0)  	{ -#ifdef WIN32 +#ifdef _WIN32  		fprintf(stderr, "getaddrinfo() error : %d\n", n);  #else  		fprintf(stderr, "getaddrinfo() error : %s\n", gai_strerror(n)); @@ -173,15 +182,19 @@ int connecthostport(const char * host, unsigned short port)  		s = socket(p->ai_family, p->ai_socktype, p->ai_protocol);  		if(s < 0)  			continue; +		if(p->ai_addr->sa_family == AF_INET6 && scope_id > 0) { +			struct sockaddr_in6 * addr6 = (struct sockaddr_in6 *)p->ai_addr; +			addr6->sin6_scope_id = scope_id; +		}  #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT  		/* setting a 3 seconds timeout for the connect() call */ -		timeout.tv_sec = 5; +		timeout.tv_sec = 3;  		timeout.tv_usec = 0;  		if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)) < 0)  		{  			PRINT_SOCKET_ERROR("setsockopt");  		} -		timeout.tv_sec = 5; +		timeout.tv_sec = 3;  		timeout.tv_usec = 0;  		if(setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(struct timeval)) < 0)  		{ diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/connecthostport.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/connecthostport.h index 57e24eb..56941d6 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/connecthostport.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/connecthostport.h @@ -1,17 +1,18 @@ -/* $Id: connecthostport.h,v 1.1 2010/04/04 23:21:03 nanard Exp $ */ +/* $Id: connecthostport.h,v 1.3 2012/09/27 15:42:10 nanard Exp $ */  /* Project: miniupnp   * http://miniupnp.free.fr/   * Author: Thomas Bernard - * Copyright (c) 2010 Thomas Bernard + * Copyright (c) 2010-2012 Thomas Bernard   * This software is subjects to the conditions detailed   * in the LICENCE file provided within this distribution */ -#ifndef __CONNECTHOSTPORT_H__ -#define __CONNECTHOSTPORT_H__ +#ifndef CONNECTHOSTPORT_H_INCLUDED +#define CONNECTHOSTPORT_H_INCLUDED  /* connecthostport()   * return a socket connected (TCP) to the host and port   * or -1 in case of error */ -int connecthostport(const char * host, unsigned short port); +int connecthostport(const char * host, unsigned short port, +                    unsigned int scope_id);  #endif diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/declspec.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/declspec.h index b804247..f66b6d7 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/declspec.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/declspec.h @@ -1,7 +1,7 @@ -#ifndef __DECLSPEC_H__ -#define __DECLSPEC_H__ +#ifndef DECLSPEC_H_INCLUDED +#define DECLSPEC_H_INCLUDED -#if defined(WIN32) && !defined(STATICLIB) +#if defined(_WIN32) && !defined(STATICLIB)  	#ifdef MINIUPNP_EXPORTS  		#define LIBSPEC __declspec(dllexport)  	#else diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/igd_desc_parse.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/igd_desc_parse.h index bab1fd5..0a49b01 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/igd_desc_parse.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/igd_desc_parse.h @@ -1,4 +1,4 @@ -/* $Id: igd_desc_parse.h,v 1.10 2011/04/11 09:19:24 nanard Exp $ */ +/* $Id: igd_desc_parse.h,v 1.11 2012/10/16 16:49:02 nanard Exp $ */  /* Project : miniupnp   * http://miniupnp.free.fr/   * Author : Thomas Bernard @@ -6,8 +6,8 @@   * This software is subject to the conditions detailed in the   * LICENCE file provided in this distribution.   * */ -#ifndef __IGD_DESC_PARSE_H__ -#define __IGD_DESC_PARSE_H__ +#ifndef IGD_DESC_PARSE_H_INCLUDED +#define IGD_DESC_PARSE_H_INCLUDED  /* Structure to store the result of the parsing of UPnP   * descriptions of Internet Gateway Devices */ diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/minisoap.c b/3rdParty/LibMiniUPnPc/src/miniupnpc/minisoap.c index 8889bf0..e45a481 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/minisoap.c +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/minisoap.c @@ -1,7 +1,7 @@ -/* $Id: minisoap.c,v 1.21 2011/03/22 19:15:35 nanard Exp $ */ +/* $Id: minisoap.c,v 1.22 2012/01/21 13:30:31 nanard Exp $ */  /* Project : miniupnp   * Author : Thomas Bernard - * Copyright (c) 2005-2009 Thomas Bernard + * Copyright (c) 2005-2012 Thomas Bernard   * This software is subject to the conditions detailed in the   * LICENCE file provided in this distribution.   * @@ -9,7 +9,7 @@   */  #include <stdio.h>  #include <string.h> -#ifdef WIN32 +#ifdef _WIN32  #include <io.h>  #include <winsock2.h>  #define snprintf _snprintf @@ -24,7 +24,7 @@  /* only for malloc */  #include <stdlib.h> -#ifdef WIN32 +#ifdef _WIN32  #define PRINT_SOCKET_ERROR(x)    printf("Socket error: %s, %d\n", x, WSAGetLastError());  #else  #define PRINT_SOCKET_ERROR(x) perror(x) @@ -57,7 +57,7 @@ httpWrite(int fd, const char * body, int bodysize,  	/* disable send on the socket */  	/* draytek routers dont seems to like that... */  #if 0 -#ifdef WIN32 +#ifdef _WIN32  	if(shutdown(fd, SD_SEND)<0) {  #else  	if(shutdown(fd, SHUT_WR)<0)	{ /*SD_SEND*/ diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/minisoap.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/minisoap.h index 696725f..14c859d 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/minisoap.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/minisoap.h @@ -1,11 +1,11 @@ -/* $Id: minisoap.h,v 1.4 2010/04/12 20:39:41 nanard Exp $ */ +/* $Id: minisoap.h,v 1.5 2012/09/27 15:42:10 nanard Exp $ */  /* Project : miniupnp   * Author : Thomas Bernard   * Copyright (c) 2005 Thomas Bernard   * This software is subject to the conditions detailed in the   * LICENCE file provided in this distribution. */ -#ifndef __MINISOAP_H__ -#define __MINISOAP_H__ +#ifndef MINISOAP_H_INCLUDED +#define MINISOAP_H_INCLUDED  /*int httpWrite(int, const char *, int, const char *);*/  int soapPostSubmit(int, const char *, const char *, unsigned short, diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/minissdpc.c b/3rdParty/LibMiniUPnPc/src/miniupnpc/minissdpc.c index a92c009..c4913fb 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/minissdpc.c +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/minissdpc.c @@ -1,33 +1,23 @@ -/* $Id: minissdpc.c,v 1.14 2010/11/25 09:57:25 nanard Exp $ */ +/* $Id: minissdpc.c,v 1.16 2012/03/05 19:42:46 nanard Exp $ */  /* Project : miniupnp + * Web : http://miniupnp.free.fr/   * Author : Thomas BERNARD - * copyright (c) 2005-2009 Thomas Bernard + * copyright (c) 2005-2012 Thomas Bernard   * This software is subjet to the conditions detailed in the   * provided LICENCE file. */  /*#include <syslog.h>*/  #include <stdio.h>  #include <string.h>  #include <stdlib.h> - -#ifndef WIN32  #include <unistd.h>  #include <sys/types.h> -#else -#define ssize_t int -#endif - -#if defined(WIN32) || defined(__amigaos__) || defined(__amigaos4__) -#ifdef WIN32 +#if defined(_WIN32) || defined(__amigaos__) || defined(__amigaos4__) +#ifdef _WIN32  #include <winsock2.h>  #include <ws2tcpip.h>  #include <io.h>  #include <winsock.h> -#if _MSC_VER >= 1600  #include <stdint.h> -#else -typedef __int16 int16_t; -typedef unsigned __int16 uint16_t; -#endif  #endif  #if defined(__amigaos__) || defined(__amigaos4__)  #include <sys/socket.h> @@ -130,7 +120,7 @@ getDevicesFromMiniSSDPD(const char * devtype, const char * socketpath)  		p += stsize;  		tmp->buffer[urlsize+1+stsize] = '\0';  		devlist = tmp; -		/* added for compatibility with recent versions of MiniSSDPd  +		/* added for compatibility with recent versions of MiniSSDPd  		 * >= 2007/12/19 */  		DECODELENGTH(usnsize, p);  		p += usnsize; diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/minissdpc.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/minissdpc.h index 25e91ce..915b002 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/minissdpc.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/minissdpc.h @@ -1,12 +1,12 @@ -/* $Id: minissdpc.h,v 1.1 2007/08/31 15:15:33 nanard Exp $ */ +/* $Id: minissdpc.h,v 1.2 2012/09/27 15:42:10 nanard Exp $ */  /* Project: miniupnp   * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/   * Author: Thomas Bernard   * Copyright (c) 2005-2007 Thomas Bernard   * This software is subjects to the conditions detailed   * in the LICENCE file provided within this distribution */ -#ifndef __MINISSDPC_H__ -#define __MINISSDPC_H__ +#ifndef MINISSDPC_H_INCLUDED +#define MINISSDPC_H_INCLUDED  struct UPNPDev *  getDevicesFromMiniSSDPD(const char * devtype, const char * socketpath); diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/miniupnpc.c b/3rdParty/LibMiniUPnPc/src/miniupnpc/miniupnpc.c index bd46a24..a8a21f4 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/miniupnpc.c +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/miniupnpc.c @@ -1,7 +1,8 @@ -/* $Id: miniupnpc.c,v 1.95 2011/05/15 21:42:26 nanard Exp $ */ +/* $Id: miniupnpc.c,v 1.115 2013/12/13 12:02:24 nanard Exp $ */  /* Project : miniupnp + * Web : http://miniupnp.free.fr/   * Author : Thomas BERNARD - * copyright (c) 2005-2011 Thomas Bernard + * copyright (c) 2005-2013 Thomas Bernard   * This software is subjet to the conditions detailed in the   * provided LICENSE file. */  #define __EXTENSIONS__ 1 @@ -16,16 +17,21 @@  #endif  #endif +#if !defined(__DragonFly__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(MACOSX) && !defined(_WIN32) && !defined(__CYGWIN__) && !defined(__sun) +#define HAS_IP_MREQN +#endif +  #include <stdlib.h>  #include <stdio.h>  #include <string.h> -#ifdef WIN32 +#ifdef _WIN32  /* Win32 Specific includes and defines */  #include <winsock2.h>  #include <ws2tcpip.h>  #include <io.h>  #include <iphlpapi.h>  #define snprintf _snprintf +#define strdup _strdup  #ifndef strncasecmp  #if defined(_MSC_VER) && (_MSC_VER >= 1400)  #define strncasecmp _memicmp @@ -34,7 +40,7 @@  #endif /* defined(_MSC_VER) && (_MSC_VER >= 1400) */  #endif /* #ifndef strncasecmp */  #define MAXHOSTNAMELEN 64 -#else /* #ifdef WIN32 */ +#else /* #ifdef _WIN32 */  /* Standard POSIX includes */  #include <unistd.h>  #if defined(__amigaos__) && !defined(__amigaos4__) @@ -56,7 +62,7 @@  #include <strings.h>  #include <errno.h>  #define closesocket close -#endif /* #else WIN32 */ +#endif /* #else _WIN32 */  #ifdef MINIUPNPC_SET_SOCKET_TIMEOUT  #include <sys/time.h>  #endif @@ -65,6 +71,17 @@  #define TIMEVAL struct timeval  #endif + +#if defined(HAS_IP_MREQN) && defined(NEED_STRUCT_IP_MREQN) +/* Several versions of glibc don't define this structure, define it here and compile with CFLAGS NEED_STRUCT_IP_MREQN */ +struct ip_mreqn +{ +	struct in_addr	imr_multiaddr;		/* IP multicast address of group */ +	struct in_addr	imr_address;		/* local IP address of interface */ +	int		imr_ifindex;		/* Interface index */ +}; +#endif +  #include "miniupnpc.h"  #include "minissdpc.h"  #include "miniwget.h" @@ -74,12 +91,16 @@  #include "connecthostport.h"  #include "receivedata.h" -#ifdef WIN32 +#ifdef _WIN32  #define PRINT_SOCKET_ERROR(x)    printf("Socket error: %s, %d\n", x, WSAGetLastError());  #else  #define PRINT_SOCKET_ERROR(x) perror(x)  #endif +#ifndef MAXHOSTNAMELEN +#define MAXHOSTNAMELEN 64 +#endif +  #define SOAPPREFIX "s"  #define SERVICEPREFIX "u"  #define SERVICEPREFIX2 'u' @@ -184,12 +205,11 @@ char * simpleUPnPcommand2(int s, const char * url, const char * service,  		strncpy(p, "></" SOAPPREFIX ":Body></" SOAPPREFIX ":Envelope>\r\n",  		        soapbody + sizeof(soapbody) - p);  	} -	if(!parseURL(url, hostname, &port, &path)) return NULL; -	if(s<0) -	{ -		s = connecthostport(hostname, port); -		if(s < 0) -		{ +	if(!parseURL(url, hostname, &port, &path, NULL)) return NULL; +	if(s < 0) { +		s = connecthostport(hostname, port, 0); +		if(s < 0) { +			/* failed to connect */  			return NULL;  		}  	} @@ -225,8 +245,9 @@ char * simpleUPnPcommand(int s, const char * url, const char * service,  {  	char * buf; +#if 1  	buf = simpleUPnPcommand2(s, url, service, action, args, bufsize, "1.1"); -/* +#else  	buf = simpleUPnPcommand2(s, url, service, action, args, bufsize, "1.0");  	if (!buf || *bufsize == 0)  	{ @@ -235,7 +256,7 @@ char * simpleUPnPcommand(int s, const char * url, const char * service,  #endif  		buf = simpleUPnPcommand2(s, url, service, action, args, bufsize, "1.1");  	} -*/ +#endif  	return buf;  } @@ -322,8 +343,9 @@ upnpDiscover(int delay, const char * multicastif,  {  	struct UPNPDev * tmp;  	struct UPNPDev * devlist = 0; +	unsigned int scope_id = 0;  	int opt = 1; -	static const char MSearchMsgFmt[] =  +	static const char MSearchMsgFmt[] =  	"M-SEARCH * HTTP/1.1\r\n"  	"HOST: %s:" XSTR(PORT) "\r\n"  	"ST: %s\r\n" @@ -353,14 +375,14 @@ upnpDiscover(int delay, const char * multicastif,  	int rv;  	struct addrinfo hints, *servinfo, *p;  #endif -#ifdef WIN32 +#ifdef _WIN32  	MIB_IPFORWARDROW ip_forward;  #endif  	int linklocal = 1;  	if(error)  		*error = UPNPDISCOVER_UNKNOWN_ERROR; -#if !defined(WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) +#if !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__)  	/* first try to get infos from minissdpd ! */  	if(!minissdpdsock)  		minissdpdsock = "/var/run/minissdpd.sock"; @@ -378,7 +400,7 @@ upnpDiscover(int delay, const char * multicastif,  	deviceIndex = 0;  #endif  	/* fallback to direct discovery */ -#ifdef WIN32 +#ifdef _WIN32  	sudp = socket(ipv6 ? PF_INET6 : PF_INET, SOCK_DGRAM, IPPROTO_UDP);  #else  	sudp = socket(ipv6 ? PF_INET6 : PF_INET, SOCK_DGRAM, 0); @@ -405,8 +427,8 @@ upnpDiscover(int delay, const char * multicastif,  			p->sin_port = htons(PORT);  		p->sin_addr.s_addr = INADDR_ANY;  	} -#ifdef WIN32 -/* This code could help us to use the right Network interface for  +#ifdef _WIN32 +/* This code could help us to use the right Network interface for   * SSDP multicast traffic */  /* Get IP associated with the index given in the ip_forward struct   * in order to give this ip to setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF) */ @@ -465,7 +487,7 @@ upnpDiscover(int delay, const char * multicastif,  	}  #endif -#ifdef WIN32 +#ifdef _WIN32  	if (setsockopt(sudp, SOL_SOCKET, SO_REUSEADDR, (const char *)&opt, sizeof (opt)) < 0)  #else  	if (setsockopt(sudp, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)) < 0) @@ -480,7 +502,7 @@ upnpDiscover(int delay, const char * multicastif,  	if(multicastif)  	{  		if(ipv6) { -#if !defined(WIN32) +#if !defined(_WIN32)  			/* according to MSDN, if_nametoindex() is supported since  			 * MS Windows Vista and MS Windows Server 2008.  			 * http://msdn.microsoft.com/en-us/library/bb408409%28v=vs.85%29.aspx */ @@ -497,10 +519,28 @@ upnpDiscover(int delay, const char * multicastif,  		} else {  			struct in_addr mc_if;  			mc_if.s_addr = inet_addr(multicastif); /* ex: 192.168.x.x */ -			((struct sockaddr_in *)&sockudp_r)->sin_addr.s_addr = mc_if.s_addr; -			if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&mc_if, sizeof(mc_if)) < 0) +			if(mc_if.s_addr != INADDR_NONE)  			{ -				PRINT_SOCKET_ERROR("setsockopt"); +				((struct sockaddr_in *)&sockudp_r)->sin_addr.s_addr = mc_if.s_addr; +				if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&mc_if, sizeof(mc_if)) < 0) +				{ +					PRINT_SOCKET_ERROR("setsockopt"); +				} +			} else { +#ifdef HAS_IP_MREQN +				/* was not an ip address, try with an interface name */ +				struct ip_mreqn reqn;	/* only defined with -D_BSD_SOURCE or -D_GNU_SOURCE */ +				memset(&reqn, 0, sizeof(struct ip_mreqn)); +				reqn.imr_ifindex = if_nametoindex(multicastif); +				if(setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&reqn, sizeof(reqn)) < 0) +				{ +					PRINT_SOCKET_ERROR("setsockopt"); +				} +#else +#ifdef DEBUG +				printf("Setting of multicast interface not supported with interface name.\n"); +#endif +#endif  			}  		}  	} @@ -520,6 +560,10 @@ upnpDiscover(int delay, const char * multicastif,  		*error = UPNPDISCOVER_SUCCESS;  	/* Calculating maximum response time in seconds */  	mx = ((unsigned int)delay) / 1000u; +	if(mx == 0) { +		mx = 1; +		delay = 1000; +	}  	/* receiving SSDP response packet */  	for(n = 0; deviceList[deviceIndex]; deviceIndex++)  	{ @@ -563,7 +607,7 @@ upnpDiscover(int delay, const char * multicastif,  		}  #else /* #ifdef NO_GETADDRINFO */  		memset(&hints, 0, sizeof(hints)); -		hints.ai_family = AF_UNSPEC; // AF_INET6 or AF_INET +		hints.ai_family = AF_UNSPEC; /* AF_INET6 or AF_INET */  		hints.ai_socktype = SOCK_DGRAM;  		/*hints.ai_flags = */  		if ((rv = getaddrinfo(ipv6 @@ -572,7 +616,7 @@ upnpDiscover(int delay, const char * multicastif,  		                      XSTR(PORT), &hints, &servinfo)) != 0) {  			if(error)  				*error = UPNPDISCOVER_SOCKET_ERROR; -#ifdef WIN32 +#ifdef _WIN32  		    fprintf(stderr, "getaddrinfo() failed: %d\n", rv);  #else  		    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); @@ -582,6 +626,13 @@ upnpDiscover(int delay, const char * multicastif,  		for(p = servinfo; p; p = p->ai_next) {  			n = sendto(sudp, bufr, n, 0, p->ai_addr, p->ai_addrlen);  			if (n < 0) { +#ifdef DEBUG +				char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; +				if (getnameinfo(p->ai_addr, p->ai_addrlen, hbuf, sizeof(hbuf), sbuf, +						sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0) { +					fprintf(stderr, "host:%s port:%s\n", hbuf, sbuf); +				} +#endif  				PRINT_SOCKET_ERROR("sendto");  				continue;  			} @@ -595,7 +646,7 @@ upnpDiscover(int delay, const char * multicastif,  #endif /* #ifdef NO_GETADDRINFO */  	}  	/* Waiting for SSDP REPLY packet to M-SEARCH */ -	n = receivedata(sudp, bufr, sizeof(bufr), delay); +	n = receivedata(sudp, bufr, sizeof(bufr), delay, &scope_id);  	if (n < 0) {  		/* error */  		if(error) @@ -655,6 +706,7 @@ upnpDiscover(int delay, const char * multicastif,  			tmp->buffer[urlsize] = '\0';  			memcpy(tmp->buffer + urlsize + 1, st, stsize);  			tmp->buffer[urlsize+1+stsize] = '\0'; +			tmp->scope_id = scope_id;  			devlist = tmp;  		}  	} @@ -701,14 +753,31 @@ url_cpy_or_cat(char * dst, const char * src, int n)  /* Prepare the Urls for usage...   */ -LIBSPEC void GetUPNPUrls(struct UPNPUrls * urls, struct IGDdatas * data, -                 const char * descURL) +LIBSPEC void +GetUPNPUrls(struct UPNPUrls * urls, struct IGDdatas * data, +            const char * descURL, unsigned int scope_id)  {  	char * p;  	int n1, n2, n3, n4; +#ifdef IF_NAMESIZE +	char ifname[IF_NAMESIZE]; +#else +	char scope_str[8]; +#endif +  	n1 = strlen(data->urlbase);  	if(n1==0)  		n1 = strlen(descURL); +	if(scope_id != 0) { +#ifdef IF_NAMESIZE +		if(if_indextoname(scope_id, ifname)) { +			n1 += 3 + strlen(ifname);	/* 3 == strlen(%25) */ +		} +#else +	/* under windows, scope is numerical */ +	snprintf(scope_str, sizeof(scope_str), "%u", scope_id); +#endif +	}  	n1 += 2;	/* 1 byte more for Null terminator, 1 byte for '/' if needed */  	n2 = n1; n3 = n1; n4 = n1;  	n1 += strlen(data->first.scpdurl); @@ -716,21 +785,44 @@ LIBSPEC void GetUPNPUrls(struct UPNPUrls * urls, struct IGDdatas * data,  	n3 += strlen(data->CIF.controlurl);  	n4 += strlen(data->IPv6FC.controlurl); +	/* allocate memory to store URLs */  	urls->ipcondescURL = (char *)malloc(n1);  	urls->controlURL = (char *)malloc(n2);  	urls->controlURL_CIF = (char *)malloc(n3);  	urls->controlURL_6FC = (char *)malloc(n4); -	/* maintenant on chope la desc du WANIPConnection */ + +	/* strdup descURL */ +	urls->rootdescURL = strdup(descURL); + +	/* get description of WANIPConnection */  	if(data->urlbase[0] != '\0')  		strncpy(urls->ipcondescURL, data->urlbase, n1);  	else  		strncpy(urls->ipcondescURL, descURL, n1);  	p = strchr(urls->ipcondescURL+7, '/');  	if(p) p[0] = '\0'; +	if(scope_id != 0) { +		if(0 == memcmp(urls->ipcondescURL, "http://[fe80:", 13)) { +			/* this is a linklocal IPv6 address */ +			p = strchr(urls->ipcondescURL, ']'); +			if(p) { +				/* insert %25<scope> into URL */ +#ifdef IF_NAMESIZE +				memmove(p + 3 + strlen(ifname), p, strlen(p) + 1); +				memcpy(p, "%25", 3); +				memcpy(p + 3, ifname, strlen(ifname)); +#else +				memmove(p + 3 + strlen(scope_str), p, strlen(p) + 1); +				memcpy(p, "%25", 3); +				memcpy(p + 3, scope_str, strlen(scope_str)); +#endif +			} +		} +	}  	strncpy(urls->controlURL, urls->ipcondescURL, n2);  	strncpy(urls->controlURL_CIF, urls->ipcondescURL, n3);  	strncpy(urls->controlURL_6FC, urls->ipcondescURL, n4); -	 +  	url_cpy_or_cat(urls->ipcondescURL, data->first.scpdurl, n1);  	url_cpy_or_cat(urls->controlURL, data->first.controlurl, n2); @@ -764,6 +856,8 @@ FreeUPNPUrls(struct UPNPUrls * urls)  	urls->controlURL_CIF = 0;  	free(urls->controlURL_6FC);  	urls->controlURL_6FC = 0; +	free(urls->rootdescURL); +	urls->rootdescURL = 0;  }  int @@ -785,13 +879,14 @@ UPNPIGD_IsConnected(struct UPNPUrls * urls, struct IGDdatas * data)  /* UPNP_GetValidIGD() :   * return values : + *    -1 = Internal error   *     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 + * In any positive non zero return case, the urls and data structures   * passed as parameters are set. Donc forget to call FreeUPNPUrls(urls) to   * free allocated memory.   */ @@ -801,11 +896,17 @@ UPNP_GetValidIGD(struct UPNPDev * devlist,  				 struct IGDdatas * data,  				 char * lanaddr, int lanaddrlen)  { -	char * descXML; -	int descXMLsize = 0; +	struct xml_desc { +		char * xml; +		int size; +		int is_igd; +	} * desc = NULL;  	struct UPNPDev * dev;  	int ndev = 0; -	int state; /* state 1 : IGD connected. State 2 : IGD. State 3 : anything */ +	int i; +	int state = -1; /* state 1 : IGD connected. State 2 : IGD. State 3 : anything */ +	int n_igd = 0; +	char extIpAddr[16];  	if(!devlist)  	{  #ifdef DEBUG @@ -813,35 +914,68 @@ UPNP_GetValidIGD(struct UPNPDev * devlist,  #endif  		return 0;  	} +	/* counting total number of devices in the list */ +	for(dev = devlist; dev; dev = dev->pNext) +		ndev++; +	if(ndev > 0) +	{ +		desc = calloc(ndev, sizeof(struct xml_desc)); +		if(!desc) +			return -1; /* memory allocation error */ +	} +	/* Step 1 : downloading descriptions and testing type */ +	for(dev = devlist, i = 0; dev; dev = dev->pNext, i++) +	{ +		/* we should choose an internet gateway device. +		 * with st == urn:schemas-upnp-org:device:InternetGatewayDevice:1 */ +		desc[i].xml = miniwget_getaddr(dev->descURL, &(desc[i].size), +		                               lanaddr, lanaddrlen, +		                               dev->scope_id); +#ifdef DEBUG +		if(!desc[i].xml) +		{ +			printf("error getting XML description %s\n", dev->descURL); +		} +#endif +		if(desc[i].xml) +		{ +			memset(data, 0, sizeof(struct IGDdatas)); +			memset(urls, 0, sizeof(struct UPNPUrls)); +			parserootdesc(desc[i].xml, desc[i].size, data); +			if(0==strcmp(data->CIF.servicetype, +			   "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1")) +			{ +				desc[i].is_igd = 1; +				n_igd++; +			} +		} +	} +	/* iterate the list to find a device depending on state */  	for(state = 1; state <= 3; state++)  	{ -		for(dev = devlist; dev; dev = dev->pNext) +		for(dev = devlist, i = 0; dev; dev = dev->pNext, i++)  		{ -			/* we should choose an internet gateway device. -		 	* with st == urn:schemas-upnp-org:device:InternetGatewayDevice:1 */ -			descXML = miniwget_getaddr(dev->descURL, &descXMLsize, -			   	                        lanaddr, lanaddrlen); -			if(descXML) +			if(desc[i].xml)  			{ -				ndev++;  				memset(data, 0, sizeof(struct IGDdatas));  				memset(urls, 0, sizeof(struct UPNPUrls)); -				parserootdesc(descXML, descXMLsize, data); -				free(descXML); -				descXML = NULL; -				if(0==strcmp(data->CIF.servicetype, -				   "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1") -				   || state >= 3 ) +				parserootdesc(desc[i].xml, desc[i].size, data); +				if(desc[i].is_igd || state >= 3 )  				{ -				  GetUPNPUrls(urls, data, dev->descURL); +				  GetUPNPUrls(urls, data, dev->descURL, dev->scope_id); +				  /* in state 2 and 3 we dont test if device is connected ! */ +				  if(state >= 2) +				    goto free_and_return;  #ifdef DEBUG  				  printf("UPNPIGD_IsConnected(%s) = %d\n",  				     urls->controlURL,  			         UPNPIGD_IsConnected(urls, data));  #endif -				  if((state >= 2) || UPNPIGD_IsConnected(urls, data)) -					return state; +				  /* checks that status is connected AND there is a external IP address assigned */ +				  if(UPNPIGD_IsConnected(urls, data) +				     && (UPNP_GetExternalIPAddress(urls->controlURL,  data->first.servicetype, extIpAddr) == 0)) +					goto free_and_return;  				  FreeUPNPUrls(urls);  				  if(data->second.servicetype[0] != '\0') {  #ifdef DEBUG @@ -852,28 +986,33 @@ UPNP_GetValidIGD(struct UPNPDev * devlist,  				    memcpy(&data->tmp, &data->first, sizeof(struct IGDdatas_service));  				    memcpy(&data->first, &data->second, sizeof(struct IGDdatas_service));  				    memcpy(&data->second, &data->tmp, sizeof(struct IGDdatas_service)); -				    GetUPNPUrls(urls, data, dev->descURL); +				    GetUPNPUrls(urls, data, dev->descURL, dev->scope_id);  #ifdef DEBUG  				    printf("UPNPIGD_IsConnected(%s) = %d\n",  				       urls->controlURL,  			           UPNPIGD_IsConnected(urls, data));  #endif -				    if((state >= 2) || UPNPIGD_IsConnected(urls, data)) -					  return state; +				    if(UPNPIGD_IsConnected(urls, data) +				       && (UPNP_GetExternalIPAddress(urls->controlURL,  data->first.servicetype, extIpAddr) == 0)) +					  goto free_and_return;  				    FreeUPNPUrls(urls);  				  }  				}  				memset(data, 0, sizeof(struct IGDdatas));  			} -#ifdef DEBUG -			else -			{ -				printf("error getting XML description %s\n", dev->descURL); +		} +	} +	state = 0; +free_and_return: +	if(desc) { +		for(i = 0; i < ndev; i++) { +			if(desc[i].xml) { +				free(desc[i].xml);  			} -#endif  		} +		free(desc);  	} -	return 0; +	return state;  }  /* UPNP_GetIGDFromUrl() @@ -890,14 +1029,14 @@ UPNP_GetIGDFromUrl(const char * rootdescurl,  	char * descXML;  	int descXMLsize = 0;  	descXML = miniwget_getaddr(rootdescurl, &descXMLsize, -	   	                       lanaddr, lanaddrlen); +	   	                       lanaddr, lanaddrlen, 0);  	if(descXML) {  		memset(data, 0, sizeof(struct IGDdatas));  		memset(urls, 0, sizeof(struct UPNPUrls));  		parserootdesc(descXML, descXMLsize, data);  		free(descXML);  		descXML = NULL; -		GetUPNPUrls(urls, data, rootdescurl); +		GetUPNPUrls(urls, data, rootdescurl, 0);  		return 1;  	} else {  		return 0; diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/miniupnpc.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/miniupnpc.h index 50df017..b0d5d7f 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/miniupnpc.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/miniupnpc.h @@ -1,12 +1,12 @@ -/* $Id: miniupnpc.h,v 1.23 2011/04/11 08:21:46 nanard Exp $ */ +/* $Id: miniupnpc.h,v 1.35 2014/01/31 13:26:34 nanard Exp $ */  /* Project: miniupnp   * http://miniupnp.free.fr/   * Author: Thomas Bernard - * Copyright (c) 2005-2011 Thomas Bernard + * Copyright (c) 2005-2012 Thomas Bernard   * This software is subjects to the conditions detailed   * in the LICENCE file provided within this distribution */ -#ifndef __MINIUPNPC_H__ -#define __MINIUPNPC_H__ +#ifndef MINIUPNPC_H_INCLUDED +#define MINIUPNPC_H_INCLUDED  #include "declspec.h"  #include "igd_desc_parse.h" @@ -17,6 +17,10 @@  #define UPNPDISCOVER_SOCKET_ERROR (-101)  #define UPNPDISCOVER_MEMORY_ERROR (-102) +/* versions : */ +#define MINIUPNPC_VERSION	"1.9" +#define MINIUPNPC_API_VERSION	10 +  #ifdef __cplusplus  extern "C" {  #endif @@ -33,6 +37,7 @@ struct UPNPDev {  	struct UPNPDev * pNext;  	char * descURL;  	char * st; +	unsigned int scope_id;  	char buffer[2];  }; @@ -74,6 +79,7 @@ struct UPNPUrls {  	char * ipcondescURL;  	char * controlURL_CIF;  	char * controlURL_6FC; +	char * rootdescURL;  };  /* UPNP_GetValidIGD() : @@ -105,9 +111,12 @@ UPNP_GetIGDFromUrl(const char * rootdescurl,                     struct IGDdatas * data,                     char * lanaddr, int lanaddrlen); -LIBSPEC void GetUPNPUrls(struct UPNPUrls *, struct IGDdatas *, const char *); +LIBSPEC void +GetUPNPUrls(struct UPNPUrls *, struct IGDdatas *, +            const char *, unsigned int); -LIBSPEC void FreeUPNPUrls(struct UPNPUrls *); +LIBSPEC void +FreeUPNPUrls(struct UPNPUrls *);  /* return 0 or 1 */  LIBSPEC int UPNPIGD_IsConnected(struct UPNPUrls *, struct IGDdatas *); diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/miniupnpctypes.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/miniupnpctypes.h index 86081c3..591c32f 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/miniupnpctypes.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/miniupnpctypes.h @@ -1,11 +1,11 @@ -/* $Id: miniupnpctypes.h,v 1.1 2011/02/15 11:10:40 nanard Exp $ */ +/* $Id: miniupnpctypes.h,v 1.2 2012/09/27 15:42:10 nanard Exp $ */  /* Miniupnp project : http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org   * Author : Thomas Bernard   * Copyright (c) 2011 Thomas Bernard   * This software is subject to the conditions detailed in the   * LICENCE file provided within this distribution */ -#ifndef __MINIUPNPCTYPES_H__ -#define __MINIUPNPCTYPES_H__ +#ifndef MINIUPNPCTYPES_H_INCLUDED +#define MINIUPNPCTYPES_H_INCLUDED  #if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)  #define UNSIGNED_INTEGER unsigned long long diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/miniwget.c b/3rdParty/LibMiniUPnPc/src/miniupnpc/miniwget.c index 0c31416..a75f55b 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/miniwget.c +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/miniwget.c @@ -1,15 +1,16 @@ -/* $Id: miniwget.c,v 1.52 2011/06/17 22:59:42 nanard Exp $ */ +/* $Id: miniwget.c,v 1.60 2013/10/07 10:03:16 nanard Exp $ */  /* Project : miniupnp + * Website : http://miniupnp.free.fr/   * Author : Thomas Bernard - * Copyright (c) 2005-2011 Thomas Bernard + * Copyright (c) 2005-2013 Thomas Bernard   * This software is subject to the conditions detailed in the   * LICENCE file provided in this distribution. */ -  +  #include <stdio.h>  #include <stdlib.h>  #include <string.h>  #include <ctype.h> -#ifdef WIN32 +#ifdef _WIN32  #include <winsock2.h>  #include <ws2tcpip.h>  #include <io.h> @@ -24,7 +25,7 @@  #define strncasecmp memicmp  #endif /* defined(_MSC_VER) && (_MSC_VER >= 1400) */  #endif /* #ifndef strncasecmp */ -#else /* #ifdef WIN32 */ +#else /* #ifdef _WIN32 */  #include <unistd.h>  #include <sys/param.h>  #if defined(__amigaos__) && !defined(__amigaos4__) @@ -33,26 +34,28 @@  #include <sys/select.h>  #endif /* #else defined(__amigaos__) && !defined(__amigaos4__) */  #include <sys/socket.h> +#include <netinet/in.h>  #include <arpa/inet.h> +#include <net/if.h>  #include <netdb.h>  #define closesocket close  /* defining MINIUPNPC_IGNORE_EINTR enable the ignore of interruptions   * during the connect() call */  #define MINIUPNPC_IGNORE_EINTR -#endif /* #else WIN32 */ +#endif /* #else _WIN32 */  #if defined(__sun) || defined(sun)  #define MIN(x,y) (((x)<(y))?(x):(y))  #endif -#ifdef __ANDROID__ -#define MIN(x,y) (((x)<(y))?(x):(y)) -#endif -  #include "miniupnpcstrings.h"  #include "miniwget.h"  #include "connecthostport.h"  #include "receivedata.h" +#ifndef MAXHOSTNAMELEN +#define MAXHOSTNAMELEN 64 +#endif +  /*   * Read a HTTP response from a socket.   * Process Content-Length and Transfer-encoding headers. @@ -71,20 +74,20 @@ getHTTPResponse(int s, int * size)  	unsigned int bytestocopy = 0;  	/* buffers : */  	char * header_buf; -	int header_buf_len = 2048; -	int header_buf_used = 0; +	unsigned int header_buf_len = 2048; +	unsigned int header_buf_used = 0;  	char * content_buf; -	int content_buf_len = 2048; -	int content_buf_used = 0; +	unsigned int content_buf_len = 2048; +	unsigned int content_buf_used = 0;  	char chunksize_buf[32]; -	int chunksize_buf_index; +	unsigned int chunksize_buf_index;  	header_buf = malloc(header_buf_len);  	content_buf = malloc(content_buf_len);  	chunksize_buf[0] = '\0';  	chunksize_buf_index = 0; -	while((n = receivedata(s, buf, 2048, 5000)) > 0) +	while((n = receivedata(s, buf, 2048, 5000, NULL)) > 0)  	{  		if(endofheaders == 0)  		{ @@ -101,14 +104,14 @@ getHTTPResponse(int s, int * size)  			/* search for CR LF CR LF (end of headers)  			 * recognize also LF LF */  			i = 0; -			while(i < (header_buf_used-1) && (endofheaders == 0)) { +			while(i < ((int)header_buf_used-1) && (endofheaders == 0)) {  				if(header_buf[i] == '\r') {  					i++;  					if(header_buf[i] == '\n') {  						i++; -						if(i < header_buf_used && header_buf[i] == '\r') { +						if(i < (int)header_buf_used && header_buf[i] == '\r') {  							i++; -							if(i < header_buf_used && header_buf[i] == '\n') { +							if(i < (int)header_buf_used && header_buf[i] == '\n') {  								endofheaders = i+1;  							}  						} @@ -159,12 +162,12 @@ getHTTPResponse(int s, int * size)  							chunked = 1;  						}  					} -					while(header_buf[i]=='\r' || header_buf[i] == '\n') +					while((i < (int)header_buf_used) && (header_buf[i]=='\r' || header_buf[i] == '\n'))  						i++;  					linestart = i;  					colon = linestart;  					valuestart = 0; -				}  +				}  			}  			/* copy the remaining of the received data back to buf */  			n = header_buf_used - endofheaders; @@ -198,7 +201,7 @@ getHTTPResponse(int s, int * size)  							i++; /* discarding chunk-extension */  						if(i<n && buf[i] == '\r') i++;  						if(i<n && buf[i] == '\n') { -							int j; +							unsigned int j;  							for(j = 0; j < chunksize_buf_index; j++) {  							if(chunksize_buf[j] >= '0'  							   && chunksize_buf[j] <= '9') @@ -225,15 +228,15 @@ getHTTPResponse(int s, int * size)  							goto end_of_stream;  						}  					} -					bytestocopy = ((int)chunksize < n - i)?chunksize:(n - i); -					if((int)(content_buf_used + bytestocopy) > content_buf_len) +					bytestocopy = ((int)chunksize < (n - i))?chunksize:(unsigned int)(n - i); +					if((content_buf_used + bytestocopy) > content_buf_len)  					{ -						if(content_length >= content_buf_used + (int)bytestocopy) { +						if(content_length >= (int)(content_buf_used + bytestocopy)) {  							content_buf_len = content_length;  						} else { -							content_buf_len = content_buf_used + (int)bytestocopy; +							content_buf_len = content_buf_used + bytestocopy;  						} -						content_buf = (char *)realloc((void *)content_buf,  +						content_buf = (char *)realloc((void *)content_buf,  						                              content_buf_len);  					}  					memcpy(content_buf + content_buf_used, buf + i, bytestocopy); @@ -246,18 +249,18 @@ getHTTPResponse(int s, int * size)  			{  				/* not chunked */  				if(content_length > 0 -				   && (content_buf_used + n) > content_length) { +				   && (int)(content_buf_used + n) > content_length) {  					/* skipping additional bytes */  					n = content_length - content_buf_used;  				}  				if(content_buf_used + n > content_buf_len)  				{ -					if(content_length >= content_buf_used + n) { +					if(content_length >= (int)(content_buf_used + n)) {  						content_buf_len = content_length;  					} else {  						content_buf_len = content_buf_used + n;  					} -					content_buf = (char *)realloc((void *)content_buf,  +					content_buf = (char *)realloc((void *)content_buf,  					                              content_buf_len);  				}  				memcpy(content_buf + content_buf_used, buf, n); @@ -265,7 +268,7 @@ getHTTPResponse(int s, int * size)  			}  		}  		/* use the Content-Length header value if available */ -		if(content_length > 0 && content_buf_used >= content_length) +		if(content_length > 0 && (int)content_buf_used >= content_length)  		{  #ifdef DEBUG  			printf("End of HTTP content\n"); @@ -288,10 +291,10 @@ end_of_stream:   * do all the work.   * Return NULL if something failed. */  static void * -miniwget3(const char * url, const char * host, +miniwget3(const char * host,            unsigned short port, const char * path,            int * size, char * addr_str, int addr_str_len, -          const char * httpversion) +          const char * httpversion, unsigned int scope_id)  {  	char buf[2048];      int s; @@ -301,7 +304,7 @@ miniwget3(const char * url, const char * host,  	void * content;  	*size = 0; -	s = connecthostport(host, port); +	s = connecthostport(host, port, scope_id);  	if(s < 0)  		return NULL; @@ -347,7 +350,7 @@ miniwget3(const char * url, const char * host,  			                NULL, 0,  			                NI_NUMERICHOST | NI_NUMERICSERV);  			if(n != 0) { -#ifdef WIN32 +#ifdef _WIN32  				fprintf(stderr, "getnameinfo() failed : %d\n", n);  #else  				fprintf(stderr, "getnameinfo() failed : %s\n", gai_strerror(n)); @@ -392,24 +395,29 @@ miniwget3(const char * url, const char * host,  /* miniwget2() :   * Call miniwget3(); retry with HTTP/1.1 if 1.0 fails. */  static void * -miniwget2(const char * url, const char * host, +miniwget2(const char * host,  		  unsigned short port, const char * path, -		  int * size, char * addr_str, int addr_str_len) +		  int * size, char * addr_str, int addr_str_len, +          unsigned int scope_id)  {  	char * respbuffer; -	respbuffer = miniwget3(url, host, port, path, size, addr_str, addr_str_len, "1.1"); -/* -	respbuffer = miniwget3(url, host, port, path, size, addr_str, addr_str_len, "1.0"); +#if 1 +	respbuffer = miniwget3(host, port, path, size, +	                       addr_str, addr_str_len, "1.1", scope_id); +#else +	respbuffer = miniwget3(host, port, path, size, +	                       addr_str, addr_str_len, "1.0", scope_id);  	if (*size == 0)  	{  #ifdef DEBUG  		printf("Retrying with HTTP/1.1\n");  #endif  		free(respbuffer); -		respbuffer = miniwget3(url, host, port, path, size, addr_str, addr_str_len, "1.1"); +		respbuffer = miniwget3(host, port, path, size, +		                       addr_str, addr_str_len, "1.1", scope_id);  	} -*/ +#endif  	return respbuffer;  } @@ -421,12 +429,15 @@ miniwget2(const char * url, const char * host,   *   url :		source string not modified   *   hostname :	hostname destination string (size of MAXHOSTNAMELEN+1)   *   port :		port (destination) - *   path :		pointer to the path part of the URL  + *   path :		pointer to the path part of the URL   *   * Return values :   *    0 - Failure   *    1 - Success         */ -int parseURL(const char * url, char * hostname, unsigned short * port, char * * path) +int +parseURL(const char * url, +         char * hostname, unsigned short * port, +         char * * path, unsigned int * scope_id)  {  	char * p1, *p2, *p3;  	if(!url) @@ -442,7 +453,43 @@ int parseURL(const char * url, char * hostname, unsigned short * port, char * *  	if(*p1 == '[')  	{  		/* IP v6 : http://[2a00:1450:8002::6a]/path/abc */ +		char * scope; +		scope = strchr(p1, '%');  		p2 = strchr(p1, ']'); +		if(p2 && scope && scope < p2 && scope_id) { +			/* parse scope */ +#ifdef IF_NAMESIZE +			char tmp[IF_NAMESIZE]; +			int l; +			scope++; +			/* "%25" is just '%' in URL encoding */ +			if(scope[0] == '2' && scope[1] == '5') +				scope += 2;	/* skip "25" */ +			l = p2 - scope; +			if(l >= IF_NAMESIZE) +				l = IF_NAMESIZE - 1; +			memcpy(tmp, scope, l); +			tmp[l] = '\0'; +			*scope_id = if_nametoindex(tmp); +			if(*scope_id == 0) { +				*scope_id = (unsigned int)strtoul(tmp, NULL, 10); +			} +#else +			/* under windows, scope is numerical */ +			char tmp[8]; +			int l; +			scope++; +			/* "%25" is just '%' in URL encoding */ +			if(scope[0] == '2' && scope[1] == '5') +				scope += 2;	/* skip "25" */ +			l = p2 - scope; +			if(l >= sizeof(tmp)) +				l = sizeof(tmp) - 1; +			memcpy(tmp, scope, l); +			tmp[l] = '\0'; +			*scope_id = (unsigned int)strtoul(tmp, NULL, 10); +#endif +		}  		p3 = strchr(p1, '/');  		if(p2 && p3)  		{ @@ -492,35 +539,40 @@ int parseURL(const char * url, char * hostname, unsigned short * port, char * *  	return 1;  } -void * miniwget(const char * url, int * size) +void * +miniwget(const char * url, int * size, unsigned int scope_id)  {  	unsigned short port;  	char * path;  	/* protocol://host:port/chemin */  	char hostname[MAXHOSTNAMELEN+1];  	*size = 0; -	if(!parseURL(url, hostname, &port, &path)) +	if(!parseURL(url, hostname, &port, &path, &scope_id))  		return NULL;  #ifdef DEBUG -	printf("parsed url : hostname='%s' port=%hu path='%s'\n", hostname, port, path); +	printf("parsed url : hostname='%s' port=%hu path='%s' scope_id=%u\n", +	       hostname, port, path, scope_id);  #endif -	return miniwget2(url, hostname, port, path, size, 0, 0); +	return miniwget2(hostname, port, path, size, 0, 0, scope_id);  } -void * miniwget_getaddr(const char * url, int * size, char * addr, int addrlen) +void * +miniwget_getaddr(const char * url, int * size, +                 char * addr, int addrlen, unsigned int scope_id)  {  	unsigned short port;  	char * path; -	/* protocol://host:port/chemin */ +	/* protocol://host:port/path */  	char hostname[MAXHOSTNAMELEN+1];  	*size = 0;  	if(addr)  		addr[0] = '\0'; -	if(!parseURL(url, hostname, &port, &path)) +	if(!parseURL(url, hostname, &port, &path, &scope_id))  		return NULL;  #ifdef DEBUG -	printf("parsed url : hostname='%s' port=%hu path='%s'\n", hostname, port, path); +	printf("parsed url : hostname='%s' port=%hu path='%s' scope_id=%u\n", +	       hostname, port, path, scope_id);  #endif -	return miniwget2(url, hostname, port, path, size, addr, addrlen); +	return miniwget2(hostname, port, path, size, addr, addrlen, scope_id);  } diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/miniwget.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/miniwget.h index 8314b40..31bcea3 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/miniwget.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/miniwget.h @@ -1,12 +1,12 @@ -/* $Id: miniwget.h,v 1.6 2010/12/09 16:11:33 nanard Exp $ */ +/* $Id: miniwget.h,v 1.8 2012/09/27 15:42:10 nanard Exp $ */  /* Project : miniupnp   * Author : Thomas Bernard - * Copyright (c) 2005 Thomas Bernard + * Copyright (c) 2005-2012 Thomas Bernard   * This software is subject to the conditions detailed in the   * LICENCE file provided in this distribution.   * */ -#ifndef __MINIWGET_H__ -#define __MINIWGET_H__ +#ifndef MINIWGET_H_INCLUDED +#define MINIWGET_H_INCLUDED  #include "declspec.h" @@ -16,11 +16,11 @@ extern "C" {  LIBSPEC void * getHTTPResponse(int s, int * size); -LIBSPEC void * miniwget(const char *, int *); +LIBSPEC void * miniwget(const char *, int *, unsigned int); -LIBSPEC void * miniwget_getaddr(const char *, int *, char *, int); +LIBSPEC void * miniwget_getaddr(const char *, int *, char *, int, unsigned int); -int parseURL(const char *, char *, unsigned short *, char * *); +int parseURL(const char *, char *, unsigned short *, char * *, unsigned int *);  #ifdef __cplusplus  } diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/minixml.c b/3rdParty/LibMiniUPnPc/src/miniupnpc/minixml.c index 8b5594c..eb4d7d9 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/minixml.c +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/minixml.c @@ -1,10 +1,10 @@ -/* $Id: minixml.c,v 1.9 2011/02/07 13:44:57 nanard Exp $ */ +/* $Id: minixml.c,v 1.10 2012/03/05 19:42:47 nanard Exp $ */  /* minixml.c : the minimum size a xml parser can be ! */  /* Project : miniupnp   * webpage: http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/   * Author : Thomas Bernard -Copyright (c) 2005-2011, Thomas BERNARD  +Copyright (c) 2005-2011, Thomas BERNARD  All rights reserved.  Redistribution and use in source and binary forms, with or without @@ -149,7 +149,7 @@ static void parseelt(struct xmlparser * p)  							return;  					}  					if(memcmp(p->xml, "<![CDATA[", 9) == 0) -					{  +					{  						/* CDATA handling */  						p->xml += 9;  						data = p->xml; diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/minixml.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/minixml.h index 857c70e..9f43aa4 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/minixml.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/minixml.h @@ -1,4 +1,4 @@ -/* $Id: minixml.h,v 1.6 2006/11/30 11:47:21 nanard Exp $ */ +/* $Id: minixml.h,v 1.7 2012/09/27 15:42:10 nanard Exp $ */  /* minimal xml parser   *   * Project : miniupnp @@ -8,8 +8,8 @@   * This software is subject to the conditions detailed in the   * LICENCE file provided in this distribution.   * */ -#ifndef __MINIXML_H__ -#define __MINIXML_H__ +#ifndef MINIXML_H_INCLUDED +#define MINIXML_H_INCLUDED  #define IS_WHITE_SPACE(c) ((c==' ') || (c=='\t') || (c=='\r') || (c=='\n'))  /* if a callback function pointer is set to NULL, diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/minixmlvalid.c b/3rdParty/LibMiniUPnPc/src/miniupnpc/minixmlvalid.c index 766211b..0a112bf 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/minixmlvalid.c +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/minixmlvalid.c @@ -1,4 +1,4 @@ -/* $Id: minixmlvalid.c,v 1.4 2011/02/07 13:44:57 nanard Exp $ */ +/* $Id: minixmlvalid.c,v 1.6 2012/05/01 16:24:07 nanard Exp $ */  /* MiniUPnP Project   * http://miniupnp.tuxfamily.org/ or http://miniupnp.free.fr/   * minixmlvalid.c : @@ -32,7 +32,7 @@ int evtlistcmp(struct eventlist * a, struct eventlist * b)  	if(a->n != b->n)  	{  		printf("event number not matching : %d != %d\n", a->n, b->n); -		//return 1; +		/*return 1;*/  	}  	for(i=0; i<a->n; i++)  	{ @@ -82,7 +82,7 @@ static const struct event evtref[] =  	{ELTEND, "elt2b", 5},  	{ELTEND, "elt2a", 5},  	{ELTEND, "xmlroot", 7} -};	 +};  void startelt(void * data, const char * p, int l)  { @@ -148,6 +148,8 @@ int testxmlparser(const char * xml, int size)  int main(int argc, char * * argv)  {  	int r; +	(void)argc; (void)argv; +  	r = testxmlparser(xmldata, sizeof(xmldata)-1);  	if(r)  		printf("minixml validation test failed\n"); diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/portlistingparse.c b/3rdParty/LibMiniUPnPc/src/miniupnpc/portlistingparse.c index e09e80f..19e3054 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/portlistingparse.c +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/portlistingparse.c @@ -1,7 +1,7 @@ -/* $Id: portlistingparse.c,v 1.4 2011/03/18 11:02:17 nanard Exp $ */ +/* $Id: portlistingparse.c,v 1.6 2012/05/29 10:26:51 nanard Exp $ */  /* MiniUPnP project   * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ - * (c) 2011 Thomas Bernard  + * (c) 2011 Thomas Bernard   * This software is subject to the conditions detailed   * in the LICENCE file provided within the distribution */  #include <string.h> @@ -71,6 +71,8 @@ static void  endelt(void * d, const char * name, int l)  {  	struct PortMappingParserData * pdata = (struct PortMappingParserData *)d; +	(void)name; +	(void)l;  	pdata->curelt = PortMappingEltNone;  } diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/portlistingparse.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/portlistingparse.h index 1852478..bafa2a4 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/portlistingparse.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/portlistingparse.h @@ -1,17 +1,17 @@ -/* $Id: portlistingparse.h,v 1.4 2011/02/15 23:03:56 nanard Exp $ */ +/* $Id: portlistingparse.h,v 1.7 2012/09/27 15:42:10 nanard Exp $ */  /* MiniUPnP project   * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ - * (c) 2011 Thomas Bernard  + * (c) 2011-2012 Thomas Bernard   * This software is subject to the conditions detailed   * in the LICENCE file provided within the distribution */ -#ifndef __PORTLISTINGPARSE_H__ -#define __PORTLISTINGPARSE_H__ +#ifndef PORTLISTINGPARSE_H_INCLUDED +#define PORTLISTINGPARSE_H_INCLUDED  #include "declspec.h"  /* for the definition of UNSIGNED_INTEGER */  #include "miniupnpctypes.h" -#if defined(NO_SYS_QUEUE_H) || defined(WIN32) || defined(__HAIKU__)  +#if defined(NO_SYS_QUEUE_H) || defined(_WIN32) || defined(__HAIKU__)  #include "bsdqueue.h"  #else  #include <sys/queue.h> @@ -37,7 +37,7 @@ typedef enum { PortMappingEltNone,         PortMappingEntry, NewRemoteHost,         NewExternalPort, NewProtocol,         NewInternalPort, NewInternalClient, -       NewEnabled, NewDescription,  +       NewEnabled, NewDescription,         NewLeaseTime } portMappingElt;  struct PortMapping { diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/receivedata.c b/3rdParty/LibMiniUPnPc/src/miniupnpc/receivedata.c index a1eadfc..ffbfbea 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/receivedata.c +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/receivedata.c @@ -1,12 +1,13 @@ -/* $Id: receivedata.c,v 1.1 2011/04/11 08:21:47 nanard Exp $ */ +/* $Id: receivedata.c,v 1.5 2013/10/07 09:48:36 nanard Exp $ */  /* Project : miniupnp + * Website : http://miniupnp.free.fr/   * Author : Thomas Bernard - * Copyright (c) 2011 Thomas Bernard + * Copyright (c) 2011-2012 Thomas Bernard   * This software is subject to the conditions detailed in the   * LICENCE file provided in this distribution. */  #include <stdio.h> -#ifdef WIN32 +#ifdef _WIN32  #include <winsock2.h>  #include <ws2tcpip.h>  #else @@ -17,6 +18,7 @@  #include <sys/select.h>  #endif /* #else defined(__amigaos__) && !defined(__amigaos4__) */  #include <sys/socket.h> +#include <netinet/in.h>  #if !defined(__amigaos__) && !defined(__amigaos4__)  #include <poll.h>  #endif @@ -24,7 +26,7 @@  #define MINIUPNPC_IGNORE_EINTR  #endif -#ifdef WIN32 +#ifdef _WIN32  #define PRINT_SOCKET_ERROR(x)    printf("Socket error: %s, %d\n", x, WSAGetLastError());  #else  #define PRINT_SOCKET_ERROR(x) perror(x) @@ -33,10 +35,21 @@  #include "receivedata.h"  int -receivedata(int socket, char * data, int length, int timeout) +receivedata(int socket, +            char * data, int length, +            int timeout, unsigned int * scope_id)  { +#if MINIUPNPC_GET_SRC_ADDR +#ifdef DEBUG +	/* to shut up valgrind about uninit value */ +	struct sockaddr_storage src_addr = {0}; +#else +	struct sockaddr_storage src_addr; +#endif +	socklen_t src_addr_len = sizeof(src_addr); +#endif      int n; -#if !defined(WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) +#if !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__)  	/* using poll */      struct pollfd fds[1]; /* for the poll */  #ifdef MINIUPNPC_IGNORE_EINTR @@ -55,8 +68,8 @@ receivedata(int socket, char * data, int length, int timeout)  		/* timeout */          return 0;      } -#else /* !defined(WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) */ -	/* using select under WIN32 and amigaos */ +#else /* !defined(_WIN32) && !defined(__amigaos__) && !defined(__amigaos4__) */ +	/* using select under _WIN32 and amigaos */      fd_set socketSet;      TIMEVAL timeval;      FD_ZERO(&socketSet); @@ -69,12 +82,27 @@ receivedata(int socket, char * data, int length, int timeout)          return -1;      } else if(n == 0) {          return 0; -    }     +    }  #endif +#if MINIUPNPC_GET_SRC_ADDR +	n = recvfrom(socket, data, length, 0, +	             (struct sockaddr *)&src_addr, &src_addr_len); +#else  	n = recv(socket, data, length, 0); +#endif  	if(n<0) {  		PRINT_SOCKET_ERROR("recv");  	} +#if MINIUPNPC_GET_SRC_ADDR +	if (src_addr.ss_family == AF_INET6) { +		const struct sockaddr_in6 * src_addr6 = (struct sockaddr_in6 *)&src_addr; +#ifdef DEBUG +		printf("scope_id=%u\n", src_addr6->sin6_scope_id); +#endif +		if(scope_id) +			*scope_id = src_addr6->sin6_scope_id; +	} +#endif  	return n;  } diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/receivedata.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/receivedata.h index 7a551b9..0520a11 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/receivedata.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/receivedata.h @@ -1,17 +1,19 @@ -/* $Id: receivedata.h,v 1.1 2011/04/11 08:21:47 nanard Exp $ */ +/* $Id: receivedata.h,v 1.4 2012/09/27 15:42:10 nanard Exp $ */  /* Project: miniupnp   * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/   * Author: Thomas Bernard - * Copyright (c) 2011 Thomas Bernard + * Copyright (c) 2011-2012 Thomas Bernard   * This software is subjects to the conditions detailed   * in the LICENCE file provided within this distribution */ -#ifndef __RECEIVEDATA_H__ -#define __RECEIVEDATA_H__ +#ifndef RECEIVEDATA_H_INCLUDED +#define RECEIVEDATA_H_INCLUDED -/* Reads data from the specified socket.  - * Returns the number of bytes read if successful, zero if no bytes were  +/* Reads data from the specified socket. + * Returns the number of bytes read if successful, zero if no bytes were   * read or if we timed out. Returns negative if there was an error. */ -int receivedata(int socket, char * data, int length, int timeout); +int receivedata(int socket, +                char * data, int length, +                int timeout, unsigned int * scope_id);  #endif diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpc.c b/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpc.c index b136d9d..9c9979a 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpc.c +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpc.c @@ -1,7 +1,7 @@ -/* $Id: upnpc.c,v 1.88 2011/06/17 23:31:01 nanard Exp $ */ +/* $Id: upnpc.c,v 1.101 2014/01/31 13:18:25 nanard Exp $ */  /* Project : miniupnp   * Author : Thomas Bernard - * Copyright (c) 2005-2011 Thomas Bernard + * Copyright (c) 2005-2013 Thomas Bernard   * This software is subject to the conditions detailed in the   * LICENCE file provided in this distribution. */ @@ -9,16 +9,19 @@  #include <stdlib.h>  #include <string.h>  #include <time.h> -#ifdef WIN32 +#ifdef _WIN32  #include <winsock2.h>  #define snprintf _snprintf +#else +/* for IPPROTO_TCP / IPPROTO_UDP */ +#include <netinet/in.h>  #endif  #include "miniwget.h"  #include "miniupnpc.h"  #include "upnpcommands.h"  #include "upnperrors.h" -/* protofix() checks if protocol is "UDP" or "TCP"  +/* protofix() checks if protocol is "UDP" or "TCP"   * returns NULL if not */  const char * protofix(const char * proto)  { @@ -26,7 +29,7 @@ const char * protofix(const char * proto)  	static const char proto_udp[4] = { 'U', 'D', 'P', 0};  	int i, b;  	for(i=0, b=1; i<4; i++) -		b = b && (   (proto[i] == proto_tcp[i])  +		b = b && (   (proto[i] == proto_tcp[i])  		          || (proto[i] == (proto_tcp[i] | 32)) );  	if(b)  		return proto_tcp; @@ -49,44 +52,47 @@ static void DisplayInfos(struct UPNPUrls * urls,  	unsigned int brUp, brDown;  	time_t timenow, timestarted;  	int r; -	UPNP_GetConnectionTypeInfo(urls->controlURL, -	                           data->first.servicetype, -							   connectionType); -	if(connectionType[0]) +	if(UPNP_GetConnectionTypeInfo(urls->controlURL, +	                              data->first.servicetype, +	                              connectionType) != UPNPCOMMAND_SUCCESS) +		printf("GetConnectionTypeInfo failed.\n"); +	else  		printf("Connection Type : %s\n", connectionType); +	if(UPNP_GetStatusInfo(urls->controlURL, data->first.servicetype, +	                      status, &uptime, lastconnerr) != UPNPCOMMAND_SUCCESS) +		printf("GetStatusInfo failed.\n");  	else -		printf("GetConnectionTypeInfo failed.\n"); -	UPNP_GetStatusInfo(urls->controlURL, data->first.servicetype, -	                   status, &uptime, lastconnerr); -	printf("Status : %s, uptime=%us, LastConnectionError : %s\n", -	       status, uptime, lastconnerr); +		printf("Status : %s, uptime=%us, LastConnectionError : %s\n", +		       status, uptime, lastconnerr);  	timenow = time(NULL);  	timestarted = timenow - uptime;  	printf("  Time started : %s", ctime(×tarted)); -	UPNP_GetLinkLayerMaxBitRates(urls->controlURL_CIF, data->CIF.servicetype, -			&brDown, &brUp); -	printf("MaxBitRateDown : %u bps", brDown); -	if(brDown >= 1000000) { -		printf(" (%u.%u Mbps)", brDown / 1000000, (brDown / 100000) % 10); -	} else if(brDown >= 1000) { -		printf(" (%u Kbps)", brDown / 1000); -	} -	printf("   MaxBitRateUp %u bps", brUp); -	if(brUp >= 1000000) { -		printf(" (%u.%u Mbps)", brUp / 1000000, (brUp / 100000) % 10); -	} else if(brUp >= 1000) { -		printf(" (%u Kbps)", brUp / 1000); +	if(UPNP_GetLinkLayerMaxBitRates(urls->controlURL_CIF, data->CIF.servicetype, +	                                &brDown, &brUp) != UPNPCOMMAND_SUCCESS) { +		printf("GetLinkLayerMaxBitRates failed.\n"); +	} else { +		printf("MaxBitRateDown : %u bps", brDown); +		if(brDown >= 1000000) { +			printf(" (%u.%u Mbps)", brDown / 1000000, (brDown / 100000) % 10); +		} else if(brDown >= 1000) { +			printf(" (%u Kbps)", brDown / 1000); +		} +		printf("   MaxBitRateUp %u bps", brUp); +		if(brUp >= 1000000) { +			printf(" (%u.%u Mbps)", brUp / 1000000, (brUp / 100000) % 10); +		} else if(brUp >= 1000) { +			printf(" (%u Kbps)", brUp / 1000); +		} +		printf("\n");  	} -	printf("\n");  	r = UPNP_GetExternalIPAddress(urls->controlURL,  	                          data->first.servicetype,  							  externalIPAddress); -	if(r != UPNPCOMMAND_SUCCESS) -		printf("GetExternalIPAddress() returned %d\n", r); -	if(externalIPAddress[0]) +	if(r != UPNPCOMMAND_SUCCESS) { +		printf("GetExternalIPAddress failed. (errorcode=%d)\n", r); +	} else {  		printf("ExternalIPAddress = %s\n", externalIPAddress); -	else -		printf("GetExternalIPAddress failed.\n"); +	}  }  static void GetConnectionStatus(struct UPNPUrls * urls, @@ -119,6 +125,7 @@ static void ListRedirections(struct UPNPUrls * urls,  	/*unsigned int num=0;  	UPNP_GetPortMappingNumberOfEntries(urls->controlURL, data->servicetype, &num);  	printf("PortMappingNumberOfEntries : %u\n", num);*/ +	printf(" i protocol exPort->inAddr:inPort description remoteHost leaseTime\n");  	do {  		snprintf(index, 6, "%d", i);  		rHost[0] = '\0'; enabled[0] = '\0'; @@ -166,6 +173,7 @@ static void NewListRedirections(struct UPNPUrls * urls,  	                               &pdata);  	if(r == UPNPCOMMAND_SUCCESS)  	{ +		printf(" i protocol exPort->inAddr:inPort description remoteHost leaseTime\n");  		for(pm = pdata.head.lh_first; pm != NULL; pm = pm->entries.le_next)  		{  			printf("%2d %s %5hu->%s:%-5hu '%s' '%s' %u\n", @@ -209,7 +217,7 @@ static void NewListRedirections(struct UPNPUrls * urls,  	}  } -/* Test function  +/* Test function   * 1 - get connection type   * 2 - get extenal ip address   * 3 - Add port mapping @@ -220,7 +228,8 @@ static void SetRedirectAndTest(struct UPNPUrls * urls,  							   const char * iport,  							   const char * eport,                                 const char * proto, -                               const char * leaseDuration) +                               const char * leaseDuration, +                               const char * description)  {  	char externalIPAddress[40];  	char intClient[40]; @@ -239,7 +248,7 @@ static void SetRedirectAndTest(struct UPNPUrls * urls,  		fprintf(stderr, "invalid protocol\n");  		return;  	} -	 +  	UPNP_GetExternalIPAddress(urls->controlURL,  	                          data->first.servicetype,  							  externalIPAddress); @@ -247,22 +256,23 @@ static void SetRedirectAndTest(struct UPNPUrls * urls,  		printf("ExternalIPAddress = %s\n", externalIPAddress);  	else  		printf("GetExternalIPAddress failed.\n"); -	 +  	r = UPNP_AddPortMapping(urls->controlURL, data->first.servicetype, -	                        eport, iport, iaddr, 0, proto, 0, leaseDuration); +	                        eport, iport, iaddr, description, +	                        proto, 0, leaseDuration);  	if(r!=UPNPCOMMAND_SUCCESS)  		printf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n",  		       eport, iport, iaddr, r, strupnperror(r));  	r = UPNP_GetSpecificPortMappingEntry(urls->controlURL,  	                                 data->first.servicetype, -    	                             eport, proto, +    	                             eport, proto, NULL/*remoteHost*/,  									 intClient, intPort, NULL/*desc*/,  	                                 NULL/*enabled*/, duration);  	if(r!=UPNPCOMMAND_SUCCESS)  		printf("GetSpecificPortMappingEntry() failed with code %d (%s)\n",  		       r, strupnperror(r)); -	 +  	if(intClient[0]) {  		printf("InternalIP:Port = %s:%s\n", intClient, intPort);  		printf("external %s:%s %s is redirected to internal %s:%s (duration=%s)\n", @@ -301,7 +311,7 @@ static void GetFirewallStatus(struct UPNPUrls * urls, struct IGDdatas * data)  	UPNP_GetFirewallStatus(urls->controlURL_6FC, data->IPv6FC.servicetype, &firewallEnabled, &inboundPinholeAllowed);  	printf("FirewallEnabled: %d & Inbound Pinhole Allowed: %d\n", firewallEnabled, inboundPinholeAllowed);  	printf("GetFirewallStatus:\n   Firewall Enabled: %s\n   Inbound Pinhole Allowed: %s\n", (firewallEnabled)? "Yes":"No", (inboundPinholeAllowed)? "Yes":"No"); -	 +  	bytessent = UPNP_GetTotalBytesSent(urls->controlURL_CIF, data->CIF.servicetype);  	bytesreceived = UPNP_GetTotalBytesReceived(urls->controlURL_CIF, data->CIF.servicetype);  	packetssent = UPNP_GetTotalPacketsSent(urls->controlURL_CIF, data->CIF.servicetype); @@ -310,7 +320,7 @@ static void GetFirewallStatus(struct UPNPUrls * urls, struct IGDdatas * data)  	printf("Packets: Sent: %8u\tRecv: %8u\n", packetssent, packetsreceived);  } -/* Test function  +/* Test function   * 1 - Add pinhole   * 2 - Check if pinhole is working from the IGD side */  static void SetPinholeAndTest(struct UPNPUrls * urls, struct IGDdatas * data, @@ -319,27 +329,43 @@ static void SetPinholeAndTest(struct UPNPUrls * urls, struct IGDdatas * data,  					const char * proto, const char * lease_time)  {  	char uniqueID[8]; -	//int isWorking = 0; +	/*int isWorking = 0;*/  	int r; +	char proto_tmp[8];  	if(!intaddr || !remoteaddr || !iport || !eport || !proto || !lease_time)  	{  		fprintf(stderr, "Wrong arguments\n");  		return;  	} -	/*proto = protofix(proto); -	if(!proto) +	if(atoi(proto) == 0)  	{ -		fprintf(stderr, "invalid protocol\n"); -		return; -	}*/ +		const char * protocol; +		protocol = protofix(proto); +		if(protocol && (strcmp("TCP", protocol) == 0)) +		{ +			snprintf(proto_tmp, sizeof(proto_tmp), "%d", IPPROTO_TCP); +			proto = proto_tmp; +		} +		else if(protocol && (strcmp("UDP", protocol) == 0)) +		{ +			snprintf(proto_tmp, sizeof(proto_tmp), "%d", IPPROTO_UDP); +			proto = proto_tmp; +		} +		else +		{ +			fprintf(stderr, "invalid protocol\n"); +			return; +		} +	}  	r = UPNP_AddPinhole(urls->controlURL_6FC, data->IPv6FC.servicetype, remoteaddr, eport, intaddr, iport, proto, lease_time, uniqueID);  	if(r!=UPNPCOMMAND_SUCCESS)  		printf("AddPinhole([%s]:%s -> [%s]:%s) failed with code %d (%s)\n", -		       intaddr, iport, remoteaddr, eport, r, strupnperror(r)); +		       remoteaddr, eport, intaddr, iport, r, strupnperror(r));  	else  	{ -		printf("AddPinhole: ([%s]:%s -> [%s]:%s) / Pinhole ID = %s\n", intaddr, iport, remoteaddr, eport, uniqueID); +		printf("AddPinhole: ([%s]:%s -> [%s]:%s) / Pinhole ID = %s\n", +		       remoteaddr, eport, intaddr, iport, uniqueID);  		/*r = UPNP_CheckPinholeWorking(urls->controlURL_6FC, data->servicetype_6FC, uniqueID, &isWorking);  		if(r!=UPNPCOMMAND_SUCCESS)  			printf("CheckPinholeWorking() failed with code %d (%s)\n", r, strupnperror(r)); @@ -374,7 +400,7 @@ static void GetPinholeAndUpdate(struct UPNPUrls * urls, struct IGDdatas * data,  	}  } -/* Test function  +/* Test function   * Get pinhole timeout   */  static void GetPinholeOutboundTimeout(struct UPNPUrls * urls, struct IGDdatas * data, @@ -463,8 +489,9 @@ int main(int argc, char ** argv)  	int retcode = 0;  	int error = 0;  	int ipv6 = 0; +	const char * description = 0; -#ifdef WIN32 +#ifdef _WIN32  	WSADATA wsaData;  	int nResult = WSAStartup(MAKEWORD(2,2), &wsaData);  	if(nResult != NO_ERROR) @@ -473,12 +500,17 @@ int main(int argc, char ** argv)  		return -1;  	}  #endif -    printf("upnpc : miniupnpc library test client. (c) 2006-2011 Thomas Bernard\n"); +    printf("upnpc : miniupnpc library test client. (c) 2005-2013 Thomas Bernard\n");      printf("Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/\n"  	       "for more information.\n");  	/* command line processing */  	for(i=1; i<argc; i++)  	{ +		if(0 == strcmp(argv[i], "--help") || 0 == strcmp(argv[i], "-h")) +		{ +			command = 0; +			break; +		}  		if(argv[i][0] == '-')  		{  			if(argv[i][1] == 'u') @@ -489,6 +521,8 @@ int main(int argc, char ** argv)  				minissdpdpath = argv[++i];  			else if(argv[i][1] == '6')  				ipv6 = 1; +			else if(argv[i][1] == 'e') +				description = argv[++i];  			else  			{  				command = argv[i][1]; @@ -527,9 +561,10 @@ int main(int argc, char ** argv)  		fprintf(stderr, "       \t%s [options] -P\n\t\tGet Presentation url\n", argv[0]);  		fprintf(stderr, "\nprotocol is UDP or TCP\n");  		fprintf(stderr, "Options:\n"); +		fprintf(stderr, "  -e description : set description for port mapping.\n");  		fprintf(stderr, "  -6 : use ip v6 instead of ip v4.\n");  		fprintf(stderr, "  -u url : bypass discovery process by providing the XML root description url.\n"); -		fprintf(stderr, "  -m address/interface : provide ip address (ip v4) or interface name (ip v6) to use for sending SSDP multicast packets.\n"); +		fprintf(stderr, "  -m address/interface : provide ip address (ip v4) or interface name (ip v4 or v6) to use for sending SSDP multicast packets.\n");  		fprintf(stderr, "  -p path : use this path for MiniSSDPd socket.\n");  		return 1;  	} @@ -598,7 +633,8 @@ int main(int argc, char ** argv)  				SetRedirectAndTest(&urls, &data,  				                   commandargv[0], commandargv[1],  				                   commandargv[2], commandargv[3], -				                   (commandargc > 4)?commandargv[4]:"0"); +				                   (commandargc > 4)?commandargv[4]:"0", +				                   description);  				break;  			case 'd':  				for(i=0; i<commandargc; i+=2) @@ -615,7 +651,8 @@ int main(int argc, char ** argv)  					/*printf("port %s protocol %s\n", argv[i], argv[i+1]);*/  					SetRedirectAndTest(&urls, &data,  					                   lanaddr, commandargv[i], -									   commandargv[i], commandargv[i+1], "0"); +									   commandargv[i], commandargv[i+1], "0", +					                   description);  				}  				break;  			case 'A': diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpcommands.c b/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpcommands.c index 1114759..ad69781 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpcommands.c +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpcommands.c @@ -1,7 +1,7 @@ -/* $Id: upnpcommands.c,v 1.37 2011/06/04 15:56:23 nanard Exp $ */ +/* $Id: upnpcommands.c,v 1.42 2014/01/31 13:18:25 nanard Exp $ */  /* Project : miniupnp   * Author : Thomas Bernard - * Copyright (c) 2005-2011 Thomas Bernard + * Copyright (c) 2005-2012 Thomas Bernard   * This software is subject to the conditions detailed in the   * LICENCE file provided in this distribution.   * */ @@ -119,7 +119,7 @@ UPNP_GetTotalPacketsReceived(const char * controlURL,  LIBSPEC int  UPNP_GetStatusInfo(const char * controlURL,  				const char * servicetype, -				char * status,  +				char * status,  				unsigned int * uptime,  				char * lastconnerror)  { @@ -221,8 +221,8 @@ UPNP_GetConnectionTypeInfo(const char * controlURL,  /* UPNP_GetLinkLayerMaxBitRate() call the corresponding UPNP method.   * Returns 2 values: Downloadlink bandwidth and Uplink bandwidth. - * One of the values can be null  - * Note : GetLinkLayerMaxBitRates belongs to WANPPPConnection:1 only  + * One of the values can be null + * Note : GetLinkLayerMaxBitRates belongs to WANPPPConnection:1 only   * We can use the GetCommonLinkProperties from WANCommonInterfaceConfig:1 */  LIBSPEC int  UPNP_GetLinkLayerMaxBitRates(const char * controlURL, @@ -285,7 +285,7 @@ UPNP_GetLinkLayerMaxBitRates(const char * controlURL,  /* 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. @@ -578,7 +578,8 @@ LIBSPEC int  UPNP_GetSpecificPortMappingEntry(const char * controlURL,                                   const char * servicetype,                                   const char * extPort, -							     const char * proto, +                                 const char * proto, +                                 const char * remoteHost,                                   char * intClient,                                   char * intPort,                                   char * desc, @@ -597,7 +598,7 @@ UPNP_GetSpecificPortMappingEntry(const char * controlURL,  	GetPortMappingArgs = calloc(4, sizeof(struct UPNParg));  	GetPortMappingArgs[0].elt = "NewRemoteHost"; -	/* TODO : add remote host ? */ +	GetPortMappingArgs[0].val = remoteHost;  	GetPortMappingArgs[1].elt = "NewExternalPort";  	GetPortMappingArgs[1].val = extPort;  	GetPortMappingArgs[2].elt = "NewProtocol"; @@ -741,16 +742,16 @@ UPNP_GetListOfPortMappings(const char * controlURL,  	}  	ClearNameValueList(&pdata); -	//printf("%.*s", bufsize, buffer); +	/*printf("%.*s", bufsize, buffer);*/  	return ret;  } -/* IGD:2, functions for service WANIPv6FirewallControl:1 */  +/* IGD:2, functions for service WANIPv6FirewallControl:1 */  LIBSPEC int  UPNP_GetFirewallStatus(const char * controlURL,  				const char * servicetype, -				int * firewallEnabled,  +				int * firewallEnabled,  				int * inboundPinholeAllowed)  {  	struct NameValueParserData pdata; @@ -759,7 +760,7 @@ UPNP_GetFirewallStatus(const char * controlURL,  	char * fe, *ipa, *p;  	int ret = UPNPCOMMAND_UNKNOWN_ERROR; -	if(!firewallEnabled && !inboundPinholeAllowed) +	if(!firewallEnabled || !inboundPinholeAllowed)  		return UPNPCOMMAND_INVALID_ARGS;  	buffer = simpleUPnPcommand(-1, controlURL, servicetype, @@ -868,7 +869,7 @@ UPNP_AddPinhole(const char * controlURL, const char * servicetype,  		return UPNPCOMMAND_INVALID_ARGS;  	AddPinholeArgs = calloc(7, sizeof(struct UPNParg)); -	// RemoteHost can be wilcarded +	/* RemoteHost can be wilcarded */  	if(strncmp(remoteHost, "empty", 5)==0)  	{  		AddPinholeArgs[0].elt = "RemoteHost"; @@ -912,7 +913,7 @@ UPNP_AddPinhole(const char * controlURL, const char * servicetype,  	resVal = GetValueFromNameValueList(&pdata, "errorCode");  	if(resVal)  	{ -		//printf("AddPortMapping errorCode = '%s'\n", resVal);  +		/*printf("AddPortMapping errorCode = '%s'\n", resVal);*/  		ret = UPNPCOMMAND_UNKNOWN_ERROR;  		sscanf(resVal, "%d", &ret);  	} diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpcommands.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpcommands.h index 66d95e0..dc3f23f 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpcommands.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpcommands.h @@ -1,11 +1,11 @@ -/* $Id: upnpcommands.h,v 1.23 2011/04/11 09:14:00 nanard Exp $ */ +/* $Id: upnpcommands.h,v 1.26 2014/01/31 13:18:26 nanard Exp $ */  /* Miniupnp project : http://miniupnp.free.fr/   * Author : Thomas Bernard   * Copyright (c) 2005-2011 Thomas Bernard   * This software is subject to the conditions detailed in the   * LICENCE file provided within this distribution */ -#ifndef __UPNPCOMMANDS_H__ -#define __UPNPCOMMANDS_H__ +#ifndef UPNPCOMMANDS_H_INCLUDED +#define UPNPCOMMANDS_H_INCLUDED  #include "upnpreplyparse.h"  #include "portlistingparse.h" @@ -62,12 +62,12 @@ UPNP_GetConnectionTypeInfo(const char * controlURL,  /* 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  + * 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. */ @@ -95,7 +95,7 @@ UPNP_GetLinkLayerMaxBitRates(const char* controlURL,   * 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. @@ -106,7 +106,7 @@ UPNP_GetLinkLayerMaxBitRates(const char* controlURL,   * 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  + *                              must be the same   * 725 OnlyPermanentLeasesSupported - The NAT implementation only supports   *                  permanent lease times on port mappings   * 726 RemoteHostOnlySupportsWildcard - RemoteHost must be a wildcard @@ -150,6 +150,7 @@ UPNP_GetPortMappingNumberOfEntries(const char* controlURL,   * params :   *  in   extPort   *  in   proto + *  in   remoteHost   *  out  intClient (16 bytes)   *  out  intPort (6 bytes)   *  out  desc (80 bytes) @@ -164,6 +165,7 @@ UPNP_GetSpecificPortMappingEntry(const char * controlURL,                                   const char * servicetype,                                   const char * extPort,                                   const char * proto, +                                 const char * remoteHost,                                   char * intClient,                                   char * intPort,                                   char * desc, @@ -221,11 +223,11 @@ UPNP_GetListOfPortMappings(const char * controlURL,                             const char * numberOfPorts,                             struct PortMappingParserData * data); -/* IGD:2, functions for service WANIPv6FirewallControl:1 */  +/* IGD:2, functions for service WANIPv6FirewallControl:1 */  LIBSPEC int  UPNP_GetFirewallStatus(const char * controlURL,  				const char * servicetype, -				int * firewallEnabled,  +				int * firewallEnabled,  				int * inboundPinholeAllowed);  LIBSPEC int diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/upnperrors.c b/3rdParty/LibMiniUPnPc/src/miniupnpc/upnperrors.c index a48ae10..644098f 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/upnperrors.c +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/upnperrors.c @@ -1,4 +1,4 @@ -/* $Id: upnperrors.c,v 1.5 2011/04/10 11:19:36 nanard Exp $ */ +/* $Id: upnperrors.c,v 1.6 2012/03/15 01:02:03 nanard Exp $ */  /* Project : miniupnp   * Author : Thomas BERNARD   * copyright (c) 2007 Thomas Bernard @@ -97,7 +97,8 @@ const char * strupnperror(int err)  		s = "ExternalPortOnlySupportsWildcard";  		break;  	default: -		s = NULL; +		s = "UnknownError"; +		break;  	}  	return s;  } diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/upnperrors.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/upnperrors.h index 2c544c9..077d693 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/upnperrors.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/upnperrors.h @@ -1,12 +1,12 @@ -/* $Id: upnperrors.h,v 1.2 2008/07/02 23:31:15 nanard Exp $ */ +/* $Id: upnperrors.h,v 1.4 2012/09/27 15:42:11 nanard Exp $ */  /* (c) 2007 Thomas Bernard   * All rights reserved.   * MiniUPnP Project.   * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/   * This software is subjet to the conditions detailed in the   * provided LICENCE file. */ -#ifndef __UPNPERRORS_H__ -#define __UPNPERRORS_H__ +#ifndef UPNPERRORS_H_INCLUDED +#define UPNPERRORS_H_INCLUDED  #include "declspec.h" @@ -15,7 +15,7 @@ extern "C" {  #endif  /* strupnperror() - * Return a string description of the UPnP error code  + * Return a string description of the UPnP error code   * or NULL for undefinded errors */  LIBSPEC const char * strupnperror(int err); diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpreplyparse.c b/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpreplyparse.c index 482030b..dafa263 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpreplyparse.c +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpreplyparse.c @@ -1,7 +1,7 @@ -/* $Id: upnpreplyparse.c,v 1.11 2011/02/07 16:17:06 nanard Exp $ */ +/* $Id: upnpreplyparse.c,v 1.15 2013/06/06 21:36:40 nanard Exp $ */  /* MiniUPnP project   * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ - * (c) 2006-2011 Thomas Bernard  + * (c) 2006-2013 Thomas Bernard   * This software is subject to the conditions detailed   * in the LICENCE file provided within the distribution */ @@ -15,18 +15,55 @@  static void  NameValueParserStartElt(void * d, const char * name, int l)  { -    struct NameValueParserData * data = (struct NameValueParserData *)d; +	struct NameValueParserData * data = (struct NameValueParserData *)d; +	data->topelt = 1;      if(l>63)          l = 63;      memcpy(data->curelt, name, l);      data->curelt[l] = '\0'; +	data->cdata = NULL; +	data->cdatalen = 0;  }  static void -NameValueParserGetData(void * d, const char * datas, int l) +NameValueParserEndElt(void * d, const char * name, int l)  {      struct NameValueParserData * data = (struct NameValueParserData *)d;      struct NameValue * nv; +	(void)name; +	(void)l; +	if(!data->topelt) +		return; +	if(strcmp(data->curelt, "NewPortListing") != 0) +	{ +		int l; +		/* standard case. Limited to n chars strings */ +		l = data->cdatalen; +	    nv = malloc(sizeof(struct NameValue)); +	    if(l>=(int)sizeof(nv->value)) +	        l = sizeof(nv->value) - 1; +	    strncpy(nv->name, data->curelt, 64); +		nv->name[63] = '\0'; +		if(data->cdata != NULL) +		{ +			memcpy(nv->value, data->cdata, l); +			nv->value[l] = '\0'; +		} +		else +		{ +			nv->value[0] = '\0'; +		} +	    LIST_INSERT_HEAD( &(data->head), nv, entries); +	} +	data->cdata = NULL; +	data->cdatalen = 0; +	data->topelt = 0; +} + +static void +NameValueParserGetData(void * d, const char * datas, int l) +{ +    struct NameValueParserData * data = (struct NameValueParserData *)d;  	if(strcmp(data->curelt, "NewPortListing") == 0)  	{  		/* specific case for NewPortListing which is a XML Document */ @@ -42,15 +79,9 @@ NameValueParserGetData(void * d, const char * datas, int l)  	}  	else  	{ -		/* standard case. Limited to 63 chars strings */ -	    nv = malloc(sizeof(struct NameValue)); -	    if(l>63) -	        l = 63; -	    strncpy(nv->name, data->curelt, 64); -		nv->name[63] = '\0'; -	    memcpy(nv->value, datas, l); -	    nv->value[l] = '\0'; -	    LIST_INSERT_HEAD( &(data->head), nv, entries); +		/* standard case. */ +		data->cdata = datas; +		data->cdatalen = l;  	}  } @@ -67,7 +98,7 @@ ParseNameValue(const char * buffer, int bufsize,      parser.xmlsize = bufsize;      parser.data = data;      parser.starteltfunc = NameValueParserStartElt; -    parser.endeltfunc = 0; +    parser.endeltfunc = NameValueParserEndElt;      parser.datafunc = NameValueParserGetData;  	parser.attfunc = 0;      parsexml(&parser); @@ -90,7 +121,7 @@ ClearNameValueList(struct NameValueParserData * pdata)      }  } -char *  +char *  GetValueFromNameValueList(struct NameValueParserData * pdata,                            const char * Name)  { @@ -131,7 +162,7 @@ GetValueFromNameValueListIgnoreNS(struct NameValueParserData * pdata,  }  #endif -/* debug all-in-one function  +/* debug all-in-one function   * do parsing then display to stdout */  #ifdef DEBUG  void diff --git a/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpreplyparse.h b/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpreplyparse.h index 267ea87..d4e3757 100644 --- a/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpreplyparse.h +++ b/3rdParty/LibMiniUPnPc/src/miniupnpc/upnpreplyparse.h @@ -1,14 +1,14 @@ -/* $Id: upnpreplyparse.h,v 1.11 2011/02/07 16:17:06 nanard Exp $ */ +/* $Id: upnpreplyparse.h,v 1.17 2013/06/06 21:36:40 nanard Exp $ */  /* MiniUPnP project   * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ - * (c) 2006-2011 Thomas Bernard  + * (c) 2006-2013 Thomas Bernard   * This software is subject to the conditions detailed   * in the LICENCE file provided within the distribution */ -#ifndef __UPNPREPLYPARSE_H__ -#define __UPNPREPLYPARSE_H__ +#ifndef UPNPREPLYPARSE_H_INCLUDED +#define UPNPREPLYPARSE_H_INCLUDED -#if defined(NO_SYS_QUEUE_H) || defined(WIN32) || defined(__HAIKU__)  +#if defined(NO_SYS_QUEUE_H) || defined(_WIN32) || defined(__HAIKU__)  #include "bsdqueue.h"  #else  #include <sys/queue.h> @@ -21,7 +21,7 @@ extern "C" {  struct NameValue {      LIST_ENTRY(NameValue) entries;      char name[64]; -    char value[64]; +    char value[128];  };  struct NameValueParserData { @@ -29,6 +29,9 @@ struct NameValueParserData {      char curelt[64];  	char * portListing;  	int portListingLength; +	int topelt; +	const char * cdata; +	int cdatalen;  };  /* ParseNameValue() */ @@ -45,10 +48,12 @@ char *  GetValueFromNameValueList(struct NameValueParserData * pdata,                            const char * Name); +#if 0  /* GetValueFromNameValueListIgnoreNS() */  char *  GetValueFromNameValueListIgnoreNS(struct NameValueParserData * pdata,                                    const char * Name); +#endif  /* DisplayNameValueList() */  #ifdef DEBUG  | 
 Swift