Compare commits

...

14 Commits

Author SHA1 Message Date
Marcelo Roberto Jimenez
ce5ccd8edc Creation of the tag for release-1.6.6.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/tags/release-1.6.6@352 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2008-04-26 00:52:45 +00:00
Marcelo Roberto Jimenez
f0161c7274 Merge of trunk into branch 1.6.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@351 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2008-04-26 00:49:39 +00:00
Marcelo Roberto Jimenez
4b40e94b03 Merge of trunk into branch 1.6.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@339 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2008-03-25 10:21:08 +00:00
Marcelo Roberto Jimenez
1c9632dcc3 White spaces.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@329 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2008-03-05 03:55:33 +00:00
Marcelo Roberto Jimenez
cc0c2ffc50 Merge of trunk into branch-1.6.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@327 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2008-02-22 04:48:10 +00:00
Marcelo Roberto Jimenez
f812b124d7 Merge of trunk into branch-1.6.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@324 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2008-02-10 02:27:45 +00:00
Marcelo Roberto Jimenez
a785465222 Merge of trunk into branch-1.6.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@322 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2008-02-08 02:29:26 +00:00
Marcelo Roberto Jimenez
078f3f8faf Merge of trunk into branch 1.6.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@312 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2008-02-03 01:36:23 +00:00
Marcelo Roberto Jimenez
1eeaf99b83 Merge of trunk into branch-1.6.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@306 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2008-01-27 02:13:08 +00:00
Marcelo Roberto Jimenez
f6dd5062fe Merge of trunk into branch-1.6.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@284 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-12-27 02:14:02 +00:00
Marcelo Roberto Jimenez
7d4a610b93 Merge of head into branch-1.6.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@265 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-12-10 23:18:38 +00:00
Marcelo Roberto Jimenez
0a074d1989 Merge of trunk into branch 1.6.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@263 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-12-10 22:56:56 +00:00
Marcelo Roberto Jimenez
0475a46680 Merge of current trunk to branch 1.6.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@251 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-19 14:15:45 +00:00
Marcelo Roberto Jimenez
2a76749682 Creating branch 1.6.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@210 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-06-23 14:23:29 +00:00
77 changed files with 8643 additions and 4639 deletions

231
ChangeLog
View File

@@ -1,3 +1,228 @@
*******************************************************************************
Version 1.6.6
*******************************************************************************
2008-04-24 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Added thread id's to the UpnpPrintf debug messages. Thanks to
Charles Nepveu for the idea.
2008-04-24 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Bug Tracker [ 1948586 ]
Uppercase U in in "xmlns:U" in Invoke Action causes seg. f.
Submitted By: Thomas Norheim - kjakan_no
Device no longer segfaults with the following malformed xml action:
<u:SetColor xmlns:U="urn:schemas-upnp-org:service:tvpicture:1">
<Color>2</Color>
</u:SetColor>
2008-04-23 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Use -O0 in debug builds so that variables do not get optimized out.
2008-04-10 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Apostolos Syropoulos changes for OpenSolaris x86.
2008-03-20 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Andre Sodermans (wienerschnitzel) patch for building libupnp under
windows systems with VC9.
2008-03-20 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Andre Sodermans (wienerschnitzel) patch for building libupnp under
windows systems with VC8.
2008-03-08 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Fixed a printf format problem on the upnp_tv_device.c from both
upnp/sample/tvdevie and upnp/sample/tvcombo directories. The variable
port was a short int instead of an unsigned short and it was beeing
print as a negative value.
2008-03-08 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Bug Tracker [ 1902668 ] Cannot compile on MSVC
Submitted By Luke Kim - nereusuj
Version 1.6.5 cannot be compiled because of some changes in 1.6.3.
MSVC does not support stdint.h, gettimeofday(), sys/param.h, const int
variables in array size and Windows does not define _WINDOWS_ but define
_WINDOWS.
* MSVC does not understand "const int"'s as declarators of array
dimensions, we must use #define'd constants.
* Use WIN32 instead of _WINDOWS_ or _WINDOWS.
2008-02-22 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* No longer ignore "upnp:rootdevice" advertisement. Thanks to Bob Ciora.
2008-02-10 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Changed "sys_errlist[errno]", which is deprecated, by
"strerror_r()", which is thread safe.
2008-02-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Slightly improved error report by showing the sys_errlist string
corresponding to errno.
2008-02-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Got rid of two useless constants: UPNP_SOCKETERROR and
UPNP_INVALID_SOCKET. They both mean the same, that a network API
function has failed. -1 is the value to check, not an invented constant.
*******************************************************************************
Version 1.6.5
*******************************************************************************
2008-02-02 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Peter Hartley's fix for wrong sized variable beeing passed to
http_MakeMessage() on 64 bit architectures.
*******************************************************************************
Version 1.6.4
*******************************************************************************
2008-01-23 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Workaround for a problem with the new automake AM_CONDITIONAL macro
from autotools-1.10. Thanks to Ingo Hofmann for helping with debugging
this one.
2008-01-22 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Added quoting to macros AC_CONFIG_AUX_DIR, AC_CONFIG_MACRO_DIR and
AC_CONFIG_SRCDIR in configure.ac. Also changed the name of the
auxiliary directory in AC_CONFIG_AUX_DIR to build-aux.
2008-01-22 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Fix for setsockopt() in Threadpool.c to allow more than one process
to join the multicast-group on OSX. Thanks to Ingo Hofmann.
2008-01-22 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Using defined(__OSX__) || defined(__APPLE__) instead of just
defined(__OSX__) in the code. Thanks to Ingo Hofmann and Chris
Pickel.
2008-01-21 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Fix for isFileInVirtualDir. Thanks to Peter Hartley for the patch.
2008-01-07 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Putting back a "defined(__OSX__)" that has been removed in the
previous *BSD patch. Thanks to Chris Pickel for pointing it out.
2008-01-07 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Patches Tracker [ 1865812 ] typo in docs comment
Submitted By: Hartmut Holzgraefe - hholzgra
typo in docs comment ACCAPTED instead of ACCEPTED in
@name UPNP_E_UNSUBSCRIBE_UNACCAPTED [-302]
Also, the documentation file name was mispelled and was corrected in
the Makefile.am.
*******************************************************************************
Version 1.6.3
*******************************************************************************
2007-12-25 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Using pthread flags for the whole project, not just at the places
individually indicated by several Makefile.am files spread all over
the directories. That was too much error prone.
2007-12-24 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Added a configure test to check if pthread_rwlock_t is available.
Define _GNU_SOURCE if needed. The fallback behaviou will only be
implemented if _GNU_SOURCE prooves to be insufficient on some
platforms. Thanks to Jonathan Casiot (no_dice) and Robert Gingher
(robsbox).
2007-12-17 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Removed unused iasnprintf.{c,h} files.
2007-12-17 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Removed STATSONLY() macro from ThreadPool.{c,h}.
* Removed time() usage from ThreadPool.c.
* Fixed STATS = 0 compilation.
2007-12-16 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Library was not compiling on FreeBSD 7. Code now no longer uses
ftime(), using gettimeofday() instead. Thanks to Josh Carroll.
*******************************************************************************
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 +277,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
@@ -269,7 +498,7 @@ Version 1.4.2
2007-01-23 Marcelo Jimenez <mroberto(at)users.sourceforge.net> 2007-01-23 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Tracker [ 1634922 ] Support for large files (>= 2 GiB), part 2 * SF Tracker [ 1634922 ] Support for large files (>= 2 GiB), part 2
Submitted By: Jonathan - no_dice Submitted By: Jonathan Casiot - no_dice
Summary: This patch hopefully fixes the remaining types and related Summary: This patch hopefully fixes the remaining types and related
code to enable files >= 2 GiB to be streamed. Jonathan claims to have code to enable files >= 2 GiB to be streamed. Jonathan claims to have
tested this with a patched version of ushare-0.9.8 and a D-Link DSM-520. tested this with a patched version of ushare-0.9.8 and a D-Link DSM-520.

25
THANKS
View File

@@ -6,31 +6,46 @@ 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)
- Andre Sodermans (wienerschnitzel)
- Apostolos Syropoulos
- Arno Willig - Arno Willig
- Bob Ciora - Bob Ciora
- Chaos - Chaos
- Charles Nepveu (cnepveu)
- Chris Pickel
- Craig Nelson - Craig Nelson
- David Maass - David Maass
- Emil Ljungdahl - Emil Ljungdahl
- Erik Johansson - Erik Johansson
- Eric Tanguy - Eric Tanguy
- Erwan Velu - Erwan Velu
- Eugene Christensen
- Fabrice Fontaine
- Fredrik Svensson - Fredrik Svensson
- Glen Masgai - Glen Masgai
- Hartmut Holzgraefe - hholzgra
- Ingo Hofmann
- Jiri Zouhar - Jiri Zouhar
- John Dennis - John Dennis
- Jonathan (no_dice) - Jonathan Casiot (no_dice)
- Josh Carroll
- Keith Brindley
- Leuk_He - Leuk_He
- Loigu - Loigu
- Luke Kim - Luke Kim (nereusuj)
- Marcelo Roberto Jimenez - Marcelo Roberto Jimenez (mroberto)
- Markus Strobl - Markus Strobl
- Nektarios K. Papadopoulos - Nektarios K. Papadopoulos (npapadop)
- Oskar Liljeblad - Oskar Liljeblad
- Michael (Oxy) - Michael (oxygenic)
- Paul Vixie - Paul Vixie
- Peter Hartley
- Rene Hexel - Rene Hexel
- Robert Gingher (robsbox)
- Siva Chandran - Siva Chandran
- Stéphane Corthésy
- Steve Bresson
- Timothy Redaelli - Timothy Redaelli
- Titus Winters - Titus Winters

View File

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

222
build/msvc/stdint.h Normal file
View File

@@ -0,0 +1,222 @@
// ISO C9x compliant stdint.h for Microsoft Visual Studio
// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
//
// Copyright (c) 2006 Alexander Chemeris
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// 3. The name of the author may be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef _MSC_VER // [
#error "Use this header only with Microsoft Visual C++ compilers!"
#endif // _MSC_VER ]
#ifndef _MSC_STDINT_H_ // [
#define _MSC_STDINT_H_
#if _MSC_VER > 1000
#pragma once
#endif
#include <limits.h>
// For Visual Studio 6 in C++ mode wrap <wchar.h> include with 'extern "C++" {}'
// or compiler give many errors like this:
// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
#if (_MSC_VER < 1300) && defined(__cplusplus)
extern "C++" {
#endif
# include <wchar.h>
#if (_MSC_VER < 1300) && defined(__cplusplus)
}
#endif
// 7.18.1 Integer types
// 7.18.1.1 Exact-width integer types
typedef __int8 int8_t;
typedef __int16 int16_t;
typedef __int32 int32_t;
typedef __int64 int64_t;
typedef unsigned __int8 uint8_t;
typedef unsigned __int16 uint16_t;
typedef unsigned __int32 uint32_t;
typedef unsigned __int64 uint64_t;
// 7.18.1.2 Minimum-width integer types
typedef int8_t int_least8_t;
typedef int16_t int_least16_t;
typedef int32_t int_least32_t;
typedef int64_t int_least64_t;
typedef uint8_t uint_least8_t;
typedef uint16_t uint_least16_t;
typedef uint32_t uint_least32_t;
typedef uint64_t uint_least64_t;
// 7.18.1.3 Fastest minimum-width integer types
typedef int8_t int_fast8_t;
typedef int16_t int_fast16_t;
typedef int32_t int_fast32_t;
typedef int64_t int_fast64_t;
typedef uint8_t uint_fast8_t;
typedef uint16_t uint_fast16_t;
typedef uint32_t uint_fast32_t;
typedef uint64_t uint_fast64_t;
// 7.18.1.4 Integer types capable of holding object pointers
#ifdef _WIN64 // [
typedef __int64 intptr_t;
typedef unsigned __int64 uintptr_t;
#else // _WIN64 ][
typedef int intptr_t;
typedef unsigned int uintptr_t;
#endif // _WIN64 ]
// 7.18.1.5 Greatest-width integer types
typedef int64_t intmax_t;
typedef uint64_t uintmax_t;
// 7.18.2 Limits of specified-width integer types
#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
// 7.18.2.1 Limits of exact-width integer types
#define INT8_MIN ((int8_t)_I8_MIN)
#define INT8_MAX _I8_MAX
#define INT16_MIN ((int16_t)_I16_MIN)
#define INT16_MAX _I16_MAX
#define INT32_MIN ((int32_t)_I32_MIN)
#define INT32_MAX _I32_MAX
#define INT64_MIN ((int64_t)_I64_MIN)
#define INT64_MAX _I64_MAX
#define UINT8_MAX _UI8_MAX
#define UINT16_MAX _UI16_MAX
#define UINT32_MAX _UI32_MAX
#define UINT64_MAX _UI64_MAX
// 7.18.2.2 Limits of minimum-width integer types
#define INT_LEAST8_MIN INT8_MIN
#define INT_LEAST8_MAX INT8_MAX
#define INT_LEAST16_MIN INT16_MIN
#define INT_LEAST16_MAX INT16_MAX
#define INT_LEAST32_MIN INT32_MIN
#define INT_LEAST32_MAX INT32_MAX
#define INT_LEAST64_MIN INT64_MIN
#define INT_LEAST64_MAX INT64_MAX
#define UINT_LEAST8_MAX UINT8_MAX
#define UINT_LEAST16_MAX UINT16_MAX
#define UINT_LEAST32_MAX UINT32_MAX
#define UINT_LEAST64_MAX UINT64_MAX
// 7.18.2.3 Limits of fastest minimum-width integer types
#define INT_FAST8_MIN INT8_MIN
#define INT_FAST8_MAX INT8_MAX
#define INT_FAST16_MIN INT16_MIN
#define INT_FAST16_MAX INT16_MAX
#define INT_FAST32_MIN INT32_MIN
#define INT_FAST32_MAX INT32_MAX
#define INT_FAST64_MIN INT64_MIN
#define INT_FAST64_MAX INT64_MAX
#define UINT_FAST8_MAX UINT8_MAX
#define UINT_FAST16_MAX UINT16_MAX
#define UINT_FAST32_MAX UINT32_MAX
#define UINT_FAST64_MAX UINT64_MAX
// 7.18.2.4 Limits of integer types capable of holding object pointers
#ifdef _WIN64 // [
# define INTPTR_MIN INT64_MIN
# define INTPTR_MAX INT64_MAX
# define UINTPTR_MAX UINT64_MAX
#else // _WIN64 ][
# define INTPTR_MIN INT32_MIN
# define INTPTR_MAX INT32_MAX
# define UINTPTR_MAX UINT32_MAX
#endif // _WIN64 ]
// 7.18.2.5 Limits of greatest-width integer types
#define INTMAX_MIN INT64_MIN
#define INTMAX_MAX INT64_MAX
#define UINTMAX_MAX UINT64_MAX
// 7.18.3 Limits of other integer types
#ifdef _WIN64 // [
# define PTRDIFF_MIN _I64_MIN
# define PTRDIFF_MAX _I64_MAX
#else // _WIN64 ][
# define PTRDIFF_MIN _I32_MIN
# define PTRDIFF_MAX _I32_MAX
#endif // _WIN64 ]
#define SIG_ATOMIC_MIN INT_MIN
#define SIG_ATOMIC_MAX INT_MAX
#ifndef SIZE_MAX // [
# ifdef _WIN64 // [
# define SIZE_MAX _UI64_MAX
# else // _WIN64 ][
# define SIZE_MAX _UI32_MAX
# endif // _WIN64 ]
#endif // SIZE_MAX ]
// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
#ifndef WCHAR_MIN // [
# define WCHAR_MIN 0
#endif // WCHAR_MIN ]
#ifndef WCHAR_MAX // [
# define WCHAR_MAX _UI16_MAX
#endif // WCHAR_MAX ]
#define WINT_MIN 0
#define WINT_MAX _UI16_MAX
#endif // __STDC_LIMIT_MACROS ]
// 7.18.4 Limits of other integer types
#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
// 7.18.4.1 Macros for minimum-width integer constants
#define INT8_C(val) val##i8
#define INT16_C(val) val##i16
#define INT32_C(val) val##i32
#define INT64_C(val) val##i64
#define UINT8_C(val) val##ui8
#define UINT16_C(val) val##ui16
#define UINT32_C(val) val##ui32
#define UINT64_C(val) val##ui64
// 7.18.4.2 Macros for greatest-width integer constants
#define INTMAX_C INT64_C
#define UINTMAX_C UINT64_C
#endif // __STDC_CONSTANT_MACROS ]
#endif // _MSC_STDINT_H_ ]

223
build/vc8/ixml.vcproj Normal file
View File

@@ -0,0 +1,223 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="ixml"
ProjectGUID="{AD489FAF-9CDD-411B-BFE9-1B9C6C16D427}"
RootNamespace="ixml"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
ConfigurationType="4"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\ixml\inc;..\..\ixml\src\inc"
PreprocessorDefinitions="WIN32;DEBUG"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
RuntimeLibrary="2"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\..\ixml\src\attr.c"
>
</File>
<File
RelativePath="..\..\ixml\src\document.c"
>
</File>
<File
RelativePath="..\..\ixml\src\element.c"
>
</File>
<File
RelativePath="..\..\ixml\src\ixml.c"
>
</File>
<File
RelativePath="..\..\ixml\src\ixmlmembuf.c"
>
</File>
<File
RelativePath="..\..\ixml\src\ixmlparser.c"
>
</File>
<File
RelativePath="..\..\ixml\src\namedNodeMap.c"
>
</File>
<File
RelativePath="..\..\ixml\src\node.c"
>
</File>
<File
RelativePath="..\..\ixml\src\nodeList.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\..\ixml\inc\ixml.h"
>
</File>
<File
RelativePath="..\..\ixml\src\inc\ixmlmembuf.h"
>
</File>
<File
RelativePath="..\..\ixml\src\inc\ixmlparser.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

65
build/vc8/libupnp.sln Normal file
View File

@@ -0,0 +1,65 @@

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libupnp", "libupnp.vcproj", "{6227F51A-1498-4C4A-B213-F6FDED605125}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "threadutil", "threadutil.vcproj", "{24884928-0501-4CF2-BC8A-180AFC23B2AF}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ixml", "ixml.vcproj", "{AD489FAF-9CDD-411B-BFE9-1B9C6C16D427}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tvdevice", "tvdevice.vcproj", "{F592B023-E1F3-4A1E-841E-662DEE497435}"
ProjectSection(ProjectDependencies) = postProject
{6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125}
{24884928-0501-4CF2-BC8A-180AFC23B2AF} = {24884928-0501-4CF2-BC8A-180AFC23B2AF}
{AD489FAF-9CDD-411B-BFE9-1B9C6C16D427} = {AD489FAF-9CDD-411B-BFE9-1B9C6C16D427}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tvctrlpt", "tvctrlpt.vcproj", "{BC1557D9-9E84-4BA5-861E-CB04D767FBDC}"
ProjectSection(ProjectDependencies) = postProject
{AD489FAF-9CDD-411B-BFE9-1B9C6C16D427} = {AD489FAF-9CDD-411B-BFE9-1B9C6C16D427}
{24884928-0501-4CF2-BC8A-180AFC23B2AF} = {24884928-0501-4CF2-BC8A-180AFC23B2AF}
{6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tvcombo", "tvcombo.vcproj", "{B5D74697-F615-4DCB-AA8B-935F6372F01C}"
ProjectSection(ProjectDependencies) = postProject
{6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125}
{24884928-0501-4CF2-BC8A-180AFC23B2AF} = {24884928-0501-4CF2-BC8A-180AFC23B2AF}
{AD489FAF-9CDD-411B-BFE9-1B9C6C16D427} = {AD489FAF-9CDD-411B-BFE9-1B9C6C16D427}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6227F51A-1498-4C4A-B213-F6FDED605125}.Debug|Win32.ActiveCfg = Debug|Win32
{6227F51A-1498-4C4A-B213-F6FDED605125}.Debug|Win32.Build.0 = Debug|Win32
{6227F51A-1498-4C4A-B213-F6FDED605125}.Release|Win32.ActiveCfg = Release|Win32
{6227F51A-1498-4C4A-B213-F6FDED605125}.Release|Win32.Build.0 = Release|Win32
{24884928-0501-4CF2-BC8A-180AFC23B2AF}.Debug|Win32.ActiveCfg = Debug|Win32
{24884928-0501-4CF2-BC8A-180AFC23B2AF}.Debug|Win32.Build.0 = Debug|Win32
{24884928-0501-4CF2-BC8A-180AFC23B2AF}.Release|Win32.ActiveCfg = Release|Win32
{24884928-0501-4CF2-BC8A-180AFC23B2AF}.Release|Win32.Build.0 = Release|Win32
{AD489FAF-9CDD-411B-BFE9-1B9C6C16D427}.Debug|Win32.ActiveCfg = Debug|Win32
{AD489FAF-9CDD-411B-BFE9-1B9C6C16D427}.Debug|Win32.Build.0 = Debug|Win32
{AD489FAF-9CDD-411B-BFE9-1B9C6C16D427}.Release|Win32.ActiveCfg = Release|Win32
{AD489FAF-9CDD-411B-BFE9-1B9C6C16D427}.Release|Win32.Build.0 = Release|Win32
{F592B023-E1F3-4A1E-841E-662DEE497435}.Debug|Win32.ActiveCfg = Debug|Win32
{F592B023-E1F3-4A1E-841E-662DEE497435}.Debug|Win32.Build.0 = Debug|Win32
{F592B023-E1F3-4A1E-841E-662DEE497435}.Release|Win32.ActiveCfg = Release|Win32
{F592B023-E1F3-4A1E-841E-662DEE497435}.Release|Win32.Build.0 = Release|Win32
{BC1557D9-9E84-4BA5-861E-CB04D767FBDC}.Debug|Win32.ActiveCfg = Debug|Win32
{BC1557D9-9E84-4BA5-861E-CB04D767FBDC}.Debug|Win32.Build.0 = Debug|Win32
{BC1557D9-9E84-4BA5-861E-CB04D767FBDC}.Release|Win32.ActiveCfg = Release|Win32
{BC1557D9-9E84-4BA5-861E-CB04D767FBDC}.Release|Win32.Build.0 = Release|Win32
{B5D74697-F615-4DCB-AA8B-935F6372F01C}.Debug|Win32.ActiveCfg = Debug|Win32
{B5D74697-F615-4DCB-AA8B-935F6372F01C}.Debug|Win32.Build.0 = Debug|Win32
{B5D74697-F615-4DCB-AA8B-935F6372F01C}.Release|Win32.ActiveCfg = Release|Win32
{B5D74697-F615-4DCB-AA8B-935F6372F01C}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

559
build/vc8/libupnp.vcproj Normal file
View File

@@ -0,0 +1,559 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="libupnp"
ProjectGUID="{6227F51A-1498-4C4A-B213-F6FDED605125}"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Release|Win32"
OutputDirectory=".\Release"
IntermediateDirectory=".\Release"
ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName=".\Release/libupnp.tlb"
HeaderFileName=""
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\pthreads\include,..\ixml\src\inc,..\ixml\inc,..\threadutil\inc,..\upnp\inc,..\upnp\src\inc,.\inc"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBUPNP_EXPORTS;PTW32_STATIC_LIB;UPNP_STATIC_LIB;UPNP_USE_MSVCPP"
StringPooling="true"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
PrecompiledHeaderFile=".\Release/libupnp.pch"
AssemblerListingLocation=".\Release/"
ObjectFile=".\Release/"
ProgramDataBaseFileName=".\Release/"
BrowseInformation="1"
WarningLevel="3"
SuppressStartupBanner="true"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1031"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib"
OutputFile=".\Release/libupnp.dll"
LinkIncremental="1"
SuppressStartupBanner="true"
ProgramDatabaseFile=".\Release/libupnp.pdb"
ImportLibrary=".\Release/libupnp.lib"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
SuppressStartupBanner="true"
OutputFile=".\Release/libupnp.bsc"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName=".\Debug/libupnp.tlb"
HeaderFileName=""
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\pthreads\include;..\..\ixml\src\inc;..\..\ixml\inc;..\..\threadutil\inc;..\..\upnp\inc;..\..\upnp\src\inc;..\inc;..\msvc"
PreprocessorDefinitions="DEBUG;WIN32;_WINDOWS;_USRDLL;LIBUPNP_EXPORTS;UPNP_USE_MSVCPP"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
PrecompiledHeaderFile="$(OutDir)\libupnp.pch"
AssemblerListingLocation="$(OutDir)\"
ObjectFile="$(OutDir)\"
ProgramDataBaseFileName="$(OutDir)\"
BrowseInformation="1"
WarningLevel="3"
SuppressStartupBanner="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1031"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib"
OutputFile="$(OutDir)\libupnp.dll"
LinkIncremental="2"
SuppressStartupBanner="true"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(OutDir)\libupnp.pdb"
ImportLibrary="$(OutDir)\libupnp.lib"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
SuppressStartupBanner="true"
OutputFile="$(OutDir)\libupnp.bsc"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="sources"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
>
<File
RelativePath="..\..\ixml\src\attr.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\client_table\client_table.c"
>
</File>
<File
RelativePath="..\..\ixml\src\document.c"
>
</File>
<File
RelativePath="..\..\ixml\src\element.c"
>
</File>
<File
RelativePath="..\..\threadutil\src\FreeList.c"
>
</File>
<File
RelativePath="..\..\upnp\src\gena\gena_callback2.c"
>
</File>
<File
RelativePath="..\..\upnp\src\gena\gena_ctrlpt.c"
>
</File>
<File
RelativePath="..\..\upnp\src\gena\gena_device.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\net\http\httpparser.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\net\http\httpreadwrite.c"
>
</File>
<File
RelativePath="..\..\upnp\src\inet_pton.c"
>
</File>
<File
RelativePath="..\..\ixml\src\ixml.c"
>
</File>
<File
RelativePath="..\..\ixml\src\ixmlmembuf.c"
>
</File>
<File
RelativePath="..\..\ixml\src\ixmlparser.c"
>
</File>
<File
RelativePath="..\..\threadutil\src\LinkedList.c"
>
</File>
<File
RelativePath="..\..\upnp\src\uuid\md5.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\util\membuffer.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\miniserver\miniserver.c"
>
</File>
<File
RelativePath="..\..\ixml\src\namedNodeMap.c"
>
</File>
<File
RelativePath="..\..\ixml\src\node.c"
>
</File>
<File
RelativePath="..\..\ixml\src\nodeList.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\net\http\parsetools.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\service_table\service_table.c"
>
</File>
<File
RelativePath="..\..\upnp\src\soap\soap_common.c"
>
</File>
<File
RelativePath="..\..\upnp\src\soap\soap_ctrlpt.c"
>
</File>
<File
RelativePath="..\..\upnp\src\soap\soap_device.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\net\sock.c"
>
</File>
<File
RelativePath="..\..\upnp\src\ssdp\ssdp_ctrlpt.c"
>
</File>
<File
RelativePath="..\..\upnp\src\ssdp\ssdp_device.c"
>
</File>
<File
RelativePath="..\..\upnp\src\ssdp\ssdp_server.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\net\http\statcodes.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\util\strintmap.c"
>
</File>
<File
RelativePath="..\..\upnp\src\uuid\sysdep.c"
>
</File>
<File
RelativePath="..\..\threadutil\src\ThreadPool.c"
>
</File>
<File
RelativePath="..\..\threadutil\src\TimerThread.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\util\upnp_timeout.c"
>
</File>
<File
RelativePath="..\..\upnp\src\api\upnpapi.c"
>
</File>
<File
RelativePath="..\..\upnp\src\api\upnpdebug.c"
>
</File>
<File
RelativePath="..\..\upnp\src\api\upnptools.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\net\uri\uri.c"
>
</File>
<File
RelativePath="..\..\upnp\src\urlconfig\urlconfig.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\util\util.c"
>
</File>
<File
RelativePath="..\..\upnp\src\uuid\uuid.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\net\http\webserver.c"
>
</File>
<File
RelativePath="..\..\upnp\src\win_dll.c"
>
</File>
</Filter>
<Filter
Name="headers"
Filter="h;hpp;hxx;hm;inl"
>
<File
RelativePath="..\..\upnp\src\inc\client_table.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\config.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\gena.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\gena_ctrlpt.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\gena_device.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\global.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\gmtdate.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\http_client.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\httpparser.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\httpreadwrite.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\inet_pton.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\md5.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\membuffer.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\miniserver.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\netall.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\parsetools.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\server.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\service_table.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\soaplib.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\sock.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\ssdplib.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\statcodes.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\statuscodes.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\strintmap.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\sysdep.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\unixutil.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\upnp_timeout.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\upnpapi.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\upnpclosesocket.h"
>
</File>
<File
RelativePath="..\..\upnp\inc\upnpdebug.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\uri.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\urlconfig.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\util.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\utilall.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\uuid.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\webserver.h"
>
</File>
</Filter>
<Filter
Name="resources"
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
>
</Filter>
<File
RelativePath="..\..\..\..\libupnp_win32.patch"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

213
build/vc8/threadutil.vcproj Normal file
View File

@@ -0,0 +1,213 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="threadutil"
ProjectGUID="{24884928-0501-4CF2-BC8A-180AFC23B2AF}"
RootNamespace="threadutil"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
ConfigurationType="4"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\threadutil\inc;..\..\upnp\inc;..\..\ixml\inc;..\..\pthreads\include"
PreprocessorDefinitions="WIN32;DEBUG"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
AdditionalDependencies="pthreadVC2.lib"
AdditionalLibraryDirectories="..\..\pthreads\lib"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
RuntimeLibrary="2"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\..\threadutil\src\FreeList.c"
>
</File>
<File
RelativePath="..\..\threadutil\src\LinkedList.c"
>
</File>
<File
RelativePath="..\..\threadutil\src\ThreadPool.c"
>
</File>
<File
RelativePath="..\..\threadutil\src\TimerThread.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\..\threadutil\inc\FreeList.h"
>
</File>
<File
RelativePath="..\..\threadutil\inc\ithread.h"
>
</File>
<File
RelativePath="..\..\threadutil\inc\LinkedList.h"
>
</File>
<File
RelativePath="..\..\threadutil\inc\ThreadPool.h"
>
</File>
<File
RelativePath="..\..\threadutil\inc\TimerThread.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

216
build/vc8/tvcombo.vcproj Normal file
View File

@@ -0,0 +1,216 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="tvcombo"
ProjectGUID="{B5D74697-F615-4DCB-AA8B-935F6372F01C}"
RootNamespace="tvcombo"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\upnp\inc;..\..\ixml\inc;..\..\upnp\sample\common;..\inc;..\..\threadutil\inc;..\..\pthreads\include;..\..\upnp\sample\tvcombo;..\..\upnp\sample\tvcombo\linux"
PreprocessorDefinitions="WIN32;DEBUG"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="..\..\pthreads\lib\pthreadVC2.lib ixml.lib threadutil.lib libupnp.lib"
AdditionalLibraryDirectories="&quot;$(OutDir)&quot;;&quot;out.vc8.$(ConfigurationName)\ixml&quot;;&quot;out.vc8.$(ConfigurationName)\threadutil&quot;;&quot;out.vc8.$(ConfigurationName)\libupnp&quot;"
GenerateDebugInformation="true"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
RuntimeLibrary="2"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\..\upnp\sample\common\sample_util.c"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvcombo\linux\upnp_tv_combo_main.c"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvcombo\upnp_tv_ctrlpt.c"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvcombo\upnp_tv_device.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\..\upnp\sample\common\sample_util.h"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvcombo\upnp_tv_ctrlpt.h"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvcombo\upnp_tv_device.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

208
build/vc8/tvctrlpt.vcproj Normal file
View File

@@ -0,0 +1,208 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="tvctrlpt"
ProjectGUID="{BC1557D9-9E84-4BA5-861E-CB04D767FBDC}"
RootNamespace="tvctrlpt"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\upnp\inc;..\..\ixml\inc;..\..\upnp\sample\common;..\inc;..\..\threadutil\inc;..\..\pthreads\include;..\..\upnp\sample\tvctrlpt;..\..\upnp\sample\tvctrlpt\linux"
PreprocessorDefinitions="WIN32;DEBUG"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="..\..\pthreads\lib\pthreadVC2.lib ixml.lib threadutil.lib libupnp.lib"
AdditionalLibraryDirectories="&quot;$(OutDir)&quot;;&quot;out.vc8.$(ConfigurationName)\ixml&quot;;&quot;out.vc8.$(ConfigurationName)\threadutil&quot;;&quot;out.vc8.$(ConfigurationName)\libupnp&quot;"
GenerateDebugInformation="true"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
RuntimeLibrary="2"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\..\upnp\sample\common\sample_util.c"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvctrlpt\upnp_tv_ctrlpt.c"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvctrlpt\linux\upnp_tv_ctrlpt_main.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\..\upnp\sample\common\sample_util.h"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvctrlpt\upnp_tv_ctrlpt.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

208
build/vc8/tvdevice.vcproj Normal file
View File

@@ -0,0 +1,208 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="tvdevice"
ProjectGUID="{F592B023-E1F3-4A1E-841E-662DEE497435}"
RootNamespace="tvdevice"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\upnp\inc;..\..\ixml\inc;..\..\upnp\sample\common;..\inc;..\..\threadutil\inc;..\..\pthreads\include;..\..\upnp\sample\tvdevice;..\..\upnp\sample\tvdevice\linux"
PreprocessorDefinitions="WIN32;DEBUG"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="..\..\pthreads\lib\pthreadVC2.lib ixml.lib threadutil.lib libupnp.lib"
AdditionalLibraryDirectories="&quot;$(OutDir)&quot;;&quot;out.vc8.$(ConfigurationName)\ixml&quot;;&quot;out.vc8.$(ConfigurationName)\threadutil&quot;;&quot;out.vc8.$(ConfigurationName)\libupnp&quot;"
GenerateDebugInformation="true"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
RuntimeLibrary="2"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\..\upnp\sample\common\sample_util.c"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvdevice\upnp_tv_device.c"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvdevice\linux\upnp_tv_device_main.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\..\upnp\sample\common\sample_util.h"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvdevice\upnp_tv_device.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

222
build/vc9/ixml.vcproj Normal file
View File

@@ -0,0 +1,222 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="ixml"
ProjectGUID="{9C2C266D-35A3-465F-A297-0E21D54E5C89}"
RootNamespace="ixml"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
ConfigurationType="4"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\ixml\inc;..\..\ixml\src\inc"
PreprocessorDefinitions="DEBUG;WIN32"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\..\ixml\src\attr.c"
>
</File>
<File
RelativePath="..\..\ixml\src\document.c"
>
</File>
<File
RelativePath="..\..\ixml\src\element.c"
>
</File>
<File
RelativePath="..\..\ixml\src\ixml.c"
>
</File>
<File
RelativePath="..\..\ixml\src\ixmlmembuf.c"
>
</File>
<File
RelativePath="..\..\ixml\src\ixmlparser.c"
>
</File>
<File
RelativePath="..\..\ixml\src\namedNodeMap.c"
>
</File>
<File
RelativePath="..\..\ixml\src\node.c"
>
</File>
<File
RelativePath="..\..\ixml\src\nodeList.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\..\ixml\inc\ixml.h"
>
</File>
<File
RelativePath="..\..\ixml\src\inc\ixmlmembuf.h"
>
</File>
<File
RelativePath="..\..\ixml\src\inc\ixmlparser.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

69
build/vc9/libupnp.sln Normal file
View File

@@ -0,0 +1,69 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libupnp", "libupnp.vcproj", "{6227F51A-1498-4C4A-B213-F6FDED605125}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ixml", "ixml.vcproj", "{9C2C266D-35A3-465F-A297-0E21D54E5C89}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "threadutil", "threadutil.vcproj", "{1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}"
ProjectSection(ProjectDependencies) = postProject
{6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125}
{9C2C266D-35A3-465F-A297-0E21D54E5C89} = {9C2C266D-35A3-465F-A297-0E21D54E5C89}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tvctrlpt", "tvctrlpt.vcproj", "{8FB56F1C-E617-4B79-96AE-1FA499A3A9B5}"
ProjectSection(ProjectDependencies) = postProject
{6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125}
{9C2C266D-35A3-465F-A297-0E21D54E5C89} = {9C2C266D-35A3-465F-A297-0E21D54E5C89}
{1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D} = {1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tvdevice", "tvdevice.vcproj", "{7FB5F4A6-74F9-471D-B358-BAA0AC1CCA0A}"
ProjectSection(ProjectDependencies) = postProject
{6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125}
{9C2C266D-35A3-465F-A297-0E21D54E5C89} = {9C2C266D-35A3-465F-A297-0E21D54E5C89}
{1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D} = {1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tvcombo", "tvcombo.vcproj", "{6365804B-22C6-4D5E-91F3-0C052EB55B4F}"
ProjectSection(ProjectDependencies) = postProject
{6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125}
{9C2C266D-35A3-465F-A297-0E21D54E5C89} = {9C2C266D-35A3-465F-A297-0E21D54E5C89}
{1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D} = {1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6227F51A-1498-4C4A-B213-F6FDED605125}.Debug|Win32.ActiveCfg = Debug|Win32
{6227F51A-1498-4C4A-B213-F6FDED605125}.Debug|Win32.Build.0 = Debug|Win32
{6227F51A-1498-4C4A-B213-F6FDED605125}.Release|Win32.ActiveCfg = Release|Win32
{6227F51A-1498-4C4A-B213-F6FDED605125}.Release|Win32.Build.0 = Release|Win32
{9C2C266D-35A3-465F-A297-0E21D54E5C89}.Debug|Win32.ActiveCfg = Debug|Win32
{9C2C266D-35A3-465F-A297-0E21D54E5C89}.Debug|Win32.Build.0 = Debug|Win32
{9C2C266D-35A3-465F-A297-0E21D54E5C89}.Release|Win32.ActiveCfg = Release|Win32
{9C2C266D-35A3-465F-A297-0E21D54E5C89}.Release|Win32.Build.0 = Release|Win32
{1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}.Debug|Win32.ActiveCfg = Debug|Win32
{1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}.Debug|Win32.Build.0 = Debug|Win32
{1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}.Release|Win32.ActiveCfg = Release|Win32
{1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}.Release|Win32.Build.0 = Release|Win32
{8FB56F1C-E617-4B79-96AE-1FA499A3A9B5}.Debug|Win32.ActiveCfg = Debug|Win32
{8FB56F1C-E617-4B79-96AE-1FA499A3A9B5}.Debug|Win32.Build.0 = Debug|Win32
{8FB56F1C-E617-4B79-96AE-1FA499A3A9B5}.Release|Win32.ActiveCfg = Release|Win32
{8FB56F1C-E617-4B79-96AE-1FA499A3A9B5}.Release|Win32.Build.0 = Release|Win32
{7FB5F4A6-74F9-471D-B358-BAA0AC1CCA0A}.Debug|Win32.ActiveCfg = Debug|Win32
{7FB5F4A6-74F9-471D-B358-BAA0AC1CCA0A}.Debug|Win32.Build.0 = Debug|Win32
{7FB5F4A6-74F9-471D-B358-BAA0AC1CCA0A}.Release|Win32.ActiveCfg = Release|Win32
{7FB5F4A6-74F9-471D-B358-BAA0AC1CCA0A}.Release|Win32.Build.0 = Release|Win32
{6365804B-22C6-4D5E-91F3-0C052EB55B4F}.Debug|Win32.ActiveCfg = Debug|Win32
{6365804B-22C6-4D5E-91F3-0C052EB55B4F}.Debug|Win32.Build.0 = Debug|Win32
{6365804B-22C6-4D5E-91F3-0C052EB55B4F}.Release|Win32.ActiveCfg = Release|Win32
{6365804B-22C6-4D5E-91F3-0C052EB55B4F}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

558
build/vc9/libupnp.vcproj Normal file
View File

@@ -0,0 +1,558 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="libupnp"
ProjectGUID="{6227F51A-1498-4C4A-B213-F6FDED605125}"
TargetFrameworkVersion="131072"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Release|Win32"
OutputDirectory=".\Release"
IntermediateDirectory=".\Release"
ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName=".\Release/libupnp.tlb"
HeaderFileName=""
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\pthreads\include,..\ixml\src\inc,..\ixml\inc,..\threadutil\inc,..\upnp\inc,..\upnp\src\inc,.\inc"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBUPNP_EXPORTS;PTW32_STATIC_LIB;UPNP_STATIC_LIB;UPNP_USE_MSVCPP"
StringPooling="true"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
PrecompiledHeaderFile=".\Release/libupnp.pch"
AssemblerListingLocation=".\Release/"
ObjectFile=".\Release/"
ProgramDataBaseFileName=".\Release/"
BrowseInformation="1"
WarningLevel="3"
SuppressStartupBanner="true"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1031"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib"
OutputFile=".\Release/libupnp.dll"
LinkIncremental="1"
SuppressStartupBanner="true"
ProgramDatabaseFile=".\Release/libupnp.pdb"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
ImportLibrary=".\Release/libupnp.lib"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
SuppressStartupBanner="true"
OutputFile=".\Release/libupnp.bsc"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="true"
SuppressStartupBanner="true"
TargetEnvironment="1"
TypeLibraryName=".\Debug/libupnp.tlb"
HeaderFileName=""
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\pthreads\include;..\..\ixml\src\inc;..\..\ixml\inc;..\..\threadutil\inc;..\..\upnp\inc;..\..\upnp\src\inc;..\inc;..\msvc"
PreprocessorDefinitions="DEBUG;WIN32;_USRDLL;LIBUPNP_EXPORTS;UPNP_USE_MSVCPP"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
PrecompiledHeaderFile="$(OutDir)\libupnp.pch"
AssemblerListingLocation="$(OutDir)\"
ObjectFile="$(OutDir)\"
ProgramDataBaseFileName="$(OutDir)\"
BrowseInformation="1"
WarningLevel="3"
SuppressStartupBanner="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1031"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib"
OutputFile="$(OutDir)\libupnp.dll"
LinkIncremental="2"
SuppressStartupBanner="true"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(OutDir)\libupnp.pdb"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
ImportLibrary="$(OutDir)\libupnp.lib"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
SuppressStartupBanner="true"
OutputFile="$(OutDir)\libupnp.bsc"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="sources"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
>
<File
RelativePath="..\..\ixml\src\attr.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\client_table\client_table.c"
>
</File>
<File
RelativePath="..\..\ixml\src\document.c"
>
</File>
<File
RelativePath="..\..\ixml\src\element.c"
>
</File>
<File
RelativePath="..\..\threadutil\src\FreeList.c"
>
</File>
<File
RelativePath="..\..\upnp\src\gena\gena_callback2.c"
>
</File>
<File
RelativePath="..\..\upnp\src\gena\gena_ctrlpt.c"
>
</File>
<File
RelativePath="..\..\upnp\src\gena\gena_device.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\net\http\httpparser.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\net\http\httpreadwrite.c"
>
</File>
<File
RelativePath="..\..\upnp\src\inet_pton.c"
>
</File>
<File
RelativePath="..\..\ixml\src\ixml.c"
>
</File>
<File
RelativePath="..\..\ixml\src\ixmlmembuf.c"
>
</File>
<File
RelativePath="..\..\ixml\src\ixmlparser.c"
>
</File>
<File
RelativePath="..\..\threadutil\src\LinkedList.c"
>
</File>
<File
RelativePath="..\..\upnp\src\uuid\md5.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\util\membuffer.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\miniserver\miniserver.c"
>
</File>
<File
RelativePath="..\..\ixml\src\namedNodeMap.c"
>
</File>
<File
RelativePath="..\..\ixml\src\node.c"
>
</File>
<File
RelativePath="..\..\ixml\src\nodeList.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\net\http\parsetools.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\service_table\service_table.c"
>
</File>
<File
RelativePath="..\..\upnp\src\soap\soap_common.c"
>
</File>
<File
RelativePath="..\..\upnp\src\soap\soap_ctrlpt.c"
>
</File>
<File
RelativePath="..\..\upnp\src\soap\soap_device.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\net\sock.c"
>
</File>
<File
RelativePath="..\..\upnp\src\ssdp\ssdp_ctrlpt.c"
>
</File>
<File
RelativePath="..\..\upnp\src\ssdp\ssdp_device.c"
>
</File>
<File
RelativePath="..\..\upnp\src\ssdp\ssdp_server.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\net\http\statcodes.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\util\strintmap.c"
>
</File>
<File
RelativePath="..\..\upnp\src\uuid\sysdep.c"
>
</File>
<File
RelativePath="..\..\threadutil\src\ThreadPool.c"
>
</File>
<File
RelativePath="..\..\threadutil\src\TimerThread.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\util\upnp_timeout.c"
>
</File>
<File
RelativePath="..\..\upnp\src\api\upnpapi.c"
>
</File>
<File
RelativePath="..\..\upnp\src\api\upnpdebug.c"
>
</File>
<File
RelativePath="..\..\upnp\src\api\upnptools.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\net\uri\uri.c"
>
</File>
<File
RelativePath="..\..\upnp\src\urlconfig\urlconfig.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\util\util.c"
>
</File>
<File
RelativePath="..\..\upnp\src\uuid\uuid.c"
>
</File>
<File
RelativePath="..\..\upnp\src\genlib\net\http\webserver.c"
>
</File>
<File
RelativePath="..\..\upnp\src\win_dll.c"
>
</File>
</Filter>
<Filter
Name="headers"
Filter="h;hpp;hxx;hm;inl"
>
<File
RelativePath="..\..\upnp\src\inc\client_table.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\config.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\gena.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\gena_ctrlpt.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\gena_device.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\global.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\gmtdate.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\http_client.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\httpparser.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\httpreadwrite.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\inet_pton.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\md5.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\membuffer.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\miniserver.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\netall.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\parsetools.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\server.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\service_table.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\soaplib.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\sock.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\ssdplib.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\statcodes.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\statuscodes.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\strintmap.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\sysdep.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\unixutil.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\upnp_timeout.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\upnpapi.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\upnpclosesocket.h"
>
</File>
<File
RelativePath="..\..\upnp\inc\upnpdebug.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\uri.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\urlconfig.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\util.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\utilall.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\uuid.h"
>
</File>
<File
RelativePath="..\..\upnp\src\inc\webserver.h"
>
</File>
</Filter>
<Filter
Name="resources"
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
>
</Filter>
<File
RelativePath="..\..\..\..\libupnp_win32.patch"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

212
build/vc9/threadutil.vcproj Normal file
View File

@@ -0,0 +1,212 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="threadutil"
ProjectGUID="{1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}"
RootNamespace="threadutil"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
ConfigurationType="4"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\threadutil\inc;..\..\upnp\inc;..\..\ixml\inc;..\..\pthreads\include"
PreprocessorDefinitions="WIN32;DEBUG"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
AdditionalDependencies="pthreadVC2.lib"
AdditionalLibraryDirectories="..\..\pthreads\lib"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\..\threadutil\src\FreeList.c"
>
</File>
<File
RelativePath="..\..\threadutil\src\LinkedList.c"
>
</File>
<File
RelativePath="..\..\threadutil\src\ThreadPool.c"
>
</File>
<File
RelativePath="..\..\threadutil\src\TimerThread.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\..\threadutil\inc\FreeList.h"
>
</File>
<File
RelativePath="..\..\threadutil\inc\ithread.h"
>
</File>
<File
RelativePath="..\..\threadutil\inc\LinkedList.h"
>
</File>
<File
RelativePath="..\..\threadutil\inc\threadpool.h"
>
</File>
<File
RelativePath="..\..\threadutil\inc\TimerThread.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

212
build/vc9/tvcombo.vcproj Normal file
View File

@@ -0,0 +1,212 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="tvcombo"
ProjectGUID="{6365804B-22C6-4D5E-91F3-0C052EB55B4F}"
RootNamespace="tvcombo"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\upnp\inc;..\..\upnp\sample\common;..\..\upnp\sample;..\..\ixml\inc;..\..\pthreads\include;..\inc;..\..\threadutil\inc;..\..\upnp\sample\tvcombo"
PreprocessorDefinitions="DEBUG;WIN32"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="..\..\pthreads\lib\pthreadVC2.lib ixml.lib threadutil.lib libupnp.lib"
AdditionalLibraryDirectories="&quot;$(OutDir)&quot;;&quot;.\out.vc9.$(ConfigurationName)\ixml&quot;;&quot;.\out.vc9.$(ConfigurationName)\threadutil&quot;;&quot;.\out.vc9.$(ConfigurationName)\libupnp&quot;"
GenerateDebugInformation="true"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\..\upnp\sample\common\sample_util.c"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvcombo\linux\upnp_tv_combo_main.c"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvcombo\upnp_tv_ctrlpt.c"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvcombo\upnp_tv_device.c"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\..\upnp\sample\common\sample_util.h"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvcombo\upnp_tv_ctrlpt.h"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvcombo\upnp_tv_device.h"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

204
build/vc9/tvctrlpt.vcproj Normal file
View File

@@ -0,0 +1,204 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="tvctrlpt"
ProjectGUID="{8FB56F1C-E617-4B79-96AE-1FA499A3A9B5}"
RootNamespace="sample"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\upnp\inc;..\..\upnp\sample\common;..\..\ixml\inc;..\inc;..\..\threadutil\inc;..\..\pthreads\include;..\..\upnp\sample\tvctrlpt\linux;..\..\upnp\sample\tvctrlpt"
PreprocessorDefinitions="WIN32;DEBUG"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="..\..\pthreads\lib\pthreadVC2.lib ixml.lib threadutil.lib libupnp.lib"
AdditionalLibraryDirectories="&quot;$(OutDir)&quot;;&quot;.\out.vc9.$(ConfigurationName)\ixml&quot;;&quot;.\out.vc9.$(ConfigurationName)\threadutil&quot;;&quot;.\out.vc9.$(ConfigurationName)\libupnp&quot;"
GenerateDebugInformation="true"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\..\upnp\sample\common\sample_util.c"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvctrlpt\upnp_tv_ctrlpt.c"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvctrlpt\linux\upnp_tv_ctrlpt_main.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\..\upnp\sample\common\sample_util.h"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvctrlpt\upnp_tv_ctrlpt.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

204
build/vc9/tvdevice.vcproj Normal file
View File

@@ -0,0 +1,204 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="tvdevice"
ProjectGUID="{7FB5F4A6-74F9-471D-B358-BAA0AC1CCA0A}"
RootNamespace="tvdevice"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\upnp\inc;..\..\ixml\inc;..\..\upnp\sample\common;..\inc;..\..\threadutil\inc;..\..\pthreads\include;..\..\upnp\sample\tvdevice;..\..\upnp\sample\tvdevice\linux"
PreprocessorDefinitions="WIN32;DEBUG"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="..\..\pthreads\lib\pthreadVC2.lib ixml.lib threadutil.lib libupnp.lib"
AdditionalLibraryDirectories="&quot;$(OutDir)&quot;;&quot;.\out.vc9.$(ConfigurationName)\ixml&quot;;&quot;.\out.vc9.$(ConfigurationName)\threadutil&quot;;&quot;.\out.vc9.$(ConfigurationName)\libupnp&quot;"
GenerateDebugInformation="true"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\..\upnp\sample\common\sample_util.c"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvdevice\upnp_tv_device.c"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvdevice\linux\upnp_tv_device_main.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\..\upnp\sample\common\sample_util.h"
>
</File>
<File
RelativePath="..\..\upnp\sample\tvdevice\upnp_tv_device.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@@ -4,73 +4,167 @@
# #
# 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.6], [mroberto@users.sourceforge.net])
# *Independently* of the above libupnp package version, the libtool version dnl ############################################################################
# of the 3 libraries need to be updated whenever there is a change released : dnl # *Independently* of the above libupnp package version, the libtool version
# "current:revision:age" (this is NOT the same as the package version), where: dnl # of the 3 libraries need to be updated whenever there is a change released:
# - library code modified: revision++ dnl # "current:revision:age" (this is NOT the same as the package version),
# - interfaces changed/added/removed: current++ and revision=0 dnl # where:
# - interfaces added: age++ dnl # - library code modified: revision++
# - interfaces removed: age=0 dnl # - interfaces changed/added/removed: current++ and revision=0
# *please update only once, before a formal release, not for each change* dnl # - interfaces added: age++
# dnl # - interfaces removed: age=0
# For release 1.4.1, we had: dnl # *please update only once, before a formal release, not for each change*
#AC_SUBST([LT_VERSION_IXML], [2:2:0]) dnl #
#AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0]) dnl ############################################################################
#AC_SUBST([LT_VERSION_UPNP], [2:2:0]) dnl # Release 1.4.1:
# dnl #AC_SUBST([LT_VERSION_IXML], [2:2:0])
# "current:revision:age" dnl #AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0])
# dnl #AC_SUBST([LT_VERSION_UPNP], [2:2:0])
# - Code has changed in ixml dnl #
# revision: 2 -> 3 dnl ############################################################################
# - Code has changed in threadutil dnl # Release 1.4.6:
# revision: 2 -> 3 dnl # "current:revision:age"
# - Interface added in threadutil dnl #
# current: 2 -> 3 dnl # - Code has changed in ixml
# revisiion: 3 -> 0 dnl # revision: 2 -> 3
# age: 0 -> 1 dnl # - Code has changed in threadutil
# - Code has changed in upnp dnl # revision: 2 -> 3
# revision: 2 -> 3 dnl # - Interface added in threadutil
# dnl # current: 2 -> 3
# For release 1.4.6, we had: dnl # revisiion: 3 -> 0
#AC_SUBST([LT_VERSION_IXML], [2:3:0]) dnl # age: 0 -> 1
#AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1]) dnl # - Code has changed in upnp
#AC_SUBST([LT_VERSION_UPNP], [2:3:0]) dnl # revision: 2 -> 3
# dnl #
# "current:revision:age" dnl #AC_SUBST([LT_VERSION_IXML], [2:3:0])
# dnl #AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1])
# - Code has changed in ixml dnl #AC_SUBST([LT_VERSION_UPNP], [2:3:0])
# revision: 3 -> 4 dnl #
# - Code has changed in threadutil dnl ############################################################################
# revision: 0 -> 1 dnl # Release 1.6.0:
# - Code has changed in upnp dnl # "current:revision:age"
# revision: 3 -> 4 dnl #
# - Interface changed in upnp dnl # - Code has changed in ixml
# current: 2 -> 3 dnl # revision: 3 -> 4
# revision: 4 -> 0 dnl # - Code has changed in threadutil
# - Interface removed in upnp dnl # revision: 0 -> 1
# age: 0 -> 0 dnl # - Code has changed in upnp
# dnl # revision: 3 -> 4
# For release 1.6.0, we had: dnl # - Interface changed in upnp
#AC_SUBST([LT_VERSION_IXML], [2:4:0]) dnl # current: 2 -> 3
#AC_SUBST([LT_VERSION_THREADUTIL], [3:1:1]) dnl # revision: 4 -> 0
#AC_SUBST([LT_VERSION_UPNP], [3:0:0]) dnl # - Interface removed in upnp
dnl # age: 0 -> 0
dnl #
dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0])
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [3:1:1])
dnl #AC_SUBST([LT_VERSION_UPNP], [3:0:0])
dnl #
dnl ############################################################################
dnl # Release 1.6.1:
dnl # "current:revision:age"
dnl #
dnl # - Code has changed in threadutil
dnl # revision: 1 -> 2
dnl # - Interface added in threadutil
dnl # current: 3 -> 4
dnl # revision: 2 -> 0
dnl # - Interface added in threadutil
dnl # age: 1 -> 2
dnl # - Code has changed in upnp
dnl # revision: 0 -> 1
dnl #
dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0])
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2])
dnl #AC_SUBST([LT_VERSION_UPNP], [3:1:0])
dnl #
dnl ############################################################################
dnl # Release 1.6.2:
dnl # "current:revision:age"
dnl #
dnl # - Code has changed in upnp
dnl # revision: 1 -> 2
dnl #
dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0])
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2])
dnl #AC_SUBST([LT_VERSION_UPNP], [3:2:0])
dnl #
dnl ############################################################################
dnl # Release 1.6.3:
dnl # "current:revision:age"
dnl #
dnl # - Code has changed in threadutil
dnl # revision: 0 -> 1
dnl #
dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0])
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:1:2])
dnl #AC_SUBST([LT_VERSION_UPNP], [3:2:0])
dnl #
dnl ############################################################################
dnl # Release 1.6.4:
dnl # "current:revision:age"
dnl #
dnl # - Code has changed in threadutil
dnl # revision: 1 -> 2
dnl # - Code has changed in upnp
dnl # revision: 2 -> 3
dnl #
dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0])
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:2:2])
dnl #AC_SUBST([LT_VERSION_UPNP], [3:3:0])
dnl #
dnl ############################################################################
dnl # Release 1.6.5:
dnl # "current:revision:age"
dnl #
dnl # - Code has changed in upnp
dnl # revision: 3 -> 4
dnl #
dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0])
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:2:2])
dnl #AC_SUBST([LT_VERSION_UPNP], [3:4:0])
dnl #
dnl ############################################################################
dnl # Release 1.6.6:
dnl # "current:revision:age"
dnl #
dnl # - Code has changed in threadutil
dnl # revision: 2 -> 3
dnl # - Code has changed in upnp
dnl # revision: 4 -> 5
dnl #
dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0])
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:3:2])
dnl #AC_SUBST([LT_VERSION_UPNP], [3:5:0])
dnl #
dnl ############################################################################
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:3:2])
AC_SUBST([LT_VERSION_UPNP], [3:0:0]) AC_SUBST([LT_VERSION_UPNP], [3:5:0])
dnl ############################################################################
dnl # Repeating the algorithm to place it closer to the modificatin place:
dnl # - library code modified: revision++
dnl # - interfaces changed/added/removed: current++ and revision=0
dnl # - interfaces added: age++
dnl # - interfaces removed: age=0
dnl # *please update only once, before a formal release, not for each change*
dnl ############################################################################
AC_CONFIG_AUX_DIR(config.aux) AC_CONFIG_AUX_DIR([build-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
# #
@@ -95,8 +189,7 @@ AC_REVISION([$Revision: 1.11 $])
upnpmaj=`echo "$PACKAGE_VERSION" | sed 's/\..*//' ` upnpmaj=`echo "$PACKAGE_VERSION" | sed 's/\..*//' `
upnpmin=[`echo "$PACKAGE_VERSION" | sed 's/^[^.]\.// ; s/[^0-9].*$//' `] upnpmin=[`echo "$PACKAGE_VERSION" | sed 's/^[^.]\.// ; s/[^0-9].*$//' `]
upnppatch=[`echo "$PACKAGE_VERSION" | sed 's/^[^.]\.[^.]\.// ; s/[^0-9].*$//' `] upnppatch=[`echo "$PACKAGE_VERSION" | sed 's/^[^.]\.[^.]\.// ; s/[^0-9].*$//' `]
AC_DEFINE_UNQUOTED([UPNP_VERSION_STRING], "$PACKAGE_VERSION", AC_DEFINE_UNQUOTED([UPNP_VERSION_STRING], "$PACKAGE_VERSION", [see upnpconfig.h])
[see upnpconfig.h])
AC_DEFINE_UNQUOTED([UPNP_VERSION_MAJOR], $upnpmaj, [see upnpconfig.h]) AC_DEFINE_UNQUOTED([UPNP_VERSION_MAJOR], $upnpmaj, [see upnpconfig.h])
AC_DEFINE_UNQUOTED([UPNP_VERSION_MINOR], $upnpmin, [see upnpconfig.h]) AC_DEFINE_UNQUOTED([UPNP_VERSION_MINOR], $upnpmin, [see upnpconfig.h])
AC_DEFINE_UNQUOTED([UPNP_VERSION_PATCH], $upnppatch, [see upnpconfig.h]) AC_DEFINE_UNQUOTED([UPNP_VERSION_PATCH], $upnppatch, [see upnpconfig.h])
@@ -118,7 +211,6 @@ fi
# #
# Check for libupnp subsets # Check for libupnp subsets
# #
RT_BOOL_ARG_ENABLE([client], [yes], [control point code (client)]) RT_BOOL_ARG_ENABLE([client], [yes], [control point code (client)])
if test "x$enable_client" = xyes ; then if test "x$enable_client" = xyes ; then
AC_DEFINE(UPNP_HAVE_CLIENT, 1, [see upnpconfig.h]) AC_DEFINE(UPNP_HAVE_CLIENT, 1, [see upnpconfig.h])
@@ -152,11 +244,13 @@ fi
RT_BOOL_ARG_ENABLE([samples], [yes], [compilation of upnp/sample/ code]) RT_BOOL_ARG_ENABLE([samples], [yes], [compilation of upnp/sample/ code])
#
# doc installation # doc installation
# autoconf >= 2.60 already defines ${docdir}, but we will not use its # autoconf >= 2.60 already defines ${docdir}, but we will not use its
# default value, which is ${datarootdir}/doc/${PACKAGE_TARNAME}. # default value, which is ${datarootdir}/doc/${PACKAGE_TARNAME}.
# That would give us ${datarootdir}/doc/libupnp, and we want the package # That would give us ${datarootdir}/doc/libupnp, and we want the package
# version on that. # version on that.
#
docdir="${datadir}/doc/${PACKAGE_NAME}-${PACKAGE_VERSION}" docdir="${datadir}/doc/${PACKAGE_NAME}-${PACKAGE_VERSION}"
AC_MSG_CHECKING([for documentation directory]) AC_MSG_CHECKING([for documentation directory])
AC_ARG_WITH( AC_ARG_WITH(
@@ -171,7 +265,9 @@ AS_HELP_STRING(
[], [],
[with_documentation=no]) [with_documentation=no])
#
# If something has been entered after an equal sign, assume it is the directory # If something has been entered after an equal sign, assume it is the directory
#
if test x"$with_documentation" != xyes -a x"$with_documentation" != xno; then if test x"$with_documentation" != xyes -a x"$with_documentation" != xno; then
docdir="$with_documentation" docdir="$with_documentation"
fi fi
@@ -205,7 +301,9 @@ freebsd*)
echo "Using non-specific system compiler settings" echo "Using non-specific system compiler settings"
if test x"$enable_debug" = xyes; then if test x"$enable_debug" = xyes; then
# AC_PROG_CC already sets CFLAGS to "-g -O2" by default # AC_PROG_CC already sets CFLAGS to "-g -O2" by default
: #:
# Use -O0 in debug so that variables do not get optimized out
AX_CFLAGS_GCC_OPTION([-O0])
else else
# add optimise for size # add optimise for size
AX_CFLAGS_GCC_OPTION([-Os]) AX_CFLAGS_GCC_OPTION([-Os])
@@ -257,7 +355,6 @@ AC_CHECK_HEADERS(
# Checks for typedefs, structures, and compiler characteristics # Checks for typedefs, structures, and compiler characteristics
# #
AC_C_CONST AC_C_CONST
AC_TYPE_SIZE_T
TYPE_SOCKLEN_T TYPE_SOCKLEN_T
@@ -272,9 +369,40 @@ AC_CHECK_FUNCS(ftime,, [AC_CHECK_LIB(compat, ftime)])
# #
# Checks for POSIX Threads # Checks for POSIX Threads
# #
echo "--------------------------- pthread stuff -------------------------------------"
ACX_PTHREAD( ACX_PTHREAD(
[], [],
[AC_MSG_ERROR([POSIX threads are required to build this program])]) [AC_MSG_ERROR([POSIX threads are required to build this program])])
#
# Update environment variables for pthreads
#
CC="$PTHREAD_CC"
CFLAGS="$PTHREAD_CFLAGS $CFLAGS"
LIBS="$PTHREAD_LIBS $LIBS"
#
# Determine if pthread_rwlock_t is available
#
echo "----------------------- pthread_rwlock_t stuff --------------------------------"
AC_MSG_CHECKING([if pthread_rwlock_t is available])
AC_LANG([C])
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[#include <pthread.h>],
[pthread_rwlock_t *x;])],
[AC_DEFINE([UPNP_USE_RWLOCK], [1], [Use pthread_rwlock_t])
AC_MSG_RESULT([yes, supported without any options])],
[AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[#define _GNU_SOURCE
#include <pthread.h>],
[pthread_rwlock_t *x;])],
[AC_DEFINE([UPNP_USE_RWLOCK], [1], [Use pthread_rwlock_t])
CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
AC_MSG_RESULT([yes, definition of _GNU_SOURCE required])],
[AC_DEFINE([UPNP_USE_RWLOCK], [0], [Do not use pthread_rwlock_t])
AC_MSG_RESULT([no, needs to fallback to pthread_mutex])
AC_MSG_ERROR([pthread_rwlock_t not available])])])
echo "-------------------------------------------------------------------------------"
AC_CONFIG_FILES([ AC_CONFIG_FILES([

View File

@@ -39,7 +39,7 @@ EXTRA_DIST = \
./html/upnp/UPNP_E_SOCKET_ERROR-208.html \ ./html/upnp/UPNP_E_SOCKET_ERROR-208.html \
./html/upnp/UPNP_E_CANCELED-210.html \ ./html/upnp/UPNP_E_CANCELED-210.html \
./html/upnp/UPNP_E_SUBSCRIBE_UNACCEPTED-301.html \ ./html/upnp/UPNP_E_SUBSCRIBE_UNACCEPTED-301.html \
./html/upnp/UPNP_E_UNSUBSCRIBE_UNACCAPTED-302.html \ ./html/upnp/UPNP_E_UNSUBSCRIBE_UNACCEPTED-302.html \
./html/upnp/UPNP_E_NOTIFY_UNACCEPTED-303.html \ ./html/upnp/UPNP_E_NOTIFY_UNACCEPTED-303.html \
./html/upnp/UPNP_E_INVALID_ARGUMENT-501.html \ ./html/upnp/UPNP_E_INVALID_ARGUMENT-501.html \
./html/upnp/UPNP_E_FILE_NOT_FOUND-502.html \ ./html/upnp/UPNP_E_FILE_NOT_FOUND-502.html \
@@ -295,7 +295,7 @@ if WITH_DOCUMENTATION
./html/upnp/UPNP_E_SOCKET_ERROR-208.html \ ./html/upnp/UPNP_E_SOCKET_ERROR-208.html \
./html/upnp/UPNP_E_CANCELED-210.html \ ./html/upnp/UPNP_E_CANCELED-210.html \
./html/upnp/UPNP_E_SUBSCRIBE_UNACCEPTED-301.html \ ./html/upnp/UPNP_E_SUBSCRIBE_UNACCEPTED-301.html \
./html/upnp/UPNP_E_UNSUBSCRIBE_UNACCAPTED-302.html \ ./html/upnp/UPNP_E_UNSUBSCRIBE_UNACCEPTED-302.html \
./html/upnp/UPNP_E_NOTIFY_UNACCEPTED-303.html \ ./html/upnp/UPNP_E_NOTIFY_UNACCEPTED-303.html \
./html/upnp/UPNP_E_INVALID_ARGUMENT-501.html \ ./html/upnp/UPNP_E_INVALID_ARGUMENT-501.html \
./html/upnp/UPNP_E_FILE_NOT_FOUND-502.html \ ./html/upnp/UPNP_E_FILE_NOT_FOUND-502.html \

View File

@@ -38,10 +38,6 @@
#define MINVAL( a, b ) ( (a) < (b) ? (a) : (b) ) #define MINVAL( a, b ) ( (a) < (b) ? (a) : (b) )
#define MAXVAL( a, b ) ( (a) > (b) ? (a) : (b) ) #define MAXVAL( a, b ) ( (a) > (b) ? (a) : (b) )
#ifndef WIN32
#define UPNP_INLINE inline
#endif
#define MEMBUF_DEF_SIZE_INC 20 #define MEMBUF_DEF_SIZE_INC 20

View File

@@ -504,14 +504,19 @@ Parser_init( )
* Parser_isValidEndElement * Parser_isValidEndElement
* check if a new node->nodeName matches top of element stack. * check if a new node->nodeName matches top of element stack.
* Internal to parser only. * Internal to parser only.
*
*=================================================================*/ *=================================================================*/
static int static int
Parser_isValidEndElement( IN Parser * xmlParser, Parser_isValidEndElement(
IN Parser * xmlParser,
IN IXML_Node * newNode ) IN IXML_Node * newNode )
{ {
return ( strcmp( xmlParser->pCurElement->element, newNode->nodeName ) assert( xmlParser );
== 0 ); assert( xmlParser->pCurElement );
assert( xmlParser->pCurElement->element );
assert( newNode );
assert( newNode->nodeName );
return strcmp( xmlParser->pCurElement->element, newNode->nodeName ) == 0;
} }
/*=============================================================== /*===============================================================
@@ -921,6 +926,8 @@ Parser_parseDocument( OUT IXML_Document ** retDoc,
int rc = IXML_SUCCESS; int rc = IXML_SUCCESS;
IXML_CDATASection *cdataSecNode = NULL; IXML_CDATASection *cdataSecNode = NULL;
// It is important that the node gets initialized here, otherwise things
// can go wrong on the error handler.
ixmlNode_init( &newNode ); ixmlNode_init( &newNode );
rc = ixmlDocument_createDocumentEx( &gRootDoc ); rc = ixmlDocument_createDocumentEx( &gRootDoc );
@@ -936,7 +943,9 @@ Parser_parseDocument( OUT IXML_Document ** retDoc,
} }
while( bETag == FALSE ) { while( bETag == FALSE ) {
// clear the newNode contents // clear the newNode contents. Redundant on the first iteration,
// but nonetheless, necessary due to the possible calls to
// ErrorHandler above. Currently, this is just a memset to zero.
ixmlNode_init( &newNode ); ixmlNode_init( &newNode );
if( Parser_getNextNode( xmlParser, &newNode, &bETag ) == if( Parser_getNextNode( xmlParser, &newNode, &bETag ) ==
@@ -2497,3 +2506,4 @@ Parser_getNextNode( IN Parser * xmlParser,
return IXML_SYNTAX_ERR; return IXML_SYNTAX_ERR;
} }

View File

@@ -261,7 +261,7 @@ ixmlNode_setLocalName( IN IXML_Node * nodeptr,
} }
/*================================================================ /*================================================================
* ixmlNode_getNodeNamespaceURI * ixmlNode_getNamespaceURI
* Returns the node namespaceURI * Returns the node namespaceURI
* External function. * External function.
* Returns: * Returns:

0
ixml/test/test_document.sh Normal file → Executable file
View File

View File

@@ -1,4 +1,4 @@
Version: 1.4.2 Version: 1.6.6
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

View File

@@ -41,7 +41,7 @@ AC_DEFUN([RT_BOOL_ARG_ENABLE],[
)]) )])
test "x$enable_[$1]" != [x]m4_if([$2],[yes],[no],[yes]) dnl test "x$enable_[$1]" != [x]m4_if([$2],[yes],[no],[yes]) dnl
&& enable_[]Name=[$2] && enable_[]Name=[$2]
AC_MSG_RESULT($enable_[]Name)dnl AC_MSG_RESULT($enable_[]Name)
AM_CONDITIONAL([ENABLE_]NAME, test x"$enable_[]Name" = xyes) AM_CONDITIONAL([ENABLE_]NAME, test x"$enable_[]Name" = xyes)
dnl dnl
m4_popdef([NAME])dnl m4_popdef([NAME])dnl

View File

@@ -6,7 +6,6 @@
# #
AM_CPPFLAGS = -I$(srcdir)/inc -I$(srcdir)/src/inc AM_CPPFLAGS = -I$(srcdir)/inc -I$(srcdir)/src/inc
AM_CFLAGS = $(PTHREAD_CFLAGS)
if ENABLE_DEBUG if ENABLE_DEBUG
AM_CPPFLAGS += -DDEBUG -DSTATS AM_CPPFLAGS += -DDEBUG -DSTATS
@@ -21,12 +20,11 @@ libthreadutil_la_LDFLAGS = -version-info $(LT_VERSION_THREADUTIL)
libthreadutil_la_SOURCES = \ libthreadutil_la_SOURCES = \
src/FreeList.c src/LinkedList.c \ src/FreeList.c src/LinkedList.c \
src/ThreadPool.c src/TimerThread.c \ src/ThreadPool.c src/TimerThread.c
src/iasnprintf.c
upnpincludedir = $(includedir)/upnp upnpincludedir = $(includedir)/upnp
upnpinclude_HEADERS = \ upnpinclude_HEADERS = \
inc/FreeList.h inc/LinkedList.h \ inc/FreeList.h inc/LinkedList.h \
inc/ThreadPool.h inc/TimerThread.h \ inc/ThreadPool.h inc/TimerThread.h \
inc/iasnprintf.h inc/ithread.h inc/ithread.h

View File

@@ -32,6 +32,12 @@
#ifndef THREADPOOL_H #ifndef THREADPOOL_H
#define THREADPOOL_H #define THREADPOOL_H
#ifdef UPNP_USE_MSVCPP
#define UPNP_INLINE
#else
#define UPNP_INLINE inline
#endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@@ -64,32 +70,36 @@ typedef enum priority {LOW_PRIORITY,
#define DEFAULT_FREE_ROUTINE NULL /* default free routine used TPJobInit */ #define DEFAULT_FREE_ROUTINE NULL /* default free routine used TPJobInit */
#define DEFAULT_MAX_JOBS_TOTAL 100 /* default max jobs used TPAttrInit */ #define DEFAULT_MAX_JOBS_TOTAL 100 /* default max jobs used TPAttrInit */
#define STATS 1 /* always include stats because code change is minimal */
/* Statistics */ /* Statistics */
#ifdef WIN32 /* TODO: check why STATSONLY fails during compilation */ /* always include stats because code change is minimal */
#undef STATS #define STATS 1
#endif
#ifdef STATS
#define STATSONLY(x) x
#else
#define STATSONLY(x)
#endif
#ifdef _DEBUG #ifdef _DEBUG
#define DEBUG 1 #define DEBUG 1
#endif #endif
#include "LinkedList.h" #include "LinkedList.h"
#include <sys/timeb.h>
#ifdef WIN32
#include <time.h>
#include <winsock2.h>
struct timezone
{
int tz_minuteswest; /* minutes W of Greenwich */
int tz_dsttime; /* type of dst correction */
};
int gettimeofday(struct timeval *tv, struct timezone *tz);
#else /* WIN32 */
#include <sys/time.h> /* for gettimeofday() */
#endif
#include "FreeList.h" #include "FreeList.h"
#include "ithread.h" #include "ithread.h"
#include <errno.h> #include <errno.h>
#include <sys/timeb.h>
#define EXPORT #define EXPORT
typedef int PolicyType; typedef int PolicyType;
#define DEFAULT_POLICY SCHED_OTHER #define DEFAULT_POLICY SCHED_OTHER
#define DEFAULT_SCHED_PARAM 0 /* default priority */ #define DEFAULT_SCHED_PARAM 0 /* default priority */
@@ -111,26 +121,28 @@ typedef void (*free_routine)(void *arg);
*****************************************************************************/ *****************************************************************************/
typedef struct THREADPOOLATTR typedef struct THREADPOOLATTR
{ {
int minThreads; /* minThreads, ThreadPool will always maintain at least /* minThreads, ThreadPool will always maintain at least this many threads */
this many threads */ int minThreads;
int maxThreads; /* maxThreads, ThreadPool will never have more than this /* maxThreads, ThreadPool will never have more than this number of threads */
number of threads */ int maxThreads;
int maxIdleTime; /* maxIdleTime (in milliseconds) /* maxIdleTime (in milliseconds) this is the maximum time a thread will
this is the maximum time a thread will remain idle * remain idle before dying */
before dying */ int maxIdleTime;
int jobsPerThread; /* jobs per thread to maintain */ /* jobs per thread to maintain */
int jobsPerThread;
int maxJobsTotal; /* maximum number of jobs that can be queued totally. */ /* maximum number of jobs that can be queued totally. */
int maxJobsTotal;
int starvationTime; /* the time a low priority or med priority /* the time a low priority or med priority job waits before getting bumped
job waits before getting bumped * up a priority (in milliseconds) */
up a priority (in milliseconds) */ int starvationTime;
PolicyType schedPolicy; /* scheduling policy to use */
/* scheduling policy to use */
PolicyType schedPolicy;
} ThreadPoolAttr; } ThreadPoolAttr;
/**************************************************************************** /****************************************************************************
@@ -144,7 +156,7 @@ typedef struct THREADPOOLJOB
start_routine func; start_routine func;
void *arg; void *arg;
free_routine free_func; free_routine free_func;
struct timeb requestTime; struct timeval requestTime;
int priority; int priority;
int jobId; int jobId;
} ThreadPoolJob; } ThreadPoolJob;
@@ -156,8 +168,6 @@ typedef struct THREADPOOLJOB
* Structure to hold statistics * Structure to hold statistics
*****************************************************************************/ *****************************************************************************/
#ifdef STATS
typedef struct TPOOLSTATS typedef struct TPOOLSTATS
{ {
double totalTimeHQ; double totalTimeHQ;
@@ -181,8 +191,6 @@ typedef struct TPOOLSTATS
int currentJobsMQ; int currentJobsMQ;
} ThreadPoolStats; } ThreadPoolStats;
#endif
/**************************************************************************** /****************************************************************************
* Name: ThreadPool * Name: ThreadPool
@@ -222,11 +230,8 @@ typedef struct THREADPOOL
ThreadPoolAttr attr; /* thread pool attributes */ ThreadPoolAttr attr; /* thread pool attributes */
#ifdef STATS
/* statistics */ /* statistics */
ThreadPoolStats stats; ThreadPoolStats stats;
#endif
} ThreadPool; } ThreadPool;
@@ -267,8 +272,7 @@ typedef struct THREADPOOL
* INVALID_POLICY if schedPolicy can't be set * INVALID_POLICY if schedPolicy can't be set
* EMAXTHREADS if minimum threads is greater than maximum threads * EMAXTHREADS if minimum threads is greater than maximum threads
*****************************************************************************/ *****************************************************************************/
int ThreadPoolInit(ThreadPool *tp, int ThreadPoolInit(ThreadPool *tp, ThreadPoolAttr *attr);
ThreadPoolAttr *attr);
/**************************************************************************** /****************************************************************************
* Function: ThreadPoolAddPersistent * Function: ThreadPoolAddPersistent
@@ -290,9 +294,7 @@ int ThreadPoolInit(ThreadPool *tp,
* EOUTOFMEM not enough memory to add job. * EOUTOFMEM not enough memory to add job.
* EMAXTHREADS not enough threads to add persistent job. * EMAXTHREADS not enough threads to add persistent job.
*****************************************************************************/ *****************************************************************************/
int ThreadPoolAddPersistent (ThreadPool*tp, int ThreadPoolAddPersistent(ThreadPool*tp, ThreadPoolJob *job, int *jobId);
ThreadPoolJob *job,
int *jobId);
/**************************************************************************** /****************************************************************************
* Function: ThreadPoolGetAttr * Function: ThreadPoolGetAttr
@@ -307,8 +309,7 @@ int ThreadPoolAddPersistent (ThreadPool*tp,
* 0 on success, nonzero on failure * 0 on success, nonzero on failure
* Always returns 0. * Always returns 0.
*****************************************************************************/ *****************************************************************************/
int ThreadPoolGetAttr(ThreadPool *tp, int ThreadPoolGetAttr(ThreadPool *tp, ThreadPoolAttr *out);
ThreadPoolAttr *out);
/**************************************************************************** /****************************************************************************
* Function: ThreadPoolSetAttr * Function: ThreadPoolSetAttr
* *
@@ -322,8 +323,7 @@ int ThreadPoolGetAttr(ThreadPool *tp,
* 0 on success, nonzero on failure * 0 on success, nonzero on failure
* Returns INVALID_POLICY if policy can not be set. * Returns INVALID_POLICY if policy can not be set.
*****************************************************************************/ *****************************************************************************/
int ThreadPoolSetAttr(ThreadPool *tp, int ThreadPoolSetAttr(ThreadPool *tp, ThreadPoolAttr *attr);
ThreadPoolAttr *attr);
/**************************************************************************** /****************************************************************************
* Function: ThreadPoolAdd * Function: ThreadPoolAdd
@@ -342,9 +342,7 @@ int ThreadPoolSetAttr(ThreadPool *tp,
* 0 on success, nonzero on failure * 0 on success, nonzero on failure
* EOUTOFMEM if not enough memory to add job. * EOUTOFMEM if not enough memory to add job.
*****************************************************************************/ *****************************************************************************/
int ThreadPoolAdd (ThreadPool*tp, int ThreadPoolAdd (ThreadPool*tp, ThreadPoolJob *job, int *jobId);
ThreadPoolJob *job,
int *jobId);
/**************************************************************************** /****************************************************************************
* Function: ThreadPoolRemove * Function: ThreadPoolRemove
@@ -361,8 +359,7 @@ int ThreadPoolAdd (ThreadPool*tp,
* 0 on success, nonzero on failure. * 0 on success, nonzero on failure.
* INVALID_JOB_ID if job not found. * INVALID_JOB_ID if job not found.
*****************************************************************************/ *****************************************************************************/
int ThreadPoolRemove(ThreadPool *tp, int ThreadPoolRemove(ThreadPool *tp, int jobId, ThreadPoolJob *out);
int jobId, ThreadPoolJob *out);
@@ -425,7 +422,6 @@ int TPJobSetPriority(ThreadPoolJob *job, ThreadPriority priority);
*****************************************************************************/ *****************************************************************************/
int TPJobSetFreeFunction(ThreadPoolJob *job, free_routine func); int TPJobSetFreeFunction(ThreadPoolJob *job, free_routine func);
/**************************************************************************** /****************************************************************************
* Function: TPAttrInit * Function: TPAttrInit
* *
@@ -547,6 +543,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

View File

@@ -1,66 +0,0 @@
/*******************************************************************************
*
* Copyright (c) 2000-2003 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/
#include <stdarg.h>
#define EXPORT
#ifdef __cplusplus
extern "C" {
#endif
/**
* Allocates enough memory for the
* Formatted string, up to max
* specified.
* With max set to -1, allocates
* as much size as needed.
* Memory must be freed using free.
*/
EXPORT int iasnprintf(char **ret,
int incr,
int max,
const char * fmt, ...)
#ifndef SPARC_SOLARIS
#if (__GNUC__ >= 3)
__attribute__((format (__printf__, 4, 5)));
#else
;
#endif
EXPORT void iasnprintfFree(char *);
#else
;
#endif
#ifdef __cplusplus
}
#endif

View File

@@ -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
* *
@@ -524,7 +715,11 @@ extern "C" {
* 0 on success, Nonzero on failure. * 0 on success, Nonzero on failure.
* See man page for sleep (man 3 sleep) * See man page for sleep (man 3 sleep)
*****************************************************************************/ *****************************************************************************/
#ifndef WIN32
#define isleep sleep #define isleep sleep
#else
#define isleep(x) Sleep((x)*1000)
#endif
/**************************************************************************** /****************************************************************************
* Function: isleep * Function: isleep
@@ -539,7 +734,11 @@ extern "C" {
* 0 on success, Nonzero on failure. * 0 on success, Nonzero on failure.
* See man page for sleep (man 3 sleep) * See man page for sleep (man 3 sleep)
*****************************************************************************/ *****************************************************************************/
#ifndef WIN32
#define imillisleep(x) usleep(1000*x) #define imillisleep(x) usleep(1000*x)
#else
#define imillisleep Sleep
#endif
#ifdef WIN32 #ifdef WIN32
#ifndef UPNP_STATIC_LIB #ifndef UPNP_STATIC_LIB

View File

@@ -30,8 +30,10 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#include "LinkedList.h" #include "LinkedList.h"
#ifndef WIN32
#include <sys/param.h> #include <sys/param.h>
#if (defined(BSD) && BSD >= 199306) #endif
#if (defined(BSD) && BSD >= 199306) || defined(__OSX__) || defined(__APPLE__)
#include <stdlib.h> #include <stdlib.h>
#else #else
#include <malloc.h> #include <malloc.h>
@@ -532,3 +534,4 @@ ListSize( LinkedList * list )
return list->size; return list->size;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,153 +0,0 @@
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#include <stdarg.h>
#include <assert.h>
#include <sys/param.h>
#if (defined(BSD) && BSD >= 199306)
#include <stdlib.h>
#else
#include <malloc.h>
#endif
#include <stdio.h>
#include "iasnprintf.h"
#ifndef NULL
#define NULL 0
#endif
#ifdef WIN32
#define vsnprintf _vsnprintf
#endif
/**
* Allocates enough memory for the
* Formatted string, up to max
* specified.
* With max set to -1, it allocates as
* much size as needed.
* Memory must be freed using free.
*/
int
iasnprintf( char **ret,
int incr,
int max,
const char *fmt,
... )
{
int size = incr;
int retc = 0;
va_list ap;
char *temp = NULL;
assert( ret );
assert( fmt );
( *ret ) = ( char * )malloc( incr );
if( ( *ret ) == NULL ) return -1;
while( 1 ) {
va_start( ap, fmt );
retc = vsnprintf( ( *ret ), size, fmt, ap );
va_end( ap );
if( retc < 0 ) {
//size not big enough
//and vsnprintf does NOT return the
//necessary number of bytes
if( ( max != -1 ) && ( size == max ) ) //max reached
{
break;
}
incr *= 2; //increase increment
//increase size and try again
if( ( max != -1 ) && ( ( size + incr ) > max ) ) {
incr = ( max - size );
}
temp = ( char * )realloc( ( *ret ), size + incr );
if( temp == NULL ) {
break;
}
size += incr;
( *ret ) = temp;
} else {
if( ( retc + 1 ) > size ) {
//size not big enough
//and vsnprintf
//returns the necessary
//number of bytes
if( ( max != -1 ) && ( retc + 1 > max ) ) {
retc = -1;
break;
}
temp = ( char * )realloc( ( *ret ), retc + 1 );
if( temp == NULL ) {
retc = -1;
break;
}
size = retc + 1;
( *ret ) = temp; //size increased try again
} else if( ( retc + 1 ) < size ) {
//size is bigger than needed
//try and reallocate smaller
temp = ( char * )realloc( ( *ret ), retc + 1 );
if( temp != NULL ) {
( *ret ) = temp;
}
break;
} else //size is just right, exit
{
break;
}
}
}
if( retc < 0 ) {
free( ( *ret ) );
( *ret ) = NULL;
}
return retc;
}
void
iasnprintfFree( char *fChar )
{
free( fChar );
fChar = NULL;
}

View File

@@ -11,10 +11,6 @@ AM_CPPFLAGS = \
-I$(top_srcdir)/threadutil/inc \ -I$(top_srcdir)/threadutil/inc \
-I$(top_srcdir)/ixml/inc -I$(top_srcdir)/ixml/inc
AM_CFLAGS = $(PTHREAD_CFLAGS)
AM_LDFLAGS = $(PTHREAD_LIBS)
LDADD = \ LDADD = \
libupnp.la \ libupnp.la \
$(top_builddir)/threadutil/libthreadutil.la \ $(top_builddir)/threadutil/libthreadutil.la \

View File

@@ -47,7 +47,9 @@
#include <stdio.h> #include <stdio.h>
#ifndef WIN32
#include <sys/param.h> #include <sys/param.h>
#endif
#if (defined(BSD) && BSD >= 199306) #if (defined(BSD) && BSD >= 199306)
#include <time.h> #include <time.h>
#endif #endif
@@ -102,8 +104,6 @@
#define UpnpCloseSocket closesocket #define UpnpCloseSocket closesocket
#define fseeko fseek #define fseeko fseek
#endif #endif
#define UPNP_SOCKETERROR -1
#define UPNP_INVALID_SOCKET -1
#ifndef WIN32 #ifndef WIN32
#define SOCKET int #define SOCKET int
#endif #endif
@@ -413,7 +413,7 @@
#define UPNP_E_SUBSCRIBE_UNACCEPTED -301 #define UPNP_E_SUBSCRIBE_UNACCEPTED -301
/*! @} */ /*! @} */
/** @name UPNP_E_UNSUBSCRIBE_UNACCAPTED [-302] /** @name UPNP_E_UNSUBSCRIBE_UNACCEPTED [-302]
* {\tt UPNP_E_UNSUBSCRIBE_UNACCEPTED} signifies that an unsubscribe * {\tt UPNP_E_UNSUBSCRIBE_UNACCEPTED} signifies that an unsubscribe
* request was rejected from the remote side. * request was rejected from the remote side.
*/ */

View File

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

View File

@@ -9,10 +9,6 @@ AM_CPPFLAGS = \
-I$(top_srcdir)/threadutil/inc \ -I$(top_srcdir)/threadutil/inc \
-I$(top_srcdir)/ixml/inc -I$(top_srcdir)/ixml/inc
AM_CFLAGS = $(PTHREAD_CFLAGS)
AM_LDFLAGS = $(PTHREAD_LIBS)
LDADD = \ LDADD = \
$(top_builddir)/upnp/libupnp.la \ $(top_builddir)/upnp/libupnp.la \
$(top_builddir)/threadutil/libthreadutil.la \ $(top_builddir)/threadutil/libthreadutil.la \

View File

@@ -34,19 +34,21 @@
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif /* __cplusplus */
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "upnptools.h"
#include "ithread.h" #include "ithread.h"
#include "ixml.h" #include "ixml.h"
#include "upnptools.h"
// mutex to control displaying of events // mutex to control displaying of events
extern ithread_mutex_t display_mutex; extern ithread_mutex_t display_mutex;
typedef enum { typedef enum {
STATE_UPDATE = 0, STATE_UPDATE = 0,
DEVICE_ADDED = 1, DEVICE_ADDED = 1,
@@ -162,9 +164,13 @@ int SampleUtil_PrintEvent(IN Upnp_EventType EventType,
* controlURL -- OUT -- The control URL for the service * controlURL -- OUT -- The control URL for the service
* *
********************************************************************************/ ********************************************************************************/
int SampleUtil_FindAndParseService (IN IXML_Document *DescDoc, IN char* location, int SampleUtil_FindAndParseService (
IN char *serviceType, OUT char **serviceId, IN IXML_Document *DescDoc,
OUT char **eventURL, OUT char **controlURL); IN char* location,
IN char *serviceType,
OUT char **serviceId,
OUT char **eventURL,
OUT char **controlURL);
/******************************************************************************** /********************************************************************************
@@ -196,7 +202,10 @@ extern print_string gPrintFun;
* const char * UDN * const char * UDN
* int newDevice * int newDevice
********************************************************************************/ ********************************************************************************/
typedef void (*state_update)( const char *varName, const char *varValue, const char *UDN, typedef void (*state_update)(
const char *varName,
const char *varValue,
const char *UDN,
eventType type); eventType type);
//global state update function used by smaple util //global state update function used by smaple util
@@ -224,7 +233,7 @@ int SampleUtil_Initialize(print_string print_function);
* Parameters: * Parameters:
* *
********************************************************************************/ ********************************************************************************/
int SampleUtil_Finish(void); int SampleUtil_Finish();
/******************************************************************************** /********************************************************************************
* SampleUtil_Print * SampleUtil_Print
@@ -258,11 +267,22 @@ int SampleUtil_RegisterUpdateFunction( state_update update_function );
* Parameters: * Parameters:
* *
********************************************************************************/ ********************************************************************************/
void SampleUtil_StateUpdate( const char *varName, const char *varValue, const char *UDN, void SampleUtil_StateUpdate(
const char *varName,
const char *varValue,
const char *UDN,
eventType type); eventType type);
#ifdef __cplusplus #ifdef __cplusplus
}; };
#endif /* __cplusplus */
#ifdef WIN32
#define snprintf _snprintf
#define strcasecmp stricmp
#endif #endif
#endif /* UPNPSDK_UTIL_H */
#endif /* SAMPLE_UTIL_H */

View File

@@ -449,17 +449,17 @@ device_main( int argc, char **argv )
port = ( unsigned short )portTemp; port = ( unsigned short )portTemp;
return TvDeviceStart( return TvDeviceStart( ip_address, port, desc_doc_name, web_dir_path, linux_print );
ip_address, port, desc_doc_name, web_dir_path, linux_print );
} }
int int main( int argc, char **argv )
main( int argc, char **argv )
{ {
int rc; int rc;
ithread_t cmdloop_thread; ithread_t cmdloop_thread;
#ifndef WIN32
int sig; int sig;
sigset_t sigs_to_catch; sigset_t sigs_to_catch;
#endif
int code; int code;
device_main(argc, argv); device_main(argc, argv);
@@ -468,11 +468,10 @@ main( int argc, char **argv )
SampleUtil_Print( "Error starting UPnP TV Control Point" ); SampleUtil_Print( "Error starting UPnP TV Control Point" );
return rc; return rc;
} }
// start a command loop thread /* start a command loop thread */
code = code = ithread_create( &cmdloop_thread, NULL, TvCtrlPointCommandLoop, NULL );
ithread_create( &cmdloop_thread, NULL, TvCtrlPointCommandLoop,
NULL );
#ifndef WIN32
/* /*
Catch Ctrl-C and properly shutdown Catch Ctrl-C and properly shutdown
*/ */
@@ -480,7 +479,10 @@ main( int argc, char **argv )
sigaddset( &sigs_to_catch, SIGINT ); sigaddset( &sigs_to_catch, SIGINT );
sigwait( &sigs_to_catch, &sig ); sigwait( &sigs_to_catch, &sig );
SampleUtil_Print( "Shutting down on signal %d...", sig ); SampleUtil_Print( "Shutting down on signal %d...\n", sig );
#else
ithread_join(cmdloop_thread, NULL);
#endif
TvDeviceStop(); TvDeviceStop();
rc = TvCtrlPointStop(); rc = TvCtrlPointStop();

View File

@@ -1354,7 +1354,7 @@ TvCtrlPointStart( print_string printFunctionPtr,
{ {
ithread_t timer_thread; ithread_t timer_thread;
int rc; int rc;
short int port = 0; unsigned short port = 0;
char *ip_address = NULL; char *ip_address = NULL;
SampleUtil_Initialize( printFunctionPtr ); SampleUtil_Initialize( printFunctionPtr );
@@ -1362,8 +1362,11 @@ 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 Sdk with\n"
"\tipaddress = %s port = %u\n",
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 ) {
SampleUtil_Print( "WinCEStart: UpnpInit() Error: %d", rc ); SampleUtil_Print( "WinCEStart: UpnpInit() Error: %d", rc );
@@ -1371,12 +1374,17 @@ TvCtrlPointStart( print_string printFunctionPtr,
//return TV_ERROR; //return TV_ERROR;
} }
if( NULL == ip_address ) if( NULL == ip_address ) {
ip_address = UpnpGetServerIpAddress(); ip_address = UpnpGetServerIpAddress();
if( 0 == port ) }
if( 0 == port ) {
port = UpnpGetServerPort(); port = UpnpGetServerPort();
}
SampleUtil_Print( "UPnP Initialized (%s:%d)", ip_address, port ); SampleUtil_Print(
"UPnP Initialized\n"
"\tipaddress= %s port = %u\n",
ip_address, port );
SampleUtil_Print( "Registering Control Point" ); SampleUtil_Print( "Registering Control Point" );
rc = UpnpRegisterClient( TvCtrlPointCallbackEventHandler, rc = UpnpRegisterClient( TvCtrlPointCallbackEventHandler,

View File

@@ -39,7 +39,9 @@ extern "C" {
#include <stdio.h> #include <stdio.h>
#include "ithread.h" #include "ithread.h"
#ifndef WIN32
#include <unistd.h> #include <unistd.h>
#endif
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include <signal.h> #include <signal.h>

View File

@@ -1958,8 +1958,9 @@ TvDeviceStart( char *ip_address,
SampleUtil_Initialize( pfun ); SampleUtil_Initialize( pfun );
SampleUtil_Print SampleUtil_Print(
( "Initializing UPnP Sdk with \n \t ipaddress = %s port = %d\n", "Initializing UPnP Sdk with\n"
"\tipaddress = %s port = %u\n",
ip_address, port ); ip_address, port );
if( ( ret = UpnpInit( ip_address, port ) ) != UPNP_E_SUCCESS ) { if( ( ret = UpnpInit( ip_address, port ) ) != UPNP_E_SUCCESS ) {
@@ -1976,14 +1977,18 @@ TvDeviceStart( char *ip_address,
port = UpnpGetServerPort(); port = UpnpGetServerPort();
} }
SampleUtil_Print( "UPnP Initialized\n \t ipaddress= %s port = %d\n", SampleUtil_Print(
"UPnP Initialized\n"
"\tipaddress= %s port = %u\n",
ip_address, port ); ip_address, port );
if( desc_doc_name == NULL ) if( desc_doc_name == NULL ) {
desc_doc_name = "tvcombodesc.xml"; desc_doc_name = "tvcombodesc.xml";
}
if( web_dir_path == NULL ) if( web_dir_path == NULL ) {
web_dir_path = DEFAULT_WEB_DIR; web_dir_path = DEFAULT_WEB_DIR;
}
snprintf( desc_doc_url, DESC_URL_SIZE, "http://%s:%d/%s", ip_address, snprintf( desc_doc_url, DESC_URL_SIZE, "http://%s:%d/%s", ip_address,
port, desc_doc_name ); port, desc_doc_name );
@@ -1999,8 +2004,9 @@ TvDeviceStart( char *ip_address,
return ret; return ret;
} }
SampleUtil_Print SampleUtil_Print(
( "Registering the RootDevice\n\t with desc_doc_url: %s\n", "Registering the RootDevice\n"
"\t with desc_doc_url: %s\n",
desc_doc_url ); desc_doc_url );
if( ( ret = UpnpRegisterRootDevice( desc_doc_url, if( ( ret = UpnpRegisterRootDevice( desc_doc_url,
@@ -2011,9 +2017,9 @@ TvDeviceStart( char *ip_address,
UpnpFinish(); UpnpFinish();
return ret; return ret;
} else { } else {
SampleUtil_Print( "RootDevice Registered\n" ); SampleUtil_Print(
"RootDevice Registered\n"
SampleUtil_Print( "Initializing State Table\n" ); "Initializing State Table\n");
TvDeviceStateTableInit( desc_doc_url ); TvDeviceStateTableInit( desc_doc_url );
SampleUtil_Print("State Table Initialized\n"); SampleUtil_Print("State Table Initialized\n");
@@ -2029,3 +2035,4 @@ TvDeviceStart( char *ip_address,
} }
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }

View File

@@ -41,7 +41,9 @@ extern "C" {
#include "ithread.h" #include "ithread.h"
#include <stdlib.h> #include <stdlib.h>
#ifndef WIN32
#include <unistd.h> #include <unistd.h>
#endif
#include <string.h> #include <string.h>
#include "upnp.h" #include "upnp.h"
#include "sample_util.h" #include "sample_util.h"

View File

@@ -29,9 +29,12 @@
// //
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include "sample_util.h" #include "sample_util.h"
#include "upnp_tv_ctrlpt.h" #include "upnp_tv_ctrlpt.h"
#include <stdio.h>
#include <string.h> #include <string.h>
/* /*
@@ -124,108 +127,72 @@ TvCtrlPointPrintLongHelp( void )
SampleUtil_Print( "* TV Control Point Help Info *" ); SampleUtil_Print( "* TV Control Point Help Info *" );
SampleUtil_Print( "******************************" ); SampleUtil_Print( "******************************" );
SampleUtil_Print( "" ); SampleUtil_Print( "" );
SampleUtil_Print SampleUtil_Print( "This sample control point application automatically searches" );
( "This sample control point application automatically searches" ); SampleUtil_Print( "for and subscribes to the services of television device emulator" );
SampleUtil_Print SampleUtil_Print( "devices, described in the tvdevicedesc.xml description document." );
( "for and subscribes to the services of television device emulator" );
SampleUtil_Print
( "devices, described in the tvdevicedesc.xml description document." );
SampleUtil_Print( "" ); SampleUtil_Print( "" );
SampleUtil_Print( "Commands:" ); SampleUtil_Print( "Commands:" );
SampleUtil_Print( " Help" ); SampleUtil_Print( " Help" );
SampleUtil_Print( " Print this help info." ); SampleUtil_Print( " Print this help info." );
SampleUtil_Print( " ListDev" ); SampleUtil_Print( " ListDev" );
SampleUtil_Print SampleUtil_Print( " Print the current list of TV Device Emulators that this" );
( " Print the current list of TV Device Emulators that this" ); SampleUtil_Print( " control point is aware of. Each device is preceded by a" );
SampleUtil_Print SampleUtil_Print( " device number which corresponds to the devnum argument of" );
( " control point is aware of. Each device is preceded by a" );
SampleUtil_Print
( " device number which corresponds to the devnum argument of" );
SampleUtil_Print( " commands listed below." ); SampleUtil_Print( " commands listed below." );
SampleUtil_Print( " Refresh" ); SampleUtil_Print( " Refresh" );
SampleUtil_Print SampleUtil_Print( " Delete all of the devices from the device list and issue new" );
( " Delete all of the devices from the device list and issue new" ); SampleUtil_Print( " search request to rebuild the list from scratch." );
SampleUtil_Print
( " search request to rebuild the list from scratch." );
SampleUtil_Print( " PrintDev <devnum>" ); SampleUtil_Print( " PrintDev <devnum>" );
SampleUtil_Print SampleUtil_Print( " Print the state table for the device <devnum>." );
( " Print the state table for the device <devnum>." ); SampleUtil_Print( " e.g., 'PrintDev 1' prints the state table for the first" );
SampleUtil_Print
( " e.g., 'PrintDev 1' prints the state table for the first" );
SampleUtil_Print( " device in the device list." ); SampleUtil_Print( " device in the device list." );
SampleUtil_Print( " PowerOn <devnum>" ); SampleUtil_Print( " PowerOn <devnum>" );
SampleUtil_Print SampleUtil_Print( " Sends the PowerOn action to the Control Service of" );
( " Sends the PowerOn action to the Control Service of" );
SampleUtil_Print( " device <devnum>." ); SampleUtil_Print( " device <devnum>." );
SampleUtil_Print( " PowerOff <devnum>" ); SampleUtil_Print( " PowerOff <devnum>" );
SampleUtil_Print SampleUtil_Print( " Sends the PowerOff action to the Control Service of" );
( " Sends the PowerOff action to the Control Service of" );
SampleUtil_Print( " device <devnum>." ); SampleUtil_Print( " device <devnum>." );
SampleUtil_Print( " SetChannel <devnum> <channel>" ); SampleUtil_Print( " SetChannel <devnum> <channel>" );
SampleUtil_Print SampleUtil_Print( " Sends the SetChannel action to the Control Service of" );
( " Sends the SetChannel action to the Control Service of" ); SampleUtil_Print( " device <devnum>, requesting the channel to be changed" );
SampleUtil_Print
( " device <devnum>, requesting the channel to be changed" );
SampleUtil_Print( " to <channel>." ); SampleUtil_Print( " to <channel>." );
SampleUtil_Print( " SetVolume <devnum> <volume>" ); SampleUtil_Print( " SetVolume <devnum> <volume>" );
SampleUtil_Print SampleUtil_Print( " Sends the SetVolume action to the Control Service of" );
( " Sends the SetVolume action to the Control Service of" ); SampleUtil_Print( " device <devnum>, requesting the volume to be changed" );
SampleUtil_Print
( " device <devnum>, requesting the volume to be changed" );
SampleUtil_Print( " to <volume>." ); SampleUtil_Print( " to <volume>." );
SampleUtil_Print( " SetColor <devnum> <color>" ); SampleUtil_Print( " SetColor <devnum> <color>" );
SampleUtil_Print SampleUtil_Print( " Sends the SetColor action to the Control Service of" );
( " Sends the SetColor action to the Control Service of" ); SampleUtil_Print( " device <devnum>, requesting the color to be changed" );
SampleUtil_Print
( " device <devnum>, requesting the color to be changed" );
SampleUtil_Print( " to <color>." ); SampleUtil_Print( " to <color>." );
SampleUtil_Print( " SetTint <devnum> <tint>" ); SampleUtil_Print( " SetTint <devnum> <tint>" );
SampleUtil_Print SampleUtil_Print( " Sends the SetTint action to the Control Service of" );
( " Sends the SetTint action to the Control Service of" ); SampleUtil_Print( " device <devnum>, requesting the tint to be changed" );
SampleUtil_Print
( " device <devnum>, requesting the tint to be changed" );
SampleUtil_Print( " to <tint>." ); SampleUtil_Print( " to <tint>." );
SampleUtil_Print( " SetContrast <devnum> <contrast>" ); SampleUtil_Print( " SetContrast <devnum> <contrast>" );
SampleUtil_Print SampleUtil_Print( " Sends the SetContrast action to the Control Service of" );
( " Sends the SetContrast action to the Control Service of" ); SampleUtil_Print( " device <devnum>, requesting the contrast to be changed" );
SampleUtil_Print
( " device <devnum>, requesting the contrast to be changed" );
SampleUtil_Print( " to <contrast>." ); SampleUtil_Print( " to <contrast>." );
SampleUtil_Print( " SetBrightness <devnum> <brightness>" ); SampleUtil_Print( " SetBrightness <devnum> <brightness>" );
SampleUtil_Print SampleUtil_Print( " Sends the SetBrightness action to the Control Service of" );
( " Sends the SetBrightness action to the Control Service of" ); SampleUtil_Print( " device <devnum>, requesting the brightness to be changed" );
SampleUtil_Print
( " device <devnum>, requesting the brightness to be changed" );
SampleUtil_Print( " to <brightness>." ); SampleUtil_Print( " to <brightness>." );
SampleUtil_Print( " CtrlAction <devnum> <action>" ); SampleUtil_Print( " CtrlAction <devnum> <action>" );
SampleUtil_Print SampleUtil_Print( " Sends an action request specified by the string <action>" );
( " Sends an action request specified by the string <action>" ); SampleUtil_Print( " to the Control Service of device <devnum>. This command" );
SampleUtil_Print SampleUtil_Print( " only works for actions that have no arguments." );
( " to the Control Service of device <devnum>. This command" ); SampleUtil_Print( " (e.g., \"CtrlAction 1 IncreaseChannel\")" );
SampleUtil_Print
( " only works for actions that have no arguments." );
SampleUtil_Print
( " (e.g., \"CtrlAction 1 IncreaseChannel\")" );
SampleUtil_Print( " PictAction <devnum> <action>" ); SampleUtil_Print( " PictAction <devnum> <action>" );
SampleUtil_Print SampleUtil_Print( " Sends an action request specified by the string <action>" );
( " Sends an action request specified by the string <action>" ); SampleUtil_Print( " to the Picture Service of device <devnum>. This command" );
SampleUtil_Print SampleUtil_Print( " only works for actions that have no arguments." );
( " to the Picture Service of device <devnum>. This command" ); SampleUtil_Print( " (e.g., \"PictAction 1 DecreaseContrast\")" );
SampleUtil_Print
( " only works for actions that have no arguments." );
SampleUtil_Print
( " (e.g., \"PictAction 1 DecreaseContrast\")" );
SampleUtil_Print( " CtrlGetVar <devnum> <varname>" ); SampleUtil_Print( " CtrlGetVar <devnum> <varname>" );
SampleUtil_Print SampleUtil_Print( " Requests the value of a variable specified by the string <varname>" );
( " Requests the value of a variable specified by the string <varname>" ); SampleUtil_Print( " from the Control Service of device <devnum>." );
SampleUtil_Print
( " from the Control Service of device <devnum>." );
SampleUtil_Print( " (e.g., \"CtrlGetVar 1 Volume\")" ); SampleUtil_Print( " (e.g., \"CtrlGetVar 1 Volume\")" );
SampleUtil_Print( " PictGetVar <devnum> <action>" ); SampleUtil_Print( " PictGetVar <devnum> <action>" );
SampleUtil_Print SampleUtil_Print( " Requests the value of a variable specified by the string <varname>" );
( " Requests the value of a variable specified by the string <varname>" ); SampleUtil_Print( " from the Picture Service of device <devnum>." );
SampleUtil_Print
( " from the Picture Service of device <devnum>." );
SampleUtil_Print( " (e.g., \"PictGetVar 1 Tint\")" ); SampleUtil_Print( " (e.g., \"PictGetVar 1 Tint\")" );
SampleUtil_Print( " Exit" ); SampleUtil_Print( " Exit" );
SampleUtil_Print( " Exits the control point application." ); SampleUtil_Print( " Exits the control point application." );
@@ -440,20 +407,23 @@ main( int argc,
{ {
int rc; int rc;
ithread_t cmdloop_thread; ithread_t cmdloop_thread;
#ifndef WIN32
int sig; int sig;
sigset_t sigs_to_catch; sigset_t sigs_to_catch;
#endif
int code; int code;
rc = TvCtrlPointStart( linux_print, NULL ); rc = TvCtrlPointStart( linux_print, NULL );
if( rc != TV_SUCCESS ) { if( rc != TV_SUCCESS ) {
SampleUtil_Print( "Error starting UPnP TV Control Point" ); SampleUtil_Print( "Error starting UPnP TV Control Point" );
exit( rc ); return rc;
} }
// start a command loop thread // start a command loop thread
code = code =
ithread_create( &cmdloop_thread, NULL, TvCtrlPointCommandLoop, ithread_create( &cmdloop_thread, NULL, TvCtrlPointCommandLoop,
NULL ); NULL );
#ifndef WIN32
/* /*
Catch Ctrl-C and properly shutdown Catch Ctrl-C and properly shutdown
*/ */
@@ -462,6 +432,10 @@ main( int argc,
sigwait( &sigs_to_catch, &sig ); sigwait( &sigs_to_catch, &sig );
SampleUtil_Print( "Shutting down on signal %d...", sig ); SampleUtil_Print( "Shutting down on signal %d...", sig );
#else
ithread_join(cmdloop_thread, NULL);
#endif
rc = TvCtrlPointStop(); rc = TvCtrlPointStop();
exit( rc ); return rc;
} }

View File

@@ -1354,7 +1354,7 @@ TvCtrlPointStart( print_string printFunctionPtr,
{ {
ithread_t timer_thread; ithread_t timer_thread;
int rc; int rc;
short int port = 0; unsigned short port = 0;
char *ip_address = NULL; char *ip_address = NULL;
SampleUtil_Initialize( printFunctionPtr ); SampleUtil_Initialize( printFunctionPtr );
@@ -1362,8 +1362,11 @@ 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 Sdk with\n"
"\tipaddress = %s port = %u\n",
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 ) {
SampleUtil_Print( "WinCEStart: UpnpInit() Error: %d", rc ); SampleUtil_Print( "WinCEStart: UpnpInit() Error: %d", rc );
@@ -1371,12 +1374,17 @@ TvCtrlPointStart( print_string printFunctionPtr,
return TV_ERROR; return TV_ERROR;
} }
if( NULL == ip_address ) if( NULL == ip_address ) {
ip_address = UpnpGetServerIpAddress(); ip_address = UpnpGetServerIpAddress();
if( 0 == port ) }
if( 0 == port ) {
port = UpnpGetServerPort(); port = UpnpGetServerPort();
}
SampleUtil_Print( "UPnP Initialized (%s:%d)", ip_address, port ); SampleUtil_Print(
"UPnP Initialized\n"
"\tipaddress= %s port = %u\n",
ip_address, port );
SampleUtil_Print( "Registering Control Point" ); SampleUtil_Print( "Registering Control Point" );
rc = UpnpRegisterClient( TvCtrlPointCallbackEventHandler, rc = UpnpRegisterClient( TvCtrlPointCallbackEventHandler,

View File

@@ -39,7 +39,9 @@ extern "C" {
#include <stdio.h> #include <stdio.h>
#include "ithread.h" #include "ithread.h"
#ifndef WIN32
#include <unistd.h> #include <unistd.h>
#endif
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include <signal.h> #include <signal.h>

View File

@@ -29,10 +29,14 @@
// //
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include "sample_util.h" #include "sample_util.h"
#include "upnp_tv_device.h" #include "upnp_tv_device.h"
#include <stdio.h>
/****************************************************************************** /******************************************************************************
* linux_print * linux_print
* *
@@ -117,21 +121,21 @@ TvDeviceCommandLoop( void *args )
* *
* *
*****************************************************************************/ *****************************************************************************/
int int main( IN int argc, IN char **argv )
main( IN int argc,
IN char **argv )
{ {
unsigned int portTemp = 0; unsigned int portTemp = 0;
char *ip_address = NULL, char *ip_address = NULL,
*desc_doc_name = NULL, *desc_doc_name = NULL,
*web_dir_path = NULL; *web_dir_path = NULL;
int rc;
ithread_t cmdloop_thread; ithread_t cmdloop_thread;
int code; #ifndef WIN32
unsigned int port = 0;
int sig; int sig;
sigset_t sigs_to_catch; sigset_t sigs_to_catch;
#endif
int code;
unsigned int port = 0;
int i = 0; int i = 0;
SampleUtil_Initialize( linux_print ); SampleUtil_Initialize( linux_print );
@@ -163,21 +167,18 @@ main( IN int argc,
( "\tweb_dir_path: Filesystem path where web files " ( "\tweb_dir_path: Filesystem path where web files "
"related to the device are stored\n" ); "related to the device are stored\n" );
SampleUtil_Print( "\t\te.g.: /upnp/sample/tvdevice/web\n" ); SampleUtil_Print( "\t\te.g.: /upnp/sample/tvdevice/web\n" );
exit( 1 ); return 1;
} }
} }
port = ( unsigned short )portTemp; port = ( unsigned short )portTemp;
TvDeviceStart( ip_address, port, desc_doc_name, web_dir_path, TvDeviceStart( ip_address, port, desc_doc_name, web_dir_path, linux_print );
linux_print );
/* /* start a command loop thread */
start a command loop thread code = ithread_create( &cmdloop_thread, NULL, TvDeviceCommandLoop, NULL );
*/
code = ithread_create( &cmdloop_thread, NULL, TvDeviceCommandLoop,
NULL );
#ifndef WIN32
/* /*
Catch Ctrl-C and properly shutdown Catch Ctrl-C and properly shutdown
*/ */
@@ -186,6 +187,11 @@ main( IN int argc,
sigwait( &sigs_to_catch, &sig ); sigwait( &sigs_to_catch, &sig );
SampleUtil_Print( "Shutting down on signal %d...\n", sig ); SampleUtil_Print( "Shutting down on signal %d...\n", sig );
TvDeviceStop( ); #else
exit( 0 ); ithread_join(cmdloop_thread, NULL);
#endif
rc = TvDeviceStop();
return rc;
} }

View File

@@ -1960,8 +1960,9 @@ TvDeviceStart( char *ip_address,
SampleUtil_Initialize( pfun ); SampleUtil_Initialize( pfun );
SampleUtil_Print SampleUtil_Print(
( "Initializing UPnP Sdk with \n \t ipaddress = %s port = %d\n", "Initializing UPnP Sdk with\n"
"\tipaddress = %s port = %u\n",
ip_address, port ); ip_address, port );
if( ( ret = UpnpInit( ip_address, port ) ) != UPNP_E_SUCCESS ) { if( ( ret = UpnpInit( ip_address, port ) ) != UPNP_E_SUCCESS ) {
@@ -1976,14 +1977,18 @@ TvDeviceStart( char *ip_address,
port = UpnpGetServerPort(); port = UpnpGetServerPort();
SampleUtil_Print( "UPnP Initialized\n \t ipaddress= %s port = %d\n", SampleUtil_Print(
"UPnP Initialized\n"
"\tipaddress= %s port = %u\n",
ip_address, port ); ip_address, port );
if( desc_doc_name == NULL ) if( desc_doc_name == NULL ) {
desc_doc_name = "tvdevicedesc.xml"; desc_doc_name = "tvdevicedesc.xml";
}
if( web_dir_path == NULL ) if( web_dir_path == NULL ) {
web_dir_path = DEFAULT_WEB_DIR; web_dir_path = DEFAULT_WEB_DIR;
}
snprintf( desc_doc_url, DESC_URL_SIZE, "http://%s:%d/%s", ip_address, snprintf( desc_doc_url, DESC_URL_SIZE, "http://%s:%d/%s", ip_address,
port, desc_doc_name ); port, desc_doc_name );
@@ -1999,8 +2004,9 @@ TvDeviceStart( char *ip_address,
return ret; return ret;
} }
SampleUtil_Print SampleUtil_Print(
( "Registering the RootDevice\n\t with desc_doc_url: %s\n", "Registering the RootDevice\n"
"\t with desc_doc_url: %s\n",
desc_doc_url ); desc_doc_url );
if( ( ret = UpnpRegisterRootDevice( desc_doc_url, if( ( ret = UpnpRegisterRootDevice( desc_doc_url,
@@ -2011,9 +2017,9 @@ TvDeviceStart( char *ip_address,
UpnpFinish(); UpnpFinish();
return ret; return ret;
} else { } else {
SampleUtil_Print( "RootDevice Registered\n" ); SampleUtil_Print(
"RootDevice Registered\n"
SampleUtil_Print( "Initializing State Table\n" ); "Initializing State Table\n");
TvDeviceStateTableInit( desc_doc_url ); TvDeviceStateTableInit( desc_doc_url );
SampleUtil_Print("State Table Initialized\n"); SampleUtil_Print("State Table Initialized\n");
@@ -2029,3 +2035,4 @@ TvDeviceStart( char *ip_address,
} }
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }

View File

@@ -41,7 +41,9 @@ extern "C" {
#include "ithread.h" #include "ithread.h"
#include <stdlib.h> #include <stdlib.h>
#ifndef WIN32
#include <unistd.h> #include <unistd.h>
#endif
#include <string.h> #include <string.h>
#include "upnp.h" #include "upnp.h"
#include "sample_util.h" #include "sample_util.h"

View File

@@ -31,71 +31,76 @@
#include "config.h" #include "config.h"
#include <sys/stat.h>
#include <assert.h> #include <assert.h>
#include <signal.h> #include <signal.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/stat.h>
#ifndef WIN32 #ifndef WIN32
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#ifndef SPARC_SOLARIS
// #include <linux/if.h>
#include <net/if.h> #include <net/if.h>
#else #include <netinet/in.h>
#include <fcntl.h>
#include <net/if.h>
#include <sys/sockio.h>
#endif
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/utsname.h> #include <sys/utsname.h>
#include <unistd.h> #include <unistd.h>
#include <sys/param.h>
#if (defined(BSD) && BSD >= 199306) #if defined(_sun)
#include <sys/sockio.h>
#include <fcntl.h>
#elif defined(BSD) && BSD >= 199306
#include <ifaddrs.h> #include <ifaddrs.h>
#endif #endif
#endif #endif /* WIN32 */
#include "upnpapi.h" #include "upnpapi.h"
#include "httpreadwrite.h" #include "httpreadwrite.h"
#include "membuffer.h"
#include "ssdplib.h" #include "ssdplib.h"
#include "soaplib.h" #include "soaplib.h"
#include "ThreadPool.h" #include "ThreadPool.h"
#include "membuffer.h"
#include "httpreadwrite.h"
// Needed for GENA // Needed for GENA
#include "gena.h" #include "gena.h"
#include "service_table.h"
#include "miniserver.h" #include "miniserver.h"
#include "service_table.h"
#ifdef INTERNAL_WEB_SERVER #ifdef INTERNAL_WEB_SERVER
#include "webserver.h" #include "webserver.h"
#include "urlconfig.h" #include "urlconfig.h"
#endif // INTERNAL_WEB_SERVER #endif // INTERNAL_WEB_SERVER
//
virtualDirList *pVirtualDirList; 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 +218,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 +235,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 +328,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 +406,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 +415,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 +435,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 +972,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 +1578,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 +1754,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 +1771,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 +1837,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 +1897,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 +1956,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 +2030,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 +2095,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 +2190,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 +2261,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 +2338,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 +2414,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 +2510,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 +2594,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 +2670,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 +2790,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 +2904,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 +2984,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 +3317,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 +3652,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 +3660,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;

View File

@@ -310,17 +310,30 @@ void UpnpDisplayFileAndLine(
IN const char *DbgFileName, IN const char *DbgFileName,
IN int DbgLineNo) IN int DbgLineNo)
{ {
int starlength = 66; #define NLINES 2
const char *lines[2]; #define MAX_LINE_SIZE 512
char FileAndLine[500]; #define NUMBER_OF_STARS 80
lines[0] = "DEBUG"; const char *lines[NLINES];
if (DbgFileName) { char buf[NLINES][MAX_LINE_SIZE];
sprintf(FileAndLine, int i;
"FILE: %s, LINE: %d",
DbgFileName, DbgLineNo); /* Initialize the pointer array */
lines[1] = FileAndLine; for (i = 0; i < NLINES; i++) {
lines[i] = buf[i];
} }
UpnpDisplayBanner(fd, lines, 2, starlength);
/* Put the debug lines in the buffer */
sprintf(buf[0], "DEBUG - THREAD ID: 0x%lX",
(unsigned long int)ithread_self());
if (DbgFileName) {
sprintf(buf[1],
"FILE: %s, LINE: %d",
DbgFileName,
DbgLineNo);
}
/* Show the lines centered */
UpnpDisplayBanner(fd, lines, NLINES, NUMBER_OF_STARS);
fflush(fd); fflush(fd);
} }
#endif #endif

View File

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

View File

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

View File

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

View File

@@ -35,6 +35,7 @@
************************************************************************/ ************************************************************************/
#include "config.h" #include "config.h"
#ifndef WIN32 #ifndef WIN32
#include <arpa/inet.h> #include <arpa/inet.h>
#include <netinet/in.h> #include <netinet/in.h>
@@ -42,12 +43,13 @@
#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"
@@ -65,7 +67,6 @@
#include "ThreadPool.h" #include "ThreadPool.h"
#include "httpreadwrite.h" #include "httpreadwrite.h"
#include "statcodes.h" #include "statcodes.h"
#include "upnp.h"
#include "upnpapi.h" #include "upnpapi.h"
#define APPLICATION_LISTENING_PORT 49152 #define APPLICATION_LISTENING_PORT 49152
@@ -91,13 +92,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 +109,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 +145,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 +201,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 +226,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 +246,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 +316,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,99 +366,90 @@ 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 )
{ {
char errorBuffer[ERROR_BUFFER_LEN];
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;
unsigned int maxMiniSock; unsigned int maxMiniSock;
int byteReceived; int byteReceived;
char requestBuf[256]; char requestBuf[256];
int ret = 0;
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 ) == ret = select( maxMiniSock, &rdSet, NULL, &expSet, NULL );
UPNP_SOCKETERROR ) { if ( ret == -1 ) {
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in select call !!!\n" ); "Error in select(): %s\n", errorBuffer );
/* 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 == -1 ) {
if( connectHnd == UPNP_INVALID_SOCKET ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver: Error" "miniserver: Error in accept(): %s\n", errorBuffer );
" 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 ) );
byteReceived = byteReceived =
recvfrom( miniServStopSock, requestBuf, 25, 0, recvfrom( miniServStopSock, requestBuf, 25, 0,
( struct sockaddr * )&clientAddr, ( struct sockaddr * )&clientAddr,
@@ -474,12 +457,11 @@ RunMiniServer( MiniServerSockArray * miniSock )
if( byteReceived > 0 ) { if( byteReceived > 0 ) {
requestBuf[byteReceived] = '\0'; requestBuf[byteReceived] = '\0';
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"Received response !!! %s From host %s \n", "Received response: %s From host %s \n",
requestBuf, inet_ntoa( clientAddr.sin_addr ) ); requestBuf, inet_ntoa( clientAddr.sin_addr ) );
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 +476,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,29 +525,30 @@ 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,
unsigned short listen_port ) unsigned short listen_port )
{ {
char errorBuffer[ERROR_BUFFER_LEN];
struct sockaddr_in serverAddr; struct sockaddr_in serverAddr;
int listenfd; int listenfd;
int success; int success;
@@ -575,9 +557,10 @@ get_miniserver_sockets( MiniServerSockArray * out,
int sockError = UPNP_E_SUCCESS; int sockError = UPNP_E_SUCCESS;
int errCode = 0; int errCode = 0;
int miniServerStopSock; int miniServerStopSock;
int ret = 0;
listenfd = socket( AF_INET, SOCK_STREAM, 0 ); listenfd = socket( AF_INET, SOCK_STREAM, 0 );
if( listenfd < 0 ) { if ( listenfd == -1 ) {
return UPNP_E_OUTOF_SOCKET; // error creating socket return UPNP_E_OUTOF_SOCKET; // error creating socket
} }
// As per the IANA specifications for the use of ports by applications // As per the IANA specifications for the use of ports by applications
@@ -599,46 +582,46 @@ get_miniserver_sockets( MiniServerSockArray * out,
// AFTER OUR SERVER HAS BEEN CLOSED // AFTER OUR SERVER HAS BEEN CLOSED
// THIS MAY CAUSE TCP TO BECOME LESS RELIABLE // THIS MAY CAUSE TCP TO BECOME LESS RELIABLE
// HOWEVER IT HAS BEEN SUGESTED FOR TCP SERVERS // HOWEVER IT HAS BEEN SUGESTED FOR TCP SERVERS
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv start: resuseaddr set\n" ); "mserv start: resuseaddr set\n" );
sockError = setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR, sockError = setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR,
(const char *)&reuseaddr_on, sizeof (int) ); (const char *)&reuseaddr_on, sizeof (int) );
if( sockError == UPNP_SOCKETERROR ) { if ( sockError == -1 ) {
shutdown( listenfd, SD_BOTH ); shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd ); UpnpCloseSocket( listenfd );
return UPNP_E_SOCKET_BIND; return UPNP_E_SOCKET_BIND;
} }
sockError = bind( listenfd, sockError = bind( listenfd, (struct sockaddr *)&serverAddr,
( struct sockaddr * )&serverAddr, sizeof (struct sockaddr_in) );
sizeof( struct sockaddr_in )
);
} else { } else {
do { do {
serverAddr.sin_port = htons( listen_port++ ); serverAddr.sin_port = htons( listen_port++ );
sockError = bind( listenfd, sockError = bind( listenfd, (struct sockaddr *)&serverAddr,
( struct sockaddr * )&serverAddr, sizeof (struct sockaddr_in) );
sizeof( struct sockaddr_in ) if ( sockError == -1 ) {
);
if( sockError == UPNP_SOCKETERROR ) {
#ifdef WIN32 #ifdef WIN32
errCode = WSAGetLastError(); errCode = WSAGetLastError();
#else #else
errCode = errno; errCode = errno;
#endif #endif
if( errno == EADDRINUSE ) if( errno == EADDRINUSE ) {
errCode = 1; errCode = 1;
}
} else } else
errCode = 0; errCode = 0;
} while ( errCode != 0 ); } while ( errCode != 0 );
} }
if( sockError == UPNP_SOCKETERROR ) { if ( sockError == -1 ) {
perror( "mserv start: bind failed" ); strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv start: Error in bind(): %s\n", errorBuffer );
shutdown( listenfd, SD_BOTH ); shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd ); UpnpCloseSocket( listenfd );
return UPNP_E_SOCKET_BIND; // bind failed return UPNP_E_SOCKET_BIND; // bind failed
} }
@@ -646,28 +629,34 @@ get_miniserver_sockets( MiniServerSockArray * out,
"mserv start: bind success\n" ); "mserv start: bind success\n" );
success = listen( listenfd, SOMAXCONN ); success = listen( listenfd, SOMAXCONN );
if( success == UPNP_SOCKETERROR ) { if ( success == -1 ) {
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv start: Error in listen(): %s\n", errorBuffer );
shutdown( listenfd, SD_BOTH ); shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd ); UpnpCloseSocket( listenfd );
return UPNP_E_LISTEN; // listen failed
return UPNP_E_LISTEN;
} }
actual_port = get_port( listenfd ); actual_port = get_port( listenfd );
if( actual_port <= 0 ) { if( actual_port <= 0 ) {
shutdown( listenfd, SD_BOTH ); shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd ); UpnpCloseSocket( listenfd );
return UPNP_E_INTERNAL_ERROR; return UPNP_E_INTERNAL_ERROR;
} }
out->miniServerPort = actual_port; out->miniServerPort = actual_port;
if( ( miniServerStopSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == miniServerStopSock = socket( AF_INET, SOCK_DGRAM, 0 );
UPNP_INVALID_SOCKET ) { if ( miniServerStopSock == -1 ) {
UpnpPrintf( UPNP_CRITICAL, strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
MSERV, __FILE__, __LINE__, UpnpPrintf( UPNP_CRITICAL, MSERV, __FILE__, __LINE__,
"Error in socket operation !!!\n" ); "Error in socket(): %s\n", errorBuffer );
shutdown( listenfd, SD_BOTH ); shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd ); UpnpCloseSocket( listenfd );
return UPNP_E_OUTOF_SOCKET; return UPNP_E_OUTOF_SOCKET;
} }
@@ -675,10 +664,9 @@ get_miniserver_sockets( MiniServerSockArray * out,
memset( ( char * )&serverAddr, 0, sizeof( struct sockaddr_in ) ); memset( ( char * )&serverAddr, 0, sizeof( struct sockaddr_in ) );
serverAddr.sin_family = AF_INET; serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr( "127.0.0.1" ); serverAddr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
ret = bind( miniServerStopSock, (struct sockaddr *)&serverAddr,
if( bind( miniServerStopSock, ( struct sockaddr * )&serverAddr, sizeof (serverAddr) );
sizeof( serverAddr ) ) == UPNP_SOCKETERROR ) { if ( ret == -1 ) {
UpnpPrintf( UPNP_CRITICAL, UpnpPrintf( UPNP_CRITICAL,
MSERV, __FILE__, __LINE__, MSERV, __FILE__, __LINE__,
"Error in binding localhost!!!\n" ); "Error in binding localhost!!!\n" );
@@ -686,35 +674,36 @@ get_miniserver_sockets( MiniServerSockArray * out,
UpnpCloseSocket( listenfd ); UpnpCloseSocket( listenfd );
shutdown( miniServerStopSock, SD_BOTH ); shutdown( miniServerStopSock, SD_BOTH );
UpnpCloseSocket( miniServerStopSock ); UpnpCloseSocket( miniServerStopSock );
return UPNP_E_SOCKET_BIND; return UPNP_E_SOCKET_BIND;
} }
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;
} }
out->stopPort = miniStopSockPort; out->stopPort = miniStopSockPort;
out->miniServerSock = listenfd; out->miniServerSock = listenfd;
out->miniServerStopSock = miniServerStopSock; out->miniServerStopSock = miniServerStopSock;
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }
/************************************************************************ /************************************************************************
* 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 +711,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;
@@ -743,47 +729,44 @@ StartMiniServer( unsigned short listen_port )
return UPNP_E_INTERNAL_ERROR; // miniserver running return UPNP_E_INTERNAL_ERROR; // miniserver running
} }
miniSocket = miniSocket = (MiniServerSockArray *) malloc( sizeof (MiniServerSockArray) );
( MiniServerSockArray * ) malloc( sizeof( MiniServerSockArray ) ); if( miniSocket == NULL ) {
if( miniSocket == NULL )
return UPNP_E_OUTOF_MEMORY; return UPNP_E_OUTOF_MEMORY;
}
if( ( success = get_miniserver_sockets( miniSocket, listen_port ) ) success = get_miniserver_sockets( miniSocket, listen_port );
!= UPNP_E_SUCCESS ) { if( success != UPNP_E_SUCCESS ) {
free( miniSocket ); free( miniSocket );
return success; return success;
} }
if( ( success = get_ssdp_sockets( miniSocket ) ) != UPNP_E_SUCCESS ) { success = get_ssdp_sockets( miniSocket );
if( success != 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;
} }
TPJobInit( &job, ( start_routine ) RunMiniServer, TPJobInit( &job, (start_routine)RunMiniServer, (void *)miniSocket );
( void * )miniSocket );
TPJobSetPriority( &job, MED_PRIORITY ); TPJobSetPriority( &job, MED_PRIORITY );
TPJobSetFreeFunction( &job, ( free_routine ) free ); TPJobSetFreeFunction( &job, ( free_routine ) free );
success = ThreadPoolAddPersistent( &gMiniServerThreadPool, &job, NULL ); success = ThreadPoolAddPersistent( &gMiniServerThreadPool, &job, NULL );
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 +779,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,35 +800,36 @@ 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()
{ {
char errorBuffer[ERROR_BUFFER_LEN];
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 == -1 ) {
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_SERVER:StopSSDPServer: Error in socket operation !!!\n" ); "SSDP_SERVER: StopSSDPServer: Error in socket() %s\n", errorBuffer );
return 0; return 0;
} }
@@ -853,14 +837,16 @@ StopMiniServer( void )
ssdpAddr.sin_family = AF_INET; ssdpAddr.sin_family = AF_INET;
ssdpAddr.sin_addr.s_addr = inet_addr( "127.0.0.1" ); ssdpAddr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
ssdpAddr.sin_port = htons( miniStopSockPort ); ssdpAddr.sin_port = htons( miniStopSockPort );
sendto( sock, buf, bufLen, 0, ( struct sockaddr * )&ssdpAddr, sendto( sock, buf, bufLen, 0, (struct sockaddr *)&ssdpAddr, socklen );
socklen );
usleep( 1000 ); usleep( 1000 );
if( gMServState == MSERV_IDLE ) if( gMServState == MSERV_IDLE ) {
break; break;
}
isleep( 1 ); isleep( 1 );
} }
shutdown( sock, SD_BOTH ); shutdown( sock, SD_BOTH );
UpnpCloseSocket( sock ); UpnpCloseSocket( sock );
return 0; return 0;
} }

View File

@@ -395,8 +395,13 @@ scanner_get_str( IN scanner_t * scanner )
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
#ifndef WIN32
#warning The only use of the function 'scanner_pushback()' in the code is commented out. #warning The only use of the function 'scanner_pushback()' in the code is commented out.
#warning 'scanner_pushback()' is a candidate for removal. #warning 'scanner_pushback()' is a candidate for removal.
#else
#pragma message ("The only use of the function 'scanner_pushback()' in the code is commented out.")
#pragma message ("'scanner_pushback()' is a candidate for removal.")
#endif
static UPNP_INLINE void static UPNP_INLINE void
scanner_pushback( INOUT scanner_t * scanner, scanner_pushback( INOUT scanner_t * scanner,
IN size_t pushback_bytes ) IN size_t pushback_bytes )
@@ -965,8 +970,13 @@ read_until_crlf( INOUT scanner_t * scanner,
* PARSE_FAILURE * PARSE_FAILURE
* PARSE_INCOMPLETE * PARSE_INCOMPLETE
************************************************************************/ ************************************************************************/
#ifndef WIN32
#warning There are currently no uses of the function 'skip_to_end_of_header()' in the code. #warning There are currently no uses of the function 'skip_to_end_of_header()' in the code.
#warning 'skip_to_end_of_header()' is a candidate for removal. #warning 'skip_to_end_of_header()' is a candidate for removal.
#else
#pragma message("There are currently no uses of the function 'skip_to_end_of_header()' in the code.")
#pragma message("'skip_to_end_of_header()' is a candidate for removal.")
#endif
static UPNP_INLINE int static UPNP_INLINE int
skip_to_end_of_header( INOUT scanner_t * scanner ) skip_to_end_of_header( INOUT scanner_t * scanner )
{ {

View File

@@ -70,8 +70,18 @@
#include "sock.h" #include "sock.h"
#include "webserver.h" #include "webserver.h"
#define DOSOCKET_READ 1
#define DOSOCKET_WRITE 0 /*
* Please, do not change these to const int while MSVC cannot understand
* const int in array dimensions.
*/
/*
const int CHUNK_HEADER_SIZE = 10;
const int CHUNK_TAIL_SIZE = 10;
*/
#define CHUNK_HEADER_SIZE 10
#define CHUNK_TAIL_SIZE 10
/************************************************************************ /************************************************************************
* Function: http_FixUrl * Function: http_FixUrl
@@ -80,7 +90,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 +121,7 @@ http_FixUrl( IN uri_type * url,
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }
/************************************************************************ /************************************************************************
* Function: http_FixStrUrl * Function: http_FixStrUrl
* *
@@ -118,7 +130,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 +151,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 +159,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 +194,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 +282,7 @@ http_RecvMessage( IN SOCKINFO * info,
} }
} }
/************************************************************************ /************************************************************************
* Function: http_SendMessage * Function: http_SendMessage
* *
@@ -274,7 +291,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 +315,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 +337,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 +386,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 +402,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 +430,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 +485,7 @@ http_SendMessage( IN SOCKINFO * info,
return 0; return 0;
} }
/************************************************************************ /************************************************************************
* Function: http_RequestAndResponse * Function: http_RequestAndResponse
* *
@@ -502,7 +498,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 +559,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 +679,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 +722,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 +830,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 +859,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 +899,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 +952,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 +1057,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 +1148,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 +1267,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 +1391,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 +1422,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 +1450,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 +1487,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 +1514,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 +1669,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 +1719,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 +1764,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 +2022,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 +2063,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 +2151,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 +2317,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 +2337,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 +2357,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
} }

View File

@@ -29,20 +29,18 @@
// //
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
/************************************************************************ /******************************************************************************
* 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>
#include <fcntl.h> #include <fcntl.h>
#ifndef UPNP_USE_BCBPP #ifndef UPNP_USE_BCBPP
#ifndef UPNP_USE_MSVCPP
#include <inttypes.h> #include <inttypes.h>
#include <stdint.h> #include <stdint.h>
#endif #endif
#endif
#include "util.h" #include "util.h"
#include "strintmap.h" #include "strintmap.h"
#include "membuffer.h" #include "membuffer.h"
@@ -64,7 +62,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 +184,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 +588,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 +687,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
@@ -746,7 +743,7 @@ isFileInVirtualDir( IN char *filePath )
return TRUE; return TRUE;
} else { } else {
if( ( strncmp( pCurVirtualDir->dirName, filePath, webDirLen ) if( ( strncmp( pCurVirtualDir->dirName, filePath, webDirLen )
== 0 ) && ( filePath[webDirLen] == '/' ) ) == 0 ) && ( filePath[webDirLen] == '/' || filePath[webDirLen] == '\0' || filePath[webDirLen] == '?' ) )
return TRUE; return TRUE;
} }
@@ -870,7 +867,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 +877,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 +909,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 +926,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 +1529,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 +1761,4 @@ web_server_callback( IN http_parser_t * parser,
membuffer_destroy( &headers ); membuffer_destroy( &headers );
membuffer_destroy( &filename ); membuffer_destroy( &filename );
} }

View File

@@ -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__) || defined(__APPLE__))
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__) || defined(__APPLE__)
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 ) ) {

View File

@@ -32,6 +32,7 @@
#ifndef INTERNAL_CONFIG_H #ifndef INTERNAL_CONFIG_H
#define INTERNAL_CONFIG_H #define INTERNAL_CONFIG_H
#include "autoconfig.h" #include "autoconfig.h"
@@ -261,7 +262,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

View File

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

View File

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

View File

@@ -36,12 +36,8 @@
#include "upnp.h" #include "upnp.h"
#include "client_table.h" #include "client_table.h"
//#include "../ssdp/ssdplib.h" //#include "../ssdp/ssdplib.h"
#define MAX_INTERFACES 256 #define MAX_INTERFACES 256
#define DEFAULT_INTERFACE 1 #define DEFAULT_INTERFACE 1
@@ -98,18 +94,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);

View File

@@ -31,8 +31,11 @@
#ifndef UTIL_H #ifndef UTIL_H
#define UTIL_H #define UTIL_H
#include "upnp.h" #include "upnp.h"
// usually used to specify direction of parameters in functions // usually used to specify direction of parameters in functions
#ifndef IN #ifndef IN
#define IN #define IN
@@ -52,12 +55,6 @@
#define EVENT_TERMINATE -3 #define EVENT_TERMINATE -3
#ifndef WIN32
#define max(a, b) (((a)>(b))? (a):(b))
#define min(a, b) (((a)<(b))? (a):(b))
#endif
// boolean type in C // boolean type in C
typedef char xboolean; typedef char xboolean;
@@ -69,6 +66,7 @@ typedef char xboolean;
#define FALSE 0 #define FALSE 0
#endif #endif
/////////////////////////// ///////////////////////////
// funcs // funcs
@@ -76,6 +74,16 @@ typedef char xboolean;
extern "C" { extern "C" {
#endif #endif
/************************************************************************
* Function: logerror
*
* Parameters:
* IN const char *fmt; format string
*
* Description: Log an error message.
*
* Return: void
************************************************************************/
void log_error( IN const char *fmt, ... ); void log_error( IN const char *fmt, ... );
/************************************************************************ /************************************************************************
@@ -86,11 +94,9 @@ void log_error( IN const char *fmt, ... );
* IN const char *src; input buffer * IN const char *src; input buffer
* *
* Description: Copy no of bytes spcified by the LINE_SIZE constant, * Description: Copy no of bytes spcified by the LINE_SIZE constant,
* from the source buffer. Null terminate the destination buffer * from the source buffer. Null terminate the destination buffer.
* *
* Return : void ; * Return: void
*
* Note :
************************************************************************/ ************************************************************************/
void linecopy( OUT char dest[LINE_SIZE], IN const char* src ); void linecopy( OUT char dest[LINE_SIZE], IN const char* src );
@@ -104,9 +110,7 @@ void linecopy( OUT char dest[LINE_SIZE], IN const char* src );
* Description: Copy no of bytes spcified by the NAME_SIZE constant, * Description: Copy no of bytes spcified by the NAME_SIZE constant,
* from the source buffer. Null terminate the destination buffer * from the source buffer. Null terminate the destination buffer
* *
* Return : void ; * Return: void
*
* Note :
************************************************************************/ ************************************************************************/
void namecopy( OUT char dest[NAME_SIZE], IN const char* src ); void namecopy( OUT char dest[NAME_SIZE], IN const char* src );
@@ -124,9 +128,7 @@ void namecopy( OUT char dest[NAME_SIZE], IN const char* src );
* Copy no of bytes spcified by the LINE_SIZE constant, * Copy no of bytes spcified by the LINE_SIZE constant,
* from the source buffer. Null terminate the destination buffer * from the source buffer. Null terminate the destination buffer
* *
* Return : void ; * Return: void
*
* Note :
************************************************************************/ ************************************************************************/
void linecopylen( OUT char dest[LINE_SIZE], IN const char* src, IN size_t srclen ); void linecopylen( OUT char dest[LINE_SIZE], IN const char* src, IN size_t srclen );
@@ -135,6 +137,9 @@ void linecopylen( OUT char dest[LINE_SIZE], IN const char* src, IN size_t srclen
} // extern C } // extern C
#endif #endif
/* Size of the errorBuffer variable, passed to the strerror_r() function */
#define ERROR_BUFFER_LEN 256
////////////////////////////////// //////////////////////////////////
// C specific // C specific
#ifndef __cplusplus #ifndef __cplusplus
@@ -155,9 +160,14 @@ void linecopylen( OUT char dest[LINE_SIZE], IN const char* src, IN size_t srclen
#define sleep(a) Sleep((a)*1000) #define sleep(a) Sleep((a)*1000)
#define usleep(a) Sleep((a)/1000) #define usleep(a) Sleep((a)/1000)
#endif
#define strerror_r(a,b,c) (strerror_s((b),(c),(a)))
#else
#define max(a, b) (((a)>(b))? (a):(b))
#define min(a, b) (((a)<(b))? (a):(b))
#endif /* WIN32 */
#endif // __cplusplus #endif // __cplusplus
#endif /* GENLIB_UTIL_UTIL_H */ #endif /* UTIL_H */

View File

@@ -126,18 +126,18 @@ int web_server_set_alias( IN const char* alias_name,
int web_server_set_root_dir( IN const char* root_dir ); int web_server_set_root_dir( IN const char* root_dir );
/************************************************************************ /************************************************************************
* Function: web_server_callback * * Function: web_server_callback
* * *
* Parameters: * * Parameters:
* IN http_parser_t *parser, * * IN http_parser_t *parser,
* INOUT http_message_t* req, * * INOUT http_message_t* req,
* IN SOCKINFO *info * * IN SOCKINFO *info
* * *
* Description: main entry point into web server; * * Description: main entry point into web server;
* handles HTTP GET and HEAD requests * * handles HTTP GET and HEAD requests
* * *
* Returns: * * Returns:
* void * * void
************************************************************************/ ************************************************************************/
void web_server_callback( IN http_parser_t *parser, IN http_message_t* req, INOUT SOCKINFO *info ); void web_server_callback( IN http_parser_t *parser, IN http_message_t* req, INOUT SOCKINFO *info );
@@ -148,3 +148,4 @@ void web_server_callback( IN http_parser_t *parser, IN http_message_t* req, INOU
#endif // GENLIB_NET_HTTP_WEBSERVER_H #endif // GENLIB_NET_HTTP_WEBSERVER_H

View File

@@ -443,9 +443,9 @@ check_soap_body( IN IXML_Document * doc,
if( actionNode ) { if( actionNode ) {
ns = ixmlNode_getNamespaceURI( actionNode ); ns = ixmlNode_getNamespaceURI( actionNode );
name = ixmlNode_getLocalName( actionNode ); name = ixmlNode_getLocalName( actionNode );
if (name && ns &&
if( ( !strcmp( actionName, name ) ) !strcmp( actionName, name ) &&
&& ( !strcmp( urn, ns ) ) ) { !strcmp( urn, ns ) ) {
ret_code = UPNP_E_SUCCESS; ret_code = UPNP_E_SUCCESS;
} }
} }

View File

@@ -48,10 +48,8 @@
#ifdef WIN32 #ifdef WIN32
#include <ws2tcpip.h> #include <ws2tcpip.h>
#include <winsock2.h> #include <winsock2.h>
#ifndef imillisleep #include <string.h>
#define imillisleep Sleep #endif /* WIN32 */
#endif
#endif
/************************************************************************ /************************************************************************
@@ -125,7 +123,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();
@@ -365,8 +363,13 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
* Returns: void * Returns: void
* *
***************************************************************************/ ***************************************************************************/
#ifndef WIN32
#warning There are currently no uses of the function 'process_reply()' in the code. #warning There are currently no uses of the function 'process_reply()' in the code.
#warning 'process_reply()' is a candidate for removal. #warning 'process_reply()' is a candidate for removal.
#else
#pragma message("There are currently no uses of the function 'process_reply()' in the code.")
#pragma message("'process_reply()' is a candidate for removal.")
#endif
static UPNP_INLINE void static UPNP_INLINE void
process_reply( IN char *request_buf, process_reply( IN char *request_buf,
IN int buf_len, IN int buf_len,
@@ -514,8 +517,10 @@ SearchByTarget( IN int Mx,
IN char *St, IN char *St,
IN void *Cookie ) IN void *Cookie )
{ {
char errorBuffer[ERROR_BUFFER_LEN];
int socklen = sizeof( struct sockaddr_in ); int socklen = sizeof( struct sockaddr_in );
int *id = NULL; int *id = NULL;
int ret = 0;
char *ReqBuf; char *ReqBuf;
struct sockaddr_in destAddr; struct sockaddr_in destAddr;
fd_set wrSet; fd_set wrSet;
@@ -535,11 +540,11 @@ SearchByTarget( IN int Mx,
} }
ReqBuf = (char *)malloc( BUFSIZE ); ReqBuf = (char *)malloc( BUFSIZE );
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;
@@ -577,7 +582,7 @@ SearchByTarget( IN int Mx,
TPJobSetPriority( &job, MED_PRIORITY ); TPJobSetPriority( &job, MED_PRIORITY );
TPJobSetFreeFunction( &job, ( free_routine ) free ); TPJobSetFreeFunction( &job, ( free_routine ) free );
//Schdule a timeout event to remove search Arg // Schedule a timeout event to remove search Arg
TimerThreadSchedule( &gTimerThread, timeTillRead, TimerThreadSchedule( &gTimerThread, timeTillRead,
REL_SEC, &job, SHORT_TERM, id ); REL_SEC, &job, SHORT_TERM, id );
newArg->timeoutEventId = ( *id ); newArg->timeoutEventId = ( *id );
@@ -585,34 +590,22 @@ SearchByTarget( IN int Mx,
ListAddTail( &ctrlpt_info->SsdpSearchList, newArg ); ListAddTail( &ctrlpt_info->SsdpSearchList, newArg );
HandleUnlock(); HandleUnlock();
setsockopt( gSsdpReqSocket, IPPROTO_IP, IP_MULTICAST_IF, ret = setsockopt( gSsdpReqSocket, IPPROTO_IP, IP_MULTICAST_IF,
(char *)&addr, sizeof (addr) ); (char *)&addr, sizeof (addr) );
if( select( gSsdpReqSocket + 1, NULL, &wrSet, NULL, NULL ) ret = select( gSsdpReqSocket + 1, NULL, &wrSet, NULL, NULL );
== UPNP_SOCKETERROR ) { if( ret == -1 ) {
if( errno == EBADF ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB :RequestHandler:An invalid file descriptor" "SSDP_LIB: Error in select(): %s\n",
" was givenin one of the sets. \n" ); errorBuffer );
} else if( errno == EINTR ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB :RequestHandler: A non blocked "
"signal was caught. \n" );
} else if( errno == EINVAL ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB :RequestHandler: n is negative. \n" );
} else if( errno == ENOMEM ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB : RequestHandler:select was unable to "
"allocate memory for internal tables.\n" );
}
shutdown( gSsdpReqSocket, SD_BOTH ); shutdown( gSsdpReqSocket, SD_BOTH );
UpnpCloseSocket( gSsdpReqSocket ); UpnpCloseSocket( gSsdpReqSocket );
free( ReqBuf ); free( ReqBuf );
return UPNP_E_INTERNAL_ERROR; return UPNP_E_INTERNAL_ERROR;
} else if( FD_ISSET( gSsdpReqSocket, &wrSet ) ) { } else if( FD_ISSET( gSsdpReqSocket, &wrSet ) ) {
int NumCopy = 0; int NumCopy = 0;
while( NumCopy < NUM_SSDP_COPY ) { while( NumCopy < NUM_SSDP_COPY ) {
sendto( gSsdpReqSocket, ReqBuf, strlen( ReqBuf ), 0, sendto( gSsdpReqSocket, ReqBuf, strlen( ReqBuf ), 0,
(struct sockaddr *)&destAddr, socklen ); (struct sockaddr *)&destAddr, socklen );
@@ -627,3 +620,4 @@ SearchByTarget( IN int Mx,
#endif // EXCLUDE_SSDP #endif // EXCLUDE_SSDP
#endif // INCLUDE_CLIENT_APIS #endif // INCLUDE_CLIENT_APIS

View File

@@ -30,10 +30,14 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#include "config.h" #include "config.h"
#ifdef INCLUDE_DEVICE_APIS #ifdef INCLUDE_DEVICE_APIS
#if EXCLUDE_SSDP == 0 #if EXCLUDE_SSDP == 0
#include <assert.h> #include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <string.h>
#include "ssdplib.h" #include "ssdplib.h"
#include "upnpapi.h" #include "upnpapi.h"
#include "ThreadPool.h" #include "ThreadPool.h"
@@ -45,7 +49,7 @@
#ifdef WIN32 #ifdef WIN32
#include <ws2tcpip.h> #include <ws2tcpip.h>
#include <winsock2.h> #include <winsock2.h>
#endif #endif /* WIN32 */
#define MSGTYPE_SHUTDOWN 0 #define MSGTYPE_SHUTDOWN 0
#define MSGTYPE_ADVERTISEMENT 1 #define MSGTYPE_ADVERTISEMENT 1
@@ -213,18 +217,20 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr,
IN int NumPacket, IN int NumPacket,
IN char **RqPacket ) IN char **RqPacket )
{ {
int ReplySock, char errorBuffer[ERROR_BUFFER_LEN];
socklen = sizeof( struct sockaddr_in ); int ReplySock;
int NumCopy, int socklen = sizeof( struct sockaddr_in );
Index; int NumCopy;
int Index;
unsigned long replyAddr = inet_addr( LOCAL_HOST ); unsigned long replyAddr = inet_addr( LOCAL_HOST );
int ttl = 4; // a/c to UPNP Spec int ttl = 4; // a/c to UPNP Spec
ReplySock = socket( AF_INET, SOCK_DGRAM, 0 ); ReplySock = socket( AF_INET, SOCK_DGRAM, 0 );
if( ReplySock == UPNP_INVALID_SOCKET ) { if ( ReplySock == -1 ) {
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB: New Request Handler:" "SSDP_LIB: New Request Handler:"
"Error in socket operation !!!\n" ); "Error in socket(): %s\n", errorBuffer );
return UPNP_E_OUTOF_SOCKET; return UPNP_E_OUTOF_SOCKET;
} }
@@ -242,7 +248,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
// //
@@ -262,6 +268,7 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr,
shutdown( ReplySock, SD_BOTH ); shutdown( ReplySock, SD_BOTH );
UpnpCloseSocket( ReplySock ); UpnpCloseSocket( ReplySock );
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }
@@ -334,8 +341,8 @@ CreateServicePacket( IN int msg_type,
ret_code = http_MakeMessage( ret_code = http_MakeMessage(
&buf, 1, 1, &buf, 1, 1,
"Q" "sssdc" "sdc" "ssc" "ssc" "ssc" "S" "Xc" "sscc", "Q" "sssdc" "sdc" "ssc" "ssc" "ssc" "S" "Xc" "sscc",
HTTPMETHOD_NOTIFY, "*", HTTPMETHOD_NOTIFY, "*", (size_t)1,
1, "HOST: ", SSDP_IP, ":", SSDP_PORT, "HOST: ", SSDP_IP, ":", SSDP_PORT,
"CACHE-CONTROL: max-age=", duration, "CACHE-CONTROL: max-age=", duration,
"LOCATION: ", location, "LOCATION: ", location,
"NT: ", nt, "NT: ", nt,
@@ -530,7 +537,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 +613,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 +660,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 +702,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 +822,4 @@ DeviceShutdown( IN char *DevType,
#endif // EXCLUDE_SSDP #endif // EXCLUDE_SSDP
#endif // INCLUDE_DEVICE_APIS #endif // INCLUDE_DEVICE_APIS

View File

@@ -43,6 +43,7 @@
#include "httpreadwrite.h" #include "httpreadwrite.h"
#ifdef WIN32 #ifdef WIN32
#include <string.h>
#include <winsock2.h> #include <winsock2.h>
#include <ws2tcpip.h> #include <ws2tcpip.h>
#include "unixutil.h" #include "unixutil.h"
@@ -50,8 +51,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 +61,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 +74,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 +121,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 +148,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 +161,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 +235,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 +317,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 +361,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 +396,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
@@ -454,20 +443,18 @@ Make_Socket_NoBlocking( int sock )
* Returns: int * Returns: int
* 0 if successful else -1 * 0 if successful else -1
***************************************************************************/ ***************************************************************************/
int int unique_service_name(IN char *cmd, IN SsdpEvent *Evt)
unique_service_name( IN char *cmd,
IN SsdpEvent * Evt )
{ {
char *TempPtr, char TempBuf[COMMAND_LEN];
TempBuf[COMMAND_LEN], char *TempPtr = NULL;
*Ptr, char *Ptr = NULL;
*ptr1, char *ptr1 = NULL;
*ptr2, char *ptr2 = NULL;
*ptr3; char *ptr3 = NULL;
int CommandFound = 0; int CommandFound = 0;
int length = 0;
if( ( TempPtr = strstr( cmd, "uuid:schemas" ) ) != NULL ) { if( ( TempPtr = strstr( cmd, "uuid:schemas" ) ) != NULL ) {
ptr1 = strstr( cmd, ":device" ); ptr1 = strstr( cmd, ":device" );
if( ptr1 != NULL ) { if( ptr1 != NULL ) {
ptr2 = strstr( ptr1 + 1, ":" ); ptr2 = strstr( ptr1 + 1, ":" );
@@ -499,7 +486,6 @@ unique_service_name( IN char *cmd,
} }
if( ( TempPtr = strstr( cmd, "uuid" ) ) != NULL ) { if( ( TempPtr = strstr( cmd, "uuid" ) ) != NULL ) {
//printf("cmd = %s\n",cmd);
if( ( Ptr = strstr( cmd, "::" ) ) != NULL ) { if( ( Ptr = strstr( cmd, "::" ) ) != NULL ) {
strncpy( Evt->UDN, TempPtr, Ptr - TempPtr ); strncpy( Evt->UDN, TempPtr, Ptr - TempPtr );
Evt->UDN[Ptr - TempPtr] = '\0'; Evt->UDN[Ptr - TempPtr] = '\0';
@@ -511,7 +497,6 @@ unique_service_name( IN char *cmd,
if( strstr( cmd, "urn:" ) != NULL if( strstr( cmd, "urn:" ) != NULL
&& strstr( cmd, ":service:" ) != NULL ) { && strstr( cmd, ":service:" ) != NULL ) {
if( ( TempPtr = strstr( cmd, "urn" ) ) != NULL ) { if( ( TempPtr = strstr( cmd, "urn" ) ) != NULL ) {
strcpy( Evt->ServiceType, TempPtr ); strcpy( Evt->ServiceType, TempPtr );
CommandFound = 1; CommandFound = 1;
@@ -526,8 +511,17 @@ unique_service_name( IN char *cmd,
} }
} }
if( CommandFound == 0 ) { if( ( TempPtr = strstr( cmd, "::upnp:rootdevice" ) ) != NULL ) {
/* Everything before "::upnp::rootdevice" is the UDN. */
if( TempPtr != cmd ) {
length = TempPtr - cmd;
strncpy(Evt->UDN, cmd, length);
Evt->UDN[length] = 0;
CommandFound = 1;
}
}
if( CommandFound == 0 ) {
return -1; return -1;
} }
@@ -746,8 +740,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 +812,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,131 +862,149 @@ readFromSSDPSocket( SOCKET socket )
int int
get_ssdp_sockets( MiniServerSockArray * out ) get_ssdp_sockets( MiniServerSockArray * out )
{ {
SOCKET ssdpSock; char errorBuffer[ERROR_BUFFER_LEN];
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;
int ret = 0;
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 ) ) ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 );
== UPNP_INVALID_SOCKET ) { if ( ssdpReqSock == -1 ) {
UpnpPrintf( UPNP_CRITICAL, strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
SSDP, __FILE__, __LINE__, UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" ); "Error in socket(): %s\n", errorBuffer );
return UPNP_E_OUTOF_SOCKET;}
setsockopt( ssdpReqSock, return UPNP_E_OUTOF_SOCKET;
IPPROTO_IP, }
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); ret = setsockopt( ssdpReqSock, IPPROTO_IP, 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 */
ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 );
if ( ssdpSock == -1 ) {
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in socket(): %s\n", errorBuffer );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) )
== UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
return UPNP_E_OUTOF_SOCKET; return UPNP_E_OUTOF_SOCKET;
} }
onOff = 1; onOff = 1;
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR, ret = setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR,
( char * )&onOff, sizeof( onOff ) ) != 0 ) { (char *)&onOff, sizeof(onOff) );
if ( ret == -1) {
UpnpPrintf( UPNP_CRITICAL, strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
SSDP, __FILE__, __LINE__, UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in set reuse addr !!!\n" ); "Error in setsockopt() SO_REUSEADDR: %s\n", errorBuffer );
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;
} }
#ifdef __FreeBSD__ #if defined(__FreeBSD__) || defined(__OSX__) || defined(__APPLE__)
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT, ret = setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT,
( char * )&onOff, sizeof( onOff ) ) != 0 ) { (char *)&onOff, sizeof (onOff) );
if ( ret == -1 ) {
UpnpPrintf( UPNP_CRITICAL, strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
SSDP, __FILE__, __LINE__, UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in set reuse port !!!\n" ); "Error in setsockopt() SO_REUSEPORT: %s\n", errorBuffer );
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 ret = bind( ssdpSock, (struct sockaddr *)&ssdpAddr, sizeof (ssdpAddr) );
( ssdpSock, ( struct sockaddr * )&ssdpAddr, if ( ret == -1 ) {
sizeof( ssdpAddr ) ) != 0 ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf( UPNP_CRITICAL, UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
SSDP, __FILE__, __LINE__, "Error in bind(), addr=0x%08X, port=%d: %s\n",
"Error in binding !!!\n" ); INADDR_ANY, SSDP_PORT, errorBuffer );
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;
} }
memset( (void *)&ssdpMcastAddr, 0, sizeof (struct ip_mreq) ); memset( (void *)&ssdpMcastAddr, 0, sizeof (struct ip_mreq) );
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, ret = setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
( char * )&ssdpMcastAddr, (char *)&ssdpMcastAddr, sizeof (struct ip_mreq) );
sizeof( struct ip_mreq ) ) != 0 ) { if ( ret == -1 ) {
UpnpPrintf( UPNP_CRITICAL, strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
SSDP, __FILE__, __LINE__, UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in joining" " multicast group !!!\n" ); "Error in setsockopt() IP_ADD_MEMBERSHIP (join multicast group): %s\n",
errorBuffer );
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;
} }
/* Set multicast interface. */ /* Set multicast interface. */
memset( (void *)&addr, 0, sizeof (struct in_addr) ); memset( (void *)&addr, 0, sizeof (struct in_addr) );
addr.s_addr = inet_addr(LOCAL_HOST); addr.s_addr = inet_addr(LOCAL_HOST);
if (setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF, ret = setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF,
(char *)&addr, sizeof addr) != 0) { (char *)&addr, sizeof addr);
if ( ret == -1 ) {
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"Couldn't set multicast interface.\n" ); "Error in setsockopt() IP_MULTICAST_IF (set multicast interface): %s\n",
errorBuffer );
/* 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, ret = setsockopt( ssdpSock, IPPROTO_IP,
IP_MULTICAST_TTL, &ttl, sizeof (ttl) ); IP_MULTICAST_TTL, &ttl, sizeof (ttl) );
if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST,
( char * )&option, sizeof( option ) ) != 0 ) { ret = setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST,
UpnpPrintf( UPNP_CRITICAL, (char *)&option, sizeof (option) );
SSDP, __FILE__, __LINE__, if( ret == -1) {
"Error in setting broadcast !!!\n" ); strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in setsockopt() SO_BROADCAST (set broadcast): %s\n",
errorBuffer );
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 */

View File

@@ -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 &quot;for loop&quot; 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 &quot;for loop&quot; 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;
} }
}

View File

@@ -18,11 +18,11 @@
*/ */
#include "config.h" #include "config.h"
#ifndef WIN32 #ifdef WIN32
#include <unistd.h>
#else
#include <winsock2.h> #include <winsock2.h>
#endif #else /* WIN32 */
#include <unistd.h>
#endif /* WIN32 */
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include "sysdep.h" #include "sysdep.h"
@@ -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;
}; };
@@ -57,7 +56,7 @@ get_ieee_node_identifier( uuid_node_t * node )
less than 100ns. less than 100ns.
*/ */
#ifdef _WINDOWS_ #ifdef WIN32
void void
get_system_time( uuid_time_t * uuid_time ) get_system_time( uuid_time_t * uuid_time )
@@ -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 /* WIN32 */
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
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 /* WIN32 */

View File

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

View File

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