Compare commits
	
		
			44 Commits
		
	
	
		
			release-1.
			...
			release-1.
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 62903b80f0 | ||
|   | 6080414dc9 | ||
|   | 6cbd7f0159 | ||
|   | c7c493c043 | ||
|   | c2f8e8789a | ||
|   | 76457d0187 | ||
|   | 9f5d49f9fd | ||
|   | cad4d05cd7 | ||
|   | 26b8968e0c | ||
|   | d2eaa23b59 | ||
|   | b8aec74782 | ||
|   | 851cfbc4db | ||
|   | f42bbb6dc2 | ||
|   | bd6027c3d1 | ||
|   | e3865bf6b6 | ||
|   | 27af41e562 | ||
|   | 1f05f5d6cc | ||
|   | 43b9760840 | ||
|   | 0103424b91 | ||
|   | 13a1fff7a1 | ||
|   | c9463545a8 | ||
|   | de1d7e81a3 | ||
|   | f87dbf8115 | ||
|   | 83ee32afb7 | ||
|   | 4f960c4e34 | ||
|   | c85537df11 | ||
|   | 20905cb7a7 | ||
|   | 5b744169d5 | ||
|   | c69e16b347 | ||
|   | cb7e6b7472 | ||
|   | fd80e5a8ff | ||
|   | b29de32110 | ||
|   | 6455ac6eea | ||
|   | f7bb1f9582 | ||
|   | 0728ab3b25 | ||
|   | cb9ee8254c | ||
|   | f08fdac9b6 | ||
|   | 0db035cc7b | ||
|   | da11e52924 | ||
|   | bc7b0c9d4d | ||
|   | b2757d9d55 | ||
|   | 7967a0cd45 | ||
|   | 67b51187b9 | ||
|   | 491f5ffef6 | 
							
								
								
									
										89
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										89
									
								
								ChangeLog
									
									
									
									
									
								
							| @@ -1,3 +1,88 @@ | |||||||
|  | ******************************************************************************* | ||||||
|  | Version 1.6.2 | ||||||
|  | ******************************************************************************* | ||||||
|  |  | ||||||
|  | 2007-12-10 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  | 	* Fixed a compilation error due to a missing #ifdef in | ||||||
|  | 	upnp/src/genlib/miniserver/miniserver.c. Thanks to Eugene Christensen. | ||||||
|  |  | ||||||
|  | 2007-11-12 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  | 	* "make check" was failing because ixml/test/test_document.sh did not | ||||||
|  | 	have the executable flag set. Thanks to Steve Bresson. | ||||||
|  |  | ||||||
|  | 2007-11-12 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  | 	* Fixed a memory leak in upnpapi.c to delete gMiniServerThreadPool in | ||||||
|  | 	the call to UpnpFinish(). Thanks to Fabrice Fontaine. | ||||||
|  |  | ||||||
|  | 2007-11-09 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  | 	* Added a isleep() call to the error handler of select() in | ||||||
|  | 	RunMiniServer(), so that it does not take 100% cpu in case select() | ||||||
|  | 	fails repeatedly. | ||||||
|  |  | ||||||
|  | ******************************************************************************* | ||||||
|  | Version 1.6.1 | ||||||
|  | ******************************************************************************* | ||||||
|  |  | ||||||
|  | 2007-11-07 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  | 	* SF Bug Tracker [ 1825278 ] AdvertiseAndReply sleeps with handle lock out | ||||||
|  | 	Applied patch from Alex (afaucher) to change some write locks to read | ||||||
|  | 	locks. | ||||||
|  |  | ||||||
|  | 2007-11-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  | 	* Adjusting libtool library numbers to reflect the last changes. | ||||||
|  |  | ||||||
|  | 2007-11-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  | 	* SF Bug Tracker [ 1825278 ] AdvertiseAndReply sleeps with handle lock out | ||||||
|  | 	GlobalHndMutex, which was a mutex is now GlobalHndRWLock, which is a | ||||||
|  | 	rwlock. HandleLock() is mapped to HandleWriteLock() while all other | ||||||
|  | 	instances have not been checked. One instance in AdvertiseAndReply() | ||||||
|  | 	has been changed to HandleReadLock(). Thanks to Alex (afaucher) for the  | ||||||
|  | 	bug report and suggestions. | ||||||
|  |  | ||||||
|  | 2007-11-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  | 	* Added support for rwlocks. | ||||||
|  |  | ||||||
|  | 2007-11-05 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  | 	* SF Bug Tracker [ 1825929 ] woker thread still alive after UpnpFinish() | ||||||
|  | 	Submitted By: Luke Kim - nereusuj | ||||||
|  | 	Worker thread still alive after calling UpnpFinish() because | ||||||
|  | 	ThreadPoolShutdown() is in the #ifdef DEBUG block. | ||||||
|  | 	421 | ||||||
|  | 	422 #ifdef DEBUG | ||||||
|  | 	423 ThreadPoolShutdown( &gSendThreadPool ); | ||||||
|  | 	424 ThreadPoolShutdown( &gRecvThreadPool ); | ||||||
|  |  | ||||||
|  | 2007-08-28 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  | 	* Changed the calls to virtualDirCallback.open(filename, UPNP_WRITE) | ||||||
|  | 	to (virtualDirCallback.open)(filename, UPNP_WRITE) (notice the | ||||||
|  | 	parenthesis) due to a change in glibc that produces compilation | ||||||
|  | 	errors. | ||||||
|  |  | ||||||
|  | 2007-08-28 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  | 	* Initialization of the "randomness" struct so that valgrind does not | ||||||
|  | 	complain. | ||||||
|  |  | ||||||
|  | 2007-08-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  | 	* Merge of patch submitted By Keith Brindley - brindlk | ||||||
|  | 	SF Bug Tracker [ 1762758 ] Seek not working for large files | ||||||
|  | 	Problem: | ||||||
|  | 	Requests from the uPnP client to seek to a position beyond 2GB in a large | ||||||
|  | 	file are handled as a request to see from the 2GB point. | ||||||
|  |  | ||||||
|  | 	Impact: | ||||||
|  | 	Varies depending on client. The Xbox 360 kills the connection when it | ||||||
|  | 	realises. | ||||||
|  |  | ||||||
|  | 	Solution: | ||||||
|  | 	GetNextRange function (webserver.c) is updated to handle large file sizes. | ||||||
|  | 	Fix should also recognise when built on a 32bit platform rather than 64 and | ||||||
|  | 	handle accordingly. | ||||||
|  |  | ||||||
|  | 2007-08-05 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  | 	* Merge of Mac OS X patch from St<53>phane Corth<74>sy (davelopper), | ||||||
|  | 	SF Bug Tracker [ 1686420 ] Modifications for MacOSX. | ||||||
|  | 	Some of the proposed changes were already done by Rene Hexel's patch. | ||||||
|  |  | ||||||
| ******************************************************************************* | ******************************************************************************* | ||||||
| Version 1.6.0 | Version 1.6.0 | ||||||
| ******************************************************************************* | ******************************************************************************* | ||||||
| @@ -52,6 +137,10 @@ Version 1.6.0 | |||||||
| 	an interface change in the library and the minor library version was | 	an interface change in the library and the minor library version was | ||||||
| 	bumped. Also, the libtool library numbers were changed accordingly. | 	bumped. Also, the libtool library numbers were changed accordingly. | ||||||
|  |  | ||||||
|  | ******************************************************************************* | ||||||
|  | Version 1.4.7 | ||||||
|  | ******************************************************************************* | ||||||
|  |  | ||||||
| 2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | 2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
| 	* Added support for the Basic Device | 	* Added support for the Basic Device | ||||||
| 	(http://www.upnp.org/standardizeddcps/basic.asp) as suggested by | 	(http://www.upnp.org/standardizeddcps/basic.asp) as suggested by | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								THANKS
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								THANKS
									
									
									
									
									
								
							| @@ -6,6 +6,7 @@ suggesting various improvements or submitting actual code. | |||||||
| Here is a list of these people. Help us keep it complete and | Here is a list of these people. Help us keep it complete and | ||||||
| exempt of errors. | exempt of errors. | ||||||
|  |  | ||||||
|  | - Alex (afaucher) | ||||||
| - Arno Willig | - Arno Willig | ||||||
| - Bob Ciora | - Bob Ciora | ||||||
| - Chaos | - Chaos | ||||||
| @@ -15,15 +16,18 @@ exempt of errors. | |||||||
| - Erik Johansson | - Erik Johansson | ||||||
| - Eric Tanguy | - Eric Tanguy | ||||||
| - Erwan Velu | - Erwan Velu | ||||||
|  | - Eugene Christensen | ||||||
|  | - Fabrice Fontaine | ||||||
| - Fredrik Svensson | - Fredrik Svensson | ||||||
| - Glen Masgai | - Glen Masgai | ||||||
| - Jiri Zouhar | - Jiri Zouhar | ||||||
| - John Dennis | - John Dennis | ||||||
| - Jonathan (no_dice) | - Jonathan (no_dice) | ||||||
|  | - Keith Brindley | ||||||
| - Leuk_He | - Leuk_He | ||||||
| - Loigu | - Loigu | ||||||
| - Luke Kim | - Luke Kim | ||||||
| - Marcelo Roberto Jimenez | - Marcelo Roberto Jimenez (mroberto) | ||||||
| - Markus Strobl | - Markus Strobl | ||||||
| - Nektarios K. Papadopoulos | - Nektarios K. Papadopoulos | ||||||
| - Oskar Liljeblad | - Oskar Liljeblad | ||||||
| @@ -31,6 +35,8 @@ exempt of errors. | |||||||
| - Paul Vixie | - Paul Vixie | ||||||
| - Rene Hexel | - Rene Hexel | ||||||
| - Siva Chandran | - Siva Chandran | ||||||
|  | - Stéphane Corthésy | ||||||
|  | - Steve Bresson | ||||||
| - Timothy Redaelli | - Timothy Redaelli | ||||||
| - Titus Winters | - Titus Winters | ||||||
|  |  | ||||||
|   | |||||||
| @@ -261,7 +261,7 @@ | |||||||
|  |  | ||||||
| /** @name Other debugging features | /** @name Other debugging features | ||||||
|           The UPnP SDK contains other features to aid in debugging: |           The UPnP SDK contains other features to aid in debugging: | ||||||
| 	  see <upnp/upnpdebug.h> | 	  see <upnp/inc/upnpdebug.h> | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #define DEBUG_ALL		1 | #define DEBUG_ALL		1 | ||||||
|   | |||||||
							
								
								
									
										59
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -4,12 +4,13 @@ | |||||||
| # | # | ||||||
| # Process this file with autoconf to produce a configure script. | # Process this file with autoconf to produce a configure script. | ||||||
| # | # | ||||||
| # (C) Copyright 2005-2006 R<>mi Turboult <r3mi@users.sourceforge.net> | # (C) Copyright 2005-2007 R<>mi Turboult <r3mi@users.sourceforge.net> | ||||||
| # | # | ||||||
|  |  | ||||||
| AC_PREREQ(2.60) | AC_PREREQ(2.60) | ||||||
|  |  | ||||||
| AC_INIT([libupnp], [1.6.0], [mroberto@users.sourceforge.net]) | AC_INIT([libupnp], [1.6.2], [mroberto@users.sourceforge.net]) | ||||||
|  | ############################################################################### | ||||||
| # *Independently* of the above libupnp package version, the libtool version | # *Independently* of the above libupnp package version, the libtool version | ||||||
| # of the 3 libraries need to be updated whenever there is a change released: | # of the 3 libraries need to be updated whenever there is a change released: | ||||||
| # "current:revision:age" (this is NOT the same as the package version), where: | # "current:revision:age" (this is NOT the same as the package version), where: | ||||||
| @@ -19,11 +20,14 @@ AC_INIT([libupnp], [1.6.0], [mroberto@users.sourceforge.net]) | |||||||
| # 	- interfaces removed:			age=0 | # 	- interfaces removed:			age=0 | ||||||
| # *please update only once, before a formal release, not for each change* | # *please update only once, before a formal release, not for each change* | ||||||
| # | # | ||||||
| # For release 1.4.1, we had: | ############################################################################### | ||||||
|  | # Release 1.4.1: | ||||||
| #AC_SUBST([LT_VERSION_IXML],       [2:2:0]) | #AC_SUBST([LT_VERSION_IXML],       [2:2:0]) | ||||||
| #AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0]) | #AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0]) | ||||||
| #AC_SUBST([LT_VERSION_UPNP],       [2:2:0]) | #AC_SUBST([LT_VERSION_UPNP],       [2:2:0]) | ||||||
| # | # | ||||||
|  | ############################################################################### | ||||||
|  | # Release 1.4.6: | ||||||
| # "current:revision:age" | # "current:revision:age" | ||||||
| # | # | ||||||
| # - Code has changed in ixml | # - Code has changed in ixml | ||||||
| @@ -37,11 +41,12 @@ AC_INIT([libupnp], [1.6.0], [mroberto@users.sourceforge.net]) | |||||||
| # - Code has changed in upnp | # - Code has changed in upnp | ||||||
| #	revision: 2 -> 3 | #	revision: 2 -> 3 | ||||||
| # | # | ||||||
| # For release 1.4.6, we had: |  | ||||||
| #AC_SUBST([LT_VERSION_IXML],       [2:3:0]) | #AC_SUBST([LT_VERSION_IXML],       [2:3:0]) | ||||||
| #AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1]) | #AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1]) | ||||||
| #AC_SUBST([LT_VERSION_UPNP],       [2:3:0]) | #AC_SUBST([LT_VERSION_UPNP],       [2:3:0]) | ||||||
| # | # | ||||||
|  | ############################################################################### | ||||||
|  | # Release 1.6.0: | ||||||
| # "current:revision:age" | # "current:revision:age" | ||||||
| # | # | ||||||
| # - Code has changed in ixml | # - Code has changed in ixml | ||||||
| @@ -56,21 +61,61 @@ AC_INIT([libupnp], [1.6.0], [mroberto@users.sourceforge.net]) | |||||||
| # - Interface removed in upnp | # - Interface removed in upnp | ||||||
| #	age: 0 -> 0 | #	age: 0 -> 0 | ||||||
| # | # | ||||||
| # For release 1.6.0, we had: |  | ||||||
| #AC_SUBST([LT_VERSION_IXML],       [2:4:0]) | #AC_SUBST([LT_VERSION_IXML],       [2:4:0]) | ||||||
| #AC_SUBST([LT_VERSION_THREADUTIL], [3:1:1]) | #AC_SUBST([LT_VERSION_THREADUTIL], [3:1:1]) | ||||||
| #AC_SUBST([LT_VERSION_UPNP],       [3:0:0]) | #AC_SUBST([LT_VERSION_UPNP],       [3:0:0]) | ||||||
|  | # | ||||||
|  | ############################################################################### | ||||||
|  | # Release 1.6.1: | ||||||
|  | # "current:revision:age" | ||||||
|  | # | ||||||
|  | # - Code has changed in threadutil | ||||||
|  | #	revision: 1 -> 2 | ||||||
|  | # - Interface added in threadutil | ||||||
|  | #	current: 3 -> 4 | ||||||
|  | #	revision: 2 -> 0 | ||||||
|  | # - Interface added in threadutil | ||||||
|  | #	age: 1 -> 2 | ||||||
|  | # - Code has changed in upnp | ||||||
|  | #	revision: 0 -> 1 | ||||||
|  | # | ||||||
|  | #AC_SUBST([LT_VERSION_IXML],       [2:4:0]) | ||||||
|  | #AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2]) | ||||||
|  | #AC_SUBST([LT_VERSION_UPNP],       [3:1:0]) | ||||||
|  | # | ||||||
|  | ############################################################################### | ||||||
|  | # Release 1.6.2: | ||||||
|  | # "current:revision:age" | ||||||
|  | # | ||||||
|  | # - Code has changed in upnp | ||||||
|  | #	revision: 1 -> 2 | ||||||
|  | # | ||||||
|  | #AC_SUBST([LT_VERSION_IXML],       [2:4:0]) | ||||||
|  | #AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2]) | ||||||
|  | #AC_SUBST([LT_VERSION_UPNP],       [3:2:0]) | ||||||
|  | # | ||||||
|  | ############################################################################### | ||||||
| AC_SUBST([LT_VERSION_IXML],       [2:4:0]) | AC_SUBST([LT_VERSION_IXML],       [2:4:0]) | ||||||
| AC_SUBST([LT_VERSION_THREADUTIL], [3:1:1]) | AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2]) | ||||||
| AC_SUBST([LT_VERSION_UPNP],       [3:0:0]) | AC_SUBST([LT_VERSION_UPNP],       [3:2:0]) | ||||||
|  | ############################################################################### | ||||||
|  | # Repeating the algorithm so that it is closer to the modificatin place: | ||||||
|  | # 	- library code modified:		revision++ | ||||||
|  | # 	- interfaces changed/added/removed:	current++ and revision=0 | ||||||
|  | # 	- interfaces added: 			age++ | ||||||
|  | # 	- interfaces removed:			age=0 | ||||||
|  | # *please update only once, before a formal release, not for each change* | ||||||
|  | ############################################################################### | ||||||
|  |  | ||||||
|  |  | ||||||
| AC_CONFIG_AUX_DIR(config.aux) | AC_CONFIG_AUX_DIR(config.aux) | ||||||
| AC_CONFIG_MACRO_DIR(m4) | AC_CONFIG_MACRO_DIR(m4) | ||||||
| AC_CONFIG_SRCDIR(upnp/inc/upnp.h) | AC_CONFIG_SRCDIR(upnp/inc/upnp.h) | ||||||
|  |  | ||||||
|  |  | ||||||
| AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects dist-bzip2]) | AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects dist-bzip2]) | ||||||
|  |  | ||||||
|  |  | ||||||
| # | # | ||||||
| # Get canonical host names in host and host_os | # Get canonical host names in host and host_os | ||||||
| # | # | ||||||
|   | |||||||
							
								
								
									
										0
									
								
								ixml/test/test_document.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								ixml/test/test_document.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| Version: 1.4.2 | Version: 1.6.2 | ||||||
| Summary: Universal Plug and Play (UPnP) SDK | Summary: Universal Plug and Play (UPnP) SDK | ||||||
| Name: libupnp | Name: libupnp | ||||||
| Release: 1%{?dist} | Release: 1%{?dist} | ||||||
| @@ -77,6 +77,12 @@ make install DESTDIR=$RPM_BUILD_ROOT | |||||||
| rm -rf %{buildroot} | rm -rf %{buildroot} | ||||||
|  |  | ||||||
| %changelog | %changelog | ||||||
|  | * Mon Nov 19 2007 Marcelo Jimenez <mroberto@users.sourceforge.net> - 1.6.2-1 | ||||||
|  | - Update to version 1.6.2 | ||||||
|  |  | ||||||
|  | * Mon Nov 19 2007 Marcelo Jimenez <mroberto@users.sourceforge.net> - 1.4.7-1 | ||||||
|  | - Update to version 1.4.7 | ||||||
|  |  | ||||||
| * Fri Feb 02 2007 Eric Tanguy <eric.tanguy@univ-nantes.fr> - 1.4.2-1 | * Fri Feb 02 2007 Eric Tanguy <eric.tanguy@univ-nantes.fr> - 1.4.2-1 | ||||||
| - Update to version 1.4.2 | - Update to version 1.4.2 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -547,6 +547,10 @@ int TPAttrSetMaxJobsTotal(ThreadPoolAttr *attr, int maxJobsTotal); | |||||||
| 	EXPORT int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats); | 	EXPORT int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats); | ||||||
|  |  | ||||||
| 	EXPORT void ThreadPoolPrintStats(ThreadPoolStats *stats); | 	EXPORT void ThreadPoolPrintStats(ThreadPoolStats *stats); | ||||||
|  | #else | ||||||
|  | 	static UPNP_INLINE int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats) {} | ||||||
|  |  | ||||||
|  | 	static UPNP_INLINE void ThreadPoolPrintStats(ThreadPoolStats *stats) {} | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
|   | |||||||
| @@ -52,11 +52,16 @@ extern "C" { | |||||||
| 	#define ITHREAD_MUTEX_FAST_NP       PTHREAD_MUTEX_NORMAL | 	#define ITHREAD_MUTEX_FAST_NP       PTHREAD_MUTEX_NORMAL | ||||||
| 	#define ITHREAD_MUTEX_RECURSIVE_NP  PTHREAD_MUTEX_RECURSIVE | 	#define ITHREAD_MUTEX_RECURSIVE_NP  PTHREAD_MUTEX_RECURSIVE | ||||||
| 	#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK | 	#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK | ||||||
| #else | #else /* PTHREAD_MUTEX_RECURSIVE */ | ||||||
| 	#define ITHREAD_MUTEX_FAST_NP       PTHREAD_MUTEX_FAST_NP | 	#define ITHREAD_MUTEX_FAST_NP       PTHREAD_MUTEX_FAST_NP | ||||||
| 	#define ITHREAD_MUTEX_RECURSIVE_NP  PTHREAD_MUTEX_RECURSIVE_NP | 	#define ITHREAD_MUTEX_RECURSIVE_NP  PTHREAD_MUTEX_RECURSIVE_NP | ||||||
| 	#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK_NP | 	#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK_NP | ||||||
| #endif | #endif /* PTHREAD_MUTEX_RECURSIVE */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define ITHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE | ||||||
|  | #define ITHREAD_PROCESS_SHARED  PTHREAD_PROCESS_SHARED | ||||||
|  |  | ||||||
|  |  | ||||||
| #define ITHREAD_CANCELED PTHREAD_CANCELED | #define ITHREAD_CANCELED PTHREAD_CANCELED | ||||||
|  |  | ||||||
| @@ -136,6 +141,28 @@ extern "C" { | |||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| typedef pthread_condattr_t ithread_condattr_t;	 | typedef pthread_condattr_t ithread_condattr_t;	 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /**************************************************************************** | ||||||
|  |  * Name: ithread_rwlockattr_t | ||||||
|  |  * | ||||||
|  |  *  Description: | ||||||
|  |  *      Mutex attribute. | ||||||
|  |  *      typedef to pthread_rwlockattr_t | ||||||
|  |  *      Internal Use Only | ||||||
|  |  ***************************************************************************/ | ||||||
|  | typedef pthread_rwlockattr_t ithread_rwlockattr_t;	 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /**************************************************************************** | ||||||
|  |  * Name: ithread_rwlock_t | ||||||
|  |  * | ||||||
|  |  *  Description: | ||||||
|  |  *      Condition attribute. | ||||||
|  |  *      typedef to pthread_rwlock_t | ||||||
|  |  *      Internal Use Only | ||||||
|  |  ***************************************************************************/ | ||||||
|  | typedef pthread_rwlock_t ithread_rwlock_t;	 | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
|  * Function: ithread_mutexattr_init |  * Function: ithread_mutexattr_init | ||||||
|  * |  * | ||||||
| @@ -150,9 +177,9 @@ extern "C" { | |||||||
|  *      Always returns 0. |  *      Always returns 0. | ||||||
|  *      See man page for pthread_mutexattr_init |  *      See man page for pthread_mutexattr_init | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|    |  | ||||||
| #define ithread_mutexattr_init pthread_mutexattr_init | #define ithread_mutexattr_init pthread_mutexattr_init | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
|  * Function: ithread_mutexattr_destroy |  * Function: ithread_mutexattr_destroy | ||||||
|  * |  * | ||||||
| @@ -180,7 +207,7 @@ extern "C" { | |||||||
|  *                       ITHREAD_MUTEX_ERRORCHECK_NP |  *                       ITHREAD_MUTEX_ERRORCHECK_NP | ||||||
|  * |  * | ||||||
|  *  Parameters: |  *  Parameters: | ||||||
|  *      ithread_mutexattr_t * mutex (must be valid non NULL pointer to  |  *      ithread_mutexattr_t * attr (must be valid non NULL pointer to  | ||||||
|  *                                   ithread_mutexattr_t) |  *                                   ithread_mutexattr_t) | ||||||
|  *      int kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP |  *      int kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP | ||||||
|  *                or ITHREAD_MUTEX_ERRORCHECK_NP) |  *                or ITHREAD_MUTEX_ERRORCHECK_NP) | ||||||
| @@ -205,7 +232,7 @@ extern "C" { | |||||||
|  *                       ITHREAD_MUTEX_ERRORCHECK_NP |  *                       ITHREAD_MUTEX_ERRORCHECK_NP | ||||||
|  * |  * | ||||||
|  *  Parameters: |  *  Parameters: | ||||||
|  *      ithread_mutexattr_t * mutex (must be valid non NULL pointer to  |  *      ithread_mutexattr_t * attr (must be valid non NULL pointer to  | ||||||
|  *                                   pthread_mutexattr_t) |  *                                   pthread_mutexattr_t) | ||||||
|  *      int *kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP |  *      int *kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP | ||||||
|  *                or ITHREAD_MUTEX_ERRORCHECK_NP) |  *                or ITHREAD_MUTEX_ERRORCHECK_NP) | ||||||
| @@ -238,6 +265,7 @@ extern "C" { | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| #define ithread_mutex_init pthread_mutex_init | #define ithread_mutex_init pthread_mutex_init | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
|  * Function: ithread_mutex_lock |  * Function: ithread_mutex_lock | ||||||
|  * |  * | ||||||
| @@ -292,6 +320,169 @@ extern "C" { | |||||||
| #define ithread_mutex_destroy pthread_mutex_destroy | #define ithread_mutex_destroy pthread_mutex_destroy | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /**************************************************************************** | ||||||
|  |  * Function: ithread_rwlockattr_init | ||||||
|  |  * | ||||||
|  |  *  Description: | ||||||
|  |  *      Initializes a rwlock attribute variable to default values. | ||||||
|  |  *  Parameters: | ||||||
|  |  *      const ithread_rwlockattr_init *attr (must be valid non NULL pointer to  | ||||||
|  |  *                                           pthread_rwlockattr_t) | ||||||
|  |  *  Returns: | ||||||
|  |  *      0 on success, Nonzero on failure. | ||||||
|  |  *      Always returns 0. | ||||||
|  |  *      See man page for pthread_rwlockattr_init | ||||||
|  |  ***************************************************************************/ | ||||||
|  | #define ithread_rwlockattr_init pthread_rwlockattr_init | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /**************************************************************************** | ||||||
|  |  * Function: ithread_rwlockattr_destroy | ||||||
|  |  * | ||||||
|  |  *  Description: | ||||||
|  |  *      Releases any resources held by the rwlock attribute. | ||||||
|  |  *  Parameters: | ||||||
|  |  *      ithread_rwlockattr_t *attr (must be valid non NULL pointer to  | ||||||
|  |  *                                  pthread_rwlockattr_t) | ||||||
|  |  *  Returns: | ||||||
|  |  *      0 on success, Nonzero on failure. | ||||||
|  |  *      Always returns 0. | ||||||
|  |  *      See man page for pthread_rwlockattr_destroy | ||||||
|  |  ***************************************************************************/ | ||||||
|  | #define ithread_rwlockattr_destroy pthread_rwlockattr_destroy | ||||||
|  |    | ||||||
|  |    | ||||||
|  | /**************************************************************************** | ||||||
|  |  * Function: ithread_rwlockatttr_setpshared | ||||||
|  |  * | ||||||
|  |  *  Description: | ||||||
|  |  *      Sets the rwlock type in the attribute. | ||||||
|  |  *      Valid types are: ITHREAD_PROCESS_PRIVATE  | ||||||
|  |  *                       ITHREAD_PROCESS_SHARED | ||||||
|  |  * | ||||||
|  |  *  Parameters: | ||||||
|  |  *      ithread_rwlockattr_t * attr (must be valid non NULL pointer to  | ||||||
|  |  *                                   ithread_rwlockattr_t) | ||||||
|  |  *      int kind (one of ITHREAD_PROCESS_PRIVATE or ITHREAD_PROCESS_SHARED) | ||||||
|  |  * | ||||||
|  |  *  Returns: | ||||||
|  |  *      0 on success. Nonzero on failure. | ||||||
|  |  *      Returns EINVAL if the kind is not supported. | ||||||
|  |  *      See man page for pthread_rwlockattr_setkind_np | ||||||
|  |  *****************************************************************************/ | ||||||
|  | #define ithread_rwlockatttr_setpshared pthread_rwlockatttr_setpshared | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /**************************************************************************** | ||||||
|  |  * Function: ithread_rwlockatttr_getpshared | ||||||
|  |  * | ||||||
|  |  *  Description: | ||||||
|  |  *      Gets the rwlock type in the attribute. | ||||||
|  |  *      Valid types are: ITHREAD_PROCESS_PRIVATE  | ||||||
|  |  *                       ITHREAD_PROCESS_SHARED  | ||||||
|  |  * | ||||||
|  |  *  Parameters: | ||||||
|  |  *      ithread_rwlockattr_t * attr (must be valid non NULL pointer to  | ||||||
|  |  *                                   pthread_rwlockattr_t) | ||||||
|  |  *      int *kind (one of ITHREAD_PROCESS_PRIVATE or ITHREAD_PROCESS_SHARED) | ||||||
|  |  * | ||||||
|  |  *  Returns: | ||||||
|  |  *      0 on success. Nonzero on failure. | ||||||
|  |  *      Always returns 0. | ||||||
|  |  *      See man page for pthread_rwlockatttr_getpshared | ||||||
|  |  *****************************************************************************/ | ||||||
|  | #define ithread_rwlockatttr_getpshared pthread_rwlockatttr_getpshared | ||||||
|  |  | ||||||
|  |    | ||||||
|  | /**************************************************************************** | ||||||
|  |  * Function: ithread_rwlock_init | ||||||
|  |  * | ||||||
|  |  *  Description: | ||||||
|  |  *      Initializes rwlock. | ||||||
|  |  *      Must be called before use. | ||||||
|  |  *       | ||||||
|  |  *  Parameters: | ||||||
|  |  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t) | ||||||
|  |  *      const ithread_rwlockattr_t * rwlock_attr  | ||||||
|  |  *  Returns: | ||||||
|  |  *      0 on success, Nonzero on failure. | ||||||
|  |  *      Always returns 0. | ||||||
|  |  *      See man page for pthread_rwlock_init | ||||||
|  |  *****************************************************************************/ | ||||||
|  | #define ithread_rwlock_init pthread_rwlock_init | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /**************************************************************************** | ||||||
|  |  * Function: ithread_rwlock_rdlock | ||||||
|  |  * | ||||||
|  |  *  Description: | ||||||
|  |  *      Locks rwlock for reading. | ||||||
|  |  *  Parameters: | ||||||
|  |  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t) | ||||||
|  |  *      rwlock must be initialized. | ||||||
|  |  *       | ||||||
|  |  *  Returns: | ||||||
|  |  *      0 on success, Nonzero on failure. | ||||||
|  |  *      Always returns 0. | ||||||
|  |  *      See man page for pthread_rwlock_rdlock | ||||||
|  |  *****************************************************************************/ | ||||||
|  | #define ithread_rwlock_rdlock pthread_rwlock_rdlock | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /**************************************************************************** | ||||||
|  |  * Function: ithread_rwlock_wrlock | ||||||
|  |  * | ||||||
|  |  *  Description: | ||||||
|  |  *      Locks rwlock for writting. | ||||||
|  |  *  Parameters: | ||||||
|  |  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t) | ||||||
|  |  *      rwlock must be initialized. | ||||||
|  |  *       | ||||||
|  |  *  Returns: | ||||||
|  |  *      0 on success, Nonzero on failure. | ||||||
|  |  *      Always returns 0. | ||||||
|  |  *      See man page for pthread_rwlock_wrlock | ||||||
|  |  *****************************************************************************/ | ||||||
|  | #define ithread_rwlock_wrlock pthread_rwlock_wrlock | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /**************************************************************************** | ||||||
|  |  * Function: ithread_rwlock_unlock | ||||||
|  |  * | ||||||
|  |  *  Description: | ||||||
|  |  *      Unlocks rwlock. | ||||||
|  |  * | ||||||
|  |  *  Parameters: | ||||||
|  |  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t) | ||||||
|  |  *      rwlock must be initialized. | ||||||
|  |  *       | ||||||
|  |  *  Returns: | ||||||
|  |  *      0 on success, Nonzero on failure. | ||||||
|  |  *      Always returns 0. | ||||||
|  |  *      See man page for pthread_rwlock_unlock | ||||||
|  |  *****************************************************************************/ | ||||||
|  | #define ithread_rwlock_unlock pthread_rwlock_unlock | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /**************************************************************************** | ||||||
|  |  * Function: ithread_rwlock_destroy | ||||||
|  |  * | ||||||
|  |  *  Description: | ||||||
|  |  *      Releases any resources held by the rwlock.  | ||||||
|  |  *		rwlock can no longer be used after this call. | ||||||
|  |  *		rwlock is only destroyed when there are no longer any threads waiting on it.  | ||||||
|  |  *		rwlock cannot be destroyed if it is locked. | ||||||
|  |  *  Parameters: | ||||||
|  |  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t) | ||||||
|  |  *      rwlock must be initialized. | ||||||
|  |  *  Returns: | ||||||
|  |  *      0 on success. Nonzero on failure. | ||||||
|  |  *      Always returns 0. | ||||||
|  |  *      See man page for pthread_rwlock_destroy | ||||||
|  |  *****************************************************************************/ | ||||||
|  | #define ithread_rwlock_destroy pthread_rwlock_destroy | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
|  * Function: ithread_cond_init |  * Function: ithread_cond_init | ||||||
|  * |  * | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ | |||||||
|  |  | ||||||
| #include "LinkedList.h" | #include "LinkedList.h" | ||||||
| #include <sys/param.h> | #include <sys/param.h> | ||||||
| #if (defined(BSD) && BSD >= 199306) | #if (defined(BSD) && BSD >= 199306) || defined(__OSX__) | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #else | #else | ||||||
| #include <malloc.h> | #include <malloc.h> | ||||||
|   | |||||||
| @@ -93,8 +93,10 @@ SetPolicyType( PolicyType in ) | |||||||
| #ifdef __CYGWIN__ | #ifdef __CYGWIN__ | ||||||
|     /* TODO not currently working... */ |     /* TODO not currently working... */ | ||||||
|     return 0; |     return 0; | ||||||
|     #else | #elif defined(__OSX__) | ||||||
|     #ifdef WIN32 |     setpriority(PRIO_PROCESS, 0, 0); | ||||||
|  |     return 0; | ||||||
|  | #elif defined(WIN32) | ||||||
|      return sched_setscheduler( 0, in); |      return sched_setscheduler( 0, in); | ||||||
| #elif defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0 | #elif defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0 | ||||||
|      struct sched_param current; |      struct sched_param current; | ||||||
| @@ -105,7 +107,6 @@ SetPolicyType( PolicyType in ) | |||||||
| #else | #else | ||||||
|      return 0; |      return 0; | ||||||
| #endif | #endif | ||||||
|     #endif |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
| @@ -364,7 +365,7 @@ static void SetSeed() { | |||||||
| 	ftime( &t ); | 	ftime( &t ); | ||||||
| #if defined(WIN32) | #if defined(WIN32) | ||||||
| 	srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id().p ); | 	srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id().p ); | ||||||
| #elif defined(__FreeBSD__) | #elif defined(__FreeBSD__) || defined(__OSX__) | ||||||
| 	srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id() ); | 	srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id() ); | ||||||
| #elif defined(__linux__) | #elif defined(__linux__) | ||||||
| 	srand( ( unsigned int )t.millitm + ithread_get_current_thread_id() ); | 	srand( ( unsigned int )t.millitm + ithread_get_current_thread_id() ); | ||||||
| @@ -1510,36 +1511,33 @@ static void SetSeed() { | |||||||
|     } |     } | ||||||
|  |  | ||||||
| #ifdef STATS | #ifdef STATS | ||||||
|     void ThreadPoolPrintStats( ThreadPoolStats * stats ) { | void ThreadPoolPrintStats(ThreadPoolStats * stats) | ||||||
|                assert( stats != NULL ); if( stats == NULL ) { | { | ||||||
|                return;} | 	assert( stats != NULL ); | ||||||
|  | 	if (stats == NULL) { | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| #ifdef __FreeBSD__ | #ifdef __FreeBSD__ | ||||||
| 	printf("ThreadPoolStats at Time: %d\n", time(NULL)); | 	printf("ThreadPoolStats at Time: %d\n", time(NULL)); | ||||||
| 	       #else | #else /* __FreeBSD__ */ | ||||||
| 	printf("ThreadPoolStats at Time: %ld\n", time(NULL)); | 	printf("ThreadPoolStats at Time: %ld\n", time(NULL)); | ||||||
| 	       #endif | #endif /* __FreeBSD__ */ | ||||||
|                printf | 	printf("High Jobs pending: %d\n", stats->currentJobsHQ); | ||||||
|                ( "Average Wait in High Priority Q in milliseconds: %f\n", | 	printf("Med Jobs Pending: %d\n", stats->currentJobsMQ); | ||||||
|                  stats->avgWaitHQ ); | 	printf("Low Jobs Pending: %d\n", stats->currentJobsLQ); | ||||||
|                printf | 	printf("Average Wait in High Priority Q in milliseconds: %f\n", stats->avgWaitHQ); | ||||||
|                ( "Average Wait in Med Priority Q in milliseconds: %f\n", | 	printf("Average Wait in Med Priority Q in milliseconds: %f\n", stats->avgWaitMQ); | ||||||
|                  stats->avgWaitMQ ); | 	printf("Averate Wait in Low Priority Q in milliseconds: %f\n", stats->avgWaitLQ); | ||||||
|                printf |  | ||||||
|                ( "Averate Wait in Low Priority Q in milliseconds: %f\n", |  | ||||||
|                  stats->avgWaitLQ ); |  | ||||||
| 	printf("Max Threads Active: %d\n", stats->maxThreads); | 	printf("Max Threads Active: %d\n", stats->maxThreads); | ||||||
|                printf( "Current Worker Threads: %d\n", | 	printf("Current Worker Threads: %d\n", stats->workerThreads); | ||||||
|                        stats->workerThreads ); | 	printf("Current Persistent Threads: %d\n", stats->persistentThreads); | ||||||
|                printf( "Current Persistent Threads: %d\n", |  | ||||||
|                        stats->persistentThreads ); |  | ||||||
| 	printf("Current Idle Threads: %d\n", stats->idleThreads); | 	printf("Current Idle Threads: %d\n", stats->idleThreads); | ||||||
| 	printf("Total Threads : %d\n", stats->totalThreads); | 	printf("Total Threads : %d\n", stats->totalThreads); | ||||||
|                printf( "Total Time spent Working in seconds: %f\n", | 	printf("Total Time spent Working in seconds: %f\n", stats->totalWorkTime); | ||||||
|                        stats->totalWorkTime ); | 	printf("Total Time spent Idle in seconds : %f\n", stats->totalIdleTime); | ||||||
|                printf( "Total Time spent Idle in seconds : %f\n", | } | ||||||
|                        stats->totalIdleTime );} | #endif /* STATS */ | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  /**************************************************************************** |  /**************************************************************************** | ||||||
|  * Function: TPAttrSetMaxJobsTotal |  * Function: TPAttrSetMaxJobsTotal | ||||||
| @@ -1552,8 +1550,10 @@ static void SetSeed() { | |||||||
|  *  Returns: |  *  Returns: | ||||||
|  *      Always returns 0. |  *      Always returns 0. | ||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
|     int TPAttrSetMaxJobsTotal( ThreadPoolAttr * attr, | int TPAttrSetMaxJobsTotal( | ||||||
|                                int  maxJobsTotal ) { | 	ThreadPoolAttr * attr, | ||||||
|  | 	int  maxJobsTotal ) | ||||||
|  | { | ||||||
| 	assert( attr != NULL ); | 	assert( attr != NULL ); | ||||||
|  |  | ||||||
| 	if( attr == NULL ) { | 	if( attr == NULL ) { | ||||||
| @@ -1579,40 +1579,54 @@ static void SetSeed() { | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| #ifdef STATS | #ifdef STATS | ||||||
| int | int | ||||||
|                    ThreadPoolGetStats( ThreadPool * tp, | ThreadPoolGetStats( | ||||||
|                                        ThreadPoolStats * stats ) { |     ThreadPool *tp, | ||||||
|  |     ThreadPoolStats *stats) | ||||||
|  | { | ||||||
| 	assert(tp != NULL); | 	assert(tp != NULL); | ||||||
| 	assert(stats != NULL); | 	assert(stats != NULL); | ||||||
|                    if( ( tp == NULL ) || ( stats == NULL ) ) { |  | ||||||
|                    return EINVAL;} | 	if (tp == NULL || stats == NULL) { | ||||||
|  | 		return EINVAL; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	//if not shutdown then acquire mutex | 	//if not shutdown then acquire mutex | ||||||
| 	if (!tp->shutdown) { | 	if (!tp->shutdown) { | ||||||
|                    ithread_mutex_lock( &tp->mutex );} | 		ithread_mutex_lock(&tp->mutex); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|                    ( *stats ) = tp->stats; if( stats->totalJobsHQ > 0 ) | 	*stats = tp->stats; | ||||||
|                    stats->avgWaitHQ = | 	if (stats->totalJobsHQ > 0) { | ||||||
|                    stats->totalTimeHQ / stats->totalJobsHQ; | 		stats->avgWaitHQ = stats->totalTimeHQ / stats->totalJobsHQ; | ||||||
|                    else | 	} else { | ||||||
|                    stats->avgWaitHQ = 0; if( stats->totalJobsMQ > 0 ) | 		stats->avgWaitHQ = 0; | ||||||
|                    stats->avgWaitMQ = | 	} | ||||||
|                    stats->totalTimeMQ / stats->totalJobsMQ; | 	 | ||||||
|                    else | 	if( stats->totalJobsMQ > 0 ) { | ||||||
|                    stats->avgWaitMQ = 0; if( stats->totalJobsLQ > 0 ) | 		stats->avgWaitMQ = stats->totalTimeMQ / stats->totalJobsMQ; | ||||||
|                    stats->avgWaitLQ = | 	} else { | ||||||
|                    stats->totalTimeLQ / stats->totalJobsLQ; | 		stats->avgWaitMQ = 0; | ||||||
|                    else | 	} | ||||||
|  | 	 | ||||||
|  | 	if( stats->totalJobsLQ > 0 ) { | ||||||
|  | 		stats->avgWaitLQ = stats->totalTimeLQ / stats->totalJobsLQ; | ||||||
|  | 	} else { | ||||||
| 		stats->avgWaitLQ = 0; | 		stats->avgWaitLQ = 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	stats->totalThreads = tp->totalThreads; | 	stats->totalThreads = tp->totalThreads; | ||||||
| 	stats->persistentThreads = tp->persistentThreads; | 	stats->persistentThreads = tp->persistentThreads; | ||||||
| 	stats->currentJobsHQ = ListSize( &tp->highJobQ ); | 	stats->currentJobsHQ = ListSize( &tp->highJobQ ); | ||||||
| 	stats->currentJobsLQ = ListSize( &tp->lowJobQ ); | 	stats->currentJobsLQ = ListSize( &tp->lowJobQ ); | ||||||
| 	stats->currentJobsMQ = ListSize( &tp->medJobQ ); | 	stats->currentJobsMQ = ListSize( &tp->medJobQ ); | ||||||
|  |  | ||||||
| 	//if not shutdown then release mutex | 	//if not shutdown then release mutex | ||||||
| 	if( !tp->shutdown ) { | 	if( !tp->shutdown ) { | ||||||
|                    ithread_mutex_unlock( &tp->mutex );} | 		ithread_mutex_unlock( &tp->mutex ); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|                    return 0;} | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif /* STATS */ | ||||||
|  |  | ||||||
| #endif |  | ||||||
|   | |||||||
| @@ -32,7 +32,7 @@ | |||||||
| #include <stdarg.h> | #include <stdarg.h> | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| #include <sys/param.h> | #include <sys/param.h> | ||||||
| #if (defined(BSD) && BSD >= 199306) | #if (defined(BSD) && BSD >= 199306) || defined(__OSX__) | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #else | #else | ||||||
| #include <malloc.h> | #include <malloc.h> | ||||||
|   | |||||||
| @@ -258,7 +258,7 @@ void UpnpPrintf( | |||||||
| 	__attribute__((format (__printf__, 5, 6))) | 	__attribute__((format (__printf__, 5, 6))) | ||||||
| #endif | #endif | ||||||
| ; | ; | ||||||
| #else | #else /* DEBUG */ | ||||||
| static UPNP_INLINE void UpnpPrintf( | static UPNP_INLINE void UpnpPrintf( | ||||||
| 	Upnp_LogLevel DLevel, | 	Upnp_LogLevel DLevel, | ||||||
| 	Dbg_Module Module, | 	Dbg_Module Module, | ||||||
| @@ -266,7 +266,7 @@ static UPNP_INLINE void UpnpPrintf( | |||||||
| 	int DbgLineNo, | 	int DbgLineNo, | ||||||
| 	const char* FmtStr, | 	const char* FmtStr, | ||||||
| 	...) {} | 	...) {} | ||||||
| #endif | #endif /* DEBUG */ | ||||||
|  |  | ||||||
|  |  | ||||||
| /*************************************************************************** | /*************************************************************************** | ||||||
|   | |||||||
| @@ -1362,7 +1362,7 @@ TvCtrlPointStart( print_string printFunctionPtr, | |||||||
|  |  | ||||||
|     ithread_mutex_init( &DeviceListMutex, 0 ); |     ithread_mutex_init( &DeviceListMutex, 0 ); | ||||||
|  |  | ||||||
|     SampleUtil_Print( "Intializing UPnP with ipaddress=%s port=%d", |     SampleUtil_Print( "Initializing UPnP with ipaddress=%s port=%d", | ||||||
|                       ip_address, port ); |                       ip_address, port ); | ||||||
|     rc = UpnpInit( ip_address, port ); |     rc = UpnpInit( ip_address, port ); | ||||||
|     if( UPNP_E_SUCCESS != rc ) { |     if( UPNP_E_SUCCESS != rc ) { | ||||||
|   | |||||||
| @@ -84,18 +84,16 @@ virtualDirList *pVirtualDirList; | |||||||
| // Mutex to synchronize the subscription handling at the client side | // Mutex to synchronize the subscription handling at the client side | ||||||
| CLIENTONLY( ithread_mutex_t GlobalClientSubscribeMutex; ) | CLIENTONLY( ithread_mutex_t GlobalClientSubscribeMutex; ) | ||||||
|  |  | ||||||
| //Mutex to synchronize handles ( root device or control point handle) | // rwlock to synchronize handles (root device or control point handle) | ||||||
|     ithread_mutex_t GlobalHndMutex; |     ithread_rwlock_t GlobalHndRWLock; | ||||||
|  |  | ||||||
| // Mutex to synchronize the uuid creation process | // Mutex to synchronize the uuid creation process | ||||||
|     ithread_mutex_t gUUIDMutex; |     ithread_mutex_t gUUIDMutex; | ||||||
|  |  | ||||||
|     TimerThread gTimerThread; |     TimerThread gTimerThread; | ||||||
|  |  | ||||||
|     ThreadPool gRecvThreadPool; |  | ||||||
|  |  | ||||||
|     ThreadPool gSendThreadPool; |     ThreadPool gSendThreadPool; | ||||||
|  |     ThreadPool gRecvThreadPool; | ||||||
|     ThreadPool gMiniServerThreadPool; |     ThreadPool gMiniServerThreadPool; | ||||||
|  |  | ||||||
| //Flag to indicate the state of web server | //Flag to indicate the state of web server | ||||||
| @@ -213,9 +211,9 @@ int UpnpInit( IN const char *HostIP, | |||||||
| #ifdef __CYGWIN__ | #ifdef __CYGWIN__ | ||||||
|         /* On Cygwin, pthread_mutex_init() fails without this memset. */ |         /* On Cygwin, pthread_mutex_init() fails without this memset. */ | ||||||
|         /* TODO: Fix Cygwin so we don't need this memset(). */ |         /* TODO: Fix Cygwin so we don't need this memset(). */ | ||||||
|         memset(&GlobalHndMutex, 0, sizeof(GlobalHndMutex)); |         memset(&GlobalHndRWLock, 0, sizeof(GlobalHndRWLock)); | ||||||
| #endif | #endif | ||||||
|         if( ithread_mutex_init( &GlobalHndMutex, NULL ) != 0 ) { |     if (ithread_rwlock_init(&GlobalHndRWLock, NULL) != 0) { | ||||||
|         return UPNP_E_INIT_FAILED; |         return UPNP_E_INIT_FAILED; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -230,9 +228,9 @@ int UpnpInit( IN const char *HostIP, | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleLock(); | ||||||
|     if( HostIP != NULL ) |     if( HostIP != NULL ) { | ||||||
|         strcpy( LOCAL_HOST, HostIP ); |         strcpy( LOCAL_HOST, HostIP ); | ||||||
|     else { |     } else { | ||||||
|         if( getlocalhostname( LOCAL_HOST ) != UPNP_E_SUCCESS ) { |         if( getlocalhostname( LOCAL_HOST ) != UPNP_E_SUCCESS ) { | ||||||
|             HandleUnlock(); |             HandleUnlock(); | ||||||
|             return UPNP_E_INIT_FAILED; |             return UPNP_E_INIT_FAILED; | ||||||
| @@ -323,27 +321,54 @@ int UpnpInit( IN const char *HostIP, | |||||||
|  |  | ||||||
| #ifdef DEBUG | #ifdef DEBUG | ||||||
| static void  | static void  | ||||||
| PrintThreadPoolStats (const char* DbgFileName, int DbgLineNo, | PrintThreadPoolStats( | ||||||
| 		      const char* msg, const ThreadPoolStats* const stats) | 	ThreadPool *tp,  | ||||||
|  | 	const char *DbgFileName, | ||||||
|  | 	int DbgLineNo, | ||||||
|  | 	const char *msg) | ||||||
| { | { | ||||||
|  | 	ThreadPoolStats stats; | ||||||
|  | 	ThreadPoolGetStats(tp, &stats); | ||||||
| 	UpnpPrintf(UPNP_INFO, API, DbgFileName, DbgLineNo,  | 	UpnpPrintf(UPNP_INFO, API, DbgFileName, DbgLineNo,  | ||||||
| 		    "%s \n High Jobs pending = %d \nMed Jobs Pending = %d\n" | 		"%s \n" | ||||||
| 		    " Low Jobs Pending = %d \nWorker Threads = %d\n" | 		"High Jobs pending: %d\n" | ||||||
| 		    "Idle Threads = %d\nPersistent Threads = %d\n" | 		"Med Jobs Pending: %d\n" | ||||||
| 		    "Average Time spent in High Q = %lf\n" | 		"Low Jobs Pending: %d\n" | ||||||
| 		    "Average Time spent in Med Q = %lf\n" | 		"Average wait in High Q in milliseconds: %lf\n" | ||||||
| 		    "Average Time spent in Low Q = %lf\n" | 		"Average wait in Med Q in milliseconds: %lf\n" | ||||||
| 		    "Max Threads Used: %d\nTotal Work Time= %lf\n" | 		"Average wait in Low Q in milliseconds: %lf\n" | ||||||
| 		    "Total Idle Time = %lf\n", | 		"Max Threads Used: %d\n" | ||||||
|  | 		"Worker Threads: %d\n" | ||||||
|  | 		"Persistent Threads: %d\n" | ||||||
|  | 		"Idle Threads: %d\n" | ||||||
|  | 		"Total Threads: %d\n" | ||||||
|  | 		"Total Work Time: %lf\n" | ||||||
|  | 		"Total Idle Time: %lf\n", | ||||||
| 		msg, | 		msg, | ||||||
| 		    stats->currentJobsHQ, stats->currentJobsMQ, | 		stats.currentJobsHQ, | ||||||
| 		    stats->currentJobsLQ, stats->workerThreads, | 		stats.currentJobsMQ, | ||||||
| 		    stats->idleThreads, stats->persistentThreads, | 		stats.currentJobsLQ, | ||||||
| 		    stats->avgWaitHQ, stats->avgWaitMQ, stats->avgWaitLQ, | 		stats.avgWaitHQ, | ||||||
| 		    stats->maxThreads, stats->totalWorkTime, | 		stats.avgWaitMQ, | ||||||
| 		    stats->totalIdleTime ); | 		stats.avgWaitLQ, | ||||||
|  | 		stats.maxThreads, | ||||||
|  | 		stats.workerThreads, | ||||||
|  | 		stats.persistentThreads, | ||||||
|  | 		stats.idleThreads, | ||||||
|  | 		stats.totalThreads, | ||||||
|  | 		stats.totalWorkTime, | ||||||
|  | 		stats.totalIdleTime); | ||||||
| } | } | ||||||
| #endif | #else /* DEBUG */ | ||||||
|  | static UPNP_INLINE void  | ||||||
|  | PrintThreadPoolStats( | ||||||
|  | 	ThreadPool *tp,  | ||||||
|  | 	const char *DbgFileName, | ||||||
|  | 	int DbgLineNo, | ||||||
|  | 	const char *msg) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | #endif /* DEBUG */ | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
| @@ -374,10 +399,6 @@ UpnpFinish() | |||||||
| #endif | #endif | ||||||
|     struct Handle_Info *temp; |     struct Handle_Info *temp; | ||||||
|  |  | ||||||
| #ifdef DEBUG |  | ||||||
|     ThreadPoolStats stats; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
| //	WSACleanup(); | //	WSACleanup(); | ||||||
| #endif | #endif | ||||||
| @@ -387,20 +408,15 @@ UpnpFinish() | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpFinish : UpnpSdkInit is :%d:\n", |         "Inside UpnpFinish : UpnpSdkInit is :%d:\n", UpnpSdkInit ); | ||||||
|         UpnpSdkInit ); |  | ||||||
| #ifdef DEBUG |  | ||||||
|     if( UpnpSdkInit == 1 ) { |     if( UpnpSdkInit == 1 ) { | ||||||
|         UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |         UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, | ||||||
|             "UpnpFinish : UpnpSdkInit is ONE\n" ); |             "UpnpFinish : UpnpSdkInit is ONE\n" ); | ||||||
|     } |     } | ||||||
|     ThreadPoolGetStats( &gRecvThreadPool, &stats ); |     PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool"); | ||||||
|     PrintThreadPoolStats (__FILE__, __LINE__, |     PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool"); | ||||||
| 	"Recv Thread Pool", &stats); |     PrintThreadPoolStats(&gMiniServerThreadPool, __FILE__, __LINE__, "MiniServer Thread Pool"); | ||||||
|     ThreadPoolGetStats( &gSendThreadPool, &stats ); |  | ||||||
|     PrintThreadPoolStats (__FILE__, __LINE__, |  | ||||||
| 	"Send Thread Pool", &stats); |  | ||||||
| #endif |  | ||||||
| #ifdef INCLUDE_DEVICE_APIS | #ifdef INCLUDE_DEVICE_APIS | ||||||
|     if( GetDeviceHandleInfo( &device_handle, &temp ) == HND_DEVICE ) |     if( GetDeviceHandleInfo( &device_handle, &temp ) == HND_DEVICE ) | ||||||
|         UpnpUnRegisterRootDevice( device_handle ); |         UpnpUnRegisterRootDevice( device_handle ); | ||||||
| @@ -412,51 +428,47 @@ UpnpFinish() | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     TimerThreadShutdown( &gTimerThread ); |     TimerThreadShutdown( &gTimerThread ); | ||||||
|  |  | ||||||
|     StopMiniServer(); |     StopMiniServer(); | ||||||
|  |  | ||||||
| #if EXCLUDE_WEB_SERVER == 0 | #if EXCLUDE_WEB_SERVER == 0 | ||||||
|     web_server_destroy(); |     web_server_destroy(); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef DEBUG |     ThreadPoolShutdown(&gMiniServerThreadPool); | ||||||
|     ThreadPoolShutdown( &gSendThreadPool ); |  | ||||||
|     ThreadPoolShutdown(&gRecvThreadPool); |     ThreadPoolShutdown(&gRecvThreadPool); | ||||||
|     UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |     ThreadPoolShutdown(&gSendThreadPool); | ||||||
|         "Exiting UpnpFinish : UpnpSdkInit is :%d:\n", |  | ||||||
| 	UpnpSdkInit ); |     PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool"); | ||||||
|     ThreadPoolGetStats( &gRecvThreadPool, &stats ); |     PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool"); | ||||||
|     PrintThreadPoolStats( __FILE__, __LINE__, |     PrintThreadPoolStats(&gMiniServerThreadPool, __FILE__, __LINE__, "MiniServer Thread Pool"); | ||||||
|         "Recv Thread Pool", &stats); |  | ||||||
|     ThreadPoolGetStats( &gSendThreadPool, &stats ); |  | ||||||
|     PrintThreadPoolStats(__FILE__, __LINE__, |  | ||||||
|         "Send Thread Pool", &stats); |  | ||||||
|     UpnpCloseLog(); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef INCLUDE_CLIENT_APIS | #ifdef INCLUDE_CLIENT_APIS | ||||||
|     ithread_mutex_destroy(&GlobalClientSubscribeMutex); |     ithread_mutex_destroy(&GlobalClientSubscribeMutex); | ||||||
| #endif | #endif | ||||||
|     ithread_mutex_destroy( &GlobalHndMutex ); |     ithread_rwlock_destroy(&GlobalHndRWLock); | ||||||
|     ithread_mutex_destroy(&gUUIDMutex); |     ithread_mutex_destroy(&gUUIDMutex); | ||||||
|  |  | ||||||
|     // remove all virtual dirs |     // remove all virtual dirs | ||||||
|     UpnpRemoveAllVirtualDirs(); |     UpnpRemoveAllVirtualDirs(); | ||||||
|     // leuk_he allow static linking: |  | ||||||
|  |     // allow static linking | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
| #ifdef PTW32_STATIC_LIB | #ifdef PTW32_STATIC_LIB | ||||||
|     pthread_win32_thread_detach_np(); |     pthread_win32_thread_detach_np(); | ||||||
| #endif | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|     UpnpSdkInit = 0; |     UpnpSdkInit = 0; | ||||||
|  |     UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, | ||||||
|  |         "Exiting UpnpFinish : UpnpSdkInit is :%d:\n", UpnpSdkInit); | ||||||
|  |     UpnpCloseLog(); | ||||||
|  |  | ||||||
|     return UPNP_E_SUCCESS; |     return UPNP_E_SUCCESS; | ||||||
|  |  | ||||||
| }  /********************* End of  UpnpFinish  *************************/ | } | ||||||
|  | /*************************** End of  UpnpFinish  *****************************/ | ||||||
|  |  | ||||||
| /**************************************************************************** | /****************************************************************************** | ||||||
|  * Function: UpnpGetServerPort |  * Function: UpnpGetServerPort | ||||||
|  * |  * | ||||||
|  * Parameters: NONE |  * Parameters: NONE | ||||||
| @@ -953,7 +965,7 @@ GetDescDocumentAndURL( IN Upnp_DescType descriptionType, | |||||||
|     char *temp_str = NULL; |     char *temp_str = NULL; | ||||||
|     FILE *fp = NULL; |     FILE *fp = NULL; | ||||||
|     off_t fileLen; |     off_t fileLen; | ||||||
|     unsigned num_read; |     size_t num_read; | ||||||
|     time_t last_modified; |     time_t last_modified; | ||||||
|     struct stat file_info; |     struct stat file_info; | ||||||
|     struct sockaddr_in serverAddr; |     struct sockaddr_in serverAddr; | ||||||
| @@ -1559,7 +1571,7 @@ UpnpSearchAsync( IN UpnpClient_Handle Hnd, | |||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpSearchAsync \n" ); |         "Inside UpnpSearchAsync \n" ); | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -1735,7 +1747,7 @@ UpnpSubscribeAsync( IN UpnpClient_Handle Hnd, | |||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpSubscribeAsync \n" ); |         "Inside UpnpSubscribeAsync \n" ); | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -1752,15 +1764,13 @@ UpnpSubscribeAsync( IN UpnpClient_Handle Hnd, | |||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_PARAM; |         return UPNP_E_INVALID_PARAM; | ||||||
|     } |     } | ||||||
|  |     HandleUnlock(); | ||||||
|  |  | ||||||
|     Param = |     Param = (struct UpnpNonblockParam *) | ||||||
|         ( struct UpnpNonblockParam * ) |  | ||||||
|         malloc(sizeof (struct UpnpNonblockParam)); |         malloc(sizeof (struct UpnpNonblockParam)); | ||||||
|     if( Param == NULL ) { |     if( Param == NULL ) { | ||||||
|         HandleUnlock(); |  | ||||||
|         return UPNP_E_OUTOF_MEMORY; |         return UPNP_E_OUTOF_MEMORY; | ||||||
|     } |     } | ||||||
|     HandleUnlock(); |  | ||||||
|  |  | ||||||
|     Param->FunName = SUBSCRIBE; |     Param->FunName = SUBSCRIBE; | ||||||
|     Param->Handle = Hnd; |     Param->Handle = Hnd; | ||||||
| @@ -1820,7 +1830,7 @@ UpnpSubscribe( IN UpnpClient_Handle Hnd, | |||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpSubscribe \n" ); |         "Inside UpnpSubscribe \n" ); | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -1880,7 +1890,7 @@ UpnpUnSubscribe( IN UpnpClient_Handle Hnd, | |||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpUnSubscribe \n" ); |         "Inside UpnpUnSubscribe \n" ); | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -1939,7 +1949,7 @@ UpnpUnSubscribeAsync( IN UpnpClient_Handle Hnd, | |||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpUnSubscribeAsync \n" ); |         "Inside UpnpUnSubscribeAsync \n" ); | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -2013,7 +2023,7 @@ UpnpRenewSubscription( IN UpnpClient_Handle Hnd, | |||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpRenewSubscription \n" ); |         "Inside UpnpRenewSubscription \n" ); | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -2078,7 +2088,7 @@ UpnpRenewSubscriptionAsync( IN UpnpClient_Handle Hnd, | |||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpRenewSubscriptionAsync \n" ); |         "Inside UpnpRenewSubscriptionAsync \n" ); | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -2173,7 +2183,7 @@ UpnpNotify( IN UpnpDevice_Handle Hnd, | |||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpNotify \n" ); |         "Inside UpnpNotify \n" ); | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -2244,7 +2254,7 @@ UpnpNotifyExt( IN UpnpDevice_Handle Hnd, | |||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpNotify \n" ); |         "Inside UpnpNotify \n" ); | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -2321,7 +2331,7 @@ UpnpAcceptSubscription( IN UpnpDevice_Handle Hnd, | |||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpAcceptSubscription \n" ); |         "Inside UpnpAcceptSubscription \n" ); | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -2397,7 +2407,7 @@ UpnpAcceptSubscriptionExt( IN UpnpDevice_Handle Hnd, | |||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpAcceptSubscription \n" ); |         "Inside UpnpAcceptSubscription \n" ); | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -2493,7 +2503,7 @@ UpnpSendAction( IN UpnpClient_Handle Hnd, | |||||||
|     } |     } | ||||||
|     DevUDN_const = NULL; |     DevUDN_const = NULL; | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -2577,7 +2587,7 @@ UpnpSendActionEx( IN UpnpClient_Handle Hnd, | |||||||
|         return retVal; |         return retVal; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -2653,7 +2663,7 @@ UpnpSendActionAsync( IN UpnpClient_Handle Hnd, | |||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpSendActionAsync \n" ); |         "Inside UpnpSendActionAsync \n" ); | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -2773,7 +2783,7 @@ UpnpSendActionExAsync( IN UpnpClient_Handle Hnd, | |||||||
|         return retVal; |         return retVal; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -2887,7 +2897,7 @@ UpnpGetServiceVarStatusAsync( IN UpnpClient_Handle Hnd, | |||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpGetServiceVarStatusAsync \n" ); |         "Inside UpnpGetServiceVarStatusAsync \n" ); | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -2967,7 +2977,7 @@ UpnpGetServiceVarStatus( IN UpnpClient_Handle Hnd, | |||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|         "Inside UpnpGetServiceVarStatus \n" ); |         "Inside UpnpGetServiceVarStatus \n" ); | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
| @@ -3300,9 +3310,9 @@ UpnpDownloadXmlDoc( const char *url, | |||||||
|         UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |         UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|             "****************** END OF Parsed XML Doc *****************\n" ); |             "****************** END OF Parsed XML Doc *****************\n" ); | ||||||
|         ixmlFreeDOMString( xml_buf ); |         ixmlFreeDOMString( xml_buf ); | ||||||
|  | #endif | ||||||
|         UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |         UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|             "Exiting UpnpDownloadXmlDoc\n" ); |             "Exiting UpnpDownloadXmlDoc\n" ); | ||||||
| #endif |  | ||||||
|         return UPNP_E_SUCCESS; |         return UPNP_E_SUCCESS; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -3635,7 +3645,6 @@ int PrintHandleInfo( IN UpnpClient_Handle Hnd ) | |||||||
|     struct Handle_Info * HndInfo; |     struct Handle_Info * HndInfo; | ||||||
|     if (HandleTable[Hnd] != NULL) { |     if (HandleTable[Hnd] != NULL) { | ||||||
|         HndInfo = HandleTable[Hnd]; |         HndInfo = HandleTable[Hnd]; | ||||||
| #ifdef DEBUG |  | ||||||
|             UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, |             UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|                 "Printing information for Handle_%d\n", Hnd); |                 "Printing information for Handle_%d\n", Hnd); | ||||||
|             UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, |             UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, | ||||||
| @@ -3644,7 +3653,6 @@ int PrintHandleInfo( IN UpnpClient_Handle Hnd ) | |||||||
|                 if(HndInfo->HType != HND_CLIENT) |                 if(HndInfo->HType != HND_CLIENT) | ||||||
|                     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |                     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|                         "DescURL_%s\n", HndInfo->DescURL ); |                         "DescURL_%s\n", HndInfo->DescURL ); | ||||||
| #endif |  | ||||||
| #endif | #endif | ||||||
|     } else { |     } else { | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
|   | |||||||
| @@ -44,7 +44,7 @@ struct ErrorString { | |||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| //Intializing the array of error structures.  | // Initializing the array of error structures.  | ||||||
| struct ErrorString ErrorMessages[] = { {UPNP_E_SUCCESS, "UPNP_E_SUCCESS"}, | struct ErrorString ErrorMessages[] = { {UPNP_E_SUCCESS, "UPNP_E_SUCCESS"}, | ||||||
| {UPNP_E_INVALID_HANDLE, "UPNP_E_INVALID_HANDLE"}, | {UPNP_E_INVALID_HANDLE, "UPNP_E_INVALID_HANDLE"}, | ||||||
| {UPNP_E_INVALID_PARAM, "UPNP_E_INVALID_PARAM"}, | {UPNP_E_INVALID_PARAM, "UPNP_E_INVALID_PARAM"}, | ||||||
| @@ -581,4 +581,5 @@ UpnpCreatePropertySet( IN int NumArg, | |||||||
|     return PropSet; |     return PropSet; | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif | #endif // EXCLUDE_DOM == 0 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -93,7 +93,7 @@ GenaAutoRenewSubscription( IN void *input ) | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     if( send_callback ) { |     if( send_callback ) { | ||||||
|         HandleLock(); |         HandleReadLock(); | ||||||
|         if( GetHandleInfo( event->handle, &handle_info ) != HND_CLIENT ) { |         if( GetHandleInfo( event->handle, &handle_info ) != HND_CLIENT ) { | ||||||
|             HandleUnlock(); |             HandleUnlock(); | ||||||
|             free_upnp_timeout( event ); |             free_upnp_timeout( event ); | ||||||
| @@ -543,10 +543,10 @@ genaSubscribe( IN UpnpClient_Handle client_handle, | |||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|         "GENA SUBSCRIBE BEGIN" ); |         "GENA SUBSCRIBE BEGIN" ); | ||||||
|     HandleLock(); |  | ||||||
|  |  | ||||||
|     memset( out_sid, 0, sizeof( Upnp_SID ) ); |     memset( out_sid, 0, sizeof( Upnp_SID ) ); | ||||||
|  |  | ||||||
|  |     HandleReadLock(); | ||||||
|     // validate handle |     // validate handle | ||||||
|     if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) { |     if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
| @@ -881,3 +881,4 @@ gena_process_notification_event( IN SOCKINFO * info, | |||||||
|  |  | ||||||
| #endif // INCLUDE_CLIENT_APIS | #endif // INCLUDE_CLIENT_APIS | ||||||
| #endif // EXCLUDE_GENA | #endif // EXCLUDE_GENA | ||||||
|  |  | ||||||
|   | |||||||
| @@ -365,7 +365,7 @@ genaNotifyThread( IN void *input ) | |||||||
|     struct Handle_Info *handle_info; |     struct Handle_Info *handle_info; | ||||||
|     ThreadPoolJob job; |     ThreadPoolJob job; | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|     //validate context |     //validate context | ||||||
|  |  | ||||||
|     if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) { |     if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) { | ||||||
|   | |||||||
| @@ -42,12 +42,12 @@ | |||||||
| 	#include <sys/wait.h> | 	#include <sys/wait.h> | ||||||
| 	#include <unistd.h> | 	#include <unistd.h> | ||||||
| 	#include <sys/time.h> | 	#include <sys/time.h> | ||||||
| #else | #else /* WIN32 */ | ||||||
| 	#include <winsock2.h> | 	#include <winsock2.h> | ||||||
|  |  | ||||||
| 	typedef int socklen_t; | 	typedef int socklen_t; | ||||||
| 	#define EAFNOSUPPORT 97 | 	#define EAFNOSUPPORT 97 | ||||||
| #endif | #endif /* WIN32 */ | ||||||
| #include "unixutil.h" | #include "unixutil.h" | ||||||
| #include "ithread.h" | #include "ithread.h" | ||||||
|  |  | ||||||
| @@ -91,13 +91,12 @@ static MiniServerState gMServState = MSERV_IDLE; | |||||||
|  * Function: SetHTTPGetCallback |  * Function: SetHTTPGetCallback | ||||||
|  * |  * | ||||||
|  * Parameters : |  * Parameters : | ||||||
| *		MiniServerCallback callback ; - HTTP Callback to be invoked  |  * 	MiniServerCallback callback - HTTP Callback to be invoked  | ||||||
|  * |  * | ||||||
| *	Description :	Set HTTP Get Callback |  * Description: | ||||||
|  |  * 	Set HTTP Get Callback | ||||||
|  * |  * | ||||||
|  * Return: void |  * Return: void | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| void | void | ||||||
| SetHTTPGetCallback( MiniServerCallback callback ) | SetHTTPGetCallback( MiniServerCallback callback ) | ||||||
| @@ -109,31 +108,31 @@ SetHTTPGetCallback( MiniServerCallback callback ) | |||||||
|  * Function: SetSoapCallback |  * Function: SetSoapCallback | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *	MiniServerCallback callback ; - SOAP Callback to be invoked  |  *	MiniServerCallback callback - SOAP Callback to be invoked  | ||||||
|  * |  * | ||||||
| * Description :	Set SOAP Callback |  * Description: | ||||||
|  |  * 	Set SOAP Callback | ||||||
|  * |  * | ||||||
|  * Return: void |  * Return: void | ||||||
| * |  | ||||||
| * Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
|  | #ifdef INCLUDE_DEVICE_APIS | ||||||
| void | void | ||||||
| SetSoapCallback( MiniServerCallback callback ) | SetSoapCallback( MiniServerCallback callback ) | ||||||
| { | { | ||||||
|     gSoapCallback = callback; |     gSoapCallback = callback; | ||||||
| } | } | ||||||
|  | #endif /* INCLUDE_DEVICE_APIS */ | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: SetGenaCallback |  * Function: SetGenaCallback | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		MiniServerCallback callback ; - GENA Callback to be invoked |  *	MiniServerCallback callback - GENA Callback to be invoked | ||||||
|  * |  * | ||||||
| *	Description :	Set GENA Callback |  * Description: | ||||||
|  |  * 	Set GENA Callback | ||||||
|  * |  * | ||||||
|  * Return: void |  * Return: void | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| void | void | ||||||
| SetGenaCallback( MiniServerCallback callback ) | SetGenaCallback( MiniServerCallback callback ) | ||||||
| @@ -145,17 +144,15 @@ SetGenaCallback( MiniServerCallback callback ) | |||||||
|  * Function :	dispatch_request |  * Function :	dispatch_request | ||||||
|  * |  * | ||||||
|  * Parameters : |  * Parameters : | ||||||
| *		IN SOCKINFO *info ;		 Socket Information object. |  *	IN SOCKINFO *info	- Socket Information object. | ||||||
| *		http_parser_t* hparser ; HTTP parser object. |  *	http_parser_t* hparser	- HTTP parser object. | ||||||
|  * |  * | ||||||
| *	Description :	Based on the type pf message, appropriate callback  |  * Description : | ||||||
| *		is issued |  *	Based on the type pf message, appropriate callback is issued | ||||||
|  * |  * | ||||||
| *	Return : int ; |  * Return: int | ||||||
|  *	0 - On Success |  *	0 - On Success | ||||||
|  *	HTTP_INTERNAL_SERVER_ERROR - Callback is NULL |  *	HTTP_INTERNAL_SERVER_ERROR - Callback is NULL | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| static int | static int | ||||||
| dispatch_request( IN SOCKINFO * info, | dispatch_request( IN SOCKINFO * info, | ||||||
| @@ -203,17 +200,15 @@ dispatch_request( IN SOCKINFO * info, | |||||||
|  * Function: handle_error |  * Function: handle_error | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
|  |  * 	IN SOCKINFO *info	- Socket Inforamtion Object | ||||||
|  |  * 	int http_error_code	- HTTP Error Code | ||||||
|  |  * 	int major		- Major Version Number | ||||||
|  |  * 	int minor		- Minor Version Number | ||||||
|  * |  * | ||||||
| *		IN SOCKINFO *info ;		Socket Inforamtion Object |  * Description: | ||||||
| *		int http_error_code ;	HTTP Error Code |  * 	Send Error Message | ||||||
| *		int major ;				Major Version Number |  | ||||||
| *		int minor ;				Minor Version Number |  | ||||||
|  * |  * | ||||||
| *	Description :	Send Error Message |  * Return: void | ||||||
| * |  | ||||||
| *	Return : void; |  | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| static UPNP_INLINE void | static UPNP_INLINE void | ||||||
| handle_error( IN SOCKINFO * info, | handle_error( IN SOCKINFO * info, | ||||||
| @@ -230,12 +225,11 @@ handle_error( IN SOCKINFO * info, | |||||||
|  * Parameters: |  * Parameters: | ||||||
|  *	void *args ; Request Message to be freed |  *	void *args ; Request Message to be freed | ||||||
|  * |  * | ||||||
| *	Description :	Free memory assigned for handling request and unitial- |  * Description: | ||||||
| *	-ize socket functionality |  * 	Free memory assigned for handling request and unitialize socket | ||||||
|  |  * 	functionality | ||||||
|  * |  * | ||||||
|  * Return: void |  * Return: void | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| static void | static void | ||||||
| free_handle_request_arg( void *args ) | free_handle_request_arg( void *args ) | ||||||
| @@ -251,13 +245,12 @@ free_handle_request_arg( void *args ) | |||||||
|  * Function: handle_request |  * Function: handle_request | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		void *args ;	Request Message to be handled |  *	void *args - Request Message to be handled | ||||||
|  * |  * | ||||||
| *	Description :	Receive the request and dispatch it for handling |  * Description: | ||||||
|  |  * 	Receive the request and dispatch it for handling | ||||||
|  * |  * | ||||||
|  * Return: void |  * Return: void | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| static void | static void | ||||||
| handle_request( void *args ) | handle_request( void *args ) | ||||||
| @@ -322,16 +315,14 @@ handle_request( void *args ) | |||||||
|  * Function: schedule_request_job |  * Function: schedule_request_job | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN int connfd ;	Socket Descriptor on which connection is accepted |  *	IN int connfd - Socket Descriptor on which connection is accepted | ||||||
| *		IN struct sockaddr_in* clientAddr ;	Clients Address information |  *	IN struct sockaddr_in* clientAddr - Clients Address information | ||||||
|  * |  * | ||||||
| *	Description :	Initilize the thread pool to handle a request. |  * Description: | ||||||
|  |  * 	Initilize the thread pool to handle a request. | ||||||
|  *	Sets priority for the job and adds the job to the thread pool |  *	Sets priority for the job and adds the job to the thread pool | ||||||
|  * |  * | ||||||
| * |  | ||||||
|  * Return: void |  * Return: void | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| static UPNP_INLINE void | static UPNP_INLINE void | ||||||
| schedule_request_job( IN int connfd, | schedule_request_job( IN int connfd, | ||||||
| @@ -374,29 +365,28 @@ schedule_request_job( IN int connfd, | |||||||
|  * Function: RunMiniServer |  * Function: RunMiniServer | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		MiniServerSockArray *miniSock ;	Socket Array |  *	MiniServerSockArray *miniSock - Socket Array | ||||||
|  * |  * | ||||||
| *	Description :	Function runs the miniserver. The MiniServer accepts a  |  * Description: | ||||||
|  |  * 	Function runs the miniserver. The MiniServer accepts a  | ||||||
|  *	new request and schedules a thread to handle the new request. |  *	new request and schedules a thread to handle the new request. | ||||||
|  *	Checks for socket state and invokes appropriate read and shutdown  |  *	Checks for socket state and invokes appropriate read and shutdown  | ||||||
|  *	actions for the Miniserver and SSDP sockets  |  *	actions for the Miniserver and SSDP sockets  | ||||||
|  * |  * | ||||||
|  * Return: void |  * Return: void | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| static void | static void | ||||||
| RunMiniServer( MiniServerSockArray * miniSock ) | RunMiniServer( MiniServerSockArray * miniSock ) | ||||||
| { | { | ||||||
|     struct sockaddr_in clientAddr; |     struct sockaddr_in clientAddr; | ||||||
|     socklen_t clientLen; |     socklen_t clientLen; | ||||||
|     SOCKET miniServSock, |     SOCKET connectHnd; | ||||||
|       connectHnd; |     SOCKET miniServSock = miniSock->miniServerSock; | ||||||
|     SOCKET miniServStopSock; |     SOCKET miniServStopSock =  miniSock->miniServerStopSock; | ||||||
|     SOCKET ssdpSock; |     SOCKET ssdpSock = miniSock->ssdpSock; | ||||||
|  | #ifdef INCLUDE_CLIENT_APIS | ||||||
|     CLIENTONLY( SOCKET ssdpReqSock; |     SOCKET ssdpReqSock = miniSock->ssdpReqSock; | ||||||
|          ) | #endif | ||||||
|  |  | ||||||
|     fd_set expSet; |     fd_set expSet; | ||||||
|     fd_set rdSet; |     fd_set rdSet; | ||||||
| @@ -404,66 +394,55 @@ RunMiniServer( MiniServerSockArray * miniSock ) | |||||||
|     int byteReceived; |     int byteReceived; | ||||||
|     char requestBuf[256]; |     char requestBuf[256]; | ||||||
|  |  | ||||||
|     miniServSock = miniSock->miniServerSock; |  | ||||||
|     miniServStopSock = miniSock->miniServerStopSock; |  | ||||||
|  |  | ||||||
|     ssdpSock = miniSock->ssdpSock; |  | ||||||
|  |  | ||||||
|     CLIENTONLY( ssdpReqSock = miniSock->ssdpReqSock; |  | ||||||
|          ); |  | ||||||
|  |  | ||||||
|     gMServState = MSERV_RUNNING; |  | ||||||
|     maxMiniSock = max( miniServSock, miniServStopSock) ; |     maxMiniSock = max( miniServSock, miniServStopSock) ; | ||||||
|     maxMiniSock = max( maxMiniSock, (SOCKET)(ssdpSock) ); |     maxMiniSock = max( maxMiniSock, (SOCKET)(ssdpSock) ); | ||||||
|  | #ifdef INCLUDE_CLIENT_APIS | ||||||
|     CLIENTONLY( maxMiniSock = |     maxMiniSock = max( maxMiniSock, (SOCKET)(ssdpReqSock) ); | ||||||
|                 max( maxMiniSock, ( SOCKET ) ( ssdpReqSock ) ) ); | #endif | ||||||
|  |  | ||||||
|     ++maxMiniSock; |     ++maxMiniSock; | ||||||
|  |  | ||||||
|  |     gMServState = MSERV_RUNNING; | ||||||
|     while( TRUE ) { |     while( TRUE ) { | ||||||
|         FD_ZERO( &rdSet ); |         FD_ZERO( &rdSet ); | ||||||
|         FD_ZERO( &expSet ); |         FD_ZERO( &expSet ); | ||||||
|  |  | ||||||
|         FD_SET( miniServStopSock, &expSet ); |         FD_SET( miniServStopSock, &expSet ); | ||||||
|  |  | ||||||
|         FD_SET( miniServSock, &rdSet ); |         FD_SET( miniServSock, &rdSet ); | ||||||
|         FD_SET( miniServStopSock, &rdSet ); |         FD_SET( miniServStopSock, &rdSet ); | ||||||
|         FD_SET( ssdpSock, &rdSet ); |         FD_SET( ssdpSock, &rdSet ); | ||||||
|         CLIENTONLY( FD_SET( ssdpReqSock, &rdSet ) ); | #ifdef INCLUDE_CLIENT_APIS | ||||||
|  |         FD_SET( ssdpReqSock, &rdSet ); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|         if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) == |         if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) == | ||||||
|             UPNP_SOCKETERROR ) { |             UPNP_SOCKETERROR ) { | ||||||
|             UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, |             UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, | ||||||
|                 "Error in select call !!!\n" ); |                 "Error in select call!\n" ); | ||||||
|  | 	    /* Avoid 100% CPU in case of repeated error in select() */ | ||||||
|  | 	    isleep( 1 ); | ||||||
|             continue; |             continue; | ||||||
|         } else { |         } else { | ||||||
|  |  | ||||||
|             if( FD_ISSET( miniServSock, &rdSet ) ) { |             if( FD_ISSET( miniServSock, &rdSet ) ) { | ||||||
|                 clientLen = sizeof( struct sockaddr_in ); |                 clientLen = sizeof( struct sockaddr_in ); | ||||||
|                 connectHnd = accept( miniServSock, |                 connectHnd = accept( miniServSock, | ||||||
|                                      ( struct sockaddr * )&clientAddr, |                     ( struct sockaddr * )&clientAddr, &clientLen ); | ||||||
|                                      &clientLen ); |  | ||||||
|                 if( connectHnd == UPNP_INVALID_SOCKET ) { |                 if( connectHnd == UPNP_INVALID_SOCKET ) { | ||||||
|                     UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, |                     UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
|                         "miniserver: Error" |                         "miniserver: Error in accepting connection\n" ); | ||||||
|                         " in accepting connection\n" ); |  | ||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
|                 schedule_request_job( connectHnd, &clientAddr ); |                 schedule_request_job( connectHnd, &clientAddr ); | ||||||
|             } |             } | ||||||
|  | #ifdef INCLUDE_CLIENT_APIS | ||||||
|             // ssdp |             // ssdp | ||||||
|             CLIENTONLY( if( FD_ISSET( ssdpReqSock, &rdSet ) ) { |             if( FD_ISSET( ssdpReqSock, &rdSet ) ) { | ||||||
|  |                 readFromSSDPSocket( ssdpReqSock ); | ||||||
|                         readFromSSDPSocket( ssdpReqSock );} |             } | ||||||
|              ) | #endif | ||||||
|  |  | ||||||
|             if( FD_ISSET( ssdpSock, &rdSet ) ) { |             if( FD_ISSET( ssdpSock, &rdSet ) ) { | ||||||
|                     readFromSSDPSocket( ssdpSock ); |                     readFromSSDPSocket( ssdpSock ); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if( FD_ISSET( miniServStopSock, &rdSet ) ) { |             if( FD_ISSET( miniServStopSock, &rdSet ) ) { | ||||||
|  |  | ||||||
|                 clientLen = sizeof( struct sockaddr_in ); |                 clientLen = sizeof( struct sockaddr_in ); | ||||||
|                 memset( ( char * )&clientAddr, 0, |                 memset( ( char * )&clientAddr, 0, | ||||||
|                         sizeof( struct sockaddr_in ) ); |                         sizeof( struct sockaddr_in ) ); | ||||||
| @@ -479,7 +458,6 @@ RunMiniServer( MiniServerSockArray * miniSock ) | |||||||
|                     UpnpPrintf( UPNP_PACKET, MSERV, __FILE__, __LINE__, |                     UpnpPrintf( UPNP_PACKET, MSERV, __FILE__, __LINE__, | ||||||
|                         "Received multicast packet: \n %s\n", |                         "Received multicast packet: \n %s\n", | ||||||
|                         requestBuf ); |                         requestBuf ); | ||||||
|  |  | ||||||
|                     if( NULL != strstr( requestBuf, "ShutDown" ) ) { |                     if( NULL != strstr( requestBuf, "ShutDown" ) ) { | ||||||
|                         break; |                         break; | ||||||
| 		    } | 		    } | ||||||
| @@ -494,30 +472,29 @@ RunMiniServer( MiniServerSockArray * miniSock ) | |||||||
|     UpnpCloseSocket( miniServStopSock ); |     UpnpCloseSocket( miniServStopSock ); | ||||||
|     shutdown( ssdpSock, SD_BOTH ); |     shutdown( ssdpSock, SD_BOTH ); | ||||||
|     UpnpCloseSocket( ssdpSock ); |     UpnpCloseSocket( ssdpSock ); | ||||||
|     CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); | #ifdef INCLUDE_CLIENT_APIS | ||||||
|     CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); |     shutdown( ssdpReqSock, SD_BOTH ); | ||||||
|  |     UpnpCloseSocket( ssdpReqSock ); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|     free( miniSock ); |     free( miniSock ); | ||||||
|  |  | ||||||
|     gMServState = MSERV_IDLE; |     gMServState = MSERV_IDLE; | ||||||
|  |  | ||||||
|     return; |     return; | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: get_port |  * Function: get_port | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		int sockfd ; Socket Descriptor  |  *	int sockfd - Socket Descriptor  | ||||||
|  * |  * | ||||||
| *	Description :	Returns port to which socket, sockfd, is bound. |  * Description: | ||||||
|  |  * 	Returns port to which socket, sockfd, is bound. | ||||||
|  * |  * | ||||||
| *	Return :	int,  |  * Return: int | ||||||
|  *	-1 on error; check errno |  *	-1 on error; check errno | ||||||
|  *	 > 0 means port number |  *	 > 0 means port number | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| static int | static int | ||||||
| get_port( int sockfd ) | get_port( int sockfd ) | ||||||
| @@ -544,24 +521,24 @@ get_port( int sockfd ) | |||||||
|  * Function: get_miniserver_sockets |  * Function: get_miniserver_sockets | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		MiniServerSockArray *out ;	Socket Array |  *	MiniServerSockArray *out   - Socket Array | ||||||
| *		unsigned short listen_port ; port on which the server is listening  |  *	unsigned short listen_port - port on which the server is | ||||||
| *									for incoming connections	 |  *		listening for incoming connections	 | ||||||
|  |  * | ||||||
|  |  * Description: | ||||||
|  |  * 	Creates a STREAM socket, binds to INADDR_ANY and listens for | ||||||
|  |  * 	incoming connecttions. Returns the actual port which the sockets | ||||||
|  |  * 	sub-system returned.  | ||||||
|  * |  * | ||||||
| *	Description :	Creates a STREAM socket, binds to INADDR_ANY and  |  | ||||||
| *		listens for incoming connecttions. Returns the actual port which  |  | ||||||
| *		the sockets sub-system returned.  |  | ||||||
|  *	Also creates a DGRAM socket, binds to the loop back address and  |  *	Also creates a DGRAM socket, binds to the loop back address and  | ||||||
|  *	returns the port allocated by the socket sub-system. |  *	returns the port allocated by the socket sub-system. | ||||||
|  * |  * | ||||||
| *	Return :	int :  |  * Return: int  | ||||||
|  *	UPNP_E_OUTOF_SOCKET - Failed to create a socket |  *	UPNP_E_OUTOF_SOCKET - Failed to create a socket | ||||||
|  *	UPNP_E_SOCKET_BIND - Bind() failed |  *	UPNP_E_SOCKET_BIND - Bind() failed | ||||||
|  *	UPNP_E_LISTEN	- Listen() failed	 |  *	UPNP_E_LISTEN	- Listen() failed	 | ||||||
|  *	UPNP_E_INTERNAL_ERROR - Port returned by the socket layer is < 0 |  *	UPNP_E_INTERNAL_ERROR - Port returned by the socket layer is < 0 | ||||||
|  *	UPNP_E_SUCCESS	- Success |  *	UPNP_E_SUCCESS	- Success | ||||||
| *		 |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| get_miniserver_sockets( MiniServerSockArray * out, | get_miniserver_sockets( MiniServerSockArray * out, | ||||||
| @@ -692,8 +669,8 @@ get_miniserver_sockets( MiniServerSockArray * out, | |||||||
|     miniStopSockPort = get_port( miniServerStopSock ); |     miniStopSockPort = get_port( miniServerStopSock ); | ||||||
|     if( miniStopSockPort <= 0 ) { |     if( miniStopSockPort <= 0 ) { | ||||||
|         shutdown( miniServerStopSock, SD_BOTH ); |         shutdown( miniServerStopSock, SD_BOTH ); | ||||||
|         shutdown( listenfd, SD_BOTH ); |  | ||||||
|         UpnpCloseSocket( miniServerStopSock ); |         UpnpCloseSocket( miniServerStopSock ); | ||||||
|  |         shutdown( listenfd, SD_BOTH ); | ||||||
|         UpnpCloseSocket( listenfd ); |         UpnpCloseSocket( listenfd ); | ||||||
|         return UPNP_E_INTERNAL_ERROR; |         return UPNP_E_INTERNAL_ERROR; | ||||||
|     } |     } | ||||||
| @@ -711,10 +688,11 @@ get_miniserver_sockets( MiniServerSockArray * out, | |||||||
|  * Function: StartMiniServer |  * Function: StartMiniServer | ||||||
|  * |  * | ||||||
|  * Parameters : |  * Parameters : | ||||||
| *		unsigned short listen_port ; Port on which the server listens for  |  *	unsigned short listen_port - Port on which the server listens for  | ||||||
|  *		incoming connections |  *		incoming connections | ||||||
|  * |  * | ||||||
| *	Description :	Initialize the sockets functionality for the  |  * Description: | ||||||
|  |  * 	Initialize the sockets functionality for the  | ||||||
|  *	Miniserver. Initialize a thread pool job to run the MiniServer |  *	Miniserver. Initialize a thread pool job to run the MiniServer | ||||||
|  *	and the job to the thread pool. If listen port is 0, port is  |  *	and the job to the thread pool. If listen port is 0, port is  | ||||||
|  *	dynamically picked |  *	dynamically picked | ||||||
| @@ -722,17 +700,14 @@ get_miniserver_sockets( MiniServerSockArray * out, | |||||||
|  *	Use timer mechanism to start the MiniServer, failure to meet the  |  *	Use timer mechanism to start the MiniServer, failure to meet the  | ||||||
|  *	allowed delay aborts the attempt to launch the MiniServer. |  *	allowed delay aborts the attempt to launch the MiniServer. | ||||||
|  * |  * | ||||||
| *	Return : int ; |  * Return: int | ||||||
| *		Actual port socket is bound to - On Success:  |  *	Actual port socket is bound to - On Success | ||||||
|  *	A negative number UPNP_E_XXX - On Error |  *	A negative number UPNP_E_XXX - On Error | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| StartMiniServer( unsigned short listen_port ) | StartMiniServer( unsigned short listen_port ) | ||||||
| { | { | ||||||
|  |  | ||||||
|     int success; |     int success; | ||||||
|  |  | ||||||
|     int count; |     int count; | ||||||
|     int max_count = 10000; |     int max_count = 10000; | ||||||
|  |  | ||||||
| @@ -755,12 +730,10 @@ StartMiniServer( unsigned short listen_port ) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if( ( success = get_ssdp_sockets( miniSocket ) ) != UPNP_E_SUCCESS ) { |     if( ( success = get_ssdp_sockets( miniSocket ) ) != UPNP_E_SUCCESS ) { | ||||||
|  |  | ||||||
|         shutdown( miniSocket->miniServerSock, SD_BOTH ); |         shutdown( miniSocket->miniServerSock, SD_BOTH ); | ||||||
|         UpnpCloseSocket( miniSocket->miniServerSock ); |         UpnpCloseSocket( miniSocket->miniServerSock ); | ||||||
|         shutdown( miniSocket->miniServerStopSock, SD_BOTH ); |         shutdown( miniSocket->miniServerStopSock, SD_BOTH ); | ||||||
|         UpnpCloseSocket( miniSocket->miniServerStopSock ); |         UpnpCloseSocket( miniSocket->miniServerStopSock ); | ||||||
|  |  | ||||||
|         free( miniSocket ); |         free( miniSocket ); | ||||||
|  |  | ||||||
|         return success; |         return success; | ||||||
| @@ -776,14 +749,15 @@ StartMiniServer( unsigned short listen_port ) | |||||||
|  |  | ||||||
|     if( success < 0 ) { |     if( success < 0 ) { | ||||||
|         shutdown( miniSocket->miniServerSock, SD_BOTH ); |         shutdown( miniSocket->miniServerSock, SD_BOTH ); | ||||||
|         shutdown( miniSocket->miniServerStopSock, SD_BOTH ); |  | ||||||
|         shutdown( miniSocket->ssdpSock, SD_BOTH ); |  | ||||||
|         CLIENTONLY( shutdown( miniSocket->ssdpReqSock, SD_BOTH ) ); |  | ||||||
|         UpnpCloseSocket( miniSocket->miniServerSock ); |         UpnpCloseSocket( miniSocket->miniServerSock ); | ||||||
|  |         shutdown( miniSocket->miniServerStopSock, SD_BOTH ); | ||||||
|         UpnpCloseSocket( miniSocket->miniServerStopSock ); |         UpnpCloseSocket( miniSocket->miniServerStopSock ); | ||||||
|  |         shutdown( miniSocket->ssdpSock, SD_BOTH ); | ||||||
|         UpnpCloseSocket( miniSocket->ssdpSock ); |         UpnpCloseSocket( miniSocket->ssdpSock ); | ||||||
|  | #ifdef INCLUDE_CLIENT_APIS | ||||||
|         CLIENTONLY( UpnpCloseSocket( miniSocket->ssdpReqSock ) ); |         shutdown( miniSocket->ssdpReqSock, SD_BOTH ); | ||||||
|  |         UpnpCloseSocket( miniSocket->ssdpReqSock ); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|         return UPNP_E_OUTOF_MEMORY; |         return UPNP_E_OUTOF_MEMORY; | ||||||
|     } |     } | ||||||
| @@ -796,16 +770,16 @@ StartMiniServer( unsigned short listen_port ) | |||||||
|  |  | ||||||
|     // taking too long to start that thread |     // taking too long to start that thread | ||||||
|     if( count >= max_count ) { |     if( count >= max_count ) { | ||||||
|  |  | ||||||
|         shutdown( miniSocket->miniServerSock, SD_BOTH ); |         shutdown( miniSocket->miniServerSock, SD_BOTH ); | ||||||
|         shutdown( miniSocket->miniServerStopSock, SD_BOTH ); |  | ||||||
|         shutdown( miniSocket->ssdpSock, SD_BOTH ); |  | ||||||
|         CLIENTONLY( shutdown( miniSocket->ssdpReqSock, SD_BOTH ) ); |  | ||||||
|  |  | ||||||
|         UpnpCloseSocket( miniSocket->miniServerSock ); |         UpnpCloseSocket( miniSocket->miniServerSock ); | ||||||
|  |         shutdown( miniSocket->miniServerStopSock, SD_BOTH ); | ||||||
|         UpnpCloseSocket( miniSocket->miniServerStopSock ); |         UpnpCloseSocket( miniSocket->miniServerStopSock ); | ||||||
|  |         shutdown( miniSocket->ssdpSock, SD_BOTH ); | ||||||
|         UpnpCloseSocket( miniSocket->ssdpSock ); |         UpnpCloseSocket( miniSocket->ssdpSock ); | ||||||
|         CLIENTONLY( UpnpCloseSocket( miniSocket->ssdpReqSock ) ); | #ifdef INCLUDE_CLIENT_APIS | ||||||
|  |         shutdown( miniSocket->ssdpReqSock, SD_BOTH ); | ||||||
|  |         UpnpCloseSocket( miniSocket->ssdpReqSock ); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|         return UPNP_E_INTERNAL_ERROR; |         return UPNP_E_INTERNAL_ERROR; | ||||||
|     } |     } | ||||||
| @@ -817,30 +791,30 @@ StartMiniServer( unsigned short listen_port ) | |||||||
|  * Function: StopMiniServer |  * Function: StopMiniServer | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		void ;	 |  *	void | ||||||
|  * |  * | ||||||
| *	Description :	Stop and Shutdown the MiniServer and free socket  |  * Description: | ||||||
|  |  * 	Stop and Shutdown the MiniServer and free socket  | ||||||
|  *	resources. |  *	resources. | ||||||
|  * |  * | ||||||
| *	Return : int ; |  * Return: int | ||||||
|  *		Always returns 0  |  *		Always returns 0  | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| StopMiniServer( void ) | StopMiniServer( void ) | ||||||
| { | { | ||||||
|  |  | ||||||
|     int socklen = sizeof( struct sockaddr_in ), |     int socklen = sizeof( struct sockaddr_in ); | ||||||
|       sock; |     int sock; | ||||||
|     struct sockaddr_in ssdpAddr; |     struct sockaddr_in ssdpAddr; | ||||||
|     char buf[256] = "ShutDown"; |     char buf[256] = "ShutDown"; | ||||||
|     int bufLen = strlen( buf ); |     int bufLen = strlen( buf ); | ||||||
|  |  | ||||||
|     if( gMServState == MSERV_RUNNING ) |     if( gMServState == MSERV_RUNNING ) { | ||||||
|         gMServState = MSERV_STOPPING; |         gMServState = MSERV_STOPPING; | ||||||
|     else |     } else { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     sock = socket( AF_INET, SOCK_DGRAM, 0 ); |     sock = socket( AF_INET, SOCK_DGRAM, 0 ); | ||||||
|     if( sock == UPNP_INVALID_SOCKET ) { |     if( sock == UPNP_INVALID_SOCKET ) { | ||||||
| @@ -864,3 +838,4 @@ StopMiniServer( void ) | |||||||
|     UpnpCloseSocket( sock ); |     UpnpCloseSocket( sock ); | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -70,8 +70,10 @@ | |||||||
| #include "sock.h" | #include "sock.h" | ||||||
| #include "webserver.h" | #include "webserver.h" | ||||||
|  |  | ||||||
| #define DOSOCKET_READ	1 |  | ||||||
| #define DOSOCKET_WRITE	0 | const int CHUNK_HEADER_SIZE = 10; | ||||||
|  | const int CHUNK_TAIL_SIZE = 10; | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_FixUrl |  * Function: http_FixUrl | ||||||
| @@ -80,7 +82,8 @@ | |||||||
|  *	IN uri_type* url;		URL to be validated and fixed |  *	IN uri_type* url;		URL to be validated and fixed | ||||||
|  *	OUT uri_type* fixed_url;	URL after being fixed. |  *	OUT uri_type* fixed_url;	URL after being fixed. | ||||||
|  * |  * | ||||||
| * Description: Validates URL |  * Description: | ||||||
|  |  *	Validates URL | ||||||
|  * |  * | ||||||
|  * Returns: |  * Returns: | ||||||
|  *	 UPNP_E_INVALID_URL |  *	 UPNP_E_INVALID_URL | ||||||
| @@ -110,6 +113,7 @@ http_FixUrl( IN uri_type * url, | |||||||
|     return UPNP_E_SUCCESS; |     return UPNP_E_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_FixStrUrl |  * Function: http_FixStrUrl | ||||||
|  * |  * | ||||||
| @@ -118,7 +122,8 @@ http_FixUrl( IN uri_type * url, | |||||||
|  *	IN int urlstrlen ; 		Length of the character string |  *	IN int urlstrlen ; 		Length of the character string | ||||||
|  *	OUT uri_type* fixed_url	;	Fixed and corrected URL |  *	OUT uri_type* fixed_url	;	Fixed and corrected URL | ||||||
|  * |  * | ||||||
| * Description: Parses URL and then validates URL |  * Description: | ||||||
|  |  *	Parses URL and then validates URL | ||||||
|  * |  * | ||||||
|  * Returns: |  * Returns: | ||||||
|  *	 UPNP_E_INVALID_URL |  *	 UPNP_E_INVALID_URL | ||||||
| @@ -138,6 +143,7 @@ http_FixStrUrl( IN char *urlstr, | |||||||
|     return http_FixUrl( &url, fixed_url ); |     return http_FixUrl( &url, fixed_url ); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_Connect |  * Function: http_Connect | ||||||
|  * |  * | ||||||
| @@ -145,8 +151,8 @@ http_FixStrUrl( IN char *urlstr, | |||||||
|  *	IN uri_type* destination_url;	URL containing destination information |  *	IN uri_type* destination_url;	URL containing destination information | ||||||
|  *	OUT uri_type *url;		Fixed and corrected URL |  *	OUT uri_type *url;		Fixed and corrected URL | ||||||
|  * |  * | ||||||
| * Description: Gets destination address from URL and then connects to the  |  * Description: | ||||||
| *	remote end |  *	Gets destination address from URL and then connects to the remote end | ||||||
|  * |  * | ||||||
|  *  Returns: |  *  Returns: | ||||||
|  *	socket descriptor on sucess |  *	socket descriptor on sucess | ||||||
| @@ -180,19 +186,21 @@ http_Connect( IN uri_type * destination_url, | |||||||
|     return connfd; |     return connfd; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_RecvMessage |  * Function: http_RecvMessage | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
|  *	IN SOCKINFO *info;			Socket information object |  *	IN SOCKINFO *info;			Socket information object | ||||||
| *	OUT http_parser_t* parser,		HTTP parser object |  *	OUT http_parser_t* parser;		HTTP parser object | ||||||
|  *	IN http_method_t request_method;	HTTP request method |  *	IN http_method_t request_method;	HTTP request method | ||||||
|  *	IN OUT int* timeout_secs;		time out |  *	IN OUT int* timeout_secs;		time out | ||||||
|  *	OUT int* http_error_code;		HTTP error code returned |  *	OUT int* http_error_code;		HTTP error code returned | ||||||
|  * |  * | ||||||
| * Description: Get the data on the socket and take actions based on the  |  * Description: | ||||||
| *	read data to modify the parser objects buffer. If an error is reported  |  *	Get the data on the socket and take actions based on the read data | ||||||
| *	while parsing the data, the error code is passed in the http_errr_code  |  *	to modify the parser objects buffer. If an error is reported while | ||||||
|  |  *	parsing the data, the error code is passed in the http_errr_code | ||||||
|  *	parameter |  *	parameter | ||||||
|  * |  * | ||||||
|  * Returns: |  * Returns: | ||||||
| @@ -266,6 +274,7 @@ http_RecvMessage( IN SOCKINFO * info, | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_SendMessage |  * Function: http_SendMessage | ||||||
|  * |  * | ||||||
| @@ -274,7 +283,8 @@ http_RecvMessage( IN SOCKINFO * info, | |||||||
|  *	IN OUT int * TimeOut ;		time out value |  *	IN OUT int * TimeOut ;		time out value | ||||||
|  *	IN const char* fmt, ...	 Pattern format to take actions upon |  *	IN const char* fmt, ...	 Pattern format to take actions upon | ||||||
|  * |  * | ||||||
| * Description: Sends a message to the destination based on the |  * Description: | ||||||
|  |  *	Sends a message to the destination based on the | ||||||
|  *	IN const char* fmt parameter |  *	IN const char* fmt parameter | ||||||
|  *	fmt types: |  *	fmt types: | ||||||
|  *		'f':	arg = const char * file name |  *		'f':	arg = const char * file name | ||||||
| @@ -297,22 +307,19 @@ http_SendMessage( IN SOCKINFO * info, | |||||||
|                   IN const char *fmt, |                   IN const char *fmt, | ||||||
|                   ... ) |                   ... ) | ||||||
| { | { | ||||||
| #define CHUNK_HEADER_SIZE 10 |  | ||||||
| #define CHUNK_TAIL_SIZE 10 |  | ||||||
|  |  | ||||||
|     char c; |     char c; | ||||||
|     char *buf = NULL; |     char *buf = NULL; | ||||||
|     size_t buf_length; |     size_t buf_length; | ||||||
|     char *filename = NULL; |     char *filename = NULL; | ||||||
|     FILE *Fp; |     FILE *Fp; | ||||||
|     int num_read, |     int num_read; | ||||||
|       num_written; |     int num_written; | ||||||
|     off_t amount_to_be_read = 0; |     off_t amount_to_be_read = 0; | ||||||
|     va_list argp; |     va_list argp; | ||||||
|     char *file_buf = NULL, |     char *file_buf = NULL; | ||||||
|      *ChunkBuf = NULL; |     char *ChunkBuf = NULL; | ||||||
|     struct SendInstruction *Instr = NULL; |     struct SendInstruction *Instr = NULL; | ||||||
|     char Chunk_Header[10]; |     char Chunk_Header[CHUNK_HEADER_SIZE]; | ||||||
|     int RetVal = 0; |     int RetVal = 0; | ||||||
|  |  | ||||||
|     // 10 byte allocated for chunk header. |     // 10 byte allocated for chunk header. | ||||||
| @@ -322,44 +329,40 @@ http_SendMessage( IN SOCKINFO * info, | |||||||
|  |  | ||||||
|     while( ( c = *fmt++ ) != 0 ) { |     while( ( c = *fmt++ ) != 0 ) { | ||||||
|         if( c == 'I' ) { |         if( c == 'I' ) { | ||||||
|             Instr = ( struct SendInstruction * ) |             Instr = va_arg(argp, struct SendInstruction *); | ||||||
|                 va_arg( argp, struct SendInstruction * ); |  | ||||||
|  |  | ||||||
|             assert( Instr ); |             assert( Instr ); | ||||||
|  |  | ||||||
|             if( Instr->ReadSendSize >= 0 ) |             if( Instr->ReadSendSize >= 0 ) { | ||||||
|                 amount_to_be_read = Instr->ReadSendSize; |                 amount_to_be_read = Instr->ReadSendSize; | ||||||
|             else |             } else { | ||||||
|                 amount_to_be_read = Data_Buf_Size; |                 amount_to_be_read = Data_Buf_Size; | ||||||
|  |  | ||||||
|             if( amount_to_be_read < WEB_SERVER_BUF_SIZE ) |  | ||||||
|                 Data_Buf_Size = amount_to_be_read; |  | ||||||
|  |  | ||||||
|             ChunkBuf = ( char * )malloc( Data_Buf_Size + |  | ||||||
|                                          CHUNK_HEADER_SIZE + |  | ||||||
|                                          CHUNK_TAIL_SIZE ); |  | ||||||
|             if( !ChunkBuf ) |  | ||||||
|                 return UPNP_E_OUTOF_MEMORY; |  | ||||||
|  |  | ||||||
|             file_buf = ChunkBuf + 10; |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|         if( c == 'f' ) {        // file name |             if( amount_to_be_read < WEB_SERVER_BUF_SIZE ) { | ||||||
|  |                 Data_Buf_Size = amount_to_be_read; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             filename = ( char * )va_arg( argp, char * ); |             ChunkBuf = (char *)malloc( | ||||||
|  |                 Data_Buf_Size + CHUNK_HEADER_SIZE + CHUNK_TAIL_SIZE); | ||||||
|  |             if( !ChunkBuf ) { | ||||||
|  |                 return UPNP_E_OUTOF_MEMORY; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             if( Instr && Instr->IsVirtualFile ) |             file_buf = ChunkBuf + CHUNK_HEADER_SIZE; | ||||||
|                 Fp = virtualDirCallback.open( filename, UPNP_READ ); |         } else if( c == 'f' ) { | ||||||
|             else |             // file name | ||||||
|  |             filename = va_arg(argp, char *); | ||||||
|  |             if( Instr && Instr->IsVirtualFile ) { | ||||||
|  |                 Fp = (virtualDirCallback.open)( filename, UPNP_READ ); | ||||||
|  |             } else  { | ||||||
|                 Fp = fopen( filename, "rb" ); |                 Fp = fopen( filename, "rb" ); | ||||||
|  |             } | ||||||
|             if( Fp == NULL ) { |             if( Fp == NULL ) { | ||||||
|                 free( ChunkBuf ); |                 free( ChunkBuf ); | ||||||
|                 return UPNP_E_FILE_READ_ERROR; |                 return UPNP_E_FILE_READ_ERROR; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             assert( Fp ); |  | ||||||
|  |  | ||||||
|             if( Instr && Instr->IsRangeActive && Instr->IsVirtualFile ) { |             if( Instr && Instr->IsRangeActive && Instr->IsVirtualFile ) { | ||||||
|                 if( virtualDirCallback.seek( Fp, Instr->RangeOffset, |                 if( virtualDirCallback.seek( Fp, Instr->RangeOffset, | ||||||
|                                              SEEK_CUR ) != 0 ) { |                                              SEEK_CUR ) != 0 ) { | ||||||
| @@ -375,26 +378,14 @@ http_SendMessage( IN SOCKINFO * info, | |||||||
|  |  | ||||||
|             while( amount_to_be_read ) { |             while( amount_to_be_read ) { | ||||||
|                 if( Instr ) { |                 if( Instr ) { | ||||||
|                     if( amount_to_be_read >= Data_Buf_Size ) { |                     int n = (amount_to_be_read >= Data_Buf_Size) ? | ||||||
|                         if( Instr->IsVirtualFile ) |                         Data_Buf_Size : amount_to_be_read; | ||||||
|                             num_read = virtualDirCallback.read( Fp, |                     if( Instr->IsVirtualFile ) { | ||||||
|                                                                 file_buf, |                         num_read = virtualDirCallback.read( Fp, file_buf, n ); | ||||||
|                                                                 Data_Buf_Size ); |  | ||||||
|                         else |  | ||||||
|                             num_read = fread( file_buf, 1, Data_Buf_Size, |  | ||||||
|                                               Fp ); |  | ||||||
|                     } else { |                     } else { | ||||||
|                         if( Instr->IsVirtualFile ) |                         num_read = fread( file_buf, 1, n, Fp ); | ||||||
|                             num_read = virtualDirCallback.read( Fp, |  | ||||||
|                                                                 file_buf, |  | ||||||
|                                                                 amount_to_be_read ); |  | ||||||
|                         else |  | ||||||
|                             num_read = fread( file_buf, 1, |  | ||||||
|                                               amount_to_be_read, Fp ); |  | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|                     amount_to_be_read = amount_to_be_read - num_read; |                     amount_to_be_read = amount_to_be_read - num_read; | ||||||
|  |  | ||||||
|                     if( Instr->ReadSendSize < 0 ) { |                     if( Instr->ReadSendSize < 0 ) { | ||||||
|                         // read until close |                         // read until close | ||||||
|                         amount_to_be_read = Data_Buf_Size; |                         amount_to_be_read = Data_Buf_Size; | ||||||
| @@ -403,12 +394,11 @@ http_SendMessage( IN SOCKINFO * info, | |||||||
|                     num_read = fread( file_buf, 1, Data_Buf_Size, Fp ); |                     num_read = fread( file_buf, 1, Data_Buf_Size, Fp ); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 if( num_read == 0 ) // EOF so no more to send. |                 if( num_read == 0 ) { | ||||||
|                 { |                     // EOF so no more to send. | ||||||
|                     if( Instr && Instr->IsChunkActive ) { |                     if( Instr && Instr->IsChunkActive ) { | ||||||
|                         num_written = sock_write( info, "0\r\n\r\n", |                         char *str = "0\r\n\r\n"; | ||||||
|                                                   strlen( "0\r\n\r\n" ), |                         num_written = sock_write(info, str, strlen(str), TimeOut); | ||||||
|                                                   TimeOut ); |  | ||||||
|                     } else { |                     } else { | ||||||
|                         RetVal = UPNP_E_FILE_READ_ERROR; |                         RetVal = UPNP_E_FILE_READ_ERROR; | ||||||
|                     } |                     } | ||||||
| @@ -432,54 +422,51 @@ http_SendMessage( IN SOCKINFO * info, | |||||||
|                     // on the top of the buffer. |                     // on the top of the buffer. | ||||||
|                     //file_buf[num_read+strlen(Chunk_Header)] = NULL; |                     //file_buf[num_read+strlen(Chunk_Header)] = NULL; | ||||||
|                     //printf("Sending %s\n",file_buf-strlen(Chunk_Header)); |                     //printf("Sending %s\n",file_buf-strlen(Chunk_Header)); | ||||||
|                     num_written = sock_write( info, |                     num_written = sock_write( | ||||||
|                                               file_buf - |                         info, file_buf - strlen( Chunk_Header ), | ||||||
|                                               strlen( Chunk_Header ), |                         num_read + strlen( Chunk_Header ) + 2, TimeOut ); | ||||||
|                                               num_read + |  | ||||||
|                                               strlen( Chunk_Header ) + 2, |  | ||||||
|                                               TimeOut ); |  | ||||||
|  |  | ||||||
|                     if( num_written != |                     if( num_written != | ||||||
|                         num_read + ( int )strlen( Chunk_Header ) |                         num_read + ( int )strlen( Chunk_Header ) + 2 ) { | ||||||
|                         + 2 ) { |                         // Send error nothing we can do. | ||||||
|                         goto Cleanup_File;  //Send error nothing we can do. |                         goto Cleanup_File; | ||||||
|                     } |                     } | ||||||
|                 } else { |                 } else { | ||||||
|                     // write data |                     // write data | ||||||
|                     num_written = sock_write( info, file_buf, num_read, |                     num_written = sock_write( info, file_buf, num_read, TimeOut ); | ||||||
|                                               TimeOut ); |  | ||||||
|  |  | ||||||
|                     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |                     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                         ">>> (SENT) >>>\n%.*s\n------------\n", |                         ">>> (SENT) >>>\n%.*s\n------------\n", | ||||||
|                         ( int )num_written, file_buf ); |                         ( int )num_written, file_buf ); | ||||||
|  |  | ||||||
|                     // Send error nothing we can do |                     // Send error nothing we can do | ||||||
|                     if( num_written != num_read ) { |                     if( num_written != num_read ) { | ||||||
|                         goto Cleanup_File; |                         goto Cleanup_File; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }                   //While |             } // while | ||||||
| Cleanup_File: | Cleanup_File: | ||||||
|             va_end( argp ); |             va_end( argp ); | ||||||
|             if( Instr && Instr->IsVirtualFile ) |             if( Instr && Instr->IsVirtualFile ) { | ||||||
|                 virtualDirCallback.close( Fp ); |                 virtualDirCallback.close( Fp ); | ||||||
|             else | 	    } else { | ||||||
|                 fclose( Fp ); |                 fclose( Fp ); | ||||||
|  | 	    } | ||||||
|             free( ChunkBuf ); |             free( ChunkBuf ); | ||||||
|             return RetVal; |             return RetVal; | ||||||
|  |  | ||||||
|         } else if( c == 'b' ) { // memory buffer |         } else if( c == 'b' ) { | ||||||
|  |             // memory buffer | ||||||
|             buf = ( char * )va_arg( argp, char * ); |             buf = va_arg(argp, char *); | ||||||
|  |             buf_length = va_arg(argp, size_t); | ||||||
|             buf_length = ( size_t ) va_arg( argp, size_t ); |  | ||||||
|             if( buf_length > 0 ) { |             if( buf_length > 0 ) { | ||||||
|                 num_written = sock_write( info, buf, buf_length, TimeOut ); |                 num_written = sock_write( info, buf, buf_length, TimeOut ); | ||||||
|                 if( ( size_t ) num_written != buf_length ) |  | ||||||
|                     goto end; |  | ||||||
|                 UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |                 UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                     ">>> (SENT) >>>\n%.*s\n------------\n", |                     ">>> (SENT) >>>\n" | ||||||
|                     ( int )buf_length, buf ); | 		    "%.*s\nbuf_length=%d, num_written=%d\n" | ||||||
|  | 		    "------------\n", | ||||||
|  |                     (int)buf_length, buf, (int)buf_length, num_written ); | ||||||
|  |                 if( (size_t)num_written != buf_length ) { | ||||||
|  |                     goto end; | ||||||
|  | 		} | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -490,6 +477,7 @@ http_SendMessage( IN SOCKINFO * info, | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_RequestAndResponse |  * Function: http_RequestAndResponse | ||||||
|  * |  * | ||||||
| @@ -502,7 +490,8 @@ http_SendMessage( IN SOCKINFO * info, | |||||||
|  *	IN int timeout_secs;		time out value |  *	IN int timeout_secs;		time out value | ||||||
|  *	OUT http_parser_t* response;	Parser object to receive the repsonse |  *	OUT http_parser_t* response;	Parser object to receive the repsonse | ||||||
|  * |  * | ||||||
| * Description: Initiates socket, connects to the destination, sends a |  * Description: | ||||||
|  |  *	Initiates socket, connects to the destination, sends a | ||||||
|  *	request and waits for the response from the remote end |  *	request and waits for the response from the remote end | ||||||
|  * |  * | ||||||
|  * Returns: |  * Returns: | ||||||
| @@ -562,25 +551,25 @@ http_RequestAndResponse( IN uri_type * destination, | |||||||
|     return ret_code; |     return ret_code; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_Download |  * Function: http_Download | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *	IN const char* url_str:	String as a URL |  *	IN const char* url_str;	String as a URL | ||||||
| *	IN int timeout_secs:	time out value |  *	IN int timeout_secs;	time out value | ||||||
| *	OUT char** document:	buffer to store the document extracted |  *	OUT char** document;	buffer to store the document extracted | ||||||
|  *				from the donloaded message. |  *				from the donloaded message. | ||||||
| *	OUT int* doc_length:	length of the extracted document |  *	OUT int* doc_length;	length of the extracted document | ||||||
| *	OUT char* content_type:	Type of content |  *	OUT char* content_type;	Type of content | ||||||
|  * |  * | ||||||
| * Description :	Download the document message and extract the document  |  * Description: | ||||||
|  |  *	Download the document message and extract the document  | ||||||
|  *	from the message. |  *	from the message. | ||||||
|  * |  * | ||||||
| * Return : int; |  * Return: int | ||||||
| *	UPNP_E_SUCCESS; |  *	UPNP_E_SUCCESS | ||||||
| *	UPNP_E_INVALID_URL; |  *	UPNP_E_INVALID_URL | ||||||
| * |  | ||||||
| * Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| http_Download( IN const char *url_str, | http_Download( IN const char *url_str, | ||||||
| @@ -682,8 +671,8 @@ http_Download( IN const char *url_str, | |||||||
|     if( ( *doc_length = ( int )response.msg.entity.length ) == 0 ) { |     if( ( *doc_length = ( int )response.msg.entity.length ) == 0 ) { | ||||||
|         // 0-length msg |         // 0-length msg | ||||||
|         *document = NULL; |         *document = NULL; | ||||||
|     } else if( response.msg.status_code == HTTP_OK )    //LEAK_FIX_MK |     } else if( response.msg.status_code == HTTP_OK ) { | ||||||
|     { |         //LEAK_FIX_MK | ||||||
|         // copy entity |         // copy entity | ||||||
|         entity_start = response.msg.entity.buf; // what we want |         entity_start = response.msg.entity.buf; // what we want | ||||||
|         msg_length = response.msg.msg.length;   // save for posterity    |         msg_length = response.msg.msg.length;   // save for posterity    | ||||||
| @@ -725,12 +714,13 @@ typedef struct HTTPPOSTHANDLE { | |||||||
|  * Parameters: |  * Parameters: | ||||||
|  *	const char *url_str;		String as a URL |  *	const char *url_str;		String as a URL | ||||||
|  *	membuffer *request;		Buffer containing the request |  *	membuffer *request;		Buffer containing the request | ||||||
| *	uri_type *url ; 			URI object containing the scheme, path  |  *	uri_type *url; 			URI object containing the scheme, | ||||||
| *								query token, etc. |  *					path query token, etc. | ||||||
|  *	int contentLength;		length of content |  *	int contentLength;		length of content | ||||||
|  *	const char *contentType;	Type of content |  *	const char *contentType;	Type of content | ||||||
|  * |  * | ||||||
| * Description: Makes the message for the HTTP POST message				 |  * Description: | ||||||
|  |  *	Makes the message for the HTTP POST message | ||||||
|  * |  * | ||||||
|  * Returns: |  * Returns: | ||||||
|  *	UPNP_E_INVALID_URL |  *	UPNP_E_INVALID_URL | ||||||
| @@ -832,15 +822,14 @@ MakePostMessage( const char *url_str, | |||||||
|  *	IN unsigned int *size:	Size of the data to be sent. |  *	IN unsigned int *size:	Size of the data to be sent. | ||||||
|  *	IN int timeout:		time out value |  *	IN int timeout:		time out value | ||||||
|  * |  * | ||||||
| *	Description :	Formats data if format used is UPNP_USING_CHUNKED. |  * Description: | ||||||
|  |  *	Formats data if format used is UPNP_USING_CHUNKED. | ||||||
|  *	Writes data on the socket connected to the peer. |  *	Writes data on the socket connected to the peer. | ||||||
|  * |  * | ||||||
| *	Return : int ; |  * Return: int | ||||||
|  *	UPNP_E_SUCCESS - On Success |  *	UPNP_E_SUCCESS - On Success | ||||||
|  *	UPNP_E_INVALID_PARAM - Invalid Parameter |  *	UPNP_E_INVALID_PARAM - Invalid Parameter | ||||||
|  *	-1 - On Socket Error. |  *	-1 - On Socket Error. | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| http_WriteHttpPost( IN void *Handle, | http_WriteHttpPost( IN void *Handle, | ||||||
| @@ -862,17 +851,18 @@ http_WriteHttpPost( IN void *Handle, | |||||||
|     if( handle->contentLength == UPNP_USING_CHUNKED ) { |     if( handle->contentLength == UPNP_USING_CHUNKED ) { | ||||||
|         if( ( *size ) ) { |         if( ( *size ) ) { | ||||||
|             int tempSize = 0; |             int tempSize = 0; | ||||||
|  |             tempbuf = ( char * )malloc( | ||||||
|  |                 *size + CHUNK_HEADER_SIZE + CHUNK_TAIL_SIZE ); | ||||||
|  |             if ( tempbuf == NULL) { | ||||||
|  |                 return UPNP_E_OUTOF_MEMORY; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             tempbuf = | 	    // begin chunk | ||||||
|                 ( char * )malloc( ( *size ) + CHUNK_HEADER_SIZE + |             sprintf( tempbuf, "%x\r\n", ( *size ) ); | ||||||
|                                   CHUNK_TAIL_SIZE ); |  | ||||||
|  |  | ||||||
|             if ( tempbuf == NULL) return UPNP_E_OUTOF_MEMORY; |  | ||||||
|  |  | ||||||
|             sprintf( tempbuf, "%x\r\n", ( *size ) );    //begin chunk |  | ||||||
|             tempSize = strlen( tempbuf ); |             tempSize = strlen( tempbuf ); | ||||||
|             memcpy( tempbuf + tempSize, buf, ( *size ) ); |             memcpy( tempbuf + tempSize, buf, ( *size ) ); | ||||||
|             memcpy( tempbuf + tempSize + ( *size ), "\r\n", 2 );    //end of chunk |             memcpy( tempbuf + tempSize + ( *size ), "\r\n", 2 ); | ||||||
|  |             // end of chunk | ||||||
|             tempbufSize = tempSize + ( *size ) + 2; |             tempbufSize = tempSize + ( *size ) + 2; | ||||||
|             freeTempbuf = 1; |             freeTempbuf = 1; | ||||||
|         } |         } | ||||||
| @@ -901,20 +891,19 @@ http_WriteHttpPost( IN void *Handle, | |||||||
|  * Function: http_CloseHttpPost |  * Function: http_CloseHttpPost | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN void *Handle :			Handle to the http post object |  *	IN void *Handle;	Handle to the http post object | ||||||
| *		IN OUT int *httpStatus :	HTTP status returned on receiving a |  *	IN OUT int *httpStatus;	HTTP status returned on receiving a | ||||||
|  *				response message |  *				response message | ||||||
| *		IN int timeout :			time out value |  *	IN int timeout;		time out value | ||||||
|  * |  * | ||||||
| *	Description :	Sends remaining data if using  UPNP_USING_CHUNKED  |  * Description: | ||||||
|  |  *	Sends remaining data if using  UPNP_USING_CHUNKED  | ||||||
|  *	format. Receives any more messages. Destroys socket and any socket |  *	format. Receives any more messages. Destroys socket and any socket | ||||||
|  *	associated memory. Frees handle associated with the HTTP POST msg. |  *	associated memory. Frees handle associated with the HTTP POST msg. | ||||||
|  * |  * | ||||||
| *	Return : int ; |  * Return: int | ||||||
| *		UPNP_E_SUCCESS - On Sucess ; |  *	UPNP_E_SUCCESS		- On Sucess | ||||||
| *		UPNP_E_INVALID_PARAM  - Invalid Parameter; |  *	UPNP_E_INVALID_PARAM	- Invalid Parameter | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| http_CloseHttpPost( IN void *Handle, | http_CloseHttpPost( IN void *Handle, | ||||||
| @@ -955,25 +944,24 @@ http_CloseHttpPost( IN void *Handle, | |||||||
|  * Function: http_OpenHttpPost |  * Function: http_OpenHttpPost | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN const char *url_str :		String as a URL	 |  *	IN const char *url_str;		String as a URL	 | ||||||
| *		IN OUT void **Handle :			Pointer to buffer to store HTTP |  *	IN OUT void **Handle;		Pointer to buffer to store HTTP | ||||||
|  *					post handle |  *					post handle | ||||||
| *		IN const char *contentType :	Type of content |  *	IN const char *contentType;	Type of content | ||||||
| *		IN int contentLength :			length of content |  *	IN int contentLength;		length of content | ||||||
| *		IN int timeout :				time out value |  *	IN int timeout;			time out value | ||||||
|  * |  * | ||||||
| *	Description :	Makes the HTTP POST message, connects to the peer,  |  * Description: | ||||||
|  |  *	Makes the HTTP POST message, connects to the peer,  | ||||||
|  *	sends the HTTP POST request. Adds the post handle to buffer of  |  *	sends the HTTP POST request. Adds the post handle to buffer of  | ||||||
|  *	such handles |  *	such handles | ||||||
|  * |  * | ||||||
|  * Return : int; |  * Return : int; | ||||||
| *		UPNP_E_SUCCESS - On Sucess ; |  *	UPNP_E_SUCCESS		- On Sucess | ||||||
| *		UPNP_E_INVALID_PARAM - Invalid Paramter ; |  *	UPNP_E_INVALID_PARAM	- Invalid Parameter | ||||||
| *		UPNP_E_OUTOF_MEMORY ; |  *	UPNP_E_OUTOF_MEMORY | ||||||
| *		UPNP_E_SOCKET_ERROR ; |  *	UPNP_E_SOCKET_ERROR | ||||||
| *		UPNP_E_SOCKET_CONNECT ; |  *	UPNP_E_SOCKET_CONNECT | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| http_OpenHttpPost( IN const char *url_str, | http_OpenHttpPost( IN const char *url_str, | ||||||
| @@ -1061,7 +1049,8 @@ typedef struct HTTPGETHANDLE { | |||||||
| *	uri_type *url ; 	URI object containing the scheme, path  | *	uri_type *url ; 	URI object containing the scheme, path  | ||||||
| *				query token, etc. | *				query token, etc. | ||||||
| * | * | ||||||
| * Description: Makes the message for the HTTP GET method				 | * Description: | ||||||
|  | *	Makes the message for the HTTP GET method | ||||||
| * | * | ||||||
| * Returns: | * Returns: | ||||||
| *	UPNP_E_INVALID_URL | *	UPNP_E_INVALID_URL | ||||||
| @@ -1151,16 +1140,15 @@ MakeGetMessage( const char *url_str, | |||||||
|  *	IN OUT int *timeout_secs;	time out value |  *	IN OUT int *timeout_secs;	time out value | ||||||
|  *	IN OUT int *http_error_code;	HTTP errror code returned |  *	IN OUT int *http_error_code;	HTTP errror code returned | ||||||
|  * |  * | ||||||
| *	Description : Parses already exiting data. If not complete reads more  |  * Description: | ||||||
|  |  *	Parses already exiting data. If not complete reads more  | ||||||
|  *	data on the connected socket. The read data is then parsed. The  |  *	data on the connected socket. The read data is then parsed. The  | ||||||
|  *	same methid is carried out for headers. |  *	same methid is carried out for headers. | ||||||
|  * |  * | ||||||
| *	Return : int ; |  * Return: int | ||||||
|  *	PARSE_OK - On Success |  *	PARSE_OK - On Success | ||||||
|  *	PARSE_FAILURE - Failure to parse data correctly |  *	PARSE_FAILURE - Failure to parse data correctly | ||||||
|  *	UPNP_E_BAD_HTTPMSG - Socker read() returns an error |  *	UPNP_E_BAD_HTTPMSG - Socker read() returns an error | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| ReadResponseLineAndHeaders( IN SOCKINFO * info, | ReadResponseLineAndHeaders( IN SOCKINFO * info, | ||||||
| @@ -1271,22 +1259,21 @@ ReadResponseLineAndHeaders( IN SOCKINFO * info, | |||||||
|  * Function: http_ReadHttpGet |  * Function: http_ReadHttpGet | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *	IN void *Handle :		Handle to the HTTP get object |  *	IN void *Handle;		Handle to the HTTP get object | ||||||
| *	IN OUT char *buf :		Buffer to get the read and parsed data |  *	IN OUT char *buf;		Buffer to get the read and parsed data | ||||||
| *	IN OUT unsigned int *size :	Size of the buffer passed |  *	IN OUT unsigned int *size;	Size of the buffer passed | ||||||
| *	IN int timeout :		time out value |  *	IN int timeout;			time out value | ||||||
|  * |  * | ||||||
| * Description :	Parses already existing data, then gets new data. |  * Description: | ||||||
|  |  *	Parses already existing data, then gets new data. | ||||||
|  *	Parses and extracts information from the new data. |  *	Parses and extracts information from the new data. | ||||||
|  * |  * | ||||||
| * Return : int ; |  * Return: int | ||||||
| *	UPNP_E_SUCCESS - On Sucess ; |  *	UPNP_E_SUCCESS		- On Sucess | ||||||
| *	UPNP_E_INVALID_PARAM  - Invalid Parameter; |  *	UPNP_E_INVALID_PARAM	- Invalid Parameter | ||||||
| *	UPNP_E_BAD_RESPONSE ; |  *	UPNP_E_BAD_RESPONSE | ||||||
| *	UPNP_E_BAD_HTTPMSG ; |  *	UPNP_E_BAD_HTTPMSG | ||||||
| *	UPNP_E_CANCELED ; |  *	UPNP_E_CANCELED | ||||||
| * |  | ||||||
| * Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| http_ReadHttpGet( IN void *Handle, | http_ReadHttpGet( IN void *Handle, | ||||||
| @@ -1396,18 +1383,16 @@ http_ReadHttpGet( IN void *Handle, | |||||||
|  * Function: http_HttpGetProgress |  * Function: http_HttpGetProgress | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN void *Handle :			Handle to the HTTP get object |  *	IN void *Handle;		Handle to the HTTP get object | ||||||
| *		OUT unsigned int *length :	Buffer to get the read and parsed data |  *	OUT unsigned int *length;	Buffer to get the read and parsed data | ||||||
| *		OUT unsigned int *total :	Size of tge buffer passed |  *	OUT unsigned int *total;	Size of tge buffer passed | ||||||
|  * |  * | ||||||
| *	Description :	Extracts information from the Handle to the HTTP get |  * Description: | ||||||
| *					object. |  *	Extracts information from the Handle to the HTTP get object. | ||||||
|  * |  * | ||||||
| *	Return : int ; |  * Return: int | ||||||
| *		UPNP_E_SUCCESS - On Sucess ; |  *	UPNP_E_SUCCESS		- On Sucess | ||||||
| *		UPNP_E_INVALID_PARAM  - Invalid Parameter; |  *	UPNP_E_INVALID_PARAM	- Invalid Parameter | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_HttpGetProgress( IN void *Handle,  | int http_HttpGetProgress( IN void *Handle,  | ||||||
|                       OUT unsigned int *length, |                       OUT unsigned int *length, | ||||||
| @@ -1429,13 +1414,12 @@ int http_HttpGetProgress( IN void *Handle, | |||||||
|  * Parameters: |  * Parameters: | ||||||
|  *	IN void *Handle;	Handle to HTTP get object |  *	IN void *Handle;	Handle to HTTP get object | ||||||
|  * |  * | ||||||
| *	Description :	Set the cancel flag of the HttpGet handle |  * Description: | ||||||
|  |  *	Set the cancel flag of the HttpGet handle | ||||||
|  * |  * | ||||||
| *	Return : int ; |  * Return: int | ||||||
|  *	UPNP_E_SUCCESS		- On Success |  *	UPNP_E_SUCCESS		- On Success | ||||||
|  *	UPNP_E_INVALID_PARAM	- Invalid Parameter |  *	UPNP_E_INVALID_PARAM	- Invalid Parameter | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| http_CancelHttpGet( IN void *Handle ) | http_CancelHttpGet( IN void *Handle ) | ||||||
| @@ -1458,14 +1442,13 @@ http_CancelHttpGet( IN void *Handle ) | |||||||
|  * Parameters: |  * Parameters: | ||||||
|  *	IN void *Handle;	Handle to HTTP get object |  *	IN void *Handle;	Handle to HTTP get object | ||||||
|  * |  * | ||||||
| *	Description :	Clears the handle allocated for the HTTP GET operation |  * Description: | ||||||
|  |  *	Clears the handle allocated for the HTTP GET operation | ||||||
|  *	Clears socket states and memory allocated for socket operations.  |  *	Clears socket states and memory allocated for socket operations.  | ||||||
|  * |  * | ||||||
| *	Return : int ; |  * Return: int | ||||||
|  *	UPNP_E_SUCCESS		- On Success |  *	UPNP_E_SUCCESS		- On Success | ||||||
|  *	UPNP_E_INVALID_PARAM	- Invalid Parameter |  *	UPNP_E_INVALID_PARAM	- Invalid Parameter | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| http_CloseHttpGet( IN void *Handle ) | http_CloseHttpGet( IN void *Handle ) | ||||||
| @@ -1496,19 +1479,17 @@ http_CloseHttpGet( IN void *Handle ) | |||||||
|  *					response message |  *					response message | ||||||
|  *	IN int timeout:			time out value |  *	IN int timeout:			time out value | ||||||
|  * |  * | ||||||
| *	Description :	Makes the HTTP GET message, connects to the peer,  |  * Description: | ||||||
|  |  *	Makes the HTTP GET message, connects to the peer,  | ||||||
|  *	sends the HTTP GET request, gets the response and parses the  |  *	sends the HTTP GET request, gets the response and parses the  | ||||||
|  *	response. |  *	response. | ||||||
|  * |  * | ||||||
| *	Return : int; |  * Return: int | ||||||
| *		UPNP_E_SUCCESS - On Success ; |  *	UPNP_E_SUCCESS		- On Success | ||||||
| *		UPNP_E_INVALID_PARAM - Invalid Paramters ; |  *	UPNP_E_INVALID_PARAM	- Invalid Paramters | ||||||
| *		UPNP_E_OUTOF_MEMORY ; |  *	UPNP_E_OUTOF_MEMORY | ||||||
| *		UPNP_E_SOCKET_ERROR ; |  *	UPNP_E_SOCKET_ERROR | ||||||
| *		UPNP_E_BAD_RESPONSE ; |  *	UPNP_E_BAD_RESPONSE | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
| * |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| http_OpenHttpGet( IN const char *url_str, | http_OpenHttpGet( IN const char *url_str, | ||||||
| @@ -1525,30 +1506,27 @@ http_OpenHttpGet( IN const char *url_str, | |||||||
|  * Function: http_OpenHttpGetProxy |  * Function: http_OpenHttpGetProxy | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN const char *url_str :	String as a URL |  *	IN const char *url_str;		String as a URL | ||||||
| *		IN const char *proxy_str :	String as a URL |  *	IN const char *proxy_str;	String as a URL | ||||||
| *		IN OUT void **Handle :		Pointer to buffer to store HTTP |  *	IN OUT void **Handle;		Pointer to buffer to store HTTP | ||||||
|  *					post handle |  *					post handle | ||||||
| *		IN OUT char **contentType :	Type of content |  *	IN OUT char **contentType;	Type of content | ||||||
| *		OUT int *contentLength :	length of content |  *	OUT int *contentLength;		length of content | ||||||
| *		OUT int *httpStatus :		HTTP status returned on receiving a |  *	OUT int *httpStatus;		HTTP status returned on receiving a | ||||||
|  *					response message |  *					response message | ||||||
|  *	IN int timeout:			time out value |  *	IN int timeout:			time out value | ||||||
|  * |  * | ||||||
| *	Description :	Makes the HTTP GET message, connects to the peer,  |  * Description: | ||||||
| *		sends the HTTP GET request, gets the response and parses the  |  *	Makes the HTTP GET message, connects to the peer,  | ||||||
| *		response. |  *	sends the HTTP GET request, gets the response and parses the response. | ||||||
|  *	If a proxy URL is defined then the connection is made there. |  *	If a proxy URL is defined then the connection is made there. | ||||||
|  * |  * | ||||||
| *	Return : int; |  * Return: int | ||||||
| *		UPNP_E_SUCCESS - On Success ; |  *	UPNP_E_SUCCESS		- On Success | ||||||
| *		UPNP_E_INVALID_PARAM - Invalid Paramters ; |  *	UPNP_E_INVALID_PARAM	- Invalid Paramters | ||||||
| *		UPNP_E_OUTOF_MEMORY ; |  *	UPNP_E_OUTOF_MEMORY | ||||||
| *		UPNP_E_SOCKET_ERROR ; |  *	UPNP_E_SOCKET_ERROR | ||||||
| *		UPNP_E_BAD_RESPONSE ; |  *	UPNP_E_BAD_RESPONSE | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
| * |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| http_OpenHttpGetProxy( IN const char *url_str, | http_OpenHttpGetProxy( IN const char *url_str, | ||||||
| @@ -1683,22 +1661,21 @@ http_OpenHttpGetProxy( IN const char *url_str, | |||||||
|  * Function: http_SendStatusResponse |  * Function: http_SendStatusResponse | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN SOCKINFO *info :				Socket information object |  *	IN SOCKINFO *info;		Socket information object | ||||||
| *		IN int http_status_code :		error code returned while making  |  *	IN int http_status_code;	error code returned while making  | ||||||
|  *					or sending the response message |  *					or sending the response message | ||||||
| *		IN int request_major_version :	request major version |  *	IN int request_major_version;	request major version | ||||||
| *		IN int request_minor_version :	request minor version |  *	IN int request_minor_version;	request minor version | ||||||
|  * |  * | ||||||
| *	Description :	Generate a response message for the status query and |  * Description: | ||||||
| *		send the status response. |  *	Generate a response message for the status query and send the | ||||||
|  |  *	status response. | ||||||
|  * |  * | ||||||
| *	Return : int; |  * Return: int | ||||||
|  *	0 -- success |  *	0 -- success | ||||||
|  *	UPNP_E_OUTOF_MEMORY |  *	UPNP_E_OUTOF_MEMORY | ||||||
|  *	UPNP_E_SOCKET_WRITE |  *	UPNP_E_SOCKET_WRITE | ||||||
|  *	UPNP_E_TIMEDOUT |  *	UPNP_E_TIMEDOUT | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| http_SendStatusResponse( IN SOCKINFO * info, | http_SendStatusResponse( IN SOCKINFO * info, | ||||||
| @@ -1734,23 +1711,26 @@ http_SendStatusResponse( IN SOCKINFO * info, | |||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_MakeMessage |  * Function: http_MakeMessage | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		INOUT membuffer* buf :		buffer with the contents of the  |  *	INOUT membuffer* buf;		buffer with the contents of the  | ||||||
|  *					message |  *					message | ||||||
| *		IN int http_major_version :	HTTP major version |  *	IN int http_major_version;	HTTP major version | ||||||
| *		IN int http_minor_version :	HTTP minor version |  *	IN int http_minor_version;	HTTP minor version | ||||||
| *		IN const char* fmt :		Pattern format  |  *	IN const char* fmt;		Pattern format  | ||||||
| *		... :	 |  *	...;	 | ||||||
|  * |  * | ||||||
| *	Description :	Generate an HTTP message based on the format that is  |  * Description: | ||||||
| *		specified in the input parameters. |  *	Generate an HTTP message based on the format that is specified | ||||||
|  |  *	in the input parameters. | ||||||
|  * |  * | ||||||
|  * fmt types: |  * fmt types: | ||||||
|  *	'B':	arg = int status_code  |  *	'B':	arg = int status_code  | ||||||
| *				appends content-length, content-type and HTML body for given code |  *		appends content-length, content-type and HTML body | ||||||
|  |  *		for given code | ||||||
|  *	'b':	arg1 = const char* buf; |  *	'b':	arg1 = const char* buf; | ||||||
|  *		arg2 = size_t buf_length memory ptr |  *		arg2 = size_t buf_length memory ptr | ||||||
|  *	'C':	(no args) appends a HTTP CONNECTION: close header  |  *	'C':	(no args) appends a HTTP CONNECTION: close header  | ||||||
| @@ -1776,12 +1756,10 @@ http_SendStatusResponse( IN SOCKINFO * info, | |||||||
|  *	'U':	(no args) appends HTTP USER-AGENT: header |  *	'U':	(no args) appends HTTP USER-AGENT: header | ||||||
|  *      'X':    arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent |  *      'X':    arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent | ||||||
|  * |  * | ||||||
| *	Return : int; |  * Return: int | ||||||
|  *	0 - On Success |  *	0 - On Success | ||||||
|  *	UPNP_E_OUTOF_MEMORY |  *	UPNP_E_OUTOF_MEMORY | ||||||
| *		UPNP_E_INVALID_URL; |  *	UPNP_E_INVALID_URL | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| http_MakeMessage( INOUT membuffer * buf, | http_MakeMessage( INOUT membuffer * buf, | ||||||
| @@ -2036,21 +2014,20 @@ error_handler: | |||||||
|     return error_code; |     return error_code; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_CalcResponseVersion |  * Function: http_CalcResponseVersion | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN int request_major_vers :		Request major version |  *	IN int request_major_vers;	Request major version | ||||||
| *		IN int request_minor_vers :		Request minor version |  *	IN int request_minor_vers;	Request minor version | ||||||
| *		OUT int* response_major_vers :	Response mojor version |  *	OUT int* response_major_vers;	Response mojor version | ||||||
| *		OUT int* response_minor_vers :	Response minor version |  *	OUT int* response_minor_vers;	Response minor version | ||||||
|  * |  * | ||||||
| *	Description :	Calculate HTTP response versions based on the request |  * Description: | ||||||
| *		versions. |  *	Calculate HTTP response versions based on the request versions. | ||||||
|  * |  * | ||||||
|  * Return: void |  * Return: void | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| void | void | ||||||
| http_CalcResponseVersion( IN int request_major_vers, | http_CalcResponseVersion( IN int request_major_vers, | ||||||
| @@ -2078,7 +2055,8 @@ http_CalcResponseVersion( IN int request_major_vers, | |||||||
| *	uri_type *url; 		URI object containing the scheme, path | *	uri_type *url; 		URI object containing the scheme, path | ||||||
| *				query token, etc. | *				query token, etc. | ||||||
| * | * | ||||||
| * Description: Makes the message for the HTTP GET method				 | * Description: | ||||||
|  | *	Makes the message for the HTTP GET method | ||||||
| * | * | ||||||
| * Returns: | * Returns: | ||||||
| *	UPNP_E_INVALID_URL | *	UPNP_E_INVALID_URL | ||||||
| @@ -2165,28 +2143,26 @@ MakeGetMessageEx( const char *url_str, | |||||||
|  * Function: http_OpenHttpGetEx |  * Function: http_OpenHttpGetEx | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *	IN const char *url_str :	String as a URL |  *	IN const char *url_str;		String as a URL | ||||||
| *	IN OUT void **Handle :		Pointer to buffer to store HTTP |  *	IN OUT void **Handle;		Pointer to buffer to store HTTP | ||||||
|  *					post handle |  *					post handle | ||||||
| *	IN OUT char **contentType :	Type of content |  *	IN OUT char **contentType;	Type of content | ||||||
| *	OUT int *contentLength :	length of content |  *	OUT int *contentLength;		length of content | ||||||
| *	OUT int *httpStatus :		HTTP status returned on receiving a |  *	OUT int *httpStatus;		HTTP status returned on receiving a | ||||||
|  *					response message |  *					response message | ||||||
| *	IN int timeout :			time out value |  *	IN int timeout;			time out value | ||||||
|  * |  * | ||||||
| * Description :	Makes the HTTP GET message, connects to the peer,  |  * Description: | ||||||
|  |  *	Makes the HTTP GET message, connects to the peer,  | ||||||
|  *	sends the HTTP GET request, gets the response and parses the  |  *	sends the HTTP GET request, gets the response and parses the  | ||||||
|  *	response. |  *	response. | ||||||
|  * |  * | ||||||
| * Return : int; |  * Return: int | ||||||
| *	UPNP_E_SUCCESS - On Success ; |  *	UPNP_E_SUCCESS		- On Success | ||||||
| *	UPNP_E_INVALID_PARAM - Invalid Paramters ; |  *	UPNP_E_INVALID_PARAM	- Invalid Paramters | ||||||
| *	UPNP_E_OUTOF_MEMORY ; |  *	UPNP_E_OUTOF_MEMORY | ||||||
| *	UPNP_E_SOCKET_ERROR ; |  *	UPNP_E_SOCKET_ERROR | ||||||
| *	UPNP_E_BAD_RESPONSE ; |  *	UPNP_E_BAD_RESPONSE | ||||||
| * |  | ||||||
| * Note : |  | ||||||
| * |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int | int | ||||||
| http_OpenHttpGetEx( IN const char *url_str, | http_OpenHttpGetEx( IN const char *url_str, | ||||||
| @@ -2333,19 +2309,18 @@ http_OpenHttpGetEx( IN const char *url_str, | |||||||
|     return errCode; |     return errCode; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: get_sdk_info |  * Function: get_sdk_info | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		OUT char *info :	buffer to store the operating system  |  *	OUT char *info;	buffer to store the operating system information | ||||||
| *							information |  | ||||||
|  * |  * | ||||||
| *	Description :	Returns the server information for the operating  |  * Description: | ||||||
| *		system |  *	Returns the server information for the operating system | ||||||
|  * |  * | ||||||
| *	Return :	UPNP_INLINE void |  * Return: | ||||||
| * |  *	UPNP_INLINE void | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| // 'info' should have a size of at least 100 bytes | // 'info' should have a size of at least 100 bytes | ||||||
| void | void | ||||||
| @@ -2354,11 +2329,18 @@ get_sdk_info( OUT char *info ) | |||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
|     OSVERSIONINFO versioninfo; |     OSVERSIONINFO versioninfo; | ||||||
|     versioninfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); |     versioninfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); | ||||||
|  	if (GetVersionEx(&versioninfo)!=0) |  | ||||||
|  		sprintf( info, "%d.%d.%d %d/%s, UPnP/1.0, Portable SDK for UPnP devices/"PACKAGE_VERSION"\r\n", |     if (GetVersionEx(&versioninfo)!=0) { | ||||||
|  				versioninfo.dwMajorVersion, versioninfo.dwMinorVersion, versioninfo.dwBuildNumber, versioninfo.dwPlatformId, versioninfo.szCSDVersion ); |         sprintf( info, | ||||||
|  	else |             "%d.%d.%d %d/%s, UPnP/1.0, Portable SDK for UPnP devices/"PACKAGE_VERSION"\r\n", | ||||||
|  |             versioninfo.dwMajorVersion, | ||||||
|  |             versioninfo.dwMinorVersion, | ||||||
|  |             versioninfo.dwBuildNumber, | ||||||
|  |             versioninfo.dwPlatformId, | ||||||
|  |             versioninfo.szCSDVersion ); | ||||||
|  |     } else { | ||||||
|         *info = '\0'; |         *info = '\0'; | ||||||
|  |     } | ||||||
| #else | #else | ||||||
|     int ret_code; |     int ret_code; | ||||||
|     struct utsname sys_info; |     struct utsname sys_info; | ||||||
| @@ -2367,9 +2349,10 @@ get_sdk_info( OUT char *info ) | |||||||
|     if( ret_code == -1 ) { |     if( ret_code == -1 ) { | ||||||
|         *info = '\0'; |         *info = '\0'; | ||||||
|     } |     } | ||||||
|  |     sprintf( info, | ||||||
|     sprintf( info, "%s/%s, UPnP/1.0, Portable SDK for UPnP devices/" |         "%s/%s, UPnP/1.0, Portable SDK for UPnP devices/"PACKAGE_VERSION "\r\n", | ||||||
| 	     PACKAGE_VERSION "\r\n", |         sys_info.sysname, | ||||||
|              sys_info.sysname, sys_info.release ); |         sys_info.release ); | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -29,10 +29,10 @@ | |||||||
| // | // | ||||||
| /////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
| /************************************************************************ | /****************************************************************************** | ||||||
|  * Purpose: This file defines the Web Server and has functions to carry out |  * Purpose: This file defines the Web Server and has functions to carry out | ||||||
|  * operations of the Web Server. |  * operations of the Web Server. | ||||||
| ************************************************************************/ |  ******************************************************************************/ | ||||||
|  |  | ||||||
| #include "config.h" | #include "config.h" | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| @@ -64,7 +64,11 @@ | |||||||
| /* | /* | ||||||
|    Response Types  |    Response Types  | ||||||
|  */ |  */ | ||||||
| enum resp_type { RESP_FILEDOC, RESP_XMLDOC, RESP_HEADERS, RESP_WEBDOC, | enum resp_type { | ||||||
|  | 	RESP_FILEDOC, | ||||||
|  | 	RESP_XMLDOC, | ||||||
|  | 	RESP_HEADERS, | ||||||
|  | 	RESP_WEBDOC, | ||||||
| 	RESP_POST }; | 	RESP_POST }; | ||||||
|  |  | ||||||
| // mapping of file extension to content-type of document | // mapping of file extension to content-type of document | ||||||
| @@ -182,12 +186,9 @@ static const char *gEncodedMediaTypes = | |||||||
|     "zip\0" APPLICATION_STR "zip\0" "\0"; |     "zip\0" APPLICATION_STR "zip\0" "\0"; | ||||||
|     // *** end *** |     // *** end *** | ||||||
|  |  | ||||||
| /***********************************************************************/ | /************************************************************************ | ||||||
| /* |  | ||||||
|    module variables - Globals, static and externs                       |    module variables - Globals, static and externs                       | ||||||
|  */ | ************************************************************************/ | ||||||
|  |  | ||||||
| /***********************************************************************/ |  | ||||||
| static struct document_type_t gMediaTypeList[NUM_MEDIA_TYPES]; | static struct document_type_t gMediaTypeList[NUM_MEDIA_TYPES]; | ||||||
| membuffer gDocumentRootDir;     // a local dir which serves as webserver root | membuffer gDocumentRootDir;     // a local dir which serves as webserver root | ||||||
| static struct xml_alias_t gAliasDoc;    // XML document | static struct xml_alias_t gAliasDoc;    // XML document | ||||||
| @@ -589,10 +590,9 @@ web_server_destroy( void ) | |||||||
|  * Parameters: |  * Parameters: | ||||||
|  *	IN const char* filename ;     Filename having the description document |  *	IN const char* filename ;     Filename having the description document | ||||||
|  *	OUT struct File_Info * info ; File information object having file  |  *	OUT struct File_Info * info ; File information object having file  | ||||||
| *								  attributes such as filelength, when was  |  *		attributes such as filelength, when was the file last | ||||||
| *								  the file last modified, whether a file  |  *		modified, whether a file or a directory and whether the | ||||||
| *								  or a directory and whether the file or |  *		file or directory is readable. | ||||||
| *								  directory is readable.  |  | ||||||
|  * |  * | ||||||
|  * Description: Release memory allocated for the global web server root |  * Description: Release memory allocated for the global web server root | ||||||
|  *	directory and the global XML document |  *	directory and the global XML document | ||||||
| @@ -689,8 +689,7 @@ web_server_set_root_dir( IN const char *root_dir ) | |||||||
|  *	OUT struct xml_alias_t* alias ; xml alias object which has a file name |  *	OUT struct xml_alias_t* alias ; xml alias object which has a file name | ||||||
|  *		stored |  *		stored | ||||||
|  *   OUT struct File_Info * info	 ; File information object which will be |  *   OUT struct File_Info * info	 ; File information object which will be | ||||||
| *									filled up if the file comparison  |  *		filled up if the file comparison succeeds | ||||||
| *									succeeds										 |  | ||||||
|  * |  * | ||||||
|  * Description: Compare the files names between the one on the XML alias |  * Description: Compare the files names between the one on the XML alias | ||||||
|  *	the one passed in as the input parameter. If equal extract file |  *	the one passed in as the input parameter. If equal extract file | ||||||
| @@ -870,7 +869,7 @@ StrTok( char **Src, | |||||||
|  *	OUT int * FirstByte ;	 gets the first byte of the token |  *	OUT int * FirstByte ;	 gets the first byte of the token | ||||||
|  *	OUT int * LastByte	; gets the last byte of the token |  *	OUT int * LastByte	; gets the last byte of the token | ||||||
|  * |  * | ||||||
| * Description: Returns a range of integers from a sring					 |  * Description: Returns a range of integers from a string | ||||||
|  * |  * | ||||||
|  * Returns: int	; |  * Returns: int	; | ||||||
|  *	always returns 1; |  *	always returns 1; | ||||||
| @@ -880,22 +879,24 @@ GetNextRange( char **SrcRangeStr, | |||||||
|               off_t *FirstByte, |               off_t *FirstByte, | ||||||
|               off_t *LastByte ) |               off_t *LastByte ) | ||||||
| { | { | ||||||
|     char *Ptr, |     char *Ptr; | ||||||
|      *Tok; |     char *Tok; | ||||||
|     int i, |     int i; | ||||||
|       F = -1, |     int64_t F = -1; | ||||||
|       L = -1; |     int64_t L = -1; | ||||||
|     int Is_Suffix_byte_Range = 1; |     int Is_Suffix_byte_Range = 1; | ||||||
|  |  | ||||||
|     if( *SrcRangeStr == NULL ) |     if( *SrcRangeStr == NULL ) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     Tok = StrTok( SrcRangeStr, "," ); |     Tok = StrTok( SrcRangeStr, "," ); | ||||||
|  |  | ||||||
|     if( ( Ptr = strstr( Tok, "-" ) ) == NULL ) |     if( ( Ptr = strstr( Tok, "-" ) ) == NULL ) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|     *Ptr = ' '; |     *Ptr = ' '; | ||||||
|     sscanf( Tok, "%d%d", &F, &L ); |     sscanf( Tok, "%"SCNd64"%"SCNd64, &F, &L ); | ||||||
|  |  | ||||||
|     if( F == -1 || L == -1 ) { |     if( F == -1 || L == -1 ) { | ||||||
|         *Ptr = '-'; |         *Ptr = '-'; | ||||||
| @@ -910,16 +911,15 @@ GetNextRange( char **SrcRangeStr, | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         if( Is_Suffix_byte_Range ) { |         if( Is_Suffix_byte_Range ) { | ||||||
|             *FirstByte = L; |             *FirstByte = (off_t)L; | ||||||
|             *LastByte = F; |             *LastByte = (off_t)F; | ||||||
|             return 1; |             return 1; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     *FirstByte = (off_t)F; | ||||||
|  |     *LastByte = (off_t)L; | ||||||
|  |  | ||||||
|     *FirstByte = F; |  | ||||||
|     *LastByte = L; |  | ||||||
|     return 1; |     return 1; | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| @@ -928,8 +928,8 @@ GetNextRange( char **SrcRangeStr, | |||||||
|  * Parameters: |  * Parameters: | ||||||
|  *	char * ByteRangeSpecifier ; String containing the range |  *	char * ByteRangeSpecifier ; String containing the range | ||||||
|  *	long FileLength ; Length of the file |  *	long FileLength ; Length of the file | ||||||
| *	OUT struct SendInstruction * Instr ; SendInstruction object	where the  |  *	OUT struct SendInstruction * Instr ; SendInstruction object | ||||||
| *										range operations will be stored |  *		where the range operations will be stored | ||||||
|  * |  * | ||||||
|  * Description: Fills in the Offset, read size and contents to send out |  * Description: Fills in the Offset, read size and contents to send out | ||||||
|  *	as an HTTP Range Response |  *	as an HTTP Range Response | ||||||
| @@ -1531,7 +1531,7 @@ http_RecvPostMessage( http_parser_t * parser, | |||||||
|  |  | ||||||
|     if( Instr && Instr->IsVirtualFile ) { |     if( Instr && Instr->IsVirtualFile ) { | ||||||
|  |  | ||||||
|         Fp = virtualDirCallback.open( filename, UPNP_WRITE ); |         Fp = (virtualDirCallback.open)( filename, UPNP_WRITE ); | ||||||
|         if( Fp == NULL ) { |         if( Fp == NULL ) { | ||||||
|             return HTTP_INTERNAL_SERVER_ERROR; |             return HTTP_INTERNAL_SERVER_ERROR; | ||||||
|         } |         } | ||||||
| @@ -1763,3 +1763,4 @@ web_server_callback( IN http_parser_t * parser, | |||||||
|     membuffer_destroy( &headers ); |     membuffer_destroy( &headers ); | ||||||
|     membuffer_destroy( &filename ); |     membuffer_destroy( &filename ); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -555,7 +555,7 @@ parse_hostport( const char *in, | |||||||
|     int begin_port; |     int begin_port; | ||||||
|     int hostport_size = 0; |     int hostport_size = 0; | ||||||
|     int host_size = 0; |     int host_size = 0; | ||||||
| #ifndef WIN32 | #if !defined(WIN32) && !defined(__OSX__) | ||||||
|     char temp_hostbyname_buff[BUFFER_SIZE]; |     char temp_hostbyname_buff[BUFFER_SIZE]; | ||||||
|     struct hostent h_buf; |     struct hostent h_buf; | ||||||
| #endif | #endif | ||||||
| @@ -628,20 +628,28 @@ parse_hostport( const char *in, | |||||||
| #if defined(WIN32) || defined(__CYGWIN__) | #if defined(WIN32) || defined(__CYGWIN__) | ||||||
|         h = gethostbyname(temp_host_name); |         h = gethostbyname(temp_host_name); | ||||||
| #elif defined(SPARC_SOLARIS) | #elif defined(SPARC_SOLARIS) | ||||||
|         errCode = gethostbyname_r( temp_host_name, |         errCode = gethostbyname_r( | ||||||
|  |                 temp_host_name, | ||||||
|                 &h, |                 &h, | ||||||
|                 temp_hostbyname_buff, |                 temp_hostbyname_buff, | ||||||
|                 BUFFER_SIZE, &errcode ); |                 BUFFER_SIZE, &errcode ); | ||||||
| #elif defined(__FreeBSD__) && __FreeBSD_version < 601103 | #elif defined(__FreeBSD__) && __FreeBSD_version < 601103 | ||||||
|         h = lwres_gethostbyname_r( temp_host_name, |         h = lwres_gethostbyname_r( | ||||||
|  |                 temp_host_name, | ||||||
|                 &h_buf, |                 &h_buf, | ||||||
|                 temp_hostbyname_buff, |                 temp_hostbyname_buff, | ||||||
|                 BUFFER_SIZE, &errcode ); |                 BUFFER_SIZE, &errcode ); | ||||||
|         if ( h == NULL ) { |         if ( h == NULL ) { | ||||||
|                 errCode = 1; |                 errCode = 1; | ||||||
|         } |         } | ||||||
|  | #elif defined(__OSX__) | ||||||
|  |         h = gethostbyname(temp_host_name); | ||||||
|  |         if ( h == NULL ) { | ||||||
|  |                 errCode = 1; | ||||||
|  |         } | ||||||
| #elif defined(__linux__) | #elif defined(__linux__) | ||||||
|         errCode = gethostbyname_r( temp_host_name, |         errCode = gethostbyname_r( | ||||||
|  |                 temp_host_name, | ||||||
|                 &h_buf, |                 &h_buf, | ||||||
|                 temp_hostbyname_buff, |                 temp_hostbyname_buff, | ||||||
|                 BUFFER_SIZE, &h, &errcode ); |                 BUFFER_SIZE, &h, &errcode ); | ||||||
| @@ -673,7 +681,6 @@ parse_hostport( const char *in, | |||||||
|         } |         } | ||||||
|         } |         } | ||||||
| #endif  | #endif  | ||||||
|  |  | ||||||
|         if( errCode == 0 ) { |         if( errCode == 0 ) { | ||||||
|             if( h ) { |             if( h ) { | ||||||
|                 if( ( h->h_addrtype == AF_INET ) && ( h->h_length == 4 ) ) { |                 if( ( h->h_addrtype == AF_INET ) && ( h->h_length == 4 ) ) { | ||||||
|   | |||||||
| @@ -261,7 +261,7 @@ | |||||||
|  |  | ||||||
| /** @name Other debugging features | /** @name Other debugging features | ||||||
|           The UPnP SDK contains other features to aid in debugging: |           The UPnP SDK contains other features to aid in debugging: | ||||||
| 	  see <upnp/upnpdebug.h> | 	  see <upnp/inc/upnpdebug.h> | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #define DEBUG_ALL		1 | #define DEBUG_ALL		1 | ||||||
|   | |||||||
| @@ -56,7 +56,8 @@ http_CancelHttpGet( IN void *Handle ); | |||||||
|  *	IN uri_type* url;		URL to be validated and fixed |  *	IN uri_type* url;		URL to be validated and fixed | ||||||
|  *	OUT uri_type* fixed_url;	URL after being fixed. |  *	OUT uri_type* fixed_url;	URL after being fixed. | ||||||
|  * |  * | ||||||
| * Description: Validates URL											 |  * Description: | ||||||
|  |  *	Validates URL | ||||||
|  * |  * | ||||||
|  * Returns: |  * Returns: | ||||||
|  *	 UPNP_E_INVALID_URL |  *	 UPNP_E_INVALID_URL | ||||||
| @@ -64,6 +65,7 @@ http_CancelHttpGet( IN void *Handle ); | |||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_FixUrl( IN uri_type* url, OUT uri_type* fixed_url ); | int http_FixUrl( IN uri_type* url, OUT uri_type* fixed_url ); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_FixStrUrl |  * Function: http_FixStrUrl | ||||||
|  * |  * | ||||||
| @@ -72,7 +74,8 @@ int http_FixUrl( IN uri_type* url, OUT uri_type* fixed_url ); | |||||||
|  *	IN int urlstrlen ; 		Length of the character string |  *	IN int urlstrlen ; 		Length of the character string | ||||||
|  *	OUT uri_type* fixed_url	;	Fixed and corrected URL |  *	OUT uri_type* fixed_url	;	Fixed and corrected URL | ||||||
|  * |  * | ||||||
| * Description: Parses URL and then validates URL						 |  * Description: | ||||||
|  |  *	Parses URL and then validates URL | ||||||
|  * |  * | ||||||
|  * Returns: |  * Returns: | ||||||
|  *	 UPNP_E_INVALID_URL |  *	 UPNP_E_INVALID_URL | ||||||
| @@ -88,8 +91,8 @@ int http_FixStrUrl( IN char* urlstr, IN int urlstrlen, OUT uri_type* fixed_url ) | |||||||
|  *	IN uri_type* destination_url;	URL containing destination information |  *	IN uri_type* destination_url;	URL containing destination information | ||||||
|  *	OUT uri_type *url;		Fixed and corrected URL |  *	OUT uri_type *url;		Fixed and corrected URL | ||||||
|  * |  * | ||||||
| * Description: Gets destination address from URL and then connects to the  |  * Description: | ||||||
| *	remote end |  *	Gets destination address from URL and then connects to the remote end | ||||||
|  * |  * | ||||||
|  *  Returns: |  *  Returns: | ||||||
|  *	socket descriptor on sucess |  *	socket descriptor on sucess | ||||||
| @@ -98,19 +101,21 @@ int http_FixStrUrl( IN char* urlstr, IN int urlstrlen, OUT uri_type* fixed_url ) | |||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_Connect( IN uri_type* destination_url, OUT uri_type *url ); | int http_Connect( IN uri_type* destination_url, OUT uri_type *url ); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_RecvMessage |  * Function: http_RecvMessage | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
|  *	IN SOCKINFO *info;			Socket information object |  *	IN SOCKINFO *info;			Socket information object | ||||||
| *	OUT http_parser_t* parser,			HTTP parser object |  *	OUT http_parser_t* parser;		HTTP parser object | ||||||
|  *	IN http_method_t request_method;	HTTP request method |  *	IN http_method_t request_method;	HTTP request method | ||||||
|  *	IN OUT int* timeout_secs;		time out |  *	IN OUT int* timeout_secs;		time out | ||||||
|  *	OUT int* http_error_code;		HTTP error code returned |  *	OUT int* http_error_code;		HTTP error code returned | ||||||
|  * |  * | ||||||
| * Description: Get the data on the socket and take actions based on the  |  * Description: | ||||||
| *	read data to modify the parser objects buffer. If an error is reported  |  *	Get the data on the socket and take actions based on the read data | ||||||
| *	while parsing the data, the error code is passed in the http_errr_code  |  *	to modify the parser objects buffer. If an error is reported while | ||||||
|  |  *	parsing the data, the error code is passed in the http_errr_code | ||||||
|  *	parameter |  *	parameter | ||||||
|  * |  * | ||||||
|  * Returns: |  * Returns: | ||||||
| @@ -131,7 +136,8 @@ int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t* parser, | |||||||
|  *	IN OUT int * TimeOut ;		time out value |  *	IN OUT int * TimeOut ;		time out value | ||||||
|  *	IN const char* fmt, ...	 Pattern format to take actions upon |  *	IN const char* fmt, ...	 Pattern format to take actions upon | ||||||
|  * |  * | ||||||
| * Description: Sends a message to the destination based on the			 |  * Description: | ||||||
|  |  *	Sends a message to the destination based on the | ||||||
|  *	IN const char* fmt parameter |  *	IN const char* fmt parameter | ||||||
|  *	fmt types: |  *	fmt types: | ||||||
|  *		'f':	arg = const char * file name |  *		'f':	arg = const char * file name | ||||||
| @@ -148,9 +154,12 @@ int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t* parser, | |||||||
|  * 	UPNP_E_FILE_READ_ERROR |  * 	UPNP_E_FILE_READ_ERROR | ||||||
|  *	UPNP_E_SUCCESS |  *	UPNP_E_SUCCESS | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_SendMessage( IN SOCKINFO *info, IN OUT int* timeout_secs,  | int http_SendMessage( | ||||||
|  | 	IN SOCKINFO *info, | ||||||
|  | 	IN OUT int* timeout_secs,  | ||||||
| 	IN const char* fmt, ... ); | 	IN const char* fmt, ... ); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_RequestAndResponse |  * Function: http_RequestAndResponse | ||||||
|  * |  * | ||||||
| @@ -163,7 +172,8 @@ int http_SendMessage( IN SOCKINFO *info, IN OUT int* timeout_secs, | |||||||
|  *	IN int timeout_secs;		time out value |  *	IN int timeout_secs;		time out value | ||||||
|  *	OUT http_parser_t* response;	Parser object to receive the repsonse |  *	OUT http_parser_t* response;	Parser object to receive the repsonse | ||||||
|  * |  * | ||||||
| * Description: Initiates socket, connects to the destination, sends a	 |  * Description: | ||||||
|  |  *	Initiates socket, connects to the destination, sends a | ||||||
|  *	request and waits for the response from the remote end |  *	request and waits for the response from the remote end | ||||||
|  * |  * | ||||||
|  * Returns: |  * Returns: | ||||||
| @@ -172,12 +182,15 @@ int http_SendMessage( IN SOCKINFO *info, IN OUT int* timeout_secs, | |||||||
|  *	Error Codes returned by http_SendMessage |  *	Error Codes returned by http_SendMessage | ||||||
|  *	Error Codes returned by http_RecvMessage |  *	Error Codes returned by http_RecvMessage | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_RequestAndResponse( IN uri_type* destination, | int http_RequestAndResponse( | ||||||
| 						   IN const char* request, IN size_t request_length, | 	IN uri_type* destination, | ||||||
|  | 	IN const char* request, | ||||||
|  | 	IN size_t request_length, | ||||||
| 	IN http_method_t req_method, | 	IN http_method_t req_method, | ||||||
| 	IN int timeout_secs,  | 	IN int timeout_secs,  | ||||||
| 	OUT http_parser_t* response ); | 	OUT http_parser_t* response ); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * return codes: |  * return codes: | ||||||
|  *	0 -- success |  *	0 -- success | ||||||
| @@ -190,30 +203,31 @@ int http_RequestAndResponse( IN uri_type* destination, | |||||||
|  *	UPNP_E_SOCKET_WRITE |  *	UPNP_E_SOCKET_WRITE | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_Download |  * Function: http_Download | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN const char* url_str :	String as a URL |  *	IN const char* url_str;	String as a URL | ||||||
| *		IN int timeout_secs :		time out value |  *	IN int timeout_secs;	time out value | ||||||
| *		OUT char** document :		buffer to store the document extracted |  *	OUT char** document;	buffer to store the document extracted | ||||||
|  *				from the donloaded message. |  *				from the donloaded message. | ||||||
| *		OUT int* doc_length :		length of the extracted document |  *	OUT int* doc_length;	length of the extracted document | ||||||
| *	    OUT char* content_type :	Type of content |  *	OUT char* content_type;	Type of content | ||||||
|  * |  * | ||||||
| *	Description :	Download the document message and extract the document  |  * Description: | ||||||
|  |  *	Download the document message and extract the document  | ||||||
|  *	from the message. |  *	from the message. | ||||||
|  * |  * | ||||||
| *	Return : int; |  * Return: int | ||||||
| *		UPNP_E_SUCCESS; |  *	UPNP_E_SUCCESS | ||||||
| *		UPNP_E_INVALID_URL; |  *	UPNP_E_INVALID_URL | ||||||
| *			 |  | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_Download( IN const char* url,  | int http_Download( | ||||||
|  | 	IN const char* url,  | ||||||
| 	IN int timeout_secs, | 	IN int timeout_secs, | ||||||
| 				   OUT char** document, OUT int* doc_length, | 	OUT char** document, | ||||||
|  | 	OUT int* doc_length, | ||||||
| 	OUT char* content_type ); | 	OUT char* content_type ); | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -227,67 +241,66 @@ int http_Download( IN const char* url, | |||||||
|  *	IN unsigned int *size:	Size of the data to be sent. |  *	IN unsigned int *size:	Size of the data to be sent. | ||||||
|  *	IN int timeout:		time out value |  *	IN int timeout:		time out value | ||||||
|  * |  * | ||||||
| *	Description :	Formats data if format used is UPNP_USING_CHUNKED. |  * Description: | ||||||
|  |  *	Formats data if format used is UPNP_USING_CHUNKED. | ||||||
|  *	Writes data on the socket connected to the peer. |  *	Writes data on the socket connected to the peer. | ||||||
|  * |  * | ||||||
| *	Return : int ; |  * Return: int | ||||||
|  *	UPNP_E_SUCCESS - On Success |  *	UPNP_E_SUCCESS - On Success | ||||||
|  *	UPNP_E_INVALID_PARAM - Invalid Parameter |  *	UPNP_E_INVALID_PARAM - Invalid Parameter | ||||||
|  *	-1 - On Socket Error. |  *	-1 - On Socket Error. | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_WriteHttpPost(IN void *Handle, | int http_WriteHttpPost(IN void *Handle, | ||||||
| 		       IN char *buf, | 		       IN char *buf, | ||||||
| 		       IN unsigned int *size, | 		       IN unsigned int *size, | ||||||
| 		       IN int timeout); | 		       IN int timeout); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_CloseHttpPost |  * Function: http_CloseHttpPost | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN void *Handle :			Handle to the http post object |  *	IN void *Handle;	Handle to the http post object | ||||||
| *		IN OUT int *httpStatus :	HTTP status returned on receiving a |  *	IN OUT int *httpStatus;	HTTP status returned on receiving a | ||||||
|  *				response message |  *				response message | ||||||
| *		IN int timeout :			time out value |  *	IN int timeout;		time out value | ||||||
|  * |  * | ||||||
| *	Description :	Sends remaining data if using  UPNP_USING_CHUNKED  |  * Description: | ||||||
|  |  *	Sends remaining data if using  UPNP_USING_CHUNKED  | ||||||
|  *	format. Receives any more messages. Destroys socket and any socket |  *	format. Receives any more messages. Destroys socket and any socket | ||||||
|  *	associated memory. Frees handle associated with the HTTP POST msg. |  *	associated memory. Frees handle associated with the HTTP POST msg. | ||||||
|  * |  * | ||||||
| *	Return : int ; |  * Return: int | ||||||
| *		UPNP_E_SUCCESS - On Sucess ; |  *	UPNP_E_SUCCESS		- On Sucess | ||||||
| *		UPNP_E_INVALID_PARAM  - Invalid Parameter; |  *	UPNP_E_INVALID_PARAM	- Invalid Parameter | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_CloseHttpPost(IN void *Handle,  | int http_CloseHttpPost(IN void *Handle,  | ||||||
| 		       IN OUT int *httpStatus, | 		       IN OUT int *httpStatus, | ||||||
| 		       IN int timeout); | 		       IN int timeout); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_OpenHttpPost |  * Function: http_OpenHttpPost | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN const char *url_str :		String as a URL	 |  *	IN const char *url_str;		String as a URL	 | ||||||
| *		IN OUT void **Handle :			Pointer to buffer to store HTTP |  *	IN OUT void **Handle;		Pointer to buffer to store HTTP | ||||||
|  *					post handle |  *					post handle | ||||||
| *		IN const char *contentType :	Type of content |  *	IN const char *contentType;	Type of content | ||||||
| *		IN int contentLength :			length of content |  *	IN int contentLength;		length of content | ||||||
| *		IN int timeout :				time out value |  *	IN int timeout;			time out value | ||||||
|  * |  * | ||||||
| *	Description :	Makes the HTTP POST message, connects to the peer,  |  * Description: | ||||||
|  |  *	Makes the HTTP POST message, connects to the peer,  | ||||||
|  *	sends the HTTP POST request. Adds the post handle to buffer of  |  *	sends the HTTP POST request. Adds the post handle to buffer of  | ||||||
|  *	such handles |  *	such handles | ||||||
|  * |  * | ||||||
|  * Return : int; |  * Return : int; | ||||||
| *		UPNP_E_SUCCESS - On Sucess ; |  *	UPNP_E_SUCCESS		- On Sucess | ||||||
| *		UPNP_E_INVALID_PARAM - Invalid Paramter ; |  *	UPNP_E_INVALID_PARAM	- Invalid Parameter | ||||||
| *		UPNP_E_OUTOF_MEMORY ; |  *	UPNP_E_OUTOF_MEMORY | ||||||
| *		UPNP_E_SOCKET_ERROR ; |  *	UPNP_E_SOCKET_ERROR | ||||||
| *		UPNP_E_SOCKET_CONNECT ; |  *	UPNP_E_SOCKET_CONNECT | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_OpenHttpPost(IN const char *url_str, | int http_OpenHttpPost(IN const char *url_str, | ||||||
| 		      IN OUT void **Handle, | 		      IN OUT void **Handle, | ||||||
| @@ -295,69 +308,72 @@ int http_OpenHttpPost(IN const char *url_str, | |||||||
| 		      IN int contentLength, | 		      IN int contentLength, | ||||||
| 		      IN int timeout); | 		      IN int timeout); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_ReadHttpGet |  * Function: http_ReadHttpGet | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN void *Handle :			Handle to the HTTP get object |  *	IN void *Handle;		Handle to the HTTP get object | ||||||
| *		IN OUT char *buf :			Buffer to get the read and parsed data |  *	IN OUT char *buf;		Buffer to get the read and parsed data | ||||||
| *		IN OUT unsigned int *size :	Size of tge buffer passed |  *	IN OUT unsigned int *size;	Size of the buffer passed | ||||||
| *		IN int timeout :			time out value |  *	IN int timeout;			time out value | ||||||
|  * |  * | ||||||
| *	Description :	Parses already existing data, then gets new data. |  * Description: | ||||||
|  |  *	Parses already existing data, then gets new data. | ||||||
|  *	Parses and extracts information from the new data. |  *	Parses and extracts information from the new data. | ||||||
|  * |  * | ||||||
| *	Return : int ; |  * Return: int | ||||||
| *		UPNP_E_SUCCESS - On Sucess ; |  *	UPNP_E_SUCCESS		- On Sucess | ||||||
| *		UPNP_E_INVALID_PARAM  - Invalid Parameter; |  *	UPNP_E_INVALID_PARAM	- Invalid Parameter | ||||||
| *		UPNP_E_BAD_RESPONSE ; |  *	UPNP_E_BAD_RESPONSE | ||||||
| *		UPNP_E_BAD_HTTPMSG ; |  *	UPNP_E_BAD_HTTPMSG | ||||||
| * |  *	UPNP_E_CANCELED | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_ReadHttpGet(IN void *Handle, | int http_ReadHttpGet( | ||||||
|  | 	IN void *Handle, | ||||||
| 	IN OUT char *buf, | 	IN OUT char *buf, | ||||||
| 	IN OUT unsigned int *size, | 	IN OUT unsigned int *size, | ||||||
| 	IN int timeout); | 	IN int timeout); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_HttpGetProgress |  * Function: http_HttpGetProgress | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *       IN void *Handle :           Handle to the HTTP get object |  *	IN void *Handle;		Handle to the HTTP get object | ||||||
| *       OUT unsigned int *length :  Buffer to get the read and parsed data |  *	OUT unsigned int *length;	Buffer to get the read and parsed data | ||||||
| *       OUT unsigned int *total :   Size of tge buffer passed |  *	OUT unsigned int *total;	Size of tge buffer passed | ||||||
|  * |  * | ||||||
| *   Description :   Extracts information from the Handle to the HTTP get |  * Description: | ||||||
| *                   object. |  *	Extracts information from the Handle to the HTTP get object. | ||||||
|  * |  * | ||||||
| *   Return : int ; |  * Return: int | ||||||
| *       UPNP_E_SUCCESS - On Sucess ; |  *	UPNP_E_SUCCESS		- On Sucess | ||||||
| *       UPNP_E_INVALID_PARAM  - Invalid Parameter; |  *	UPNP_E_INVALID_PARAM	- Invalid Parameter | ||||||
| * |  | ||||||
| *   Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_HttpGetProgress(IN void *Handle, | int http_HttpGetProgress( | ||||||
|  | 	IN void *Handle, | ||||||
| 	OUT unsigned int *length, | 	OUT unsigned int *length, | ||||||
| 	OUT unsigned int *total ); | 	OUT unsigned int *total ); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_CloseHttpGet |  * Function: http_CloseHttpGet | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
|  *	IN void *Handle;	Handle to HTTP get object |  *	IN void *Handle;	Handle to HTTP get object | ||||||
|  * |  * | ||||||
| *	Description :	Clears the handle allocated for the HTTP GET operation |  * Description: | ||||||
|  |  *	Clears the handle allocated for the HTTP GET operation | ||||||
|  *	Clears socket states and memory allocated for socket operations.  |  *	Clears socket states and memory allocated for socket operations.  | ||||||
|  * |  * | ||||||
| *	Return : int ; |  * Return: int | ||||||
|  *	UPNP_E_SUCCESS		- On Success |  *	UPNP_E_SUCCESS		- On Success | ||||||
|  *	UPNP_E_INVALID_PARAM	- Invalid Parameter |  *	UPNP_E_INVALID_PARAM	- Invalid Parameter | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_CloseHttpGet(IN void *Handle); | int http_CloseHttpGet(IN void *Handle); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_OpenHttpGet |  * Function: http_OpenHttpGet | ||||||
|  * |  * | ||||||
| @@ -371,54 +387,52 @@ int http_CloseHttpGet(IN void *Handle); | |||||||
|  *					response message |  *					response message | ||||||
|  *	IN int timeout:			time out value |  *	IN int timeout:			time out value | ||||||
|  * |  * | ||||||
| *	Description :	Makes the HTTP GET message, connects to the peer,  |  * Description: | ||||||
|  |  *	Makes the HTTP GET message, connects to the peer,  | ||||||
|  *	sends the HTTP GET request, gets the response and parses the  |  *	sends the HTTP GET request, gets the response and parses the  | ||||||
|  *	response. |  *	response. | ||||||
|  * |  * | ||||||
| *	Return : int; |  * Return: int | ||||||
| *		UPNP_E_SUCCESS - On Success ; |  *	UPNP_E_SUCCESS		- On Success | ||||||
| *		UPNP_E_INVALID_PARAM - Invalid Paramters ; |  *	UPNP_E_INVALID_PARAM	- Invalid Paramters | ||||||
| *		UPNP_E_OUTOF_MEMORY ; |  *	UPNP_E_OUTOF_MEMORY | ||||||
| *		UPNP_E_SOCKET_ERROR ; |  *	UPNP_E_SOCKET_ERROR | ||||||
| *		UPNP_E_BAD_RESPONSE ; |  *	UPNP_E_BAD_RESPONSE | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
| * |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_OpenHttpGet(IN const char *url_str, | int http_OpenHttpGet( | ||||||
|  | 	IN const char *url_str, | ||||||
| 	IN OUT void **Handle, | 	IN OUT void **Handle, | ||||||
| 	IN OUT char **contentType, | 	IN OUT char **contentType, | ||||||
| 	OUT int *contentLength, | 	OUT int *contentLength, | ||||||
| 	OUT int *httpStatus, | 	OUT int *httpStatus, | ||||||
| 	IN int timeout); | 	IN int timeout); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_OpenHttpGetProxy |  * Function: http_OpenHttpGetProxy | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN const char *url_str :	String as a URL |  *	IN const char *url_str;		String as a URL | ||||||
| *		IN const char *proxy_str :	String as a URL to the proxy |  *	IN const char *proxy_str;	String as a URL | ||||||
| *		IN OUT void **Handle :		Pointer to buffer to store HTTP |  *	IN OUT void **Handle;		Pointer to buffer to store HTTP | ||||||
|  *					post handle |  *					post handle | ||||||
| *		IN OUT char **contentType :	Type of content |  *	IN OUT char **contentType;	Type of content | ||||||
| *		OUT int *contentLength :	length of content |  *	OUT int *contentLength;		length of content | ||||||
| *		OUT int *httpStatus :		HTTP status returned on receiving a |  *	OUT int *httpStatus;		HTTP status returned on receiving a | ||||||
|  *					response message |  *					response message | ||||||
|  *	IN int timeout:			time out value |  *	IN int timeout:			time out value | ||||||
|  * |  * | ||||||
| *	Description :	Makes the HTTP GET message, connects to the peer,  |  * Description: | ||||||
| *		sends the HTTP GET request, gets the response and parses the  |  *	Makes the HTTP GET message, connects to the peer,  | ||||||
| *		response. |  *	sends the HTTP GET request, gets the response and parses the response. | ||||||
| * |  *	If a proxy URL is defined then the connection is made there. | ||||||
| *	Return : int; |  | ||||||
| *		UPNP_E_SUCCESS - On Success ; |  | ||||||
| *		UPNP_E_INVALID_PARAM - Invalid Paramters ; |  | ||||||
| *		UPNP_E_OUTOF_MEMORY ; |  | ||||||
| *		UPNP_E_SOCKET_ERROR ; |  | ||||||
| *		UPNP_E_BAD_RESPONSE ; |  | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  * |  * | ||||||
|  |  * Return: int | ||||||
|  |  *	UPNP_E_SUCCESS		- On Success | ||||||
|  |  *	UPNP_E_INVALID_PARAM	- Invalid Paramters | ||||||
|  |  *	UPNP_E_OUTOF_MEMORY | ||||||
|  |  *	UPNP_E_SOCKET_ERROR | ||||||
|  |  *	UPNP_E_BAD_RESPONSE | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_OpenHttpGetProxy(IN const char *url_str, | int http_OpenHttpGetProxy(IN const char *url_str, | ||||||
| 					IN const char *proxy_str, | 					IN const char *proxy_str, | ||||||
| @@ -433,24 +447,25 @@ int http_OpenHttpGetProxy(IN const char *url_str, | |||||||
|  * Function: http_SendStatusResponse |  * Function: http_SendStatusResponse | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN SOCKINFO *info :				Socket information object |  *	IN SOCKINFO *info;		Socket information object | ||||||
| *		IN int http_status_code :		error code returned while making  |  *	IN int http_status_code;	error code returned while making  | ||||||
|  *					or sending the response message |  *					or sending the response message | ||||||
| *		IN int request_major_version :	request major version |  *	IN int request_major_version;	request major version | ||||||
| *		IN int request_minor_version :	request minor version |  *	IN int request_minor_version;	request minor version | ||||||
|  * |  * | ||||||
| *	Description :	Generate a response message for the status query and |  * Description: | ||||||
| *		send the status response. |  *	Generate a response message for the status query and send the | ||||||
|  |  *	status response. | ||||||
|  * |  * | ||||||
| *	Return : int; |  * Return: int | ||||||
|  *	0 -- success |  *	0 -- success | ||||||
|  *	UPNP_E_OUTOF_MEMORY |  *	UPNP_E_OUTOF_MEMORY | ||||||
|  *	UPNP_E_SOCKET_WRITE |  *	UPNP_E_SOCKET_WRITE | ||||||
|  *	UPNP_E_TIMEDOUT |  *	UPNP_E_TIMEDOUT | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_SendStatusResponse( IN SOCKINFO *info, IN int http_status_code, | int http_SendStatusResponse( | ||||||
|  | 	IN SOCKINFO *info, | ||||||
|  | 	IN int http_status_code, | ||||||
| 	IN int request_major_version, | 	IN int request_major_version, | ||||||
| 	IN int request_minor_version ); | 	IN int request_minor_version ); | ||||||
|  |  | ||||||
| @@ -459,96 +474,103 @@ int http_SendStatusResponse( IN SOCKINFO *info, IN int http_status_code, | |||||||
|  * Function: http_MakeMessage |  * Function: http_MakeMessage | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		INOUT membuffer* buf :		buffer with the contents of the  |  *	INOUT membuffer* buf;		buffer with the contents of the  | ||||||
|  *					message |  *					message | ||||||
| *		IN int http_major_version :	HTTP major version |  *	IN int http_major_version;	HTTP major version | ||||||
| *		IN int http_minor_version :	HTTP minor version |  *	IN int http_minor_version;	HTTP minor version | ||||||
| *		IN const char* fmt :		Pattern format  |  *	IN const char* fmt;		Pattern format  | ||||||
| *		... :	 |  *	...;	 | ||||||
|  * |  * | ||||||
| *	Description :	Generate an HTTP message based on the format that is  |  * Description: | ||||||
| *		specified in the input parameters. |  *	Generate an HTTP message based on the format that is specified | ||||||
|  |  *	in the input parameters. | ||||||
|  * |  * | ||||||
|  * fmt types: |  * fmt types: | ||||||
| *		's':	arg = const char* C_string |  *	'B':	arg = int status_code  | ||||||
| *		'b':	arg1 = const char* buf; arg2 = size_t buf_length  |  *		appends content-length, content-type and HTML body | ||||||
| *				memory ptr |  *		for given code | ||||||
| *		'c':	(no args) appends CRLF "\r\n" |  *	'b':	arg1 = const char* buf; | ||||||
| *		'd':	arg = int number		// appends decimal number |  *		arg2 = size_t buf_length memory ptr | ||||||
| *		'h':	arg = off_t number		// appends off_t number |  | ||||||
| *		't':	arg = time_t * gmt_time	// appends time in RFC 1123 fmt |  | ||||||
| *		'D':	(no args) appends HTTP DATE: header |  | ||||||
| *		'S':	(no args) appends HTTP SERVER: header |  | ||||||
| *		'U':	(no args) appends HTTP USER-AGENT: header |  | ||||||
|  *	'C':	(no args) appends a HTTP CONNECTION: close header  |  *	'C':	(no args) appends a HTTP CONNECTION: close header  | ||||||
|  *			depending on major,minor version |  *			depending on major,minor version | ||||||
| *		'N':	arg1 = int content_length	// content-length header |  *	'c':	(no args) appends CRLF "\r\n" | ||||||
| *		'Q':	arg1 = http_method_t; arg2 = char* url;  |  *	'D':	(no args) appends HTTP DATE: header | ||||||
| *				arg3 = int url_length // start line of request |  *	'd':	arg = int number            // appends decimal number | ||||||
|  |  *	'G':	arg = range information     // add range header | ||||||
|  |  *	'h':	arg = off_t number          // appends off_t number | ||||||
|  |  *	'K':	(no args)                   // add chunky header | ||||||
|  |  *	'N':	arg1 = off_t content_length // content-length header | ||||||
|  |  *	'q':    arg1 = http_method_t        // request start line and HOST header | ||||||
|  |  *		arg2 = (uri_type *) | ||||||
|  |  *	'Q':	arg1 = http_method_t;       // start line of request | ||||||
|  |  *		arg2 = char* url;  | ||||||
|  |  *		arg3 = size_t url_length  | ||||||
|  *	'R':	arg = int status_code       // adds a response start line |  *	'R':	arg = int status_code       // adds a response start line | ||||||
| *		'B':	arg = int status_code  |  *	'S':	(no args) appends HTTP SERVER: header | ||||||
| *				appends content-length, content-type and HTML body for given code |  *	's':	arg = const char* C_string | ||||||
| *		'T':	arg = char * content_type; format e.g: "text/html";	 |  *	'T':	arg = char * content_type; format | ||||||
| *				 content-type header |  *		e.g: "text/html"; content-type header | ||||||
|  |  *	't':	arg = time_t * gmt_time     // appends time in RFC 1123 fmt | ||||||
|  |  *	'U':	(no args) appends HTTP USER-AGENT: header | ||||||
|  |  *      'X':    arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent | ||||||
|  * |  * | ||||||
| *	Return : int; |  * Return: int | ||||||
|  *	0 - On Success |  *	0 - On Success | ||||||
|  *	UPNP_E_OUTOF_MEMORY |  *	UPNP_E_OUTOF_MEMORY | ||||||
| *		UPNP_E_INVALID_URL; |  *	UPNP_E_INVALID_URL | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_MakeMessage( INOUT membuffer* buf,  | int http_MakeMessage( | ||||||
|  | 	INOUT membuffer* buf,  | ||||||
| 	IN int http_major_version, | 	IN int http_major_version, | ||||||
| 	IN int http_minor_version, | 	IN int http_minor_version, | ||||||
| 	IN const char* fmt, ... ); | 	IN const char* fmt, ... ); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_CalcResponseVersion |  * Function: http_CalcResponseVersion | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN int request_major_vers :		Request major version |  *	IN int request_major_vers;	Request major version | ||||||
| *		IN int request_minor_vers :		Request minor version |  *	IN int request_minor_vers;	Request minor version | ||||||
| *		OUT int* response_major_vers :	Response mojor version |  *	OUT int* response_major_vers;	Response mojor version | ||||||
| *		OUT int* response_minor_vers :	Response minor version |  *	OUT int* response_minor_vers;	Response minor version | ||||||
|  * |  * | ||||||
| *	Description :	Calculate HTTP response versions based on the request |  * Description: | ||||||
| *		versions. |  *	Calculate HTTP response versions based on the request versions. | ||||||
|  * |  * | ||||||
|  * Return: void |  * Return: void | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| void http_CalcResponseVersion(  | void http_CalcResponseVersion(  | ||||||
| 		IN int request_major_vers, IN int request_minor_vers, | 	IN int request_major_vers, | ||||||
| 		OUT int* response_major_vers, OUT int* response_minor_vers ); | 	IN int request_minor_vers, | ||||||
|  | 	OUT int* response_major_vers, | ||||||
|  | 	OUT int* response_minor_vers ); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: http_OpenHttpGetEx |  * Function: http_OpenHttpGetEx | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		IN const char *url_str :	String as a URL |  *	IN const char *url_str;		String as a URL | ||||||
| *		IN OUT void **Handle :		Pointer to buffer to store HTTP |  *	IN OUT void **Handle;		Pointer to buffer to store HTTP | ||||||
|  *					post handle |  *					post handle | ||||||
| *		IN OUT char **contentType :	Type of content |  *	IN OUT char **contentType;	Type of content | ||||||
| *		OUT int *contentLength :	length of content |  *	OUT int *contentLength;		length of content | ||||||
| *		OUT int *httpStatus :		HTTP status returned on receiving a |  *	OUT int *httpStatus;		HTTP status returned on receiving a | ||||||
|  *					response message |  *					response message | ||||||
| *		IN int timeout :			time out value |  *	IN int timeout;			time out value | ||||||
|  * |  * | ||||||
| *	Description :	Makes the HTTP GET message, connects to the peer,  |  * Description: | ||||||
|  |  *	Makes the HTTP GET message, connects to the peer,  | ||||||
|  *	sends the HTTP GET request, gets the response and parses the  |  *	sends the HTTP GET request, gets the response and parses the  | ||||||
|  *	response. |  *	response. | ||||||
|  * |  * | ||||||
| *	Return : int; |  * Return: int | ||||||
| *		UPNP_E_SUCCESS - On Success ; |  *	UPNP_E_SUCCESS		- On Success | ||||||
| *		UPNP_E_INVALID_PARAM - Invalid Paramters ; |  *	UPNP_E_INVALID_PARAM	- Invalid Paramters | ||||||
| *		UPNP_E_OUTOF_MEMORY ; |  *	UPNP_E_OUTOF_MEMORY | ||||||
| *		UPNP_E_SOCKET_ERROR ; |  *	UPNP_E_SOCKET_ERROR | ||||||
| *		UPNP_E_BAD_RESPONSE ; |  *	UPNP_E_BAD_RESPONSE | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
| * |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int http_OpenHttpGetEx(IN const char *url_str, | int http_OpenHttpGetEx(IN const char *url_str, | ||||||
| 		     IN OUT void **Handle, | 		     IN OUT void **Handle, | ||||||
| @@ -559,18 +581,18 @@ int http_OpenHttpGetEx(IN const char *url_str, | |||||||
| 			 IN int highRange, | 			 IN int highRange, | ||||||
| 		     IN int timeout); | 		     IN int timeout); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: get_sdk_info |  * Function: get_sdk_info | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *		OUT char *info ;	 |  *	OUT char *info;	buffer to store the operating system information | ||||||
|  * |  * | ||||||
| *	Description :	Returns the server information for the operating  |  * Description: | ||||||
| *		system |  *	Returns the server information for the operating system | ||||||
|  * |  * | ||||||
| *	Return : void ; |  * Return: | ||||||
| * |  *	UPNP_INLINE void | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| void get_sdk_info( OUT char *info ); | void get_sdk_info( OUT char *info ); | ||||||
|  |  | ||||||
| @@ -580,3 +602,4 @@ void get_sdk_info( OUT char *info ); | |||||||
|  |  | ||||||
|  |  | ||||||
| #endif // GENLIB_NET_HTTP_HTTPREADWRITE_H | #endif // GENLIB_NET_HTTP_HTTPREADWRITE_H | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,63 +1,67 @@ | |||||||
| /////////////////////////////////////////////////////////////////////////// | /************************************************************************ | ||||||
| // |  *  | ||||||
| // Copyright (c) 2000-2003 Intel Corporation  |  * Copyright (c) 2000-2003 Intel Corporation  | ||||||
| // All rights reserved.  |  * All rights reserved.  | ||||||
| // |  * | ||||||
| // Redistribution and use in source and binary forms, with or without  |  * Redistribution and use in source and binary forms, with or without  | ||||||
| // modification, are permitted provided that the following conditions are met:  |  * modification, are permitted provided that the following conditions are met:  | ||||||
| // |  * | ||||||
| // * Redistributions of source code must retain the above copyright notice,  |  * * Redistributions of source code must retain the above copyright notice,  | ||||||
| // this list of conditions and the following disclaimer.  |  * this list of conditions and the following disclaimer.  | ||||||
| // * Redistributions in binary form must reproduce the above copyright notice,  |  * * Redistributions in binary form must reproduce the above copyright notice,  | ||||||
| // this list of conditions and the following disclaimer in the documentation  |  * this list of conditions and the following disclaimer in the documentation  | ||||||
| // and/or other materials provided with the distribution.  |  * and/or other materials provided with the distribution.  | ||||||
| // * Neither name of Intel Corporation nor the names of its contributors  |  * Neither name of Intel Corporation nor the names of its contributors  | ||||||
| // may be used to endorse or promote products derived from this software  |  * may be used to endorse or promote products derived from this software  | ||||||
| // without specific prior written permission. |  * without specific prior written permission. | ||||||
| //  |  *  | ||||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  | ||||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT  |  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT  | ||||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR  |  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR  | ||||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR  |  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR  | ||||||
| // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  |  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  | ||||||
| // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,  |  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,  | ||||||
| // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR  |  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR  | ||||||
| // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY  |  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY  | ||||||
| // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | ||||||
| // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  |  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  | ||||||
| // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
| // |  * | ||||||
| /////////////////////////////////////////////////////////////////////////// |  ************************************************************************/ | ||||||
|  |  | ||||||
| #ifndef MINISERVER_H | #ifndef MINISERVER_H | ||||||
| #define MINISERVER_H | #define MINISERVER_H | ||||||
|  |  | ||||||
|  |  | ||||||
| #include "sock.h" | #include "sock.h" | ||||||
| #include "httpparser.h" | #include "httpparser.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| extern SOCKET gMiniServerStopSock; | extern SOCKET gMiniServerStopSock; | ||||||
|  |  | ||||||
|  |  | ||||||
| typedef struct MServerSockArray { | typedef struct MServerSockArray { | ||||||
|   int miniServerSock;     //socket for listening for miniserver | 	/* socket for listening for miniserver requests */ | ||||||
|                           //requests | 	int miniServerSock; | ||||||
|   int miniServerStopSock; //socket for stopping miniserver  | 	/* socket for stopping miniserver */ | ||||||
|   int ssdpSock; //socket for incoming advertisments and search requests | 	int miniServerStopSock; | ||||||
|  | 	/* socket for incoming advertisments and search requests */ | ||||||
|  | 	int ssdpSock; | ||||||
|  |  | ||||||
| 	int stopPort; | 	int stopPort; | ||||||
| 	int miniServerPort; | 	int miniServerPort; | ||||||
|  |  | ||||||
|   CLIENTONLY(int ssdpReqSock;) //socket for sending search  | 	/* socket for sending search requests and receiving search replies */ | ||||||
|        //requests and receiving | 	CLIENTONLY(int ssdpReqSock;) | ||||||
|        // search replies |  | ||||||
|        |  | ||||||
| } MiniServerSockArray; | } MiniServerSockArray; | ||||||
|  |  | ||||||
| //typedef void (*MiniServerCallback) ( const char* document, int sockfd ); |  | ||||||
|  |  | ||||||
| typedef void (*MiniServerCallback) ( IN http_parser_t *parser, | typedef void (*MiniServerCallback)( | ||||||
|  | 	IN http_parser_t *parser, | ||||||
| 	IN http_message_t* request,  | 	IN http_message_t* request,  | ||||||
| 	IN SOCKINFO *info ); | 	IN SOCKINFO *info ); | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
| @@ -71,8 +75,6 @@ extern "C" { | |||||||
|  * Description:	Set HTTP Get Callback |  * Description:	Set HTTP Get Callback | ||||||
|  * |  * | ||||||
|  * Return: void |  * Return: void | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| void SetHTTPGetCallback( MiniServerCallback callback ); | void SetHTTPGetCallback( MiniServerCallback callback ); | ||||||
|  |  | ||||||
| @@ -85,14 +87,12 @@ void SetHTTPGetCallback( MiniServerCallback callback ); | |||||||
|  * Description: Set SOAP Callback |  * Description: Set SOAP Callback | ||||||
|  * |  * | ||||||
|  * Return: void |  * Return: void | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| #ifdef INCLUDE_DEVICE_APIS | #ifdef INCLUDE_DEVICE_APIS | ||||||
| void SetSoapCallback( MiniServerCallback callback ); | void SetSoapCallback( MiniServerCallback callback ); | ||||||
| #else  | #else  /* INCLUDE_DEVICE_APIS */ | ||||||
| static inline void SetSoapCallback( MiniServerCallback callback ) {} | static inline void SetSoapCallback( MiniServerCallback callback ) {} | ||||||
| #endif | #endif /* INCLUDE_DEVICE_APIS */ | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function: SetGenaCallback |  * Function: SetGenaCallback | ||||||
| @@ -100,11 +100,9 @@ static inline void SetSoapCallback( MiniServerCallback callback ) {} | |||||||
|  * Parameters: |  * Parameters: | ||||||
|  *	MiniServerCallback callback; - GENA Callback to be invoked |  *	MiniServerCallback callback; - GENA Callback to be invoked | ||||||
|  * |  * | ||||||
| *	Description :	Set GENA Callback |  * D6escription: Set GENA Callback | ||||||
|  * |  * | ||||||
|  * Return: void |  * Return: void | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| void SetGenaCallback( MiniServerCallback callback ); | void SetGenaCallback( MiniServerCallback callback ); | ||||||
|  |  | ||||||
| @@ -126,7 +124,6 @@ void SetGenaCallback( MiniServerCallback callback ); | |||||||
|  * Return: int; |  * Return: int; | ||||||
|  *	Actual port socket is bound to - On Success:  |  *	Actual port socket is bound to - On Success:  | ||||||
|  *	A negative number UPNP_E_XXX - On Error   			 |  *	A negative number UPNP_E_XXX - On Error   			 | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int StartMiniServer( unsigned short listen_port ); | int StartMiniServer( unsigned short listen_port ); | ||||||
|  |  | ||||||
| @@ -136,19 +133,18 @@ int StartMiniServer( unsigned short listen_port ); | |||||||
|  * Parameters: |  * Parameters: | ||||||
|  *	void;	 |  *	void;	 | ||||||
|  * |  * | ||||||
| *	Description :	Stop and Shutdown the MiniServer and free socket  |  * Description: Stop and Shutdown the MiniServer and free socket resources. | ||||||
| *		resources. |  | ||||||
|  * |  * | ||||||
|  * Return : int; |  * Return : int; | ||||||
|  *	Always returns 0  |  *	Always returns 0  | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
|  ************************************************************************/ |  ************************************************************************/ | ||||||
| int StopMiniServer( void ); | int StopMiniServer(); | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| }   /* extern C */ | }   /* extern C */ | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* MINISERVER_H */ | #endif /* MINISERVER_H */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -98,18 +98,25 @@ struct Handle_Info | |||||||
|     int   aliasInstalled;       // 0 = not installed; otherwise installed |     int   aliasInstalled;       // 0 = not installed; otherwise installed | ||||||
| }; | }; | ||||||
|  |  | ||||||
| extern ithread_mutex_t GlobalHndMutex; | extern ithread_rwlock_t GlobalHndRWLock; | ||||||
| Upnp_Handle_Type GetHandleInfo(int Hnd, struct Handle_Info **HndInfo);  | Upnp_Handle_Type GetHandleInfo(int Hnd, struct Handle_Info **HndInfo);  | ||||||
|  |  | ||||||
| #define HandleLock()  \ | #define HandleLock() HandleWriteLock() | ||||||
| 	UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying Lock"); \ |  | ||||||
| 	ithread_mutex_lock(&GlobalHndMutex); \ | #define HandleWriteLock()  \ | ||||||
| 	UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "LOCK"); | 	UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying a write lock"); \ | ||||||
|  | 	ithread_rwlock_wrlock(&GlobalHndRWLock); \ | ||||||
|  | 	UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Write lock acquired"); | ||||||
|  |  | ||||||
|  | #define HandleReadLock()  \ | ||||||
|  | 	UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying a read lock"); \ | ||||||
|  | 	ithread_rwlock_rdlock(&GlobalHndRWLock); \ | ||||||
|  | 	UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Read lock acquired"); | ||||||
|  |  | ||||||
| #define HandleUnlock() \ | #define HandleUnlock() \ | ||||||
| 	UpnpPrintf(UPNP_INFO, API,__FILE__, __LINE__, "Trying Unlock"); \ | 	UpnpPrintf(UPNP_INFO, API,__FILE__, __LINE__, "Trying Unlock"); \ | ||||||
| 	ithread_mutex_unlock(&GlobalHndMutex); \ | 	ithread_rwlock_unlock(&GlobalHndRWLock); \ | ||||||
| 	UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Unlock"); | 	UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Unlocked rwlock"); | ||||||
|  |  | ||||||
| Upnp_Handle_Type GetClientHandleInfo(int *client_handle_out,  | Upnp_Handle_Type GetClientHandleInfo(int *client_handle_out,  | ||||||
|                                      struct Handle_Info **HndInfo); |                                      struct Handle_Info **HndInfo); | ||||||
|   | |||||||
| @@ -125,7 +125,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg, | |||||||
|  |  | ||||||
|     // we are assuming that there can be only one client supported at a time |     // we are assuming that there can be only one client supported at a time | ||||||
|  |  | ||||||
|     HandleLock(); |     HandleReadLock(); | ||||||
|  |  | ||||||
|     if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { |     if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
| @@ -538,8 +538,7 @@ SearchByTarget( IN int Mx, | |||||||
|     if( ReqBuf == NULL ) |     if( ReqBuf == NULL ) | ||||||
|         return UPNP_E_OUTOF_MEMORY; |         return UPNP_E_OUTOF_MEMORY; | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |     UpnpPrintf(UPNP_INFO, SSDP, __FILE__, __LINE__, ">>> SSDP SEND >>>\n"); | ||||||
|         ">>> SSDP SEND >>>\n%s\n", ReqBuf ); |  | ||||||
|  |  | ||||||
|     timeTillRead = Mx; |     timeTillRead = Mx; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -242,7 +242,7 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr, | |||||||
|         // "If a multicast resource would send a response(s) to any copy of the  |         // "If a multicast resource would send a response(s) to any copy of the  | ||||||
|         //  request, it SHOULD send its response(s) to each copy of the request  |         //  request, it SHOULD send its response(s) to each copy of the request  | ||||||
|         //  it receives. It MUST NOT repeat its response(s) per copy of the  |         //  it receives. It MUST NOT repeat its response(s) per copy of the  | ||||||
|         //  reuqest." |         //  request." | ||||||
|         //   |         //   | ||||||
|         // http://www.upnp.org/download/draft-goland-http-udp-04.txt |         // http://www.upnp.org/download/draft-goland-http-udp-04.txt | ||||||
|         // |         // | ||||||
| @@ -530,7 +530,6 @@ SendReply( IN struct sockaddr_in *DestAddr, | |||||||
| *	IN char * Udn: Device UDN | *	IN char * Udn: Device UDN | ||||||
| *	IN char * Location: Location of Device description document. | *	IN char * Location: Location of Device description document. | ||||||
| *	IN int  Duration :Life time of this device. | *	IN int  Duration :Life time of this device. | ||||||
|  |  | ||||||
| * Description: | * Description: | ||||||
| *	This function creates the reply packet based on the input parameter,  | *	This function creates the reply packet based on the input parameter,  | ||||||
| *	and send it to the client address given in its input parameter DestAddr. | *	and send it to the client address given in its input parameter DestAddr. | ||||||
| @@ -607,11 +606,9 @@ DeviceReply( IN struct sockaddr_in *DestAddr, | |||||||
| *	IN char *ServType: Service Type. | *	IN char *ServType: Service Type. | ||||||
| *	IN char * Location: Location of Device description document. | *	IN char * Location: Location of Device description document. | ||||||
| *	IN int  Duration :Life time of this device. | *	IN int  Duration :Life time of this device. | ||||||
|  |  | ||||||
| * Description: | * Description: | ||||||
| *	This function creates the advertisement packet based | *	This function creates the advertisement packet based | ||||||
| *	on the input parameter, and send it to the multicast channel. | *	on the input parameter, and send it to the multicast channel. | ||||||
|  |  | ||||||
| * | * | ||||||
| * Returns: int | * Returns: int | ||||||
| *	UPNP_E_SUCCESS if successful else appropriate error | *	UPNP_E_SUCCESS if successful else appropriate error | ||||||
| @@ -656,11 +653,9 @@ ServiceAdvertisement( IN char *Udn, | |||||||
| *	IN char *ServType: Service Type. | *	IN char *ServType: Service Type. | ||||||
| *	IN char * Location: Location of Device description document. | *	IN char * Location: Location of Device description document. | ||||||
| *	IN int  Duration :Life time of this device. | *	IN int  Duration :Life time of this device. | ||||||
|  |  | ||||||
| * Description: | * Description: | ||||||
| *	This function creates the advertisement packet based  | *	This function creates the advertisement packet based  | ||||||
| *	on the input parameter, and send it to the multicast channel. | *	on the input parameter, and send it to the multicast channel. | ||||||
|  |  | ||||||
| * | * | ||||||
| * Returns: int | * Returns: int | ||||||
| *	UPNP_E_SUCCESS if successful else appropriate error | *	UPNP_E_SUCCESS if successful else appropriate error | ||||||
| @@ -700,7 +695,6 @@ ServiceReply( IN struct sockaddr_in *DestAddr, | |||||||
| *	IN char *ServType: Service Type. | *	IN char *ServType: Service Type. | ||||||
| *	IN char * Location: Location of Device description document. | *	IN char * Location: Location of Device description document. | ||||||
| *	IN int  Duration :Service duration in sec. | *	IN int  Duration :Service duration in sec. | ||||||
|  |  | ||||||
| * Description: | * Description: | ||||||
| *	This function creates a HTTP service shutdown request packet  | *	This function creates a HTTP service shutdown request packet  | ||||||
| *	and sent it to the multicast channel through RequestHandler. | *	and sent it to the multicast channel through RequestHandler. | ||||||
| @@ -821,3 +815,4 @@ DeviceShutdown( IN char *DevType, | |||||||
|  |  | ||||||
| #endif // EXCLUDE_SSDP | #endif // EXCLUDE_SSDP | ||||||
| #endif // INCLUDE_DEVICE_APIS | #endif // INCLUDE_DEVICE_APIS | ||||||
|  |  | ||||||
|   | |||||||
| @@ -50,8 +50,7 @@ | |||||||
|  |  | ||||||
| #define MAX_TIME_TOREAD  45 | #define MAX_TIME_TOREAD  45 | ||||||
|  |  | ||||||
| CLIENTONLY( SOCKET gSsdpReqSocket = 0; | CLIENTONLY( SOCKET gSsdpReqSocket = 0; ) | ||||||
|      ) |  | ||||||
|  |  | ||||||
| void RequestHandler(); | void RequestHandler(); | ||||||
| Event ErrotEvt; | Event ErrotEvt; | ||||||
| @@ -61,11 +60,10 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0; | |||||||
| unsigned short ssdpStopPort; | unsigned short ssdpStopPort; | ||||||
|  |  | ||||||
| struct SSDPSockArray { | struct SSDPSockArray { | ||||||
|          int ssdpSock;          //socket for incoming advertisments and search requests | 	// socket for incoming advertisments and search requests | ||||||
|            CLIENTONLY( int ssdpReqSock; | 	int ssdpSock; | ||||||
|               )                 //socket for sending search  | 	// socket for sending search requests and receiving search replies | ||||||
|              //requests and receiving | 	CLIENTONLY( int ssdpReqSock; ) | ||||||
|              // search replies |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #ifdef INCLUDE_DEVICE_APIS | #ifdef INCLUDE_DEVICE_APIS | ||||||
| @@ -75,7 +73,9 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0; | |||||||
|  * Function : AdvertiseAndReply |  * Function : AdvertiseAndReply | ||||||
|  * |  * | ||||||
|  * Parameters: |  * Parameters: | ||||||
| *	IN int AdFlag: -1 = Send shutdown, 0 = send reply,  |  *	IN int AdFlag: | ||||||
|  |  *		-1 = Send shutdown, | ||||||
|  |  *		 0 = send reply,  | ||||||
|  *		 1 = Send Advertisement |  *		 1 = Send Advertisement | ||||||
|  *	IN UpnpDevice_Handle Hnd: Device handle |  *	IN UpnpDevice_Handle Hnd: Device handle | ||||||
|  *	IN enum SsdpSearchType SearchType:Search type for sending replies |  *	IN enum SsdpSearchType SearchType:Search type for sending replies | ||||||
| @@ -120,18 +120,14 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|         "Inside AdvertiseAndReply with AdFlag = %d\n", |         "Inside AdvertiseAndReply with AdFlag = %d\n", | ||||||
|         AdFlag ); |         AdFlag ); | ||||||
|  |  | ||||||
|     HandleLock(); |     // Use a read lock | ||||||
|  |     HandleReadLock(); | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { | ||||||
|         HandleUnlock(); |         HandleUnlock(); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
|     } |     } | ||||||
|     defaultExp = SInfo->MaxAge; |     defaultExp = SInfo->MaxAge; | ||||||
|  |  | ||||||
|     //Modifed to prevent more than one thread from accessing the  |  | ||||||
|     //UpnpDocument stored with the handle at the same time |  | ||||||
|     // HandleUnlock(); |  | ||||||
|     nodeList = NULL; |  | ||||||
|  |  | ||||||
|     //get server info |     //get server info | ||||||
|  |  | ||||||
|     get_sdk_info( SERVER ); |     get_sdk_info( SERVER ); | ||||||
| @@ -151,14 +147,12 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|  |  | ||||||
|         dbgStr = ixmlNode_getNodeName( tmpNode ); |         dbgStr = ixmlNode_getNodeName( tmpNode ); | ||||||
|         UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |         UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, | ||||||
|                      "Extracting device type once for %s\n", |             "Extracting device type once for %s\n", dbgStr ); | ||||||
|                      dbgStr ); |  | ||||||
|         // extract device type  |         // extract device type  | ||||||
|         ixmlNodeList_free( nodeList ); |         ixmlNodeList_free( nodeList ); | ||||||
|         nodeList = NULL; |         nodeList = NULL; | ||||||
|         nodeList = |         nodeList = ixmlElement_getElementsByTagName( | ||||||
|             ixmlElement_getElementsByTagName( ( IXML_Element * ) tmpNode, |             ( IXML_Element * ) tmpNode, "deviceType" ); | ||||||
|                                               "deviceType" ); |  | ||||||
|         if( nodeList == NULL ) { |         if( nodeList == NULL ) { | ||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
| @@ -166,7 +160,6 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|         dbgStr = ixmlNode_getNodeName( tmpNode ); |         dbgStr = ixmlNode_getNodeName( tmpNode ); | ||||||
|         UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |         UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|             "Extracting UDN for %s\n", dbgStr ); |             "Extracting UDN for %s\n", dbgStr ); | ||||||
|  |  | ||||||
|         UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |         UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|             "Extracting device type\n" ); |             "Extracting device type\n" ); | ||||||
|  |  | ||||||
| @@ -241,8 +234,7 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|             if( AdFlag == 1 ) { |             if( AdFlag == 1 ) { | ||||||
|                 DeviceAdvertisement( devType, i == 0, |                 DeviceAdvertisement( devType, i == 0, | ||||||
|                                      UDNstr, SInfo->DescURL, Exp ); |                                      UDNstr, SInfo->DescURL, Exp ); | ||||||
|             } else              // AdFlag == -1 |             } else {             // AdFlag == -1 | ||||||
|             { |  | ||||||
|                 DeviceShutdown( devType, i == 0, UDNstr, |                 DeviceShutdown( devType, i == 0, UDNstr, | ||||||
|                                 SERVER, SInfo->DescURL, Exp ); |                                 SERVER, SInfo->DescURL, Exp ); | ||||||
|             } |             } | ||||||
| @@ -324,8 +316,9 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|         } |         } | ||||||
|         for( j = 0;; j++ ) { |         for( j = 0;; j++ ) { | ||||||
|             tmpNode = ixmlNodeList_item( nodeList, j ); |             tmpNode = ixmlNodeList_item( nodeList, j ); | ||||||
|             if( tmpNode == NULL ) |             if( tmpNode == NULL ) { | ||||||
|                 break; |                 break; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             ixmlNodeList_free( tmpNodeList ); |             ixmlNodeList_free( tmpNodeList ); | ||||||
|             tmpNodeList = NULL; |             tmpNodeList = NULL; | ||||||
| @@ -367,26 +360,21 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|             } else { |             } else { | ||||||
|                 switch ( SearchType ) { |                 switch ( SearchType ) { | ||||||
|                     case SSDP_ALL: |                     case SSDP_ALL: | ||||||
|                         { |  | ||||||
|                         ServiceReply( DestAddr, servType, |                         ServiceReply( DestAddr, servType, | ||||||
|                                       UDNstr, SInfo->DescURL, |                                       UDNstr, SInfo->DescURL, | ||||||
|                                       defaultExp ); |                                       defaultExp ); | ||||||
|                         break; |                         break; | ||||||
|                         } |  | ||||||
|                     case SSDP_SERVICE: |                     case SSDP_SERVICE: | ||||||
|                         { |  | ||||||
|                         if( ServiceType != NULL ) { |                         if( ServiceType != NULL ) { | ||||||
|                             if( !strncasecmp( ServiceType, |                             if( !strncasecmp( ServiceType, | ||||||
|                                               servType, |                                               servType, | ||||||
|                                                   strlen( ServiceType ) ) ) |                                               strlen( ServiceType ) ) ) { | ||||||
|                                 { |  | ||||||
|                                 ServiceReply( DestAddr, servType, |                                 ServiceReply( DestAddr, servType, | ||||||
|                                               UDNstr, SInfo->DescURL, |                                               UDNstr, SInfo->DescURL, | ||||||
|                                               defaultExp ); |                                               defaultExp ); | ||||||
|                             } |                             } | ||||||
|                         } |                         } | ||||||
|                         break; |                         break; | ||||||
|                         } |  | ||||||
|                     default: |                     default: | ||||||
|                         break; |                         break; | ||||||
|                 }               // switch(SearchType)                |                 }               // switch(SearchType)                | ||||||
| @@ -407,8 +395,8 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|  |  | ||||||
| }  /****************** End of AdvertiseAndReply *********************/ | }  /****************** End of AdvertiseAndReply *********************/ | ||||||
|  |  | ||||||
| #endif | #endif /* EXCLUDE_SSDP == 0 */ | ||||||
| #endif | #endif /* INCLUDE_DEVICE_APIS */ | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|  * Function : Make_Socket_NoBlocking |  * Function : Make_Socket_NoBlocking | ||||||
| @@ -746,8 +734,7 @@ ssdp_event_handler_thread( void *the_data ) | |||||||
|     // send msg to device or ctrlpt |     // send msg to device or ctrlpt | ||||||
|     if( ( hmsg->method == HTTPMETHOD_NOTIFY ) || |     if( ( hmsg->method == HTTPMETHOD_NOTIFY ) || | ||||||
|         ( hmsg->request_method == HTTPMETHOD_MSEARCH ) ) { |         ( hmsg->request_method == HTTPMETHOD_MSEARCH ) ) { | ||||||
|         CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, &data->dest_addr, |         CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, &data->dest_addr, FALSE, NULL );) | ||||||
|                                             FALSE, NULL );); |  | ||||||
|     } else { |     } else { | ||||||
|         ssdp_handle_device_request( hmsg, &data->dest_addr ); |         ssdp_handle_device_request( hmsg, &data->dest_addr ); | ||||||
|     } |     } | ||||||
| @@ -819,18 +806,20 @@ readFromSSDPSocket( SOCKET socket ) | |||||||
|                              ( struct sockaddr * )&clientAddr, &socklen ); |                              ( struct sockaddr * )&clientAddr, &socklen ); | ||||||
|  |  | ||||||
|     if( byteReceived > 0 ) { |     if( byteReceived > 0 ) { | ||||||
|  |  | ||||||
|         requestBuf[byteReceived] = '\0'; |         requestBuf[byteReceived] = '\0'; | ||||||
|         UpnpPrintf( UPNP_INFO, SSDP, |         UpnpPrintf( UPNP_INFO, SSDP, | ||||||
|             __FILE__, __LINE__, |             __FILE__, __LINE__, | ||||||
|                              "Received response !!!  " |             "Start of received response ----------------------------------------------------\n" | ||||||
|                              "%s From host %s \n", |             "%s\n" | ||||||
|  |             "End of received response ------------------------------------------------------\n" | ||||||
|  |             "From host %s\n", | ||||||
|             requestBuf, |             requestBuf, | ||||||
|             inet_ntoa( clientAddr.sin_addr ) ); |             inet_ntoa( clientAddr.sin_addr ) ); | ||||||
|  |  | ||||||
|         UpnpPrintf( UPNP_PACKET, SSDP, __FILE__, __LINE__, |         UpnpPrintf( UPNP_PACKET, SSDP, __FILE__, __LINE__, | ||||||
|             "Received multicast packet:" |             "Start of received multicast packet --------------------------------------------\n" | ||||||
|             "\n %s\n", requestBuf ); |             "%s\n" | ||||||
|  |             "End of received multicast packet ----------------------------------------------\n", | ||||||
|  |             requestBuf ); | ||||||
|         //add thread pool job to handle request |         //add thread pool job to handle request | ||||||
|         if( data != NULL ) { |         if( data != NULL ) { | ||||||
|             data->parser.msg.msg.length += byteReceived; |             data->parser.msg.msg.length += byteReceived; | ||||||
| @@ -867,48 +856,45 @@ readFromSSDPSocket( SOCKET socket ) | |||||||
| int | int | ||||||
| get_ssdp_sockets( MiniServerSockArray * out ) | get_ssdp_sockets( MiniServerSockArray * out ) | ||||||
| { | { | ||||||
|     SOCKET ssdpSock; |  | ||||||
|  |  | ||||||
|     CLIENTONLY( SOCKET ssdpReqSock; |  | ||||||
|          ) |  | ||||||
|     int onOff = 1; |     int onOff = 1; | ||||||
|     u_char ttl = 4; |     u_char ttl = 4; | ||||||
|     struct ip_mreq ssdpMcastAddr; |     struct ip_mreq ssdpMcastAddr; | ||||||
|     struct sockaddr_in ssdpAddr; |     struct sockaddr_in ssdpAddr; | ||||||
|     int option = 1; |     int option = 1; | ||||||
|     struct in_addr addr; |     struct in_addr addr; | ||||||
|  |     SOCKET ssdpSock; | ||||||
|  | #if INCLUDE_CLIENT_APIS | ||||||
|  |     SOCKET ssdpReqSock; | ||||||
|  |  | ||||||
|     CLIENTONLY( if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) |     if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) { | ||||||
|                     == UPNP_INVALID_SOCKET ) { |  | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |         UpnpPrintf( UPNP_CRITICAL, | ||||||
|             SSDP, __FILE__, __LINE__, |             SSDP, __FILE__, __LINE__, | ||||||
|             "Error in socket operation !!!\n" ); |             "Error in socket operation !!!\n" ); | ||||||
|                 return UPNP_E_OUTOF_SOCKET;} |             return UPNP_E_OUTOF_SOCKET; | ||||||
|                 setsockopt( ssdpReqSock, |     } | ||||||
|                             IPPROTO_IP, |     setsockopt( ssdpReqSock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); | ||||||
|                             IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); |  | ||||||
|     // just do it, regardless if fails or not. |     // just do it, regardless if fails or not. | ||||||
|                 Make_Socket_NoBlocking( ssdpReqSock ); gSsdpReqSocket = ssdpReqSock; )  //CLIENTONLY |     Make_Socket_NoBlocking( ssdpReqSock ); | ||||||
|  |     gSsdpReqSocket = ssdpReqSock; | ||||||
|  | #endif /* INCLUDE_CLIENT_APIS */ | ||||||
|  |  | ||||||
|         if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) |     if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) { | ||||||
|             == UPNP_INVALID_SOCKET ) { |  | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |         UpnpPrintf( UPNP_CRITICAL, | ||||||
|             SSDP, __FILE__, __LINE__, |             SSDP, __FILE__, __LINE__, | ||||||
|             "Error in socket operation !!!\n" ); |             "Error in socket operation !!!\n" ); | ||||||
|             CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); |         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) | ||||||
|             CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); |         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) | ||||||
|         return UPNP_E_OUTOF_SOCKET; |         return UPNP_E_OUTOF_SOCKET; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     onOff = 1; |     onOff = 1; | ||||||
|     if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR, |     if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR, | ||||||
|             ( char * )&onOff, sizeof( onOff ) ) != 0 ) { |             ( char * )&onOff, sizeof( onOff ) ) != 0 ) { | ||||||
|  |  | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |         UpnpPrintf( UPNP_CRITICAL, | ||||||
|             SSDP, __FILE__, __LINE__, |             SSDP, __FILE__, __LINE__, | ||||||
|             "Error in set reuse addr !!!\n" ); |             "Error in set reuse addr !!!\n" ); | ||||||
|         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); |         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) | ||||||
|         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); |         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) | ||||||
|         shutdown( ssdpSock, SD_BOTH ); |         shutdown( ssdpSock, SD_BOTH ); | ||||||
|         UpnpCloseSocket( ssdpSock ); |         UpnpCloseSocket( ssdpSock ); | ||||||
|         return UPNP_E_SOCKET_ERROR; |         return UPNP_E_SOCKET_ERROR; | ||||||
| @@ -917,33 +903,31 @@ get_ssdp_sockets( MiniServerSockArray * out ) | |||||||
| #ifdef __FreeBSD__ | #ifdef __FreeBSD__ | ||||||
|     if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT, |     if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT, | ||||||
|             ( char * )&onOff, sizeof( onOff ) ) != 0 ) { |             ( char * )&onOff, sizeof( onOff ) ) != 0 ) { | ||||||
|  |  | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |         UpnpPrintf( UPNP_CRITICAL, | ||||||
|             SSDP, __FILE__, __LINE__, |             SSDP, __FILE__, __LINE__, | ||||||
|             "Error in set reuse port !!!\n" ); |             "Error in set reuse port !!!\n" ); | ||||||
|         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); |         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) | ||||||
|         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); |         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) | ||||||
|         shutdown( ssdpSock, SD_BOTH ); |         shutdown( ssdpSock, SD_BOTH ); | ||||||
|         UpnpCloseSocket( ssdpSock ); |         UpnpCloseSocket( ssdpSock ); | ||||||
|         return UPNP_E_SOCKET_ERROR; |         return UPNP_E_SOCKET_ERROR; | ||||||
|     } |     } | ||||||
|     #endif | #endif /* __FreeBSD__ */ | ||||||
|  |  | ||||||
|     memset( ( void * )&ssdpAddr, 0, sizeof( struct sockaddr_in ) ); |     memset( ( void * )&ssdpAddr, 0, sizeof( struct sockaddr_in ) ); | ||||||
|     ssdpAddr.sin_family = AF_INET; |     ssdpAddr.sin_family = AF_INET; | ||||||
|     //  ssdpAddr.sin_addr.s_addr = inet_addr(LOCAL_HOST); |     //  ssdpAddr.sin_addr.s_addr = inet_addr(LOCAL_HOST); | ||||||
|     ssdpAddr.sin_addr.s_addr = htonl( INADDR_ANY ); |     ssdpAddr.sin_addr.s_addr = htonl( INADDR_ANY ); | ||||||
|     ssdpAddr.sin_port = htons( SSDP_PORT ); |     ssdpAddr.sin_port = htons( SSDP_PORT ); | ||||||
|     if( bind |     if( bind( ssdpSock, ( struct sockaddr * )&ssdpAddr, | ||||||
|         ( ssdpSock, ( struct sockaddr * )&ssdpAddr, |  | ||||||
|             sizeof( ssdpAddr ) ) != 0 ) { |             sizeof( ssdpAddr ) ) != 0 ) { | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |         UpnpPrintf( UPNP_CRITICAL, | ||||||
|             SSDP, __FILE__, __LINE__, |             SSDP, __FILE__, __LINE__, | ||||||
|             "Error in binding !!!\n" ); |             "Error in binding !!!\n" ); | ||||||
|             shutdown( ssdpSock, SD_BOTH ); |             shutdown( ssdpSock, SD_BOTH ); | ||||||
|         UpnpCloseSocket( ssdpSock ); |         UpnpCloseSocket( ssdpSock ); | ||||||
|         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); |         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) | ||||||
|         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); |         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) | ||||||
|         return UPNP_E_SOCKET_BIND; |         return UPNP_E_SOCKET_BIND; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -951,15 +935,14 @@ get_ssdp_sockets( MiniServerSockArray * out ) | |||||||
|     ssdpMcastAddr.imr_interface.s_addr = inet_addr( LOCAL_HOST ); |     ssdpMcastAddr.imr_interface.s_addr = inet_addr( LOCAL_HOST ); | ||||||
|     ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP ); |     ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP ); | ||||||
|     if( setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, |     if( setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, | ||||||
|                     ( char * )&ssdpMcastAddr, |             ( char * )&ssdpMcastAddr, sizeof( struct ip_mreq ) ) != 0 ) { | ||||||
|                     sizeof( struct ip_mreq ) ) != 0 ) { |  | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |         UpnpPrintf( UPNP_CRITICAL, | ||||||
|             SSDP, __FILE__, __LINE__, |             SSDP, __FILE__, __LINE__, | ||||||
|             "Error in joining" " multicast group !!!\n" ); |             "Error in joining" " multicast group !!!\n" ); | ||||||
|         shutdown( ssdpSock, SD_BOTH ); |         shutdown( ssdpSock, SD_BOTH ); | ||||||
|         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); |         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) | ||||||
|         UpnpCloseSocket( ssdpSock ); |         UpnpCloseSocket( ssdpSock ); | ||||||
|         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); |         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) | ||||||
|         return UPNP_E_SOCKET_ERROR; |         return UPNP_E_SOCKET_ERROR; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -973,7 +956,7 @@ get_ssdp_sockets( MiniServerSockArray * out ) | |||||||
|         /* This is probably not a critical error, so let's continue. */ |         /* This is probably not a critical error, so let's continue. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // result is not checked becuase it will fail in WinMe and Win9x. |     /* result is not checked becuase it will fail in WinMe and Win9x. */ | ||||||
|     setsockopt( ssdpSock, IPPROTO_IP, |     setsockopt( ssdpSock, IPPROTO_IP, | ||||||
|                 IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); |                 IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); | ||||||
|     if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST, |     if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST, | ||||||
| @@ -982,16 +965,16 @@ get_ssdp_sockets( MiniServerSockArray * out ) | |||||||
|             SSDP, __FILE__, __LINE__, |             SSDP, __FILE__, __LINE__, | ||||||
|             "Error in setting broadcast !!!\n" ); |             "Error in setting broadcast !!!\n" ); | ||||||
|         shutdown( ssdpSock, SD_BOTH ); |         shutdown( ssdpSock, SD_BOTH ); | ||||||
|         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); |         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) | ||||||
|         UpnpCloseSocket( ssdpSock ); |         UpnpCloseSocket( ssdpSock ); | ||||||
|         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); |         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) | ||||||
|         return UPNP_E_NETWORK_ERROR; |         return UPNP_E_NETWORK_ERROR; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     CLIENTONLY( out->ssdpReqSock = ssdpReqSock; |     CLIENTONLY( out->ssdpReqSock = ssdpReqSock; ) | ||||||
|          ); |  | ||||||
|     out->ssdpSock = ssdpSock; |     out->ssdpSock = ssdpSock; | ||||||
|     return UPNP_E_SUCCESS; |     return UPNP_E_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif // EXCLUDE_SSDP | #endif /* EXCLUDE_SSDP */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -50,22 +50,11 @@ | |||||||
| #define S43 15 | #define S43 15 | ||||||
| #define S44 21 | #define S44 21 | ||||||
|  |  | ||||||
| static void MD5Transform PROTO_LIST( ( UINT4[4], | static void MD5Transform PROTO_LIST((UINT4[4], unsigned char[64])); | ||||||
|                                        unsigned char[64] ) ); | static void Encode PROTO_LIST((unsigned char *, UINT4 *, unsigned int)); | ||||||
| static void Encode PROTO_LIST( ( unsigned char *, | static void Decode PROTO_LIST((UINT4 *, unsigned char *, unsigned int)); | ||||||
|                                  UINT4 *, | static void MD5_memcpy PROTO_LIST((POINTER, POINTER, unsigned int)); | ||||||
|                                  unsigned int ) ); | static void MD5_memset PROTO_LIST((POINTER, int, unsigned int)); | ||||||
|  |  | ||||||
| static void Decode PROTO_LIST( ( UINT4 *, |  | ||||||
|                                  unsigned char *, |  | ||||||
|                                  unsigned int ) ); |  | ||||||
|  |  | ||||||
| static void MD5_memcpy PROTO_LIST( ( POINTER, |  | ||||||
|                                      POINTER, |  | ||||||
|                                      unsigned int ) ); |  | ||||||
| static void MD5_memset PROTO_LIST( ( POINTER, |  | ||||||
|                                      int, |  | ||||||
|                                      unsigned int ) ); |  | ||||||
|  |  | ||||||
| static unsigned char PADDING[64] = { | static unsigned char PADDING[64] = { | ||||||
|     0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |     0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||||
| @@ -118,14 +107,10 @@ static unsigned char PADDING[64] = { | |||||||
|    MD5 initialization. Begins an MD5 operation, writing a new context.  |    MD5 initialization. Begins an MD5 operation, writing a new context.  | ||||||
|  */ |  */ | ||||||
| void | void | ||||||
| MD5Init( context ) | MD5Init(MD5_CTX * context) | ||||||
|      MD5_CTX *context;          /* context */ |  | ||||||
| { | { | ||||||
|     context->count[0] = context->count[1] = 0; |     context->count[0] = context->count[1] = 0; | ||||||
|  |     /* Load magic initialization constants. */ | ||||||
|     /* |  | ||||||
|        Load magic initialization constants. |  | ||||||
|      */ |  | ||||||
|     context->state[0] = 0x67452301; |     context->state[0] = 0x67452301; | ||||||
|     context->state[1] = 0xefcdab89; |     context->state[1] = 0xefcdab89; | ||||||
|     context->state[2] = 0x98badcfe; |     context->state[2] = 0x98badcfe; | ||||||
| @@ -139,114 +124,72 @@ MD5Init( context ) | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| void | void | ||||||
| MD5Update( context, | MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen) | ||||||
|            input, |  | ||||||
|            inputLen ) |  | ||||||
|      MD5_CTX *context;          /* context */ |  | ||||||
|      unsigned char *input;      /* input block */ |  | ||||||
|      unsigned int inputLen;     /* length of input block */ |  | ||||||
| { | { | ||||||
|     unsigned int i, | 	unsigned int i; | ||||||
|       index, | 	unsigned int index; | ||||||
|       partLen; | 	unsigned int partLen; | ||||||
|  |  | ||||||
|     /* | 	/* Compute number of bytes mod 64 */ | ||||||
|        Compute number of bytes mod 64  |  | ||||||
|      */ |  | ||||||
| 	index = (unsigned int)((context->count[0] >> 3) & 0x3F); | 	index = (unsigned int)((context->count[0] >> 3) & 0x3F); | ||||||
|  |  | ||||||
|     /* | 	/* Update number of bits */ | ||||||
|        Update number of bits  | 	if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) { | ||||||
|      */ |  | ||||||
|     if( ( context->count[0] += |  | ||||||
|           ( ( UINT4 ) inputLen << 3 ) ) < ( ( UINT4 ) inputLen << 3 ) ) |  | ||||||
| 		context->count[1]++; | 		context->count[1]++; | ||||||
|  | 	} | ||||||
| 	context->count[1] += ((UINT4)inputLen >> 29); | 	context->count[1] += ((UINT4)inputLen >> 29); | ||||||
|  |  | ||||||
| 	partLen = 64 - index; | 	partLen = 64 - index; | ||||||
|  |  | ||||||
|     /* | 	/* Transform as many times as possible. */ | ||||||
|        Transform as many times as possible. |  | ||||||
|      */ |  | ||||||
| 	if (inputLen >= partLen) { | 	if (inputLen >= partLen) { | ||||||
|  | 		MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen); | ||||||
|         MD5_memcpy |  | ||||||
|             ( ( POINTER ) & context->buffer[index], ( POINTER ) input, |  | ||||||
|               partLen ); |  | ||||||
| 		MD5Transform(context->state, context->buffer); | 		MD5Transform(context->state, context->buffer); | ||||||
|  | 		for (i = partLen; i + 63 < inputLen; i += 64) { | ||||||
|         for( i = partLen; i + 63 < inputLen; i += 64 ) |  | ||||||
| 			MD5Transform(context->state, &input[i]); | 			MD5Transform(context->state, &input[i]); | ||||||
|  | 		} | ||||||
| 		index = 0; | 		index = 0; | ||||||
|     } else | 	} else { | ||||||
| 		i = 0; | 		i = 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|     /* | 	/* Buffer remaining input */ | ||||||
|        Buffer remaining input  | 	MD5_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen - i); | ||||||
|      */ |  | ||||||
|     MD5_memcpy |  | ||||||
|         ( ( POINTER ) & context->buffer[index], ( POINTER ) & input[i], |  | ||||||
|           inputLen - i ); |  | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|    MD5 finalization. Ends an MD5 message-digest operation, writing the |    MD5 finalization. Ends an MD5 message-digest operation, writing the | ||||||
|    the message digest and zeroizing the context. |    the message digest and zeroizing the context. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| void | void | ||||||
| MD5Final( digest, | MD5Final(unsigned char digest[16], MD5_CTX *context) | ||||||
|           context ) |  | ||||||
|      unsigned char digest[16];  /* message digest */ |  | ||||||
|      MD5_CTX *context;          /* context */ |  | ||||||
| { | { | ||||||
|  |  | ||||||
|     unsigned char bits[8]; |     unsigned char bits[8]; | ||||||
|     unsigned int index, |     unsigned int index; | ||||||
|       padLen; |     unsigned int padLen; | ||||||
|  |  | ||||||
|     /* |     /* Save number of bits */ | ||||||
|        Save number of bits  |  | ||||||
|      */ |  | ||||||
|     Encode(bits, context->count, 8); |     Encode(bits, context->count, 8); | ||||||
|  |  | ||||||
|     /* |     /* Pad out to 56 mod 64. */ | ||||||
|        Pad out to 56 mod 64. |  | ||||||
|      */ |  | ||||||
|     index = (unsigned int)((context->count[0] >> 3) & 0x3f); |     index = (unsigned int)((context->count[0] >> 3) & 0x3f); | ||||||
|  |  | ||||||
|     padLen = (index < 56) ? (56 - index) : (120 - index); |     padLen = (index < 56) ? (56 - index) : (120 - index); | ||||||
|  |  | ||||||
|     MD5Update(context, PADDING, padLen); |     MD5Update(context, PADDING, padLen); | ||||||
|  |  | ||||||
|     /* |     /* Append length (before padding) */ | ||||||
|        Append length (before padding)  |  | ||||||
|      */ |  | ||||||
|     MD5Update(context, bits, 8); |     MD5Update(context, bits, 8); | ||||||
|  |  | ||||||
|     /* |     /* Store state in digest */ | ||||||
|        Store state in digest  |  | ||||||
|      */ |  | ||||||
|     Encode(digest, context->state, 16); |     Encode(digest, context->state, 16); | ||||||
|  |  | ||||||
|     /* |     /* Zeroize sensitive information. */ | ||||||
|        Zeroize sensitive information. |  | ||||||
|      */ |  | ||||||
|     MD5_memset((POINTER)context, 0, sizeof(*context)); |     MD5_memset((POINTER)context, 0, sizeof(*context)); | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|    MD5 basic transformation. Transforms state based on block.  |    MD5 basic transformation. Transforms state based on block.  | ||||||
|  */ |  */ | ||||||
| static void | static void | ||||||
| MD5Transform( state, | MD5Transform(UINT4 state[4], unsigned char block[64]) | ||||||
|               block ) |  | ||||||
|      UINT4 state[4]; |  | ||||||
|      unsigned char block[64]; |  | ||||||
| { | { | ||||||
|     UINT4 a = state[0], |     UINT4 a = state[0], | ||||||
|       b = state[1], |       b = state[1], | ||||||
| @@ -353,23 +296,16 @@ MD5Transform( state, | |||||||
|    a multiple of 4. |    a multiple of 4. | ||||||
|  */ |  */ | ||||||
| static void | static void | ||||||
| Encode( output, | Encode(unsigned char *output, UINT4 *input, unsigned int len) | ||||||
|         input, |  | ||||||
|         len ) |  | ||||||
|      unsigned char *output; |  | ||||||
|      UINT4 *input; |  | ||||||
|      unsigned int len; |  | ||||||
| { | { | ||||||
|     unsigned int i, | 	unsigned int i; | ||||||
|       j; | 	unsigned int j; | ||||||
|  | 	for (i = 0, j = 0; j < len; ++i, j += 4) { | ||||||
|     for( i = 0, j = 0; j < len; i++, j += 4 ) { | 		output[j+0] = (unsigned char)((input[i] >>  0) & 0xff); | ||||||
|         output[j] = ( unsigned char )( input[i] & 0xff ); |  | ||||||
| 		output[j+1] = (unsigned char)((input[i] >>  8) & 0xff); | 		output[j+1] = (unsigned char)((input[i] >>  8) & 0xff); | ||||||
| 		output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); | 		output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); | ||||||
| 		output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); | 		output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -378,55 +314,40 @@ Encode( output, | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| static void | static void | ||||||
| Decode( output, | Decode(UINT4 *output, unsigned char *input, unsigned int len) | ||||||
|         input, |  | ||||||
|         len ) |  | ||||||
|      UINT4 *output; |  | ||||||
|      unsigned char *input; |  | ||||||
|      unsigned int len; |  | ||||||
| { | { | ||||||
|     unsigned int i, | 	unsigned int i; | ||||||
|       j; | 	unsigned int j; | ||||||
|  | 	for (i = 0, j = 0; j < len; ++i, j += 4) { | ||||||
|     for( i = 0, j = 0; j < len; i++, j += 4 ) |  | ||||||
| 		output[i] = | 		output[i] = | ||||||
|             ( ( UINT4 ) input[j] ) | ( ( ( UINT4 ) input[j + 1] ) << 8 ) | | 			(((UINT4)input[j+0]) <<  0) | | ||||||
|  | 			(((UINT4)input[j+1]) <<  8) | | ||||||
| 			(((UINT4)input[j+2]) << 16) | | 			(((UINT4)input[j+2]) << 16) | | ||||||
| 			(((UINT4)input[j+3]) << 24); | 			(((UINT4)input[j+3]) << 24); | ||||||
| 	} | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|    Note: Replace "for loop" with standard memcpy if possible. |    Note: Replace for loop with standard memcpy if possible. | ||||||
|  */ |  */ | ||||||
| static void | static void | ||||||
| MD5_memcpy( output, | MD5_memcpy(POINTER  output, POINTER  input, unsigned int len) | ||||||
|             input, |  | ||||||
|             len ) |  | ||||||
|      POINTER output; |  | ||||||
|      POINTER input; |  | ||||||
|      unsigned int len; |  | ||||||
| { | { | ||||||
| 	unsigned int i; | 	unsigned int i; | ||||||
|  | 	for (i = 0; i < len; ++i) { | ||||||
|     for( i = 0; i < len; i++ ) |  | ||||||
| 		output[i] = input[i]; | 		output[i] = input[i]; | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|    Note: Replace "for loop" with standard memset if possible. |    Note: Replace for loop with standard memset if possible. | ||||||
|  */ |  */ | ||||||
| static void | static void | ||||||
| MD5_memset( output, | MD5_memset(POINTER output, int value, unsigned int len) | ||||||
|             value, |  | ||||||
|             len ) |  | ||||||
|      POINTER output; |  | ||||||
|      int value; |  | ||||||
|      unsigned int len; |  | ||||||
| { | { | ||||||
| 	unsigned int i; | 	unsigned int i; | ||||||
|  | 	for (i = 0; i < len; ++i) { | ||||||
|     for( i = 0; i < len; i++ ) |  | ||||||
| 		((char *)output)[i] = (char)value; | 		((char *)output)[i] = (char)value; | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -43,7 +43,6 @@ get_ieee_node_identifier( uuid_node_t * node ) | |||||||
|         get_random_info(seed); |         get_random_info(seed); | ||||||
|         seed[0] |= 0x80; |         seed[0] |= 0x80; | ||||||
|         memcpy(&saved_node, seed, sizeof (uuid_node_t)); |         memcpy(&saved_node, seed, sizeof (uuid_node_t)); | ||||||
|  |  | ||||||
|         inited = 1; |         inited = 1; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -97,34 +96,30 @@ get_random_info( char seed[16] ) | |||||||
| 	} randomness; | 	} randomness; | ||||||
| 	randomness r; | 	randomness r; | ||||||
|  |  | ||||||
|     MD5Init( &c ); | 	/* Initialize memory area so that valgrind does not complain */ | ||||||
|     /* | 	memset(&r, 0, sizeof r); | ||||||
|        memory usage stats  |  | ||||||
|      */ | 	/* memory usage stats */ | ||||||
| 	GlobalMemoryStatus( &r.m ); | 	GlobalMemoryStatus( &r.m ); | ||||||
|     /* | 	/* random system stats */ | ||||||
|        random system stats  |  | ||||||
|      */ |  | ||||||
| 	GetSystemInfo( &r.s ); | 	GetSystemInfo( &r.s ); | ||||||
|     /* | 	/* 100ns resolution (nominally) time of day */ | ||||||
|        100ns resolution (nominally) time of day  |  | ||||||
|      */ |  | ||||||
| 	GetSystemTimeAsFileTime( &r.t ); | 	GetSystemTimeAsFileTime( &r.t ); | ||||||
|     /* | 	/* high resolution performance counter */ | ||||||
|        high resolution performance counter  |  | ||||||
|      */ |  | ||||||
| 	QueryPerformanceCounter( &r.pc ); | 	QueryPerformanceCounter( &r.pc ); | ||||||
|     /* | 	/* milliseconds since last boot */ | ||||||
|        milliseconds since last boot  |  | ||||||
|      */ |  | ||||||
| 	r.tc = GetTickCount(); | 	r.tc = GetTickCount(); | ||||||
| 	r.l = MAX_COMPUTERNAME_LENGTH + 1; | 	r.l = MAX_COMPUTERNAME_LENGTH + 1; | ||||||
|  |  | ||||||
| 	GetComputerName( r.hostname, &r.l ); | 	GetComputerName( r.hostname, &r.l ); | ||||||
|     MD5Update( &c, &r, sizeof( randomness ) ); |  | ||||||
|  | 	/* MD5 it */ | ||||||
|  | 	MD5Init(&c); | ||||||
|  | 	MD5Update(&c, &r, sizeof r); | ||||||
| 	MD5Final(seed, &c); | 	MD5Final(seed, &c); | ||||||
| }; | }; | ||||||
| #else |  | ||||||
|  | #else /* _WINDOWS_ */ | ||||||
|  |  | ||||||
| /*-----------------------------------------------------------------------------*/ | /*-----------------------------------------------------------------------------*/ | ||||||
| void | void | ||||||
| @@ -155,12 +150,18 @@ get_random_info( char seed[16] ) | |||||||
| 	} randomness; | 	} randomness; | ||||||
| 	randomness r; | 	randomness r; | ||||||
|  |  | ||||||
|     MD5Init( &c ); | 	/* Initialize memory area so that valgrind does not complain */ | ||||||
|  | 	memset(&r, 0, sizeof r); | ||||||
|  |  | ||||||
|  | 	/* Get some random stuff */ | ||||||
| 	gettimeofday(&r.t, (struct timezone *)0); | 	gettimeofday(&r.t, (struct timezone *)0); | ||||||
| 	gethostname(r.hostname, 256 ); | 	gethostname(r.hostname, 256 ); | ||||||
|     MD5Update( &c, &r, sizeof( randomness ) ); |  | ||||||
|  | 	/* MD5 it */ | ||||||
|  | 	MD5Init(&c); | ||||||
|  | 	MD5Update(&c, &r, sizeof r); | ||||||
| 	MD5Final(seed, &c); | 	MD5Final(seed, &c); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif | #endif /* _WINDOWS_ */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -55,8 +55,8 @@ static unsigned16 true_random( void ); | |||||||
| int | int | ||||||
| uuid_create(uuid_upnp *uid) | uuid_create(uuid_upnp *uid) | ||||||
| { | { | ||||||
|     uuid_time_t timestamp, |     uuid_time_t timestamp; | ||||||
|       last_time; |     uuid_time_t last_time; | ||||||
|     unsigned16 clockseq; |     unsigned16 clockseq; | ||||||
|     uuid_node_t node; |     uuid_node_t node; | ||||||
|     uuid_node_t last_node; |     uuid_node_t last_node; | ||||||
| @@ -86,10 +86,11 @@ uuid_create( uuid_upnp * uid ) | |||||||
|        if no NV state, or if clock went backwards, or node ID changed |        if no NV state, or if clock went backwards, or node ID changed | ||||||
|        (e.g., net card swap) change clockseq  |        (e.g., net card swap) change clockseq  | ||||||
|      */ |      */ | ||||||
|     if( !f || memcmp( &node, &last_node, sizeof( uuid_node_t ) ) ) |     if (!f || memcmp(&node, &last_node, sizeof(uuid_node_t))) { | ||||||
|         clockseq = true_random(); |         clockseq = true_random(); | ||||||
|     else if( timestamp < last_time ) |     } else if (timestamp < last_time) { | ||||||
|         clockseq++; |         clockseq++; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* |     /* | ||||||
|        stuff fields into the UUID  |        stuff fields into the UUID  | ||||||
| @@ -102,24 +103,26 @@ uuid_create( uuid_upnp * uid ) | |||||||
|     write_state(clockseq, timestamp, node); |     write_state(clockseq, timestamp, node); | ||||||
|  |  | ||||||
|     UUIDUnlock(); |     UUIDUnlock(); | ||||||
|     return ( 1 ); |     return 1; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /*-----------------------------------------------------------------------------*/ | /*-----------------------------------------------------------------------------*/ | ||||||
| void | void | ||||||
| uuid_unpack( uuid_upnp * u, | uuid_unpack(uuid_upnp *u, char *out) | ||||||
|              char *out ) |  | ||||||
| { | { | ||||||
|  |  | ||||||
| 	sprintf(out, | 	sprintf(out, | ||||||
| 		"%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x", | 		"%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x", | ||||||
|              ( unsigned int )u->time_low, u->time_mid, | 		(unsigned int)u->time_low, | ||||||
|              u->time_hi_and_version, u->clock_seq_hi_and_reserved, | 		u->time_mid, | ||||||
|              u->clock_seq_low, u->node[0], u->node[1], u->node[2], | 		u->time_hi_and_version, | ||||||
|              u->node[3], u->node[4], u->node[5] ); | 		u->clock_seq_hi_and_reserved, | ||||||
|  | 		u->clock_seq_low, | ||||||
|     *( out + 36 ) = '\0'; | 		u->node[0], | ||||||
|  | 		u->node[1], | ||||||
|  | 		u->node[2], | ||||||
|  | 		u->node[3], | ||||||
|  | 		u->node[4], | ||||||
|  | 		u->node[5]); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /*-----------------------------------------------------------------------------*/ | /*-----------------------------------------------------------------------------*/ | ||||||
| @@ -139,8 +142,7 @@ format_uuid_v1( uuid_upnp * uid, | |||||||
|      */ |      */ | ||||||
|     uid->time_low = (unsigned long)(timestamp & 0xFFFFFFFF); |     uid->time_low = (unsigned long)(timestamp & 0xFFFFFFFF); | ||||||
|     uid->time_mid = (unsigned short)((timestamp >> 32) & 0xFFFF); |     uid->time_mid = (unsigned short)((timestamp >> 32) & 0xFFFF); | ||||||
|     uid->time_hi_and_version = ( unsigned short )( ( timestamp >> 48 ) & |     uid->time_hi_and_version = (unsigned short)((timestamp >> 48) & 0x0FFF); | ||||||
|                                                    0x0FFF ); |  | ||||||
|     uid->time_hi_and_version |= (1 << 12); |     uid->time_hi_and_version |= (1 << 12); | ||||||
|     uid->clock_seq_low = clock_seq & 0xFF; |     uid->clock_seq_low = clock_seq & 0xFF; | ||||||
|     uid->clock_seq_hi_and_reserved = ( clock_seq & 0x3F00 ) >> 8; |     uid->clock_seq_hi_and_reserved = ( clock_seq & 0x3F00 ) >> 8; | ||||||
| @@ -227,7 +229,6 @@ get_current_time( uuid_time_t * timestamp ) | |||||||
|     static int inited = 0; |     static int inited = 0; | ||||||
|  |  | ||||||
|     if( !inited ) { |     if( !inited ) { | ||||||
|         get_system_time( &time_now ); |  | ||||||
|         uuids_this_tick = UUIDS_PER_TICK; |         uuids_this_tick = UUIDS_PER_TICK; | ||||||
|         inited = 1; |         inited = 1; | ||||||
|     }; |     }; | ||||||
|   | |||||||
| @@ -105,7 +105,7 @@ main (int argc, char* argv[]) | |||||||
| 	 * Test library initialisation | 	 * Test library initialisation | ||||||
| 	 */ | 	 */ | ||||||
| 	printf ("\n"); | 	printf ("\n"); | ||||||
| 	printf ("Intializing UPnP ... \n"); | 	printf ("Initializing UPnP ... \n"); | ||||||
| 	rc = UpnpInit (NULL, 0); | 	rc = UpnpInit (NULL, 0); | ||||||
| 	if ( UPNP_E_SUCCESS == rc ) { | 	if ( UPNP_E_SUCCESS == rc ) { | ||||||
| 		const char* ip_address = UpnpGetServerIpAddress(); | 		const char* ip_address = UpnpGetServerIpAddress(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user