[Buildroot] PATCH [1/1] bump libupnp to recent version with IPv6 support
Sagaert Johan
sagaert.johan at skynet.be
Sat Jan 29 00:08:29 UTC 2011
Hi
Update the rather old version to a recent one , supporting IPv6
Stolen from
http://libupnp4.sourcearchive.com/documentation/1.8.0~svn20100507/
And made a patch to allow building on an IPv4 only environment.
diff -rupN
buildroot-2010.11/package/libupnp/libupnp-1.6.6-remove-sys_timeb.h.patch
buildroot/package/libupnp/libupnp-1.6.6-remove-sys_timeb.h.patch
--- buildroot-2010.11/package/libupnp/libupnp-1.6.6-remove-sys_timeb.h.patch
2010-11-30 16:52:43.000000000 +0100
+++ buildroot/package/libupnp/libupnp-1.6.6-remove-sys_timeb.h.patch
1970-01-01 01:00:00.000000000 +0100
@@ -1,11 +0,0 @@
-diff -urN libupnp-1.6.6-0rig/configure libupnp-1.6.6/configure
---- libupnp-1.6.6-0rig/configure 2008-04-25 13:47:24.000000000 +0200
-+++ libupnp-1.6.6/configure 2009-01-14 21:55:16.000000000 +0100
-@@ -21096,7 +21096,6 @@
- sys/ioctl.h \
- sys/socket.h \
- sys/time.h \
-- sys/timeb.h \
- syslog.h \
- unistd.h \
-
diff -rupN
buildroot-2010.11/package/libupnp/libupnp-1.8.0~svn20100507.orig.patch
buildroot/package/libupnp/libupnp-1.8.0~svn20100507.orig.patch
--- buildroot-2010.11/package/libupnp/libupnp-1.8.0~svn20100507.orig.patch
1970-01-01 01:00:00.000000000 +0100
+++ buildroot/package/libupnp/libupnp-1.8.0~svn20100507.orig.patch
2011-01-29 23:29:17.000000000 +0100
@@ -0,0 +1,423 @@
+diff -rupN
libupnp-1.8.0~svn20100507.orig/upnp/src/genlib/miniserver/miniserver.c
libupnp-1.8.0~svn20100507.origjs/upnp/src/genlib/miniserver/miniserver.c
+--- libupnp-1.8.0~svn20100507.orig/upnp/src/genlib/miniserver/miniserver.c
2010-05-11 16:16:14.000000000 +0200
++++
libupnp-1.8.0~svn20100507.origjs/upnp/src/genlib/miniserver/miniserver.c
2011-01-28 23:16:25.000000000 +0100
+@@ -566,12 +566,17 @@ static int get_miniserver_sockets(
+ {
+ char errorBuffer[ERROR_BUFFER_LEN];
+ struct sockaddr_storage __ss_v4;
+- struct sockaddr_storage __ss_v6;
+ struct sockaddr_in* serverAddr4 = (struct sockaddr_in*)&__ss_v4;
++#ifdef IPV6_ENABLED
++ struct sockaddr_storage __ss_v6;
++
+ struct sockaddr_in6* serverAddr6 = (struct sockaddr_in6*)&__ss_v6;
+- SOCKET listenfd4, listenfd6;
++ unsigned short actual_port6;
++ SOCKET listenfd6;
++#endif
++ SOCKET listenfd4;
+ int ret_code;
+- unsigned short actual_port4, actual_port6;
++ unsigned short actual_port4;
+ int reuseaddr_on = 0;
+ int sockError = UPNP_E_SUCCESS;
+ int errCode = 0;
+@@ -579,27 +584,36 @@ static int get_miniserver_sockets(
+ // Create listen socket for IPv4/IPv6. An error here may indicate
+ // that we don't have an IPv4/IPv6 stack.
+ listenfd4 = socket(AF_INET, SOCK_STREAM, 0);
++#ifdef IPV6_ENABLED
+ listenfd6 = socket(AF_INET6, SOCK_STREAM, 0);
+ if (listenfd4 == INVALID_SOCKET && listenfd6 == INVALID_SOCKET) {
+ return UPNP_E_OUTOF_SOCKET;
+ }
++#else
++ if (listenfd4 == INVALID_SOCKET) {
++ return UPNP_E_OUTOF_SOCKET;
++ }
++#endif
+
+ // As per the IANA specifications for the use of ports by
applications
+ // override the listen port passed in with the first available
+ if (listen_port4 < APPLICATION_LISTENING_PORT) {
+ listen_port4 = APPLICATION_LISTENING_PORT;
+ }
++#ifdef IPV6_ENABLED
+ if (listen_port6 < APPLICATION_LISTENING_PORT) {
+ listen_port6 = APPLICATION_LISTENING_PORT;
+ }
++#endif
+
+ memset(&__ss_v4, 0, sizeof (__ss_v4));
+ serverAddr4->sin_family = AF_INET;
+ serverAddr4->sin_addr.s_addr = htonl(INADDR_ANY);
+-
++#ifdef IPV6_ENABLED
+ memset(&__ss_v6, 0, sizeof (__ss_v6));
+ serverAddr6->sin6_family = AF_INET6;
+ serverAddr6->sin6_addr = in6addr_any;
++#endif
+
+ // Getting away with implementation of re-using address:port and
instead
+ // choosing to increment port numbers.
+@@ -620,8 +634,10 @@ static int get_miniserver_sockets(
+ if (sockError == -1) {
+ shutdown(listenfd4, SD_BOTH);
+ UpnpCloseSocket(listenfd4);
++#ifdef IPV6_ENABLED
+ shutdown(listenfd6, SD_BOTH);
+ UpnpCloseSocket(listenfd6);
++#endif
+ return UPNP_E_SOCKET_BIND;
+ }
+
+@@ -634,13 +650,16 @@ static int get_miniserver_sockets(
+ errorBuffer);
+ shutdown(listenfd4, SD_BOTH);
+ UpnpCloseSocket(listenfd4);
++#ifdef IPV6_ENABLED
+ shutdown(listenfd6, SD_BOTH);
+ UpnpCloseSocket(listenfd6);
++#endif
+ /* Bind failed */
+ return UPNP_E_SOCKET_BIND;
+ }
+ }
+
++#ifdef IPV6_ENABLED
+ if(listenfd6 != INVALID_SOCKET) {
+ sockError = setsockopt(listenfd6, SOL_SOCKET,
SO_REUSEADDR,
+ (const char *)&reuseaddr_on, sizeof (int));
+@@ -667,7 +686,10 @@ static int get_miniserver_sockets(
+ return UPNP_E_SOCKET_BIND;
+ }
+ }
+- } else {
++ } else
++
++#endif
++{
+ if (listenfd4 != INVALID_SOCKET) {
+ unsigned short orig_listen_port4 = listen_port4;
+ do {
+@@ -694,12 +716,15 @@ static int get_miniserver_sockets(
+ errorBuffer);
+ shutdown(listenfd4, SD_BOTH);
+ UpnpCloseSocket(listenfd4);
++#ifdef IPV6_ENABLED
+ shutdown(listenfd6, SD_BOTH);
+ UpnpCloseSocket(listenfd6);
++#endif
+ return UPNP_E_SOCKET_BIND; // bind failed
+ }
+ }
+
++#ifdef IPV6_ENABLED
+ if (listenfd6 != INVALID_SOCKET) {
+ unsigned short orig_listen_port6 = listen_port6;
+ do {
+@@ -718,7 +743,7 @@ static int get_miniserver_sockets(
+ errCode = 0;
+ }
+ } while (errCode != 0 && (listen_port6 >=
orig_listen_port6));
+-
++#endif
+ if (sockError == -1) {
+ strerror_r(errno, errorBuffer,
ERROR_BUFFER_LEN);
+ UpnpPrintf(UPNP_INFO, MSERV, __FILE__,
__LINE__,
+@@ -726,8 +751,10 @@ static int get_miniserver_sockets(
+ errorBuffer);
+ shutdown(listenfd4, SD_BOTH);
+ UpnpCloseSocket(listenfd4);
++#ifdef IPV6_ENABLED
+ shutdown(listenfd6, SD_BOTH);
+ UpnpCloseSocket(listenfd6);
++#endif
+ /* Bind failied */
+ return UPNP_E_SOCKET_BIND;
+ }
+@@ -746,8 +773,10 @@ static int get_miniserver_sockets(
+ errorBuffer);
+ shutdown(listenfd4, SD_BOTH);
+ UpnpCloseSocket(listenfd4);
++#ifdef IPV6_ENABLED
+ shutdown(listenfd6, SD_BOTH);
+ UpnpCloseSocket(listenfd6);
++#endif
+ return UPNP_E_LISTEN;
+ }
+
+@@ -755,14 +784,17 @@ static int get_miniserver_sockets(
+ if (actual_port4 <= 0) {
+ shutdown(listenfd4, SD_BOTH);
+ UpnpCloseSocket(listenfd4);
++#ifdef IPV6_ENABLED
+ shutdown(listenfd6, SD_BOTH);
+ UpnpCloseSocket(listenfd6);
++#endif
+ return UPNP_E_INTERNAL_ERROR;
+ }
+
+ out->miniServerPort4 = actual_port4;
+ }
+
++#ifdef IPV6_ENABLED
+ if (listenfd6 != INVALID_SOCKET) {
+ ret_code = listen(listenfd6, SOMAXCONN);
+ if (ret_code == -1) {
+@@ -788,9 +820,12 @@ static int get_miniserver_sockets(
+
+ out->miniServerPort6 = actual_port6;
+ }
++#endif
+
+ out->miniServerSock4 = listenfd4;
++#ifdef IPV6_ENABLED
+ out->miniServerSock6 = listenfd6;
++#endif
+
+ return UPNP_E_SUCCESS;
+ }
+diff -rupN libupnp-1.8.0~svn20100507.orig/upnp/src/ssdp/ssdp_ctrlpt.c
libupnp-1.8.0~svn20100507.origjs/upnp/src/ssdp/ssdp_ctrlpt.c
+--- libupnp-1.8.0~svn20100507.orig/upnp/src/ssdp/ssdp_ctrlpt.c 2008-07-24
08:02:57.000000000 +0200
++++ libupnp-1.8.0~svn20100507.origjs/upnp/src/ssdp/ssdp_ctrlpt.c
2011-01-28 22:57:54.000000000 +0100
+@@ -372,9 +372,12 @@ CreateClientRequestPacket( IN char *Rqst
+
+ if (AddressFamily == AF_INET) {
+ sprintf( TempBuf, "HOST: %s:%d\r\n", SSDP_IP, SSDP_PORT );
+- } else if (AddressFamily == AF_INET6) {
++ }
++#ifdef IPV6_ENABLED
++else if (AddressFamily == AF_INET6) {
+ sprintf( TempBuf, "HOST: [%s]:%d\r\n", SSDP_IPV6_LINKLOCAL,
SSDP_PORT );
+ }
++#endif
+ strcat( RqstBuf, TempBuf );
+ strcat( RqstBuf, "MAN: \"ssdp:discover\"\r\n" );
+
+@@ -488,11 +491,14 @@ SearchByTarget( IN int Mx,
+ int *id = NULL;
+ int ret = 0;
+ char ReqBufv4[BUFSIZE];
+- char ReqBufv6[BUFSIZE];
+ struct sockaddr_storage __ss_v4;
++ struct sockaddr_in* destAddr4 = (struct sockaddr_in*)&__ss_v4;
++
++#ifdef IPV6_ENABLED
++ char ReqBufv6[BUFSIZE];
+ struct sockaddr_storage __ss_v6;
+- struct sockaddr_in* destAddr4 = (struct sockaddr_in*)&__ss_v4;
+- struct sockaddr_in6* destAddr6 = (struct sockaddr_in6*)&__ss_v6;
++ struct sockaddr_in6* destAddr6 = (struct sockaddr_in6*)&__ss_v6;
++#endif
+ fd_set wrSet;
+ SsdpSearchArg *newArg = NULL;
+ int timeTillRead = 0;
+@@ -521,18 +527,22 @@ SearchByTarget( IN int Mx,
+ }
+
+ CreateClientRequestPacket( ReqBufv4, timeTillRead, St, AF_INET );
++#ifdef IPV6_ENABLED
+ CreateClientRequestPacket( ReqBufv6, timeTillRead, St, AF_INET6 );
++#endif
+
+ memset( &__ss_v4, 0, sizeof( __ss_v4 ) );
+ destAddr4->sin_family = AF_INET;
+ inet_pton( AF_INET, SSDP_IP, &destAddr4->sin_addr );
+ destAddr4->sin_port = htons( SSDP_PORT );
+
++#ifdef IPV6_ENABLED
+ memset( &__ss_v6, 0, sizeof( __ss_v6 ) );
+ destAddr6->sin6_family = AF_INET6;
+ inet_pton( AF_INET6, SSDP_IPV6_LINKLOCAL, &destAddr6->sin6_addr );
+ destAddr6->sin6_port = htons( SSDP_PORT );
+ destAddr6->sin6_scope_id = gIF_INDEX;
++#endif
+
+ // add search criteria to list
+ HandleLock();
+@@ -566,12 +576,14 @@ SearchByTarget( IN int Mx,
+ FD_SET( gSsdpReqSocket4, &wrSet );
+ max_fd = max(max_fd, gSsdpReqSocket4);
+ }
++#ifdef IPV6_ENABLED
+ if( gSsdpReqSocket6 != INVALID_SOCKET ) {
+ setsockopt( gSsdpReqSocket6, IPPROTO_IPV6, IPV6_MULTICAST_IF,
+ (char *)&gIF_INDEX, sizeof(gIF_INDEX) );
+ FD_SET( gSsdpReqSocket6, &wrSet );
+ max_fd = max(max_fd, gSsdpReqSocket6);
+ }
++#endif
+
+ ret = select( max_fd + 1, NULL, &wrSet, NULL, NULL );
+ if( ret == -1 ) {
+@@ -581,11 +593,14 @@ SearchByTarget( IN int Mx,
+ errorBuffer );
+ shutdown( gSsdpReqSocket4, SD_BOTH );
+ UpnpCloseSocket( gSsdpReqSocket4 );
++#ifdef IPV6_ENABLED
+ shutdown( gSsdpReqSocket6, SD_BOTH );
+ UpnpCloseSocket( gSsdpReqSocket6 );
+-
++#endif
+ return UPNP_E_INTERNAL_ERROR;
+ }
++
++#ifdef IPV6_ENABLED
+ if( gSsdpReqSocket6 != INVALID_SOCKET &&
+ FD_ISSET( gSsdpReqSocket6, &wrSet ) ) {
+ int NumCopy = 0;
+@@ -596,6 +611,7 @@ SearchByTarget( IN int Mx,
+ imillisleep( SSDP_PAUSE );
+ }
+ }
++#endif
+ if( gSsdpReqSocket4 != INVALID_SOCKET &&
+ FD_ISSET( gSsdpReqSocket4, &wrSet ) ) {
+ int NumCopy = 0;
+diff -rupN libupnp-1.8.0~svn20100507.orig/upnp/src/ssdp/ssdp_device.c
libupnp-1.8.0~svn20100507.origjs/upnp/src/ssdp/ssdp_device.c
+--- libupnp-1.8.0~svn20100507.orig/upnp/src/ssdp/ssdp_device.c 2008-07-24
08:02:57.000000000 +0200
++++ libupnp-1.8.0~svn20100507.origjs/upnp/src/ssdp/ssdp_device.c
2011-01-28 23:00:20.000000000 +0100
+@@ -227,7 +227,9 @@ NewRequestHandler( IN struct sockaddr *D
+ int Index;
+ unsigned long replyAddr = inet_addr( gIF_IPV4 );
+ int ttl = 4; // a/c to UPNP Spec
++#ifdef IPV6_ENABLED
+ int hops = 1;
++#endif
+ char buf_ntop[64];
+
+ ReplySock = socket( DestAddr->sa_family, SOCK_DGRAM, 0 );
+@@ -247,14 +249,18 @@ NewRequestHandler( IN struct sockaddr *D
+ (char *)&replyAddr, sizeof (replyAddr) );
+ setsockopt( ReplySock, IPPROTO_IP, IP_MULTICAST_TTL,
+ (char *)&ttl, sizeof (int) );
+- } else if( DestAddr->sa_family == AF_INET6 ) {
++ }
++#ifdef IPV6_ENABLED
++ else if( DestAddr->sa_family == AF_INET6 ) {
+ inet_ntop(AF_INET6, &((struct sockaddr_in6*)DestAddr)->sin6_addr,
+ buf_ntop, sizeof(buf_ntop));
+ setsockopt( ReplySock, IPPROTO_IPV6, IPV6_MULTICAST_IF,
+ (char *)&gIF_INDEX, sizeof(gIF_INDEX) );
+ setsockopt( ReplySock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
+ (char *)&hops, sizeof(hops) );
+- } else {
++ }
++#endif
++ else {
+ UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
+ "Invalid destination address specified." );
+ }
+diff -rupN libupnp-1.8.0~svn20100507.orig/upnp/src/ssdp/ssdp_server.c
libupnp-1.8.0~svn20100507.origjs/upnp/src/ssdp/ssdp_server.c
+--- libupnp-1.8.0~svn20100507.orig/upnp/src/ssdp/ssdp_server.c 2010-04-12
17:45:47.000000000 +0200
++++ libupnp-1.8.0~svn20100507.origjs/upnp/src/ssdp/ssdp_server.c
2011-01-28 23:06:01.000000000 +0100
+@@ -51,15 +51,21 @@
+ #define MAX_TIME_TOREAD 45
+
+ CLIENTONLY( SOCKET gSsdpReqSocket4 = INVALID_SOCKET; )
++#ifdef IPV6_ENABLED
+ CLIENTONLY( SOCKET gSsdpReqSocket6 = INVALID_SOCKET; )
++#endif
+
+ void RequestHandler();
+ int create_ssdp_sock_v4( SOCKET* ssdpSock );
++#ifdef IPV6_ENABLED
+ int create_ssdp_sock_v6( SOCKET* ssdpSock );
++#endif
+ #if INCLUDE_CLIENT_APIS
+ int create_ssdp_sock_reqv4( SOCKET* ssdpReqSock );
++#ifdef IPV6_ENABLED
+ int create_ssdp_sock_reqv6( SOCKET* ssdpReqSock );
+ #endif
++#endif
+ Event ErrotEvt;
+
+ enum Listener { Idle, Stopping, Running };
+@@ -754,7 +760,12 @@ readFromSSDPSocket( SOCKET socket )
+ //initialize parser
+
+ #ifdef INCLUDE_CLIENT_APIS
++
++#ifdef IPV6_ENABLED
+ if( socket == gSsdpReqSocket4 || socket == gSsdpReqSocket6 ) {
++#else
++ if( socket == gSsdpReqSocket4 ) {
++#endif
+ parser_response_init( &data->parser, HTTPMETHOD_MSEARCH );
+ } else {
+ parser_request_init( &data->parser );
+@@ -852,6 +863,7 @@ int get_ssdp_sockets( MiniServerSockArra
+ out->ssdpReqSock4 = INVALID_SOCKET;
+ }
+
++#ifdef IPV6_ENABLED
+ // Create the IPv6 socket for SSDP REQUESTS
+ if( strlen( gIF_IPV6 ) > 0 ) {
+ retVal = create_ssdp_sock_reqv6( &out->ssdpReqSock6 );
+@@ -865,6 +877,7 @@ int get_ssdp_sockets( MiniServerSockArra
+ } else {
+ out->ssdpReqSock6 = INVALID_SOCKET;
+ }
++#endif
+ #endif /* INCLUDE_CLIENT_APIS */
+
+ // Create the IPv4 socket for SSDP
+@@ -873,14 +886,17 @@ int get_ssdp_sockets( MiniServerSockArra
+ if( retVal != UPNP_E_SUCCESS ) {
+ CLIENTONLY( shutdown( out->ssdpReqSock4, SD_BOTH ); )
+ CLIENTONLY( UpnpCloseSocket( out->ssdpReqSock4 ); )
++#ifdef IPV6_ENABLED
+ CLIENTONLY( shutdown( out->ssdpReqSock6, SD_BOTH ); )
+ CLIENTONLY( UpnpCloseSocket( out->ssdpReqSock6 ); )
++#endif
+ return retVal;
+ }
+ } else {
+ out->ssdpSock4 = INVALID_SOCKET;
+ }
+
++#ifdef IPV6_ENABLED
+ // Create the IPv6 socket for SSDP
+ if( strlen( gIF_IPV6 ) > 0 ) {
+ retVal = create_ssdp_sock_v6( &out->ssdpSock6 );
+@@ -896,6 +912,7 @@ int get_ssdp_sockets( MiniServerSockArra
+ } else {
+ out->ssdpSock6 = INVALID_SOCKET;
+ }
++#endif
+
+ return UPNP_E_SUCCESS;
+ }
+@@ -951,6 +968,7 @@ int create_ssdp_sock_reqv4( SOCKET* ssdp
+ * Returns: void
+ *
+
***************************************************************************/
++#ifdef IPV6_ENABLED
+ int create_ssdp_sock_reqv6( SOCKET* ssdpReqSock )
+ {
+ char errorBuffer[ERROR_BUFFER_LEN];
+@@ -975,6 +993,7 @@ int create_ssdp_sock_reqv6( SOCKET* ssdp
+
+ return UPNP_E_SUCCESS;
+ }
++#endif
+ #endif /* INCLUDE_CLIENT_APIS */
+
+
+@@ -1118,6 +1137,7 @@ int create_ssdp_sock_v4( SOCKET* ssdpSoc
+ * Returns: void
+ *
+
***************************************************************************/
++#ifdef IPV6_ENABLED
+ int create_ssdp_sock_v6( SOCKET* ssdpSock )
+ {
+ char errorBuffer[ERROR_BUFFER_LEN];
+@@ -1213,6 +1233,7 @@ int create_ssdp_sock_v6( SOCKET* ssdpSoc
+
+ return UPNP_E_SUCCESS;
+ }
++#endif
+
+ #endif /* EXCLUDE_SSDP */
+
diff -rupN buildroot-2010.11/package/libupnp/libupnp.mk
buildroot/package/libupnp/libupnp.mk
--- buildroot-2010.11/package/libupnp/libupnp.mk 2010-11-30
16:52:43.000000000 +0100
+++ buildroot/package/libupnp/libupnp.mk 2011-01-30
00:34:45.000000000 +0100
@@ -3,12 +3,15 @@
# libupnp
#
#############################################################
-LIBUPNP_VERSION:=1.6.6
-LIBUPNP_SOURCE:=libupnp-$(LIBUPNP_VERSION).tar.bz2
-LIBUPNP_SITE:=http://$(BR2_SOURCEFORGE_MIRROR).dl.sourceforge.net/sourcefor
ge/pupnp
-
+LIBUPNP_VERSION:=1.8.0~svn20100507.orig
+LIBUPNP_SOURCE:=libupnp4_$(LIBUPNP_VERSION).tar.gz
+LIBUPNP_SITE:=http://ftp.de.debian.org/debian/pool/main/libu/libupnp4
LIBUPNP_CONF_ENV = ac_cv_lib_compat_ftime=no
-
LIBUPNP_INSTALL_STAGING:=YES
+LIBUPNP_INSTALL_TARGET:=YES
+
+ifeq ($(BR2_INET_IPV6),y)
+ LIBUPNP_CONF_ENV+= CFLAGS="-DIPV6_ENABLED"
+endif
$(eval $(call AUTOTARGETS,package,libupnp))
More information about the buildroot
mailing list