Compare commits

..

35 Commits

Author SHA1 Message Date
Marcelo Roberto Jimenez
eaaa721a15 Tag for release 1.4.7, the release that never was.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/tags/release-1.4.7@250 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-19 13:54:22 +00:00
Marcelo Roberto Jimenez
b09faaaec4 Merge of trunk revision 202, the last 1.4 compatible revision, to branch 1.4.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@249 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-19 13:50:19 +00:00
Marcelo Roberto Jimenez
881952bd0d Merge of trunk.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@174 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-30 14:38:50 +00:00
Marcelo Roberto Jimenez
ec93478a4f Home page and home page Changelog.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@173 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-30 12:53:36 +00:00
Marcelo Roberto Jimenez
a7ab0acfe8 Merge of trunk into branch-1.4.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@168 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-28 19:36:19 +00:00
Marcelo Roberto Jimenez
85a8da77f2 Merge of trunk into branch-1.4.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@156 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-17 04:06:11 +00:00
Marcelo Roberto Jimenez
25620c1967 Merge of trunk.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@148 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-03-06 10:48:50 +00:00
Marcelo Roberto Jimenez
8bc61b1a5c Merging trunk to release-1.4.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@145 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-03-06 10:22:07 +00:00
Marcelo Roberto Jimenez
aec58e6c9e Merge of trunk.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@133 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-13 13:53:24 +00:00
Marcelo Roberto Jimenez
4bcb9dd5e1 Merge of trunk into branch-1.4.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@130 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-13 01:40:10 +00:00
Marcelo Roberto Jimenez
8cfa0e488c Merge of trunk into branch-1.4.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@127 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-03 19:30:31 +00:00
Marcelo Roberto Jimenez
9e775e662e Changelog update and webpage update.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@111 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 23:32:05 +00:00
Marcelo Roberto Jimenez
03400550cd Merge of rev. 109.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@110 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 22:44:01 +00:00
Marcelo Roberto Jimenez
62a5d7c5ef Changelog update.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@108 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 21:37:20 +00:00
Marcelo Roberto Jimenez
df80fbae36 Merge of rev.105.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@106 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 21:31:17 +00:00
Marcelo Roberto Jimenez
9c6ea48583 Merge of rev.103.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@104 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 21:06:48 +00:00
Marcelo Roberto Jimenez
8da593fae3 Changelog update.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@102 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 20:38:00 +00:00
Marcelo Roberto Jimenez
b4816a33a9 Merge of rev.99.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@100 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 20:07:06 +00:00
Marcelo Roberto Jimenez
1b029e80af Merge of rev.97.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@98 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 19:57:16 +00:00
Oxy
907b103439 workaround for Linux-applications that do not catch SIGPIPE backported
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@76 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-07 05:49:19 +00:00
Oxy
ecd755d3f8 workaround added for applications that don't catch SIGEPIPE
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@75 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-04 05:46:06 +00:00
Marcelo Roberto Jimenez
b8cac59dd9 Merge of r61, r62, r63, r64.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@65 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-20 11:51:17 +00:00
Marcelo Roberto Jimenez
591e0d3e25 Merge of r58.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@59 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-20 02:48:14 +00:00
Oxy
bd3bf7ad0a email addresses modified to hide them from spambots (in SVNWeb)
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@57 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-18 06:39:45 +00:00
Marcelo Roberto Jimenez
374ff706fd Merge of r54.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@55 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-11 00:53:31 +00:00
Marcelo Roberto Jimenez
44564d16f8 Merge of r52.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@53 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-09 20:03:54 +00:00
Marcelo Roberto Jimenez
c0a5ccc174 Merge of r50.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@51 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-08 13:22:19 +00:00
Marcelo Roberto Jimenez
522dee807f Merging trunk to branch 1.4.x
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@49 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-08 12:38:45 +00:00
Marcelo Roberto Jimenez
062d62bbc4 Merge of r33.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@34 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-04 12:29:33 +00:00
Marcelo Roberto Jimenez
ca1d800b96 Applying current development branch to 1.4.x stable branch.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@32 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-04 02:52:46 +00:00
Marcelo Roberto Jimenez
bd8ea3ac77 Applying current development branch to 1.4.x stable branch.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@31 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-04 02:50:21 +00:00
Marcelo Roberto Jimenez
191814ec13 Applying current development branch to 1.4.x stable branch.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@30 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-04 02:49:47 +00:00
Marcelo Roberto Jimenez
854cc93854 Better naming for stable branch.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@11 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-06 16:43:09 +00:00
Marcelo Roberto Jimenez
6a0f25b290 Merge of 6.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/release-1.4.0@7 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-06 16:37:29 +00:00
Marcelo Roberto Jimenez
ed0a4d2222 Stable branch for release 1.4.0.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/release-1.4.0@5 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-06 16:30:33 +00:00
60 changed files with 4375 additions and 4892 deletions

277
ChangeLog
View File

@@ -1,218 +1,3 @@
*******************************************************************************
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
*******************************************************************************
2007-06-10 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* More fixes to Mac OS X and NetBSD from Rene Hexel:
[pupnp-devel] NetBSD & Mac OS X packages and patches
Okay, I found a couple more things. I have attached a patch file
against the trunk (version 206) that make the repository code compile
and run on both Mac OS X and NetBSD.
This fixes the following issues:
upnp/src/api/upnpapi.c: SIOCGIFCONF didn't work properly, use
getifaddrs() instead (on BSD systems).
threadutil/src/ThreadPool.c: priorities only work if
_POSIX_PRIORITY_SCHEDULING is defined (and greater than 0).
threadutil/src/LinkedList.c and threadutil/src/iasnprintf.c: use
stdlib.h instead of malloc.h on all BSD systems (not just FreeBSD).
This is important, because malloc.h does not exist on Darwin/Mac OS X.
Cheers
,
Rene
2007-06-09 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* [pupnp-devel] NetBSD & Mac OS X packages and patches.
Rene Hexel's <rh@netbsd.org> patch to compile in NetBSD and Mac OS X.
2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Updated the macro files acx_pthread.m4, ax_cflags_gcc_option.m4,
ax_cflags_warn_all.m4, m4/ax_cflags_warn_all_ansi.m4,
m4/type_socklen_t.m4.
2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Fixed an issue with the instalation of the file upnpdebug.h. Since
the last modifications that removed the macro DEBUV_ONLY, this file
must be installed even on a non-debug build.
2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Bug Tracker [ 1711325 ] Bad DestAddr in Upnp_Discovery structure
Submitted By: Bob Ciora
The field DestAddr of the structure Upnp_Discovery is now a full
SOCKADDRIN instead of a pointer to SOCKADDRIN. Commented code sugests
that in a previous moment, the function ssdp_handle_ctrlpt_msg() did
not use a postponed thread to call ctrlpt_callback(). Now the code
uses a thread, and most probably the original data would get lost and
the pointer would point to an invalid memory region. This fix caused
an interface change in the library and the minor library version was
bumped. Also, the libtool library numbers were changed accordingly.
******************************************************************************* *******************************************************************************
Version 1.4.7 Version 1.4.7
******************************************************************************* *******************************************************************************
@@ -434,7 +219,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 Casiot - no_dice Submitted By: Jonathan - 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.
@@ -579,14 +364,14 @@ Version 1.4.0
FORK FROM DEAD libupnp FORK FROM DEAD libupnp
******************************************************************************* *******************************************************************************
2006-04-29 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-04-29 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* THANKS: new file with list of contributors * THANKS: new file with list of contributors
* upnp/src/gena/gena_device.c (respond_ok): add 'Content-Length: 0' * upnp/src/gena/gena_device.c (respond_ok): add 'Content-Length: 0'
in subscription response. Patch by Chaos (Bug # 1455367). in subscription response. Patch by Chaos (Bug # 1455367).
2006-04-08 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-04-08 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/doc/UPnP_Programming_Guide.pdf: replace this document with * upnp/doc/UPnP_Programming_Guide.pdf: replace this document with
the one in libupnp-doc-1.2.1 because current CVS version the one in libupnp-doc-1.2.1 because current CVS version
@@ -597,20 +382,20 @@ FORK FROM DEAD libupnp
* changes applied to several files to work under Sparc Solaris, temporarily * changes applied to several files to work under Sparc Solaris, temporarily
requiring a define SPARC_SOLARIS requiring a define SPARC_SOLARIS
2006-04-03 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-04-03 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/Makefile.am: install upnp samples in $(docdir)/examples * upnp/Makefile.am: install upnp samples in $(docdir)/examples
2006-03-28 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-03-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* configure.ac: add --with-docdir option to choose where documentation * configure.ac: add --with-docdir option to choose where documentation
is installed (or -without-docdir to not install the documentation) is installed (or -without-docdir to not install the documentation)
2006-03-27 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-03-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/test: add simple test suite for xml parser * ixml/test: add simple test suite for xml parser
2006-03-26 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-03-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/src/ixmlparser.c (Parser_processCDSect): fix bug which prevents * ixml/src/ixmlparser.c (Parser_processCDSect): fix bug which prevents
CDATA sections which contain a 0 (zero) to be parsed (instead the CDATA sections which contain a 0 (zero) to be parsed (instead the
@@ -621,18 +406,18 @@ FORK FROM DEAD libupnp
option, and move samples compilation from check_PROGRAMS to option, and move samples compilation from check_PROGRAMS to
noinst_PROGRAMS noinst_PROGRAMS
2006-03-25 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-03-25 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/genlib/miniserver/miniserver.c (get_miniserver_sockets): * upnp/src/genlib/miniserver/miniserver.c (get_miniserver_sockets):
fix bug if new socket created has fd 0 (can only occur when stdin fix bug if new socket created has fd 0 (can only occur when stdin
has been closed). Patch by Oskar Liljeblad 2004-07-02 : has been closed). Patch by Oskar Liljeblad 2004-07-02 :
http://sourceforge.net/mailarchive/message.php?msg_id=8870528 http://sourceforge.net/mailarchive/message.php?msg_id=8870528
2006-03-21 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-03-21 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/test/test_init.c: add some version checks and exit if failure * upnp/test/test_init.c: add some version checks and exit if failure
2006-03-05 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-03-05 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* libupnp version 1.3.1 * libupnp version 1.3.1
@@ -647,11 +432,11 @@ FORK FROM DEAD libupnp
dependencies between upnp and ixml / threadutil, so that programs dependencies between upnp and ixml / threadutil, so that programs
linking against upnp only still work. linking against upnp only still work.
2006-03-04 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-03-04 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* libupnp version 1.3.0 * libupnp version 1.3.0
2006-03-03 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-03-03 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/genlib/net/http/httpreadwrite.c (get_sdk_info): use * upnp/src/genlib/net/http/httpreadwrite.c (get_sdk_info): use
package version string from configure to set sdk info package version string from configure to set sdk info
@@ -659,7 +444,7 @@ FORK FROM DEAD libupnp
* upnp/Makefile.am: add sample/tvdevice/web/ files in EXTRA_DIST * upnp/Makefile.am: add sample/tvdevice/web/ files in EXTRA_DIST
+ do not distribute generated upnpconfig.h file. + do not distribute generated upnpconfig.h file.
2006-02-28 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-02-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/inc/config.h, configure.ac: use only new defines * upnp/src/inc/config.h, configure.ac: use only new defines
UPNP_HAVE_xx instead of INCLUDE_yyy_APIS and INTERNAL_WEB_SERVER UPNP_HAVE_xx instead of INCLUDE_yyy_APIS and INTERNAL_WEB_SERVER
@@ -668,7 +453,7 @@ FORK FROM DEAD libupnp
the librarie LDFLAGS in order to export only the symbols defined the librarie LDFLAGS in order to export only the symbols defined
in the API in the API
2006-02-27 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-02-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* configure.ac: add libtool versions for the 3 libraries * configure.ac: add libtool versions for the 3 libraries
@@ -676,7 +461,7 @@ FORK FROM DEAD libupnp
* threadutil/src/ThreadPool.c (SetSeed): add missing 'static' * threadutil/src/ThreadPool.c (SetSeed): add missing 'static'
2006-02-26 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-02-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* threadutil/inc/iasnprintf.h: add gcc __printf__ format attribute * threadutil/inc/iasnprintf.h: add gcc __printf__ format attribute
to "iasnprintf" to "iasnprintf"
@@ -697,11 +482,11 @@ FORK FROM DEAD libupnp
the configuration of the installed libraries (generates installed the configuration of the installed libraries (generates installed
file <upnp/upnpconfig.h>) file <upnp/upnpconfig.h>)
2006-02-22 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-02-22 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/ : add missing include of config.h in some .c files * upnp/ : add missing include of config.h in some .c files
2006-02-21 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-02-21 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/inc/upnp.h: move some definitions which should not be * upnp/inc/upnp.h: move some definitions which should not be
exported into "upnp/src/inc/util.h" exported into "upnp/src/inc/util.h"
@@ -709,12 +494,12 @@ FORK FROM DEAD libupnp
* import all modifications below from libupnp in djmount 0.51 * import all modifications below from libupnp in djmount 0.51
into official libupnp into official libupnp
2006-01-17 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-01-17 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* threadutil/Makefile.am (libthreadutil_la_SOURCES): remove extraneous * threadutil/Makefile.am (libthreadutil_la_SOURCES): remove extraneous
file file
2006-01-15 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-01-15 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* configure.ac: add checks for large-file support * configure.ac: add checks for large-file support
@@ -734,53 +519,53 @@ FORK FROM DEAD libupnp
* ixml/src/node.c (ixmlNode_getNodeType): fix compilation warning * ixml/src/node.c (ixmlNode_getNodeType): fix compilation warning
on const return type on const return type
2006-01-12 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-01-12 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/inc/readwrite.h : suppress unused C++ header file * upnp/src/inc/readwrite.h : suppress unused C++ header file
2006-01-11 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2006-01-11 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/inc/config.h, upnp/src/inc/upnpapi.h, * upnp/inc/config.h, upnp/src/inc/upnpapi.h,
upnp/src/inc/httpreadwrite.h: remove internal configuration variable upnp/src/inc/httpreadwrite.h: remove internal configuration variable
MINIMUM_DELAY (no clear purpose) MINIMUM_DELAY (no clear purpose)
2005-12-05 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2005-12-05 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/inc/upnp.h: re-declare obsolete method UpnpSetContentLength, * upnp/inc/upnp.h: re-declare obsolete method UpnpSetContentLength,
for binary compatibility with previous libupnp version. for binary compatibility with previous libupnp version.
* upnp/src/api/upnpapi.c: correct type of g_maxContentLength to size_t * upnp/src/api/upnpapi.c: correct type of g_maxContentLength to size_t
2005-11-01 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2005-11-01 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* autoconfiscate library : replace all makefiles by Makefile.am * autoconfiscate library : replace all makefiles by Makefile.am
for automake support, + preliminary autoconf support for automake support, + preliminary autoconf support
(generated config.h not yet used in source files) (generated config.h not yet used in source files)
2005-10-18 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2005-10-18 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/makefile: fix location of DEBUG STATIC libupnp library * upnp/src/makefile: fix location of DEBUG STATIC libupnp library
* upnp/sample/tvctrlpt/linux/Makefile, * upnp/sample/tvctrlpt/linux/Makefile,
upnp/sample/tvdevice/linux/Makefile: fix STATIC library support upnp/sample/tvdevice/linux/Makefile: fix STATIC library support
2005-10-16 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2005-10-16 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* threadutil/src/Makefile (clean): remove built library * threadutil/src/Makefile (clean): remove built library
2005-08-28 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2005-08-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/src/ixml.h, ixml/src/ixml.c (ixmlRelaxParser) : new function * ixml/src/ixml.h, ixml/src/ixml.c (ixmlRelaxParser) : new function
* ixml/src/ixmlparser.h, ixml/src/ixmlparser.c (Parser_setErrorChar) : * ixml/src/ixmlparser.h, ixml/src/ixmlparser.c (Parser_setErrorChar) :
new function new function
2005-08-02 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2005-08-02 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/src/Makefile: correct bug for static library being incorrectly * ixml/src/Makefile: correct bug for static library being incorrectly
stripped when building non-debug stripped when building non-debug
2005-06-09 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2005-06-09 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/src/element.c (ixmlElement_removeAttributeNode): * ixml/src/element.c (ixmlElement_removeAttributeNode):
remove some compilation warning remove some compilation warning
@@ -791,7 +576,7 @@ FORK FROM DEAD libupnp
* upnp/inc/upnptools.h, upnp/src/api/upnptools.c : * upnp/inc/upnptools.h, upnp/src/api/upnptools.c :
add missing const's in public API add missing const's in public API
2005-05-28 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2005-05-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/inc/config.h: suppress HTTP_READ_BYTES (unused) * upnp/inc/config.h: suppress HTTP_READ_BYTES (unused)
and replace by DEFAULT_SOAP_CONTENT_LENGTH (previously in upnpapi.h) and replace by DEFAULT_SOAP_CONTENT_LENGTH (previously in upnpapi.h)
@@ -812,7 +597,7 @@ FORK FROM DEAD libupnp
* upnp/src/genlib/net/http/httpreadwrite.c : corrected an incorrect * upnp/src/genlib/net/http/httpreadwrite.c : corrected an incorrect
sprintf format sprintf format
2005-05-27 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2005-05-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/makefile, upnp/src/makefile, * upnp/makefile, upnp/src/makefile,
ixml/Makefile, ixml/src/Makefile, ixml/Makefile, ixml/src/Makefile,
@@ -820,7 +605,7 @@ FORK FROM DEAD libupnp
implement STATIC library support (from patch at implement STATIC library support (from patch at
http://sourceforge.net/tracker/?group_id=7189&atid=307189 ) http://sourceforge.net/tracker/?group_id=7189&atid=307189 )
2005-05-26 R<>mi Turboult <r3mi(at)users.sourceforge.net> 2005-05-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/api/upnpapi.c, upnp/src/soap/soap_device.c, * upnp/src/api/upnpapi.c, upnp/src/soap/soap_device.c,
upnp/src/soap/makefile : upnp/src/soap/makefile :

View File

@@ -1,7 +1,8 @@
# #
# Top-level "Makefile.am" for libupnp # Top-level "Makefile.am" for libupnp
# #
# Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net> # Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
# #
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4

2
README
View File

@@ -1,7 +1,7 @@
Portable SDK for UPnP* Devices (libupnp) Portable SDK for UPnP* Devices (libupnp)
Copyright (c) 2000-2003 Intel Corporation - All Rights Reserved. Copyright (c) 2000-2003 Intel Corporation - All Rights Reserved.
Copyright (c) 2005-2006 R<>mi Turboult <r3mi@users.sourceforge.net> Copyright (c) 2005-2006 R<>mi Turboult <r3mi@users.sourceforge.net>
Copyright (c) 2006 Michel Pfeiffer and others <virtual_worlds@gmx.de> Copyright (c) 2006 Michel Pfeiffer and others <virtual_worlds@gmx.de>
See LICENSE for details. See LICENSE for details.

22
THANKS
View File

@@ -6,43 +6,29 @@ suggesting various improvements or submitting actual code.
Here is a list of these people. Help us keep it complete and Here is a list of these people. Help us keep it complete and
exempt of errors. exempt of errors.
- Alex (afaucher)
- Arno Willig - Arno Willig
- Bob Ciora
- Chaos - Chaos
- 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 Casiot (no_dice) - Jonathan (no_dice)
- Josh Carroll
- Keith Brindley
- Leuk_He - Leuk_He
- Loigu - Loigu
- Luke Kim - Luke Kim
- Marcelo Roberto Jimenez (mroberto) - Marcelo Roberto Jimenez
- Markus Strobl - Markus Strobl
- Nektarios K. Papadopoulos (npapadop) - Nektarios K. Papadopoulos
- Oskar Liljeblad - Oskar Liljeblad
- Michael (oxygenic) - Michael (Oxy)
- Paul Vixie - Paul Vixie
- Peter Hartley
- 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/inc/upnpdebug.h> see <upnp/upnpdebug.h>
*/ */
#define DEBUG_ALL 1 #define DEBUG_ALL 1

View File

@@ -2,7 +2,7 @@
// -*- C -*- // -*- C -*-
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// //
// Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net> // Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
// 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

View File

@@ -5,17 +5,17 @@
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=libupnp - Win32 Debug CFG=libupnp - Win32 Debug
!MESSAGE Dies ist kein g<>ltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE Dies ist kein g<>ltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und f<>hren Sie den Befehl !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und f<>hren Sie den Befehl
!MESSAGE !MESSAGE
!MESSAGE NMAKE /f "libupnp.mak". !MESSAGE NMAKE /f "libupnp.mak".
!MESSAGE !MESSAGE
!MESSAGE Sie k<>nnen beim Ausf<73>hren von NMAKE eine Konfiguration angeben !MESSAGE Sie k<>nnen beim Ausf<73>hren von NMAKE eine Konfiguration angeben
!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
!MESSAGE !MESSAGE
!MESSAGE NMAKE /f "libupnp.mak" CFG="libupnp - Win32 Debug" !MESSAGE NMAKE /f "libupnp.mak" CFG="libupnp - Win32 Debug"
!MESSAGE !MESSAGE
!MESSAGE F<>r die Konfiguration stehen zur Auswahl: !MESSAGE F<>r die Konfiguration stehen zur Auswahl:
!MESSAGE !MESSAGE
!MESSAGE "libupnp - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library") !MESSAGE "libupnp - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library")
!MESSAGE "libupnp - Win32 Debug" (basierend auf "Win32 (x86) Dynamic-Link Library") !MESSAGE "libupnp - Win32 Debug" (basierend auf "Win32 (x86) Dynamic-Link Library")

View File

@@ -4,154 +4,49 @@
# #
# Process this file with autoconf to produce a configure script. # Process this file with autoconf to produce a configure script.
# #
# (C) Copyright 2005-2007 R<>mi Turboult <r3mi@users.sourceforge.net> # (C) Copyright 2005-2006 R<>mi Turboult <r3mi@users.sourceforge.net>
# #
AC_PREREQ(2.60) AC_PREREQ(2.60)
AC_INIT([libupnp], [1.6.5], [mroberto@users.sourceforge.net]) AC_INIT([libupnp], [1.4.7], [mroberto@users.sourceforge.net])
dnl ############################################################################ # *Independently* of the above libupnp package version, the libtool version
dnl # *Independently* of the above libupnp package version, the libtool version # of the 3 libraries need to be updated whenever there is a change released :
dnl # of the 3 libraries need to be updated whenever there is a change released: # "current:revision:age" (this is NOT the same as the package version), where:
dnl # "current:revision:age" (this is NOT the same as the package version), # - library code modified: revision++
dnl # where: # - interfaces changed/added/removed: current++ and revision=0
dnl # - library code modified: revision++ # - interfaces added: age++
dnl # - interfaces changed/added/removed: current++ and revision=0 # - interfaces removed: age=0
dnl # - interfaces added: age++ # *please update only once, before a formal release, not for each change*
dnl # - interfaces removed: age=0 #
dnl # *please update only once, before a formal release, not for each change* # For release 1.4.1, we had:
dnl # #AC_SUBST([LT_VERSION_IXML], [2:2:0])
dnl ############################################################################ #AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0])
dnl # Release 1.4.1: #AC_SUBST([LT_VERSION_UPNP], [2:2:0])
dnl #AC_SUBST([LT_VERSION_IXML], [2:2:0]) #
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0]) # "current:revision:age"
dnl #AC_SUBST([LT_VERSION_UPNP], [2:2:0]) #
dnl # # - Code has changed in ixml
dnl ############################################################################ # revision: 2 -> 3
dnl # Release 1.4.6: # - Code has changed in threadutil
dnl # "current:revision:age" # revision: 2 -> 3
dnl # # - Interface added in threadutil
dnl # - Code has changed in ixml # current: 2 -> 3
dnl # revision: 2 -> 3 # revisiion: 3 -> 0
dnl # - Code has changed in threadutil # age: 0 -> 1
dnl # revision: 2 -> 3 # - Code has changed in upnp (revision 2 -> 3)
dnl # - Interface added in threadutil # revision: 2 -> 3
dnl # current: 2 -> 3 AC_SUBST([LT_VERSION_IXML], [2:3:0])
dnl # revisiion: 3 -> 0 AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1])
dnl # age: 0 -> 1 AC_SUBST([LT_VERSION_UPNP], [2:3:0])
dnl # - Code has changed in upnp
dnl # revision: 2 -> 3
dnl #
dnl #AC_SUBST([LT_VERSION_IXML], [2:3:0])
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1])
dnl #AC_SUBST([LT_VERSION_UPNP], [2:3:0])
dnl #
dnl ############################################################################
dnl # Release 1.6.0:
dnl # "current:revision:age"
dnl #
dnl # - Code has changed in ixml
dnl # revision: 3 -> 4
dnl # - Code has changed in threadutil
dnl # revision: 0 -> 1
dnl # - Code has changed in upnp
dnl # revision: 3 -> 4
dnl # - Interface changed in upnp
dnl # current: 2 -> 3
dnl # revision: 4 -> 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 ############################################################################
AC_SUBST([LT_VERSION_IXML], [2:4:0])
AC_SUBST([LT_VERSION_THREADUTIL], [4:2:2])
AC_SUBST([LT_VERSION_UPNP], [3:4: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([build-aux]) AC_CONFIG_AUX_DIR(config.aux)
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR(m4)
AC_CONFIG_SRCDIR([upnp/inc/upnp.h]) AC_CONFIG_SRCDIR(upnp/inc/upnp.h)
AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects dist-bzip2]) AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects dist-bzip2])
# #
# Get canonical host names in host and host_os # Get canonical host names in host and host_os
# #
@@ -176,7 +71,8 @@ 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", [see upnpconfig.h]) AC_DEFINE_UNQUOTED([UPNP_VERSION_STRING], "$PACKAGE_VERSION",
[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])
@@ -198,6 +94,7 @@ 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])
@@ -231,13 +128,11 @@ 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(
@@ -252,9 +147,7 @@ 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
@@ -340,6 +233,7 @@ 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
@@ -354,40 +248,9 @@ 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_UNACCEPTED-302.html \ ./html/upnp/UPNP_E_UNSUBSCRIBE_UNACCAPTED-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_UNACCEPTED-302.html \ ./html/upnp/UPNP_E_UNSUBSCRIBE_UNACCAPTED-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,6 +38,10 @@
#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

@@ -501,22 +501,17 @@ 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( Parser_isValidEndElement( IN Parser * xmlParser,
IN Parser * xmlParser,
IN IXML_Node * newNode ) IN IXML_Node * newNode )
{ {
assert( xmlParser ); return ( strcmp( xmlParser->pCurElement->element, newNode->nodeName )
assert( xmlParser->pCurElement ); == 0 );
assert( xmlParser->pCurElement->element );
assert( newNode );
assert( newNode->nodeName );
return strcmp( xmlParser->pCurElement->element, newNode->nodeName ) == 0;
} }
/*=============================================================== /*===============================================================
@@ -926,8 +921,6 @@ 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 );
@@ -943,9 +936,7 @@ Parser_parseDocument( OUT IXML_Document ** retDoc,
} }
while( bETag == FALSE ) { while( bETag == FALSE ) {
// clear the newNode contents. Redundant on the first iteration, // clear the newNode contents
// 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 ) ==
@@ -1039,7 +1030,7 @@ Parser_parseDocument( OUT IXML_Document ** retDoc,
Parser_free( xmlParser ); Parser_free( xmlParser );
return rc; return rc;
ErrorHandler: ErrorHandler:
Parser_freeNodeContent( &newNode ); Parser_freeNodeContent( &newNode );
ixmlDocument_free( gRootDoc ); ixmlDocument_free( gRootDoc );
Parser_free( xmlParser ); Parser_free( xmlParser );
@@ -2506,4 +2497,3 @@ Parser_getNextNode( IN Parser * xmlParser,
return IXML_SYNTAX_ERR; return IXML_SYNTAX_ERR;
} }

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

View File

@@ -9,3 +9,4 @@ Version: @VERSION@
Libs: @PTHREAD_LIBS@ -L${libdir} -lupnp -lthreadutil -lixml Libs: @PTHREAD_LIBS@ -L${libdir} -lupnp -lthreadutil -lixml
Cflags: @PTHREAD_CFLAGS@ -I${includedir}/upnp Cflags: @PTHREAD_CFLAGS@ -I${includedir}/upnp

View File

@@ -1,4 +1,4 @@
Version: 1.6.5 Version: 1.4.7
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,9 +77,6 @@ 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 * Mon Nov 19 2007 Marcelo Jimenez <mroberto@users.sourceforge.net> - 1.4.7-1
- Update to version 1.4.7 - Update to version 1.4.7

View File

@@ -1,88 +1,50 @@
##### http://autoconf-archive.cryp.to/acx_pthread.html dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
# dnl
# SYNOPSIS dnl @summary figure out how to build C programs using POSIX threads
# dnl
# ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) dnl This macro figures out how to build C programs using POSIX threads.
# dnl It sets the PTHREAD_LIBS output variable to the threads library and
# DESCRIPTION dnl linker flags, and the PTHREAD_CFLAGS output variable to any special
# dnl C compiler flags that are needed. (The user can also force certain
# This macro figures out how to build C programs using POSIX threads. dnl compiler flags/libs to be tested by setting these environment
# It sets the PTHREAD_LIBS output variable to the threads library and dnl variables.)
# linker flags, and the PTHREAD_CFLAGS output variable to any special dnl
# C compiler flags that are needed. (The user can also force certain dnl Also sets PTHREAD_CC to any special C compiler that is needed for
# compiler flags/libs to be tested by setting these environment dnl multi-threaded programs (defaults to the value of CC otherwise).
# variables.) dnl (This is necessary on AIX to use the special cc_r compiler alias.)
# dnl
# Also sets PTHREAD_CC to any special C compiler that is needed for dnl NOTE: You are assumed to not only compile your program with these
# multi-threaded programs (defaults to the value of CC otherwise). dnl flags, but also link it with them as well. e.g. you should link
# (This is necessary on AIX to use the special cc_r compiler alias.) dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
# dnl $LIBS
# NOTE: You are assumed to not only compile your program with these dnl
# flags, but also link it with them as well. e.g. you should link dnl If you are only building threads programs, you may wish to use
# with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS dnl these variables in your default LIBS, CFLAGS, and CC:
# $LIBS dnl
# dnl LIBS="$PTHREAD_LIBS $LIBS"
# If you are only building threads programs, you may wish to use dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
# these variables in your default LIBS, CFLAGS, and CC: dnl CC="$PTHREAD_CC"
# dnl
# LIBS="$PTHREAD_LIBS $LIBS" dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
# CC="$PTHREAD_CC" dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
# dnl
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute dnl ACTION-IF-FOUND is a list of shell commands to run if a threads
# constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to
# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the
# dnl default action will define HAVE_PTHREAD.
# ACTION-IF-FOUND is a list of shell commands to run if a threads dnl
# library is found, and ACTION-IF-NOT-FOUND is a list of commands to dnl Please let the authors know if this macro fails on any platform, or
# run it if it is not found. If ACTION-IF-FOUND is not specified, the dnl if you have any other suggestions or comments. This macro was based
# default action will define HAVE_PTHREAD. dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with
# dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros
# Please let the authors know if this macro fails on any platform, or dnl posted by Alejandro Forero Cuervo to the autoconf macro repository.
# if you have any other suggestions or comments. This macro was based dnl We are also grateful for the helpful feedback of numerous users.
# on work by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) dnl
# (with help from M. Frigo), as well as ac_pthread and hb_pthread dnl @category InstalledPackages
# macros posted by Alejandro Forero Cuervo to the autoconf macro dnl @author Steven G. Johnson <stevenj@alum.mit.edu>
# repository. We are also grateful for the helpful feedback of dnl @version 2005-06-15
# numerous users. dnl @license GPLWithACException
#
# LAST MODIFICATION
#
# 2006-05-29
#
# COPYLEFT
#
# Copyright (c) 2006 Steven G. Johnson <stevenj@alum.mit.edu>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
#
# As a special exception, the respective Autoconf Macro's copyright
# owner gives unlimited permission to copy, distribute and modify the
# configure scripts that are the output of Autoconf when processing
# the Macro. You need not follow the terms of the GNU General Public
# License when using or distributing such scripts, even though
# portions of the text of the Macro appear in them. The GNU General
# Public License (GPL) does govern all other use of the material that
# constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the
# Autoconf Macro released by the Autoconf Macro Archive. When you
# make and distribute a modified version of the Autoconf Macro, you
# may extend this special exception to the GPL to apply to your
# modified version as well.
AC_DEFUN([ACX_PTHREAD], [ AC_DEFUN([ACX_PTHREAD], [
AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_CANONICAL_HOST])
@@ -254,12 +216,8 @@ if test "x$acx_pthread_ok" = xyes; then
LIBS="$save_LIBS" LIBS="$save_LIBS"
CFLAGS="$save_CFLAGS" CFLAGS="$save_CFLAGS"
# More AIX lossage: must compile with xlc_r or cc_r # More AIX lossage: must compile with cc_r
if test x"$GCC" != xyes; then AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC})
AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
else
PTHREAD_CC=$CC
fi
else else
PTHREAD_CC="$CC" PTHREAD_CC="$CC"
fi fi

View File

@@ -1,87 +1,48 @@
##### http://autoconf-archive.cryp.to/ax_cflags_gcc_option.html dnl @synopsis AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]])
# dnl
# SYNOPSIS dnl AX_CFLAGS_GCC_OPTION(-fvomit-frame) would show a message as like
# dnl "checking CFLAGS for gcc -fvomit-frame ... yes" and adds the
# AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]]) dnl optionflag to CFLAGS if it is understood. You can override the
# dnl shellvar-default of CFLAGS of course. The order of arguments stems
# DESCRIPTION dnl from the explicit macros like AX_CFLAGS_WARN_ALL.
# dnl
# AX_CFLAGS_GCC_OPTION(-fvomit-frame) would show a message as like dnl The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add
# "checking CFLAGS for gcc -fvomit-frame ... yes" and adds the dnl to CXXFLAGS - and it uses the autoconf setup for C++ instead of C
# optionflag to CFLAGS if it is understood. You can override the dnl (since it is possible to use different compilers for C and C++).
# shellvar-default of CFLAGS of course. The order of arguments stems dnl
# from the explicit macros like AX_CFLAGS_WARN_ALL. dnl The macro is a lot simpler than any special AX_CFLAGS_* macro (or
# dnl ac_cxx_rtti.m4 macro) but allows to check for arbitrary options.
# The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add dnl However, if you use this macro in a few places, it would be great
# to CXXFLAGS - and it uses the autoconf setup for C++ instead of C dnl if you would make up a new function-macro and submit it to the
# (since it is possible to use different compilers for C and C++). dnl ac-archive.
# dnl
# The macro is a lot simpler than any special AX_CFLAGS_* macro (or dnl - $1 option-to-check-for : required ("-option" as non-value)
# ac_cxx_rtti.m4 macro) but allows to check for arbitrary options. dnl - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case)
# However, if you use this macro in a few places, it would be great dnl - $3 action-if-found : add value to shellvariable
# if you would make up a new function-macro and submit it to the dnl - $4 action-if-not-found : nothing
# ac-archive. dnl
# dnl note: in earlier versions, $1-$2 were swapped. We try to detect the
# - $1 option-to-check-for : required ("-option" as non-value) dnl situation and accept a $2=~/-/ as being the old
# - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case) dnl option-to-check-for.
# - $3 action-if-found : add value to shellvariable dnl
# - $4 action-if-not-found : nothing dnl also: there are other variants that emerged from the original macro
# dnl variant which did just test an option to be possibly added.
# note: in earlier versions, $1-$2 were swapped. We try to detect the dnl However, some compilers accept an option silently, or possibly for
# situation and accept a $2=~/-/ as being the old dnl just another option that was not intended. Therefore, we have to do
# option-to-check-for. dnl a generic test for a compiler family. For gcc we check "-pedantic"
# dnl being accepted which is also understood by compilers who just want
# also: there are other variants that emerged from the original macro dnl to be compatible with gcc even when not being made from gcc
# variant which did just test an option to be possibly added. dnl sources.
# However, some compilers accept an option silently, or possibly for dnl
# just another option that was not intended. Therefore, we have to do dnl see also:
# a generic test for a compiler family. For gcc we check "-pedantic" dnl
# being accepted which is also understood by compilers who just want dnl AX_CFLAGS_SUN_OPTION AX_CFLAGS_HPUX_OPTION
# to be compatible with gcc even when not being made from gcc dnl AX_CFLAGS_AIX_OPTION AX_CFLAGS_IRIX_OPTION
# sources. dnl
# dnl @category C
# see also: dnl @author Guido Draheim <guidod@gmx.de>
# dnl @version 2003-11-04
# AX_CFLAGS_SUN_OPTION AX_CFLAGS_HPUX_OPTION dnl @license GPLWithACException
# AX_CFLAGS_AIX_OPTION AX_CFLAGS_IRIX_OPTION
#
# LAST MODIFICATION
#
# 2006-12-12
#
# COPYLEFT
#
# Copyright (c) 2006 Guido U. Draheim <guidod@gmx.de>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
#
# As a special exception, the respective Autoconf Macro's copyright
# owner gives unlimited permission to copy, distribute and modify the
# configure scripts that are the output of Autoconf when processing
# the Macro. You need not follow the terms of the GNU General Public
# License when using or distributing such scripts, even though
# portions of the text of the Macro appear in them. The GNU General
# Public License (GPL) does govern all other use of the material that
# constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the
# Autoconf Macro released by the Autoconf Macro Archive. When you
# make and distribute a modified version of the Autoconf Macro, you
# may extend this special exception to the GPL to apply to your
# modified version as well.
AC_DEFUN([AX_CFLAGS_GCC_OPTION_OLD], [dnl AC_DEFUN([AX_CFLAGS_GCC_OPTION_OLD], [dnl
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
@@ -92,8 +53,7 @@ VAR,[VAR="no, unknown"
AC_LANG_C AC_LANG_C
ac_save_[]FLAGS="$[]FLAGS" ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl for ac_arg dnl
in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC in "-pedantic % m4_ifval($2,$2,-option)" dnl GCC
"-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC
# #
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;], AC_TRY_COMPILE([],[return 0;],
@@ -125,11 +85,10 @@ AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$2])dnl
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)], AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)],
VAR,[VAR="no, unknown" VAR,[VAR="no, unknown"
AC_LANG_SAVE AC_LANG_SAVE
AC_LANG_CPLUSPLUS AC_LANG_CXX
ac_save_[]FLAGS="$[]FLAGS" ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl for ac_arg dnl
in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC in "-pedantic % m4_ifval($2,$2,-option)" dnl GCC
"-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC
# #
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;], AC_TRY_COMPILE([],[return 0;],
@@ -163,8 +122,7 @@ VAR,[VAR="no, unknown"
AC_LANG_C AC_LANG_C
ac_save_[]FLAGS="$[]FLAGS" ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl for ac_arg dnl
in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC in "-pedantic % m4_ifval($1,$1,-option)" dnl GCC
"-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC
# #
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;], AC_TRY_COMPILE([],[return 0;],
@@ -196,11 +154,10 @@ AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$1])dnl
AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)], AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)],
VAR,[VAR="no, unknown" VAR,[VAR="no, unknown"
AC_LANG_SAVE AC_LANG_SAVE
AC_LANG_CPLUSPLUS AC_LANG_CXX
ac_save_[]FLAGS="$[]FLAGS" ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl for ac_arg dnl
in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC in "-pedantic % m4_ifval($1,$1,-option)" dnl GCC
"-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC
# #
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;], AC_TRY_COMPILE([],[return 0;],

View File

@@ -1,66 +1,27 @@
##### http://autoconf-archive.cryp.to/ax_cflags_warn_all.html dnl @synopsis AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
# dnl
# SYNOPSIS dnl Try to find a compiler option that enables most reasonable
# dnl warnings. This macro is directly derived from VL_PROG_CC_WARNINGS
# AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] dnl which is split up into two AX_CFLAGS_WARN_ALL and
# dnl AX_CFLAGS_WARN_ALL_ANSI
# DESCRIPTION dnl
# dnl For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The
# Try to find a compiler option that enables most reasonable dnl result is added to the shellvar being CFLAGS by default.
# warnings. This macro is directly derived from VL_PROG_CC_WARNINGS dnl
# which is split up into two AX_CFLAGS_WARN_ALL and dnl Currently this macro knows about GCC, Solaris C compiler, Digital
# AX_CFLAGS_WARN_ALL_ANSI dnl Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C
# dnl compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos
# For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The dnl 10.0.0.8) C compiler.
# result is added to the shellvar being CFLAGS by default. dnl
# dnl - $1 shell-variable-to-add-to : CFLAGS
# Currently this macro knows about GCC, Solaris C compiler, Digital dnl - $2 add-value-if-not-found : nothing
# Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C dnl - $3 action-if-found : add value to shellvariable
# compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos dnl - $4 action-if-not-found : nothing
# 10.0.0.8) C compiler. dnl
# dnl @category C
# - $1 shell-variable-to-add-to : CFLAGS dnl @author Guido Draheim <guidod@gmx.de>
# - $2 add-value-if-not-found : nothing dnl @version 2003-01-06
# - $3 action-if-found : add value to shellvariable dnl @license GPLWithACException
# - $4 action-if-not-found : nothing
#
# LAST MODIFICATION
#
# 2006-12-12
#
# COPYLEFT
#
# Copyright (c) 2006 Guido U. Draheim <guidod@gmx.de>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
#
# As a special exception, the respective Autoconf Macro's copyright
# owner gives unlimited permission to copy, distribute and modify the
# configure scripts that are the output of Autoconf when processing
# the Macro. You need not follow the terms of the GNU General Public
# License when using or distributing such scripts, even though
# portions of the text of the Macro appear in them. The GNU General
# Public License (GPL) does govern all other use of the material that
# constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the
# Autoconf Macro released by the Autoconf Macro Archive. When you
# make and distribute a modified version of the Autoconf Macro, you
# may extend this special exception to the GPL to apply to your
# modified version as well.
AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
@@ -111,7 +72,7 @@ AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_warn_all])dnl
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings],
VAR,[VAR="no, unknown" VAR,[VAR="no, unknown"
AC_LANG_SAVE AC_LANG_SAVE
AC_LANG_CPLUSPLUS AC_LANG_CXX
ac_save_[]FLAGS="$[]FLAGS" ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl for ac_arg dnl
in "-pedantic % -Wall" dnl GCC in "-pedantic % -Wall" dnl GCC
@@ -154,5 +115,4 @@ dnl compilers will fail about it. That was needed since a lot of
dnl compilers will give false positives for some option-syntax dnl compilers will give false positives for some option-syntax
dnl like -Woption or -Xoption as they think of it is a pass-through dnl like -Woption or -Xoption as they think of it is a pass-through
dnl to later compile stages or something. The "%" is used as a dnl to later compile stages or something. The "%" is used as a
dnl delimimiter. A non-option comment can be given after "%%" marks dnl delimimiter. A non-option comment can be given after "%%" marks.
dnl which will be shown but not added to the respective C/CXXFLAGS.

View File

@@ -1,66 +1,27 @@
##### http://autoconf-archive.cryp.to/ax_cflags_warn_all_ansi.html dnl @synopsis AX_CFLAGS_WARN_ALL_ANSI [(shellvar [,default, [A/NA]])]
# dnl
# SYNOPSIS dnl Try to find a compiler option that enables most reasonable
# dnl warnings. This macro is directly derived from VL_PROG_CC_WARNINGS
# AX_CFLAGS_WARN_ALL_ANSI [(shellvar [,default, [A/NA]])] dnl which is split up into two AX_CFLAGS_WARN_ALL and
# dnl AX_CFLAGS_WARN_ALL_ANSI
# DESCRIPTION dnl
# dnl For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The
# Try to find a compiler option that enables most reasonable dnl result is added to the shellvar being CFLAGS by default.
# warnings. This macro is directly derived from VL_PROG_CC_WARNINGS dnl
# which is split up into two AX_CFLAGS_WARN_ALL and dnl Currently this macro knows about GCC, Solaris C compiler, Digital
# AX_CFLAGS_WARN_ALL_ANSI dnl Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C
# dnl compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos
# For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The dnl 10.0.0.8) C compiler.
# result is added to the shellvar being CFLAGS by default. dnl
# dnl - $1 shell-variable-to-add-to : CFLAGS
# Currently this macro knows about GCC, Solaris C compiler, Digital dnl - $2 add-value-if-not-found : nothing
# Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C dnl - $3 action-if-found : add value to shellvariable
# compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos dnl - $4 action-if-not-found : nothing
# 10.0.0.8) C compiler. dnl
# dnl @category C
# - $1 shell-variable-to-add-to : CFLAGS dnl @author Guido Draheim <guidod@gmx.de>
# - $2 add-value-if-not-found : nothing dnl @version 2003-01-06
# - $3 action-if-found : add value to shellvariable dnl @license GPLWithACException
# - $4 action-if-not-found : nothing
#
# LAST MODIFICATION
#
# 2006-12-12
#
# COPYLEFT
#
# Copyright (c) 2006 Guido U. Draheim <guidod@gmx.de>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
#
# As a special exception, the respective Autoconf Macro's copyright
# owner gives unlimited permission to copy, distribute and modify the
# configure scripts that are the output of Autoconf when processing
# the Macro. You need not follow the terms of the GNU General Public
# License when using or distributing such scripts, even though
# portions of the text of the Macro appear in them. The GNU General
# Public License (GPL) does govern all other use of the material that
# constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the
# Autoconf Macro released by the Autoconf Macro Archive. When you
# make and distribute a modified version of the Autoconf Macro, you
# may extend this special exception to the GPL to apply to your
# modified version as well.
AC_DEFUN([AX_CFLAGS_WARN_ALL_ANSI],[dnl AC_DEFUN([AX_CFLAGS_WARN_ALL_ANSI],[dnl
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
@@ -116,7 +77,7 @@ AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_warn_all_ansi])dnl
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum ansi warnings], AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum ansi warnings],
VAR,[VAR="no, unknown" VAR,[VAR="no, unknown"
AC_LANG_SAVE AC_LANG_SAVE
AC_LANG_CPLUSPLUS AC_LANG_CXX
ac_save_[]FLAGS="$[]FLAGS" ac_save_[]FLAGS="$[]FLAGS"
# IRIX C compiler: # IRIX C compiler:
# -use_readonly_const is the default for IRIX C, # -use_readonly_const is the default for IRIX C,

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) AC_MSG_RESULT($enable_[]Name)dnl
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

@@ -1,52 +1,13 @@
##### http://autoconf-archive.cryp.to/type_socklen_t.html dnl @synopsis TYPE_SOCKLEN_T
# dnl
# SYNOPSIS dnl Check whether sys/socket.h defines type socklen_t. Please note that
# dnl some systems require sys/types.h to be included before sys/socket.h
# TYPE_SOCKLEN_T dnl can be compiled.
# dnl
# DESCRIPTION dnl @category Misc
# dnl @author Lars Brinkhoff <lars@nocrew.org>
# Check whether sys/socket.h defines type socklen_t. Please note that dnl @version 2005-01-11
# some systems require sys/types.h to be included before sys/socket.h dnl @license GPLWithACException
# can be compiled.
#
# LAST MODIFICATION
#
# 2005-01-11
#
# COPYLEFT
#
# Copyright (c) 2005 Lars Brinkhoff <lars@nocrew.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
#
# As a special exception, the respective Autoconf Macro's copyright
# owner gives unlimited permission to copy, distribute and modify the
# configure scripts that are the output of Autoconf when processing
# the Macro. You need not follow the terms of the GNU General Public
# License when using or distributing such scripts, even though
# portions of the text of the Macro appear in them. The GNU General
# Public License (GPL) does govern all other use of the material that
# constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the
# Autoconf Macro released by the Autoconf Macro Archive. When you
# make and distribute a modified version of the Autoconf Macro, you
# may extend this special exception to the GPL to apply to your
# modified version as well.
AC_DEFUN([TYPE_SOCKLEN_T], AC_DEFUN([TYPE_SOCKLEN_T],
[AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t, [AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t,

View File

@@ -6,6 +6,7 @@
# #
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
@@ -20,11 +21,12 @@ 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/ithread.h inc/iasnprintf.h inc/ithread.h

View File

@@ -32,12 +32,6 @@
#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
@@ -70,23 +64,32 @@ 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 */
/* always include stats because code change is minimal */ #ifdef WIN32 /* TODO: check why STATSONLY fails during compilation */
#define STATS 1 #undef STATS
#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/time.h> /* for gettimeofday() */ #include <sys/timeb.h>
#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 */
@@ -108,28 +111,26 @@ typedef void (*free_routine)(void *arg);
*****************************************************************************/ *****************************************************************************/
typedef struct THREADPOOLATTR typedef struct THREADPOOLATTR
{ {
/* minThreads, ThreadPool will always maintain at least this many threads */ int minThreads; /* minThreads, ThreadPool will always maintain at least
int minThreads; this many threads */
/* maxThreads, ThreadPool will never have more than this number of threads */ int maxThreads; /* maxThreads, ThreadPool will never have more than this
int maxThreads; number of threads */
/* maxIdleTime (in milliseconds) this is the maximum time a thread will int maxIdleTime; /* maxIdleTime (in milliseconds)
* remain idle before dying */ this is the maximum time a thread will remain idle
int maxIdleTime; before dying */
/* jobs per thread to maintain */ int jobsPerThread; /* jobs per thread to maintain */
int jobsPerThread;
/* maximum number of jobs that can be queued totally. */ int maxJobsTotal; /* maximum number of jobs that can be queued totally. */
int maxJobsTotal;
/* the time a low priority or med priority job waits before getting bumped int starvationTime; /* the time a low priority or med priority
* up a priority (in milliseconds) */ job waits before getting bumped
int starvationTime; up a priority (in milliseconds) */
PolicyType schedPolicy; /* scheduling policy to use */
/* scheduling policy to use */
PolicyType schedPolicy;
} ThreadPoolAttr; } ThreadPoolAttr;
/**************************************************************************** /****************************************************************************
@@ -143,7 +144,7 @@ typedef struct THREADPOOLJOB
start_routine func; start_routine func;
void *arg; void *arg;
free_routine free_func; free_routine free_func;
struct timeval requestTime; struct timeb requestTime;
int priority; int priority;
int jobId; int jobId;
} ThreadPoolJob; } ThreadPoolJob;
@@ -155,6 +156,8 @@ typedef struct THREADPOOLJOB
* Structure to hold statistics * Structure to hold statistics
*****************************************************************************/ *****************************************************************************/
#ifdef STATS
typedef struct TPOOLSTATS typedef struct TPOOLSTATS
{ {
double totalTimeHQ; double totalTimeHQ;
@@ -176,7 +179,9 @@ typedef struct TPOOLSTATS
int currentJobsHQ; int currentJobsHQ;
int currentJobsLQ; int currentJobsLQ;
int currentJobsMQ; int currentJobsMQ;
} ThreadPoolStats; }ThreadPoolStats;
#endif
/**************************************************************************** /****************************************************************************
@@ -217,8 +222,11 @@ typedef struct THREADPOOL
ThreadPoolAttr attr; /* thread pool attributes */ ThreadPoolAttr attr; /* thread pool attributes */
#ifdef STATS
/* statistics */ /* statistics */
ThreadPoolStats stats; ThreadPoolStats stats;
#endif
} ThreadPool; } ThreadPool;
@@ -259,7 +267,8 @@ 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, ThreadPoolAttr *attr); int ThreadPoolInit(ThreadPool *tp,
ThreadPoolAttr *attr);
/**************************************************************************** /****************************************************************************
* Function: ThreadPoolAddPersistent * Function: ThreadPoolAddPersistent
@@ -281,7 +290,9 @@ int ThreadPoolInit(ThreadPool *tp, ThreadPoolAttr *attr);
* 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, ThreadPoolJob *job, int *jobId); int ThreadPoolAddPersistent (ThreadPool*tp,
ThreadPoolJob *job,
int *jobId);
/**************************************************************************** /****************************************************************************
* Function: ThreadPoolGetAttr * Function: ThreadPoolGetAttr
@@ -296,7 +307,8 @@ int ThreadPoolAddPersistent(ThreadPool*tp, ThreadPoolJob *job, int *jobId);
* 0 on success, nonzero on failure * 0 on success, nonzero on failure
* Always returns 0. * Always returns 0.
*****************************************************************************/ *****************************************************************************/
int ThreadPoolGetAttr(ThreadPool *tp, ThreadPoolAttr *out); int ThreadPoolGetAttr(ThreadPool *tp,
ThreadPoolAttr *out);
/**************************************************************************** /****************************************************************************
* Function: ThreadPoolSetAttr * Function: ThreadPoolSetAttr
* *
@@ -310,7 +322,8 @@ int ThreadPoolGetAttr(ThreadPool *tp, ThreadPoolAttr *out);
* 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, ThreadPoolAttr *attr); int ThreadPoolSetAttr(ThreadPool *tp,
ThreadPoolAttr *attr);
/**************************************************************************** /****************************************************************************
* Function: ThreadPoolAdd * Function: ThreadPoolAdd
@@ -329,7 +342,9 @@ int ThreadPoolSetAttr(ThreadPool *tp, ThreadPoolAttr *attr);
* 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, ThreadPoolJob *job, int *jobId); int ThreadPoolAdd (ThreadPool*tp,
ThreadPoolJob *job,
int *jobId);
/**************************************************************************** /****************************************************************************
* Function: ThreadPoolRemove * Function: ThreadPoolRemove
@@ -346,7 +361,8 @@ int ThreadPoolAdd (ThreadPool*tp, ThreadPoolJob *job, int *jobId);
* 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 jobId, ThreadPoolJob *out); int ThreadPoolRemove(ThreadPool *tp,
int jobId, ThreadPoolJob *out);
@@ -409,6 +425,7 @@ int TPJobSetPriority(ThreadPoolJob *job, ThreadPriority priority);
*****************************************************************************/ *****************************************************************************/
int TPJobSetFreeFunction(ThreadPoolJob *job, free_routine func); int TPJobSetFreeFunction(ThreadPoolJob *job, free_routine func);
/**************************************************************************** /****************************************************************************
* Function: TPAttrInit * Function: TPAttrInit
* *
@@ -530,10 +547,6 @@ 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

@@ -0,0 +1,66 @@
/*******************************************************************************
*
* 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

@@ -42,31 +42,26 @@ extern "C" {
#endif #endif
#ifdef __FreeBSD__ #ifdef __FreeBSD__
#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE #define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
#endif #endif
#ifdef PTHREAD_MUTEX_RECURSIVE #ifdef PTHREAD_MUTEX_RECURSIVE
/* This system has SuS2-compliant mutex attributes. /* This system has SuS2-compliant mutex attributes.
* E.g. on Cygwin, where we don't have the old nonportable (NP) symbols * E.g. on Cygwin, where we don't have the old nonportable (NP) symbols
*/ */
#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 /* PTHREAD_MUTEX_RECURSIVE */ #else
#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 /* PTHREAD_MUTEX_RECURSIVE */ #endif
#define ITHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE
#define ITHREAD_PROCESS_SHARED PTHREAD_PROCESS_SHARED
#define ITHREAD_CANCELED PTHREAD_CANCELED #define ITHREAD_CANCELED PTHREAD_CANCELED
/*************************************************************************** /***************************************************************************
* Name: ithread_t * Name: ithread_t
* *
* Description: * Description:
@@ -74,9 +69,9 @@ extern "C" {
* typedef to pthread_t. * typedef to pthread_t.
* Internal Use Only. * Internal Use Only.
***************************************************************************/ ***************************************************************************/
typedef pthread_t ithread_t; typedef pthread_t ithread_t;
/**************************************************************************** /****************************************************************************
* Name: ithread_attr_t * Name: ithread_attr_t
* *
* Description: * Description:
@@ -84,20 +79,20 @@ typedef pthread_t ithread_t;
* typedef to pthread_attr_t * typedef to pthread_attr_t
* Internal Use Only * Internal Use Only
***************************************************************************/ ***************************************************************************/
typedef pthread_attr_t ithread_attr_t; typedef pthread_attr_t ithread_attr_t;
/**************************************************************************** /****************************************************************************
* Name: start_routine * Name: start_routine
* *
* Description: * Description:
* Thread start routine * Thread start routine
* Internal Use Only. * Internal Use Only.
***************************************************************************/ ***************************************************************************/
typedef void * (*start_routine) (void *arg); typedef void * (*start_routine) (void *arg);
/**************************************************************************** /****************************************************************************
* Name: ithread_cond_t * Name: ithread_cond_t
* *
* Description: * Description:
@@ -105,10 +100,10 @@ typedef void * (*start_routine) (void *arg);
* typedef to pthread_cond_t * typedef to pthread_cond_t
* Internal Use Only. * Internal Use Only.
***************************************************************************/ ***************************************************************************/
typedef pthread_cond_t ithread_cond_t; typedef pthread_cond_t ithread_cond_t;
/**************************************************************************** /****************************************************************************
* Name: ithread_mutexattr_t * Name: ithread_mutexattr_t
* *
* Description: * Description:
@@ -116,10 +111,10 @@ typedef pthread_cond_t ithread_cond_t;
* typedef to pthread_mutexattr_t * typedef to pthread_mutexattr_t
* Internal Use Only * Internal Use Only
***************************************************************************/ ***************************************************************************/
typedef pthread_mutexattr_t ithread_mutexattr_t; typedef pthread_mutexattr_t ithread_mutexattr_t;
/**************************************************************************** /****************************************************************************
* Name: ithread_mutex_t * Name: ithread_mutex_t
* *
* Description: * Description:
@@ -127,10 +122,10 @@ typedef pthread_mutexattr_t ithread_mutexattr_t;
* typedef to pthread_mutex_t * typedef to pthread_mutex_t
* Internal Use Only. * Internal Use Only.
***************************************************************************/ ***************************************************************************/
typedef pthread_mutex_t ithread_mutex_t; typedef pthread_mutex_t ithread_mutex_t;
/**************************************************************************** /****************************************************************************
* Name: ithread_condattr_t * Name: ithread_condattr_t
* *
* Description: * Description:
@@ -139,31 +134,9 @@ typedef pthread_mutex_t ithread_mutex_t;
* NOT USED * NOT USED
* Internal Use Only * Internal Use Only
***************************************************************************/ ***************************************************************************/
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
* *
* Description: * Description:
@@ -177,10 +150,10 @@ typedef pthread_rwlock_t ithread_rwlock_t;
* 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
* *
* Description: * Description:
@@ -207,7 +180,7 @@ typedef pthread_rwlock_t ithread_rwlock_t;
* ITHREAD_MUTEX_ERRORCHECK_NP * ITHREAD_MUTEX_ERRORCHECK_NP
* *
* Parameters: * Parameters:
* ithread_mutexattr_t * attr (must be valid non NULL pointer to * ithread_mutexattr_t * mutex (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)
@@ -217,9 +190,9 @@ typedef pthread_rwlock_t ithread_rwlock_t;
* See man page for pthread_mutexattr_setkind_np * See man page for pthread_mutexattr_setkind_np
*****************************************************************************/ *****************************************************************************/
#ifdef PTHREAD_MUTEX_RECURSIVE #ifdef PTHREAD_MUTEX_RECURSIVE
#define ithread_mutexattr_setkind_np pthread_mutexattr_settype #define ithread_mutexattr_setkind_np pthread_mutexattr_settype
#else #else
#define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np #define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np
#endif #endif
/**************************************************************************** /****************************************************************************
@@ -232,7 +205,7 @@ typedef pthread_rwlock_t ithread_rwlock_t;
* ITHREAD_MUTEX_ERRORCHECK_NP * ITHREAD_MUTEX_ERRORCHECK_NP
* *
* Parameters: * Parameters:
* ithread_mutexattr_t * attr (must be valid non NULL pointer to * ithread_mutexattr_t * mutex (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)
@@ -242,9 +215,9 @@ typedef pthread_rwlock_t ithread_rwlock_t;
* See man page for pthread_mutexattr_getkind_np * See man page for pthread_mutexattr_getkind_np
*****************************************************************************/ *****************************************************************************/
#ifdef PTHREAD_MUTEX_RECURSIVE #ifdef PTHREAD_MUTEX_RECURSIVE
#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype #define ithread_mutexattr_getkind_np pthread_mutexattr_gettype
#else #else
#define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np #define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np
#endif #endif
@@ -265,7 +238,6 @@ typedef pthread_rwlock_t ithread_rwlock_t;
*****************************************************************************/ *****************************************************************************/
#define ithread_mutex_init pthread_mutex_init #define ithread_mutex_init pthread_mutex_init
/**************************************************************************** /****************************************************************************
* Function: ithread_mutex_lock * Function: ithread_mutex_lock
* *
@@ -320,169 +292,6 @@ typedef pthread_rwlock_t ithread_rwlock_t;
#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
* *

View File

@@ -30,8 +30,7 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#include "LinkedList.h" #include "LinkedList.h"
#include <sys/param.h> #ifdef __FreeBSD__
#if (defined(BSD) && BSD >= 199306) || defined(__OSX__) || defined(__APPLE__)
#include <stdlib.h> #include <stdlib.h>
#else #else
#include <malloc.h> #include <malloc.h>

File diff suppressed because it is too large Load Diff

152
threadutil/src/iasnprintf.c Normal file
View File

@@ -0,0 +1,152 @@
///////////////////////////////////////////////////////////////////////////
//
// 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>
#ifdef __FreeBSD__
#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

@@ -1,7 +1,8 @@
# #
# "Makefile.am" for "libupnp/upnp" # "Makefile.am" for "libupnp/upnp"
# #
# Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net> # Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
# #
SUBDIRS = doc . sample SUBDIRS = doc . sample
@@ -11,6 +12,10 @@ 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 \
@@ -18,14 +23,14 @@ LDADD = \
upnpincludedir = $(includedir)/upnp upnpincludedir = $(includedir)/upnp
upnpinclude_HEADERS = \ upnpinclude_HEADERS = inc/upnp.h
inc/upnp.h \
inc/upnpdebug.h
nodist_upnpinclude_HEADERS = inc/upnpconfig.h nodist_upnpinclude_HEADERS = inc/upnpconfig.h
if ENABLE_TOOLS if ENABLE_TOOLS
upnpinclude_HEADERS += inc/upnptools.h upnpinclude_HEADERS += inc/upnptools.h
endif endif
if ENABLE_DEBUG
upnpinclude_HEADERS += inc/upnpdebug.h
endif
lib_LTLIBRARIES = libupnp.la lib_LTLIBRARIES = libupnp.la

View File

@@ -2,7 +2,7 @@
# #
# "Makefile.am" for "libunp/upnp/doc" # "Makefile.am" for "libunp/upnp/doc"
# #
# (C) Copyright 2005 R<>mi Turboult <r3mi@users.sourceforge.net> # (C) Copyright 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
# #
########################################################################## ##########################################################################
# #

Binary file not shown.

View File

@@ -47,8 +47,7 @@
#include <stdio.h> #include <stdio.h>
#include <sys/param.h> #ifdef __FreeBSD__
#if (defined(BSD) && BSD >= 199306)
#include <time.h> #include <time.h>
#endif #endif
#include "ixml.h" #include "ixml.h"
@@ -413,7 +412,7 @@
#define UPNP_E_SUBSCRIBE_UNACCEPTED -301 #define UPNP_E_SUBSCRIBE_UNACCEPTED -301
/*! @} */ /*! @} */
/** @name UPNP_E_UNSUBSCRIBE_UNACCEPTED [-302] /** @name UPNP_E_UNSUBSCRIBE_UNACCAPTED [-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.
*/ */
@@ -829,10 +828,13 @@ struct Upnp_Event
* Upnp_Discovery structure correctly. * Upnp_Discovery structure correctly.
*/ */
typedef struct sockaddr_in SOCKADDRIN;
/** Returned in a {\bf UPNP_DISCOVERY_RESULT} callback. */ /** Returned in a {\bf UPNP_DISCOVERY_RESULT} callback. */
struct Upnp_Discovery struct Upnp_Discovery
{ {
/** The result code of the {\bf UpnpSearchAsync} call. */ /** The result code of the {\bf UpnpSearchAsync} call. */
int ErrCode; int ErrCode;
@@ -864,7 +866,8 @@ struct Upnp_Discovery
char Ext[LINE_SIZE]; char Ext[LINE_SIZE];
/** The host address of the device responding to the search. */ /** The host address of the device responding to the search. */
struct sockaddr_in DestAddr; SOCKADDRIN * DestAddr;
}; };
/** Returned along with a {\bf UPNP_EVENT_SUBSCRIBE_COMPLETE} or {\bf /** Returned along with a {\bf UPNP_EVENT_SUBSCRIBE_COMPLETE} or {\bf

View File

@@ -1,7 +1,7 @@
/* -*- C -*- */ /* -*- C -*- */
/******************************************************************************* /*******************************************************************************
* *
* Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net> * Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
* 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

View File

@@ -1,7 +1,7 @@
/******************************************************************************* /*******************************************************************************
* *
* Copyright (c) 2000-2003 Intel Corporation * Copyright (c) 2000-2003 Intel Corporation
* Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net> * Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
* 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
@@ -246,19 +246,15 @@ static UPNP_INLINE int DebugAtThisLevel(
* Returns: void * Returns: void
***************************************************************************/ ***************************************************************************/
#ifdef DEBUG #ifdef DEBUG
void UpnpPrintf( void UpnpPrintf (Upnp_LogLevel DLevel, Dbg_Module Module,
Upnp_LogLevel DLevel, const char* DbgFileName, int DbgLineNo,
Dbg_Module Module,
const char* DbgFileName,
int DbgLineNo,
const char* FmtStr, const char* FmtStr,
...) ...)
#if (__GNUC__ >= 3) #if (__GNUC__ >= 3)
/* This enables printf like format checking by the compiler */
__attribute__((format (__printf__, 5, 6))) __attribute__((format (__printf__, 5, 6)))
#endif #endif
; ;
#else /* DEBUG */ #else
static UPNP_INLINE void UpnpPrintf( static UPNP_INLINE void UpnpPrintf(
Upnp_LogLevel DLevel, Upnp_LogLevel DLevel,
Dbg_Module Module, Dbg_Module Module,
@@ -266,7 +262,7 @@ static UPNP_INLINE void UpnpPrintf(
int DbgLineNo, int DbgLineNo,
const char* FmtStr, const char* FmtStr,
...) {} ...) {}
#endif /* DEBUG */ #endif
/*************************************************************************** /***************************************************************************

View File

@@ -9,6 +9,10 @@ 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 \
@@ -75,9 +79,8 @@ endif
EXTRA_DIST = \ EXTRA_DIST = \
web/tvcombodesc.xml \ tvdevice/web/tvcontrolSCPD.xml \
web/tvcontrolSCPD.xml \ tvdevice/web/tvdevicedesc.xml \
web/tvdevicedesc.xml \ tvdevice/web/tvdevicepres.html \
web/tvdevicepres.html \ tvdevice/web/tvpictureSCPD.xml
web/tvpictureSCPD.xml

View File

@@ -1362,7 +1362,7 @@ TvCtrlPointStart( print_string printFunctionPtr,
ithread_mutex_init( &DeviceListMutex, 0 ); ithread_mutex_init( &DeviceListMutex, 0 );
SampleUtil_Print( "Initializing UPnP with ipaddress=%s port=%d", SampleUtil_Print( "Intializing UPnP with ipaddress=%s port=%d",
ip_address, port ); ip_address, port );
rc = UpnpInit( ip_address, port ); rc = UpnpInit( ip_address, port );
if( UPNP_E_SUCCESS != rc ) { if( UPNP_E_SUCCESS != rc ) {

View File

@@ -37,7 +37,6 @@
#include <string.h> #include <string.h>
#include <sys/stat.h> #include <sys/stat.h>
#ifndef WIN32 #ifndef WIN32
#include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <arpa/inet.h> #include <arpa/inet.h>
@@ -54,11 +53,6 @@
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/utsname.h> #include <sys/utsname.h>
#include <unistd.h> #include <unistd.h>
#include <sys/param.h>
#if (defined(BSD) && BSD >= 199306)
#include <ifaddrs.h>
#endif
#endif #endif
#include "upnpapi.h" #include "upnpapi.h"
#include "httpreadwrite.h" #include "httpreadwrite.h"
@@ -79,21 +73,21 @@
#include "urlconfig.h" #include "urlconfig.h"
#endif // INTERNAL_WEB_SERVER #endif // INTERNAL_WEB_SERVER
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; )
// rwlock to synchronize handles (root device or control point handle) //Mutex to synchronize handles ( root device or control point handle)
ithread_rwlock_t GlobalHndRWLock; ithread_mutex_t GlobalHndMutex;
// 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 gSendThreadPool;
ThreadPool gRecvThreadPool; ThreadPool gRecvThreadPool;
ThreadPool gSendThreadPool;
ThreadPool gMiniServerThreadPool; ThreadPool gMiniServerThreadPool;
//Flag to indicate the state of web server //Flag to indicate the state of web server
@@ -211,26 +205,26 @@ 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(&GlobalHndRWLock, 0, sizeof(GlobalHndRWLock)); memset(&GlobalHndMutex, 0, sizeof(GlobalHndMutex));
#endif #endif
if (ithread_rwlock_init(&GlobalHndRWLock, NULL) != 0) { if( ithread_mutex_init( &GlobalHndMutex, NULL ) != 0 ) {
return UPNP_E_INIT_FAILED; return UPNP_E_INIT_FAILED;
} }
if (ithread_mutex_init(&gUUIDMutex, NULL) != 0) { if( ithread_mutex_init( &gUUIDMutex, NULL ) != 0 ) {
return UPNP_E_INIT_FAILED; return UPNP_E_INIT_FAILED;
} }
// initialize subscribe mutex // initialize subscribe mutex
#ifdef INCLUDE_CLIENT_APIS #ifdef INCLUDE_CLIENT_APIS
if (ithread_mutex_init(&GlobalClientSubscribeMutex, NULL) != 0) { if ( ithread_mutex_init( &GlobalClientSubscribeMutex, NULL ) != 0 ) {
return UPNP_E_INIT_FAILED; return UPNP_E_INIT_FAILED;
} }
#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;
@@ -266,7 +260,7 @@ int UpnpInit( IN const char *HostIP,
if( ThreadPoolInit( &gMiniServerThreadPool, &attr ) != UPNP_E_SUCCESS ) { if( ThreadPoolInit( &gMiniServerThreadPool, &attr ) != UPNP_E_SUCCESS ) {
UpnpSdkInit = 0; UpnpSdkInit = 0;
UpnpFinish(); UpnpFinish( );
return UPNP_E_INIT_FAILED; return UPNP_E_INIT_FAILED;
} }
@@ -321,54 +315,27 @@ int UpnpInit( IN const char *HostIP,
#ifdef DEBUG #ifdef DEBUG
static void static void
PrintThreadPoolStats( PrintThreadPoolStats (const char* DbgFileName, int DbgLineNo,
ThreadPool *tp, const char* msg, const ThreadPoolStats* const stats)
const char *DbgFileName,
int DbgLineNo,
const char *msg)
{ {
ThreadPoolStats stats; UpnpPrintf (UPNP_INFO, API, DbgFileName, DbgLineNo,
ThreadPoolGetStats(tp, &stats); "%s \n High Jobs pending = %d \nMed Jobs Pending = %d\n"
UpnpPrintf(UPNP_INFO, API, DbgFileName, DbgLineNo, " Low Jobs Pending = %d \nWorker Threads = %d\n"
"%s \n" "Idle Threads = %d\nPersistent Threads = %d\n"
"High Jobs pending: %d\n" "Average Time spent in High Q = %lf\n"
"Med Jobs Pending: %d\n" "Average Time spent in Med Q = %lf\n"
"Low Jobs Pending: %d\n" "Average Time spent in Low Q = %lf\n"
"Average wait in High Q in milliseconds: %lf\n" "Max Threads Used: %d\nTotal Work Time= %lf\n"
"Average wait in Med Q in milliseconds: %lf\n" "Total Idle Time = %lf\n",
"Average wait in Low Q in milliseconds: %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->currentJobsHQ, stats->currentJobsMQ,
stats.currentJobsMQ, stats->currentJobsLQ, stats->workerThreads,
stats.currentJobsLQ, stats->idleThreads, stats->persistentThreads,
stats.avgWaitHQ, stats->avgWaitHQ, stats->avgWaitMQ, stats->avgWaitLQ,
stats.avgWaitMQ, stats->maxThreads, stats->totalWorkTime,
stats.avgWaitLQ, stats->totalIdleTime );
stats.maxThreads,
stats.workerThreads,
stats.persistentThreads,
stats.idleThreads,
stats.totalThreads,
stats.totalWorkTime,
stats.totalIdleTime);
} }
#else /* DEBUG */ #endif
static UPNP_INLINE void
PrintThreadPoolStats(
ThreadPool *tp,
const char *DbgFileName,
int DbgLineNo,
const char *msg)
{
}
#endif /* DEBUG */
/**************************************************************************** /****************************************************************************
@@ -399,8 +366,12 @@ UpnpFinish()
#endif #endif
struct Handle_Info *temp; struct Handle_Info *temp;
#ifdef DEBUG
ThreadPoolStats stats;
#endif
#ifdef WIN32 #ifdef WIN32
// WSACleanup(); // WSACleanup( );
#endif #endif
if( UpnpSdkInit != 1 ) { if( UpnpSdkInit != 1 ) {
@@ -408,15 +379,20 @@ UpnpFinish()
} }
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Inside UpnpFinish : UpnpSdkInit is :%d:\n", UpnpSdkInit ); "Inside UpnpFinish : UpnpSdkInit is :%d:\n",
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" );
} }
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);
#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 );
@@ -428,47 +404,51 @@ 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
ThreadPoolShutdown(&gMiniServerThreadPool); #ifdef DEBUG
ThreadPoolShutdown(&gRecvThreadPool); ThreadPoolShutdown( &gSendThreadPool );
ThreadPoolShutdown(&gSendThreadPool); ThreadPoolShutdown( &gRecvThreadPool );
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool"); "Exiting UpnpFinish : UpnpSdkInit is :%d:\n",
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool"); UpnpSdkInit );
PrintThreadPoolStats(&gMiniServerThreadPool, __FILE__, __LINE__, "MiniServer Thread Pool"); ThreadPoolGetStats( &gRecvThreadPool, &stats );
PrintThreadPoolStats( __FILE__, __LINE__,
"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_rwlock_destroy(&GlobalHndRWLock); ithread_mutex_destroy( &GlobalHndMutex );
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
@@ -965,7 +945,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;
size_t num_read; unsigned 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;
@@ -1571,7 +1551,7 @@ UpnpSearchAsync( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpSearchAsync \n" ); "Inside UpnpSearchAsync \n" );
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -1747,7 +1727,7 @@ UpnpSubscribeAsync( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpSubscribeAsync \n" ); "Inside UpnpSubscribeAsync \n" );
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -1764,13 +1744,15 @@ UpnpSubscribeAsync( IN UpnpClient_Handle Hnd,
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_PARAM; return UPNP_E_INVALID_PARAM;
} }
HandleUnlock();
Param = (struct UpnpNonblockParam *) Param =
malloc(sizeof (struct UpnpNonblockParam)); ( 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;
@@ -1830,7 +1812,7 @@ UpnpSubscribe( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpSubscribe \n" ); "Inside UpnpSubscribe \n" );
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -1890,7 +1872,7 @@ UpnpUnSubscribe( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpUnSubscribe \n" ); "Inside UpnpUnSubscribe \n" );
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -1949,7 +1931,7 @@ UpnpUnSubscribeAsync( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpUnSubscribeAsync \n" ); "Inside UpnpUnSubscribeAsync \n" );
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -2023,7 +2005,7 @@ UpnpRenewSubscription( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpRenewSubscription \n" ); "Inside UpnpRenewSubscription \n" );
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -2088,7 +2070,7 @@ UpnpRenewSubscriptionAsync( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpRenewSubscriptionAsync \n" ); "Inside UpnpRenewSubscriptionAsync \n" );
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -2183,7 +2165,7 @@ UpnpNotify( IN UpnpDevice_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpNotify \n" ); "Inside UpnpNotify \n" );
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -2254,7 +2236,7 @@ UpnpNotifyExt( IN UpnpDevice_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpNotify \n" ); "Inside UpnpNotify \n" );
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -2331,7 +2313,7 @@ UpnpAcceptSubscription( IN UpnpDevice_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpAcceptSubscription \n" ); "Inside UpnpAcceptSubscription \n" );
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -2407,7 +2389,7 @@ UpnpAcceptSubscriptionExt( IN UpnpDevice_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpAcceptSubscription \n" ); "Inside UpnpAcceptSubscription \n" );
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -2503,7 +2485,7 @@ UpnpSendAction( IN UpnpClient_Handle Hnd,
} }
DevUDN_const = NULL; DevUDN_const = NULL;
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -2587,7 +2569,7 @@ UpnpSendActionEx( IN UpnpClient_Handle Hnd,
return retVal; return retVal;
} }
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -2663,7 +2645,7 @@ UpnpSendActionAsync( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpSendActionAsync \n" ); "Inside UpnpSendActionAsync \n" );
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -2783,7 +2765,7 @@ UpnpSendActionExAsync( IN UpnpClient_Handle Hnd,
return retVal; return retVal;
} }
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -2897,7 +2879,7 @@ UpnpGetServiceVarStatusAsync( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpGetServiceVarStatusAsync \n" ); "Inside UpnpGetServiceVarStatusAsync \n" );
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -2977,7 +2959,7 @@ UpnpGetServiceVarStatus( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpGetServiceVarStatus \n" ); "Inside UpnpGetServiceVarStatus \n" );
HandleReadLock(); HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
@@ -3306,13 +3288,15 @@ UpnpDownloadXmlDoc( const char *url,
#ifdef DEBUG #ifdef DEBUG
xml_buf = ixmlPrintNode( ( IXML_Node * ) * xmlDoc ); xml_buf = ixmlPrintNode( ( IXML_Node * ) * xmlDoc );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Printing the Parsed xml document \n %s\n", xml_buf ); "Printing the Parsed xml document \n %s\n",
xml_buf );
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;
} }
} }
@@ -3645,6 +3629,7 @@ 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__,
@@ -3653,6 +3638,7 @@ 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;
@@ -3731,44 +3717,8 @@ void printNodes( IXML_Node * tmpRoot, int depth )
strcpy( out, inet_ntoa(LocalAddr.sin_addr)); strcpy( out, inet_ntoa(LocalAddr.sin_addr));
} }
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
#elif (defined(BSD) && BSD >= 199306)
struct ifaddrs *ifap, *ifa;
if (getifaddrs(&ifap) != 0) {
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"DiscoverInterfaces: getifaddrs() returned error\n" );
return UPNP_E_INIT;
}
// cycle through available interfaces
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
// Skip loopback, point-to-point and down interfaces,
// except don't skip down interfaces
// if we're trying to get a list of configurable interfaces.
if( ( ifa->ifa_flags & IFF_LOOPBACK )
|| ( !( ifa->ifa_flags & IFF_UP ) ) ) {
continue;
}
if( ifa->ifa_addr->sa_family == AF_INET ) {
// We don't want the loopback interface.
if( ((struct sockaddr_in *)(ifa->ifa_addr))->sin_addr.s_addr ==
htonl( INADDR_LOOPBACK ) ) {
continue;
}
strncpy( out, inet_ntoa( ((struct sockaddr_in *)(ifa->ifa_addr))->
sin_addr ), LINE_SIZE );
out[LINE_SIZE-1] = '\0';
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside getlocalhostname : after strncpy %s\n",
out );
break;
}
}
freeifaddrs(ifap);
return ifa ? UPNP_E_SUCCESS : UPNP_E_INIT;
#else #else
char szBuffer[MAX_INTERFACES * sizeof( struct ifreq )]; char szBuffer[MAX_INTERFACES * sizeof( struct ifreq )];
struct ifconf ifConf; struct ifconf ifConf;
struct ifreq ifReq; struct ifreq ifReq;

View File

@@ -173,7 +173,7 @@ int DebugAtThisLevel(
IN Upnp_LogLevel DLevel, IN Upnp_LogLevel DLevel,
IN Dbg_Module Module) IN Dbg_Module Module)
{ {
int ret = DLevel <= g_log_level; int ret = g_log_level >= DLevel;
ret &= ret &=
DEBUG_ALL || DEBUG_ALL ||
(Module == SSDP && DEBUG_SSDP ) || (Module == SSDP && DEBUG_SSDP ) ||

View File

@@ -36,7 +36,7 @@
#include "uri.h" #include "uri.h"
#define HEADER_LENGTH 2000 #define HEADER_LENGTH 2000
// Structure to maintain a error code and string associated with the //Structure to maintain a error code and string associated with the
// error code // error code
struct ErrorString { struct ErrorString {
int rc; /* error code */ int rc; /* error code */
@@ -44,7 +44,7 @@ struct ErrorString {
}; };
// Initializing the array of error structures. //Intializing 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,5 +581,4 @@ UpnpCreatePropertySet( IN int NumArg,
return PropSet; return PropSet;
} }
#endif // EXCLUDE_DOM == 0 #endif

View File

@@ -93,7 +93,7 @@ GenaAutoRenewSubscription( IN void *input )
} }
} }
if( send_callback ) { if( send_callback ) {
HandleReadLock(); HandleLock();
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,4 +881,3 @@ 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;
HandleReadLock(); HandleLock();
//validate context //validate context
if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) { if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) {

View File

@@ -42,12 +42,12 @@
#include <sys/wait.h> #include <sys/wait.h>
#include <unistd.h> #include <unistd.h>
#include <sys/time.h> #include <sys/time.h>
#else /* WIN32 */ #else
#include <winsock2.h> #include <winsock2.h>
typedef int socklen_t; typedef int socklen_t;
#define EAFNOSUPPORT 97 #define EAFNOSUPPORT 97
#endif /* WIN32 */ #endif
#include "unixutil.h" #include "unixutil.h"
#include "ithread.h" #include "ithread.h"
@@ -88,16 +88,17 @@ static MiniServerCallback gGenaCallback = NULL;
static MiniServerState gMServState = MSERV_IDLE; 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: * Description : Set HTTP Get Callback
* Set HTTP Get Callback *
* * Return : void
* Return: void *
************************************************************************/ * Note :
************************************************************************/
void void
SetHTTPGetCallback( MiniServerCallback callback ) SetHTTPGetCallback( MiniServerCallback callback )
{ {
@@ -105,35 +106,35 @@ SetHTTPGetCallback( MiniServerCallback callback )
} }
/************************************************************************ /************************************************************************
* Function: SetSoapCallback * Function : SetSoapCallback
* *
* Parameters: * Parameters :
* MiniServerCallback callback - SOAP Callback to be invoked * MiniServerCallback callback ; - SOAP Callback to be invoked
* *
* Description: * Description : Set SOAP Callback
* 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: * Description : Set GENA Callback
* Set GENA Callback *
* * Return : void
* Return: void *
************************************************************************/ * Note :
************************************************************************/
void void
SetGenaCallback( MiniServerCallback callback ) SetGenaCallback( MiniServerCallback callback )
{ {
@@ -141,19 +142,21 @@ 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 : * Description : Based on the type pf message, appropriate callback
* Based on the type pf message, appropriate callback is issued * 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,
http_parser_t * hparser ) http_parser_t * hparser )
@@ -197,19 +200,21 @@ 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 * IN SOCKINFO *info ; Socket Inforamtion Object
* int major - Major Version Number * int http_error_code ; HTTP Error Code
* int minor - Minor Version Number * int major ; Major Version Number
* * int minor ; Minor Version Number
* Description: *
* Send Error Message * 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,
int http_error_code, int http_error_code,
@@ -220,17 +225,18 @@ handle_error( IN SOCKINFO * info,
} }
/************************************************************************ /************************************************************************
* Function: free_handle_request_arg * Function : free_handle_request_arg
* *
* Parameters: * Parameters :
* void *args ; Request Message to be freed * void *args ; Request Message to be freed
* *
* Description: * Description : Free memory assigned for handling request and unitial-
* Free memory assigned for handling request and unitialize socket * -ize socket functionality
* functionality *
* * Return : void
* Return: void *
************************************************************************/ * Note :
************************************************************************/
static void static void
free_handle_request_arg( void *args ) free_handle_request_arg( void *args )
{ {
@@ -242,16 +248,17 @@ 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: * Description : Receive the request and dispatch it for handling
* 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 )
{ {
@@ -312,18 +319,20 @@ 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: * Description : Initilize the thread pool to handle a request.
* 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,
IN struct sockaddr_in *clientAddr ) IN struct sockaddr_in *clientAddr )
@@ -362,31 +371,32 @@ schedule_request_job( IN int connfd,
} }
/************************************************************************ /************************************************************************
* Function: RunMiniServer * Function : RunMiniServer
* *
* Parameters: * Parameters :
* MiniServerSockArray *miniSock - Socket Array * MiniServerSockArray *miniSock ; Socket Array
* *
* Description: * Description : Function runs the miniserver. The MiniServer accepts a
* Function runs the miniserver. The MiniServer accepts a * new request and schedules a thread to handle the new request.
* new request and schedules a thread to handle the new request. * Checks for socket state and invokes appropriate read and shutdown
* Checks for socket state and invokes appropriate read and shutdown * actions for the Miniserver and SSDP sockets
* actions for the Miniserver and SSDP sockets *
* * Return : void
* Return: void *
************************************************************************/ * Note :
************************************************************************/
static void static void
RunMiniServer( MiniServerSockArray * miniSock ) RunMiniServer( MiniServerSockArray * miniSock )
{ {
struct sockaddr_in clientAddr; struct sockaddr_in clientAddr;
socklen_t clientLen; socklen_t clientLen;
SOCKET connectHnd; SOCKET miniServSock,
SOCKET miniServSock = miniSock->miniServerSock; connectHnd;
SOCKET miniServStopSock = miniSock->miniServerStopSock; SOCKET miniServStopSock;
SOCKET ssdpSock = miniSock->ssdpSock; SOCKET ssdpSock;
#ifdef INCLUDE_CLIENT_APIS
SOCKET ssdpReqSock = miniSock->ssdpReqSock; CLIENTONLY( SOCKET ssdpReqSock;
#endif )
fd_set expSet; fd_set expSet;
fd_set rdSet; fd_set rdSet;
@@ -394,55 +404,66 @@ RunMiniServer( MiniServerSockArray * miniSock )
int byteReceived; int byteReceived;
char requestBuf[256]; char requestBuf[256];
maxMiniSock = max( miniServSock, miniServStopSock) ; miniServSock = miniSock->miniServerSock;
maxMiniSock = max( maxMiniSock, (SOCKET)(ssdpSock) ); miniServStopSock = miniSock->miniServerStopSock;
#ifdef INCLUDE_CLIENT_APIS
maxMiniSock = max( maxMiniSock, (SOCKET)(ssdpReqSock) ); ssdpSock = miniSock->ssdpSock;
#endif
++maxMiniSock; CLIENTONLY( ssdpReqSock = miniSock->ssdpReqSock;
);
gMServState = MSERV_RUNNING; gMServState = MSERV_RUNNING;
maxMiniSock = max( miniServSock, miniServStopSock );
maxMiniSock = max( maxMiniSock, ( SOCKET ) ( ssdpSock ) );
CLIENTONLY( maxMiniSock =
max( maxMiniSock, ( SOCKET ) ( ssdpReqSock ) ) );
++maxMiniSock;
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 );
#ifdef INCLUDE_CLIENT_APIS CLIENTONLY( FD_SET( ssdpReqSock, &rdSet ) );
FD_SET( ssdpReqSock, &rdSet );
#endif
if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) == if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) ==
UPNP_SOCKETERROR ) { UPNP_SOCKETERROR ) {
UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in select call!\n" ); "Error in select call !!!\n" );
/* Avoid 100% CPU in case of repeated error in select() */
isleep( 1 );
continue; continue;
} else { } else {
if( FD_ISSET( miniServSock, &rdSet ) ) { if( FD_ISSET( miniServSock, &rdSet ) ) {
clientLen = sizeof( struct sockaddr_in ); clientLen = sizeof( struct sockaddr_in );
connectHnd = accept( miniServSock, connectHnd = accept( miniServSock,
( struct sockaddr * )&clientAddr, &clientLen ); ( struct sockaddr * )&clientAddr,
&clientLen );
if( connectHnd == UPNP_INVALID_SOCKET ) { if( connectHnd == UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver: Error in accepting connection\n" ); "miniserver: Error"
" 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 ) );
@@ -458,6 +479,7 @@ RunMiniServer( MiniServerSockArray * miniSock )
UpnpPrintf( UPNP_PACKET, MSERV, __FILE__, __LINE__, UpnpPrintf( UPNP_PACKET, MSERV, __FILE__, __LINE__,
"Received multicast packet: \n %s\n", "Received multicast packet: \n %s\n",
requestBuf ); requestBuf );
if( NULL != strstr( requestBuf, "ShutDown" ) ) { if( NULL != strstr( requestBuf, "ShutDown" ) ) {
break; break;
} }
@@ -472,30 +494,31 @@ RunMiniServer( MiniServerSockArray * miniSock )
UpnpCloseSocket( miniServStopSock ); UpnpCloseSocket( miniServStopSock );
shutdown( ssdpSock, SD_BOTH ); shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock ); UpnpCloseSocket( ssdpSock );
#ifdef INCLUDE_CLIENT_APIS CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
shutdown( ssdpReqSock, SD_BOTH ); CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
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: * Description : Returns port to which socket, sockfd, is bound.
* 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 )
{ {
@@ -518,28 +541,28 @@ 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 * unsigned short listen_port ; port on which the server is listening
* listening for incoming connections * for incoming connections
* *
* Description: * Description : Creates a STREAM socket, binds to INADDR_ANY and
* Creates a STREAM socket, binds to INADDR_ANY and listens for * listens for incoming connecttions. Returns the actual port which
* incoming connecttions. Returns the actual port which the sockets * the sockets sub-system returned.
* sub-system returned. * Also creates a DGRAM socket, binds to the loop back address and
* * returns the port allocated by the socket sub-system.
* Also creates a DGRAM socket, binds to the loop back address and *
* returns the port allocated by the socket sub-system. * Return : int :
* * UPNP_E_OUTOF_SOCKET - Failed to create a socket
* Return: int * UPNP_E_SOCKET_BIND - Bind() failed
* UPNP_E_OUTOF_SOCKET - Failed to create a socket * UPNP_E_LISTEN - Listen() failed
* UPNP_E_SOCKET_BIND - Bind() failed * UPNP_E_INTERNAL_ERROR - Port returned by the socket layer is < 0
* UPNP_E_LISTEN - Listen() failed * UPNP_E_SUCCESS - Success
* UPNP_E_INTERNAL_ERROR - Port returned by the socket layer is < 0 *
* 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 )
@@ -669,8 +692,8 @@ get_miniserver_sockets( MiniServerSockArray * out,
miniStopSockPort = get_port( miniServerStopSock ); miniStopSockPort = get_port( miniServerStopSock );
if( miniStopSockPort <= 0 ) { if( miniStopSockPort <= 0 ) {
shutdown( miniServerStopSock, SD_BOTH ); shutdown( miniServerStopSock, SD_BOTH );
UpnpCloseSocket( miniServerStopSock );
shutdown( listenfd, SD_BOTH ); shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( miniServerStopSock );
UpnpCloseSocket( listenfd ); UpnpCloseSocket( listenfd );
return UPNP_E_INTERNAL_ERROR; return UPNP_E_INTERNAL_ERROR;
} }
@@ -685,29 +708,31 @@ get_miniserver_sockets( MiniServerSockArray * out,
} }
/************************************************************************ /************************************************************************
* Function: StartMiniServer * Function : StartMiniServer
* *
* Parameters : * Parameters :
* unsigned short listen_port - Port on which the server listens for * unsigned short listen_port ; Port on which the server listens for
* incoming connections * incoming connections
* *
* Description: * Description : Initialize the sockets functionality for the
* 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 *
* * 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;
@@ -730,10 +755,12 @@ StartMiniServer( unsigned short listen_port )
} }
if( ( success = get_ssdp_sockets( miniSocket ) ) != UPNP_E_SUCCESS ) { if( ( success = get_ssdp_sockets( miniSocket ) ) != UPNP_E_SUCCESS ) {
shutdown( miniSocket->miniServerSock, SD_BOTH ); shutdown( miniSocket->miniServerSock, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerSock ); UpnpCloseSocket( miniSocket->miniServerSock );
shutdown( miniSocket->miniServerStopSock, SD_BOTH ); shutdown( miniSocket->miniServerStopSock, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerStopSock ); UpnpCloseSocket( miniSocket->miniServerStopSock );
free( miniSocket ); free( miniSocket );
return success; return success;
@@ -749,15 +776,14 @@ StartMiniServer( unsigned short listen_port )
if( success < 0 ) { if( success < 0 ) {
shutdown( miniSocket->miniServerSock, SD_BOTH ); shutdown( miniSocket->miniServerSock, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerSock );
shutdown( miniSocket->miniServerStopSock, SD_BOTH ); shutdown( miniSocket->miniServerStopSock, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerStopSock );
shutdown( miniSocket->ssdpSock, SD_BOTH ); shutdown( miniSocket->ssdpSock, SD_BOTH );
CLIENTONLY( shutdown( miniSocket->ssdpReqSock, SD_BOTH ) );
UpnpCloseSocket( miniSocket->miniServerSock );
UpnpCloseSocket( miniSocket->miniServerStopSock );
UpnpCloseSocket( miniSocket->ssdpSock ); UpnpCloseSocket( miniSocket->ssdpSock );
#ifdef INCLUDE_CLIENT_APIS
shutdown( miniSocket->ssdpReqSock, SD_BOTH ); CLIENTONLY( UpnpCloseSocket( miniSocket->ssdpReqSock ) );
UpnpCloseSocket( miniSocket->ssdpReqSock );
#endif
return UPNP_E_OUTOF_MEMORY; return UPNP_E_OUTOF_MEMORY;
} }
@@ -770,16 +796,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 );
UpnpCloseSocket( miniSocket->miniServerSock );
shutdown( miniSocket->miniServerStopSock, SD_BOTH ); shutdown( miniSocket->miniServerStopSock, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerStopSock );
shutdown( miniSocket->ssdpSock, SD_BOTH ); shutdown( miniSocket->ssdpSock, SD_BOTH );
CLIENTONLY( shutdown( miniSocket->ssdpReqSock, SD_BOTH ) );
UpnpCloseSocket( miniSocket->miniServerSock );
UpnpCloseSocket( miniSocket->miniServerStopSock );
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_INTERNAL_ERROR; return UPNP_E_INTERNAL_ERROR;
} }
@@ -788,33 +814,33 @@ StartMiniServer( unsigned short listen_port )
} }
/************************************************************************ /************************************************************************
* Function: StopMiniServer * Function : StopMiniServer
* *
* Parameters: * Parameters :
* void * void ;
* *
* Description: * Description : Stop and Shutdown the MiniServer and free socket
* Stop and Shutdown the MiniServer and free socket * resources.
* resources. *
* * Return : int ;
* Return: int * Always returns 0
* Always returns 0 *
************************************************************************/ * Note :
************************************************************************/
int int
StopMiniServer( void ) StopMiniServer( void )
{ {
int socklen = sizeof( struct sockaddr_in ); int socklen = sizeof( struct sockaddr_in ),
int sock; sock;
struct sockaddr_in ssdpAddr; struct sockaddr_in ssdpAddr;
char buf[256] = "ShutDown"; char buf[256] = "ShutDown";
int bufLen = strlen( buf ); int bufLen = strlen( buf );
if( gMServState == MSERV_RUNNING ) { if( gMServState == MSERV_RUNNING )
gMServState = MSERV_STOPPING; gMServState = MSERV_STOPPING;
} else { else
return 0; return 0;
}
sock = socket( AF_INET, SOCK_DGRAM, 0 ); sock = socket( AF_INET, SOCK_DGRAM, 0 );
if( sock == UPNP_INVALID_SOCKET ) { if( sock == UPNP_INVALID_SOCKET ) {
@@ -838,4 +864,3 @@ StopMiniServer( void )
UpnpCloseSocket( sock ); UpnpCloseSocket( sock );
return 0; return 0;
} }

View File

@@ -396,7 +396,7 @@ scanner_get_str( IN scanner_t * scanner )
* Note : * Note :
************************************************************************/ ************************************************************************/
#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 good candidate for removal.
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 )
@@ -966,7 +966,7 @@ read_until_crlf( INOUT scanner_t * scanner,
* PARSE_INCOMPLETE * PARSE_INCOMPLETE
************************************************************************/ ************************************************************************/
#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 good candidate for removal.
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 )
{ {

File diff suppressed because it is too large Load Diff

View File

@@ -29,10 +29,10 @@
// //
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
/****************************************************************************** /************************************************************************
* Purpose: This file defines the Web Server and has functions to carry out * Purpose: This file defines the Web Server and has functions to carry out
* operations of the Web Server. * operations of the Web Server.
******************************************************************************/ ************************************************************************/
#include "config.h" #include "config.h"
#include <assert.h> #include <assert.h>
@@ -64,11 +64,7 @@
/* /*
Response Types Response Types
*/ */
enum resp_type { enum resp_type { RESP_FILEDOC, RESP_XMLDOC, RESP_HEADERS, RESP_WEBDOC,
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
@@ -186,9 +182,12 @@ 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
@@ -196,16 +195,16 @@ static ithread_mutex_t gWebMutex;
extern str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES]; extern str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES];
/************************************************************************ /************************************************************************
* Function: has_xml_content_type * Function: has_xml_content_type
* *
* Parameters: * Parameters:
* none * none
* *
* Description: decodes list and stores it in gMediaTypeList * Description: decodes list and stores it in gMediaTypeList
* *
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
static UPNP_INLINE void static UPNP_INLINE void
media_list_init( void ) media_list_init( void )
{ {
@@ -230,20 +229,20 @@ media_list_init( void )
} }
/************************************************************************ /************************************************************************
* Function: has_xml_content_type * Function: has_xml_content_type
* *
* Parameters: * Parameters:
* IN const char* extension ; * IN const char* extension ;
* OUT const char** con_type, * OUT const char** con_type,
* OUT const char** con_subtype * OUT const char** con_subtype
* *
* Description: Based on the extension, returns the content type and * Description: Based on the extension, returns the content type and
* content subtype * content subtype
* *
* Returns: * Returns:
* 0 on success; * 0 on success;
* -1 on error * -1 on error
************************************************************************/ ************************************************************************/
static UPNP_INLINE int static UPNP_INLINE int
search_extension( IN const char *extension, search_extension( IN const char *extension,
OUT const char **con_type, OUT const char **con_type,
@@ -277,20 +276,20 @@ search_extension( IN const char *extension,
} }
/************************************************************************ /************************************************************************
* Function: get_content_type * Function: get_content_type
* *
* Parameters: * Parameters:
* IN const char* filename, * IN const char* filename,
* OUT DOMString* content_type * OUT DOMString* content_type
* *
* Description: Based on the extension, clones an XML string based on * Description: Based on the extension, clones an XML string based on
* type and content subtype. If content type and sub type are not * type and content subtype. If content type and sub type are not
* found, unknown types are used * found, unknown types are used
* *
* Returns: * Returns:
* 0 - On Sucess * 0 - On Sucess
* UPNP_E_OUTOF_MEMORY - on memory allocation failures * UPNP_E_OUTOF_MEMORY - on memory allocation failures
************************************************************************/ ************************************************************************/
UPNP_INLINE int UPNP_INLINE int
get_content_type( IN const char *filename, get_content_type( IN const char *filename,
OUT DOMString * content_type ) OUT DOMString * content_type )
@@ -338,17 +337,17 @@ get_content_type( IN const char *filename,
} }
/************************************************************************ /************************************************************************
* Function: glob_alias_init * Function: glob_alias_init
* *
* Parameters: * Parameters:
* none * none
* *
* Description: Initialize the global XML document. Allocate buffers * Description: Initialize the global XML document. Allocate buffers
* for the XML document * for the XML document
* *
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
static UPNP_INLINE void static UPNP_INLINE void
glob_alias_init( void ) glob_alias_init( void )
{ {
@@ -361,16 +360,16 @@ glob_alias_init( void )
} }
/************************************************************************ /************************************************************************
* Function: is_valid_alias * Function: is_valid_alias
* *
* Parameters: * Parameters:
* IN const struct xml_alias_t* alias ; XML alias object * IN const struct xml_alias_t* alias ; XML alias object
* *
* Description: Check for the validity of the XML object buffer * Description: Check for the validity of the XML object buffer
* *
* Returns: * Returns:
* BOOLEAN * BOOLEAN
************************************************************************/ ************************************************************************/
static UPNP_INLINE xboolean static UPNP_INLINE xboolean
is_valid_alias( IN const struct xml_alias_t *alias ) is_valid_alias( IN const struct xml_alias_t *alias )
{ {
@@ -378,17 +377,17 @@ is_valid_alias( IN const struct xml_alias_t *alias )
} }
/************************************************************************ /************************************************************************
* Function: alias_grab * Function: alias_grab
* *
* Parameters: * Parameters:
* OUT struct xml_alias_t* alias ; XML alias object * OUT struct xml_alias_t* alias ; XML alias object
* *
* Description: Copy the contents of the global XML document into the * Description: Copy the contents of the global XML document into the
* local OUT parameter * local OUT parameter
* *
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
static void static void
alias_grab( OUT struct xml_alias_t *alias ) alias_grab( OUT struct xml_alias_t *alias )
{ {
@@ -403,17 +402,17 @@ alias_grab( OUT struct xml_alias_t *alias )
} }
/************************************************************************ /************************************************************************
* Function: alias_release * Function: alias_release
* *
* Parameters: * Parameters:
* IN struct xml_alias_t* alias ; XML alias object * IN struct xml_alias_t* alias ; XML alias object
* *
* Description: Release the XML document referred to by the IN parameter * Description: Release the XML document referred to by the IN parameter
* Free the allocated buffers associated with this object * Free the allocated buffers associated with this object
* *
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
static void static void
alias_release( IN struct xml_alias_t *alias ) alias_release( IN struct xml_alias_t *alias )
{ {
@@ -437,24 +436,24 @@ alias_release( IN struct xml_alias_t *alias )
} }
/************************************************************************ /************************************************************************
* Function: web_server_set_alias * Function: web_server_set_alias
* *
* Parameters: * Parameters:
* alias_name: webserver name of alias; created by caller and freed by * alias_name: webserver name of alias; created by caller and freed by
* caller (doesn't even have to be malloc()d .) * caller (doesn't even have to be malloc()d .)
* alias_content: the xml doc; this is allocated by the caller; and * alias_content: the xml doc; this is allocated by the caller; and
* freed by the web server * freed by the web server
* alias_content_length: length of alias body in bytes * alias_content_length: length of alias body in bytes
* last_modified: time when the contents of alias were last * last_modified: time when the contents of alias were last
* changed (local time) * changed (local time)
* *
* Description: Replaces current alias with the given alias. To remove * Description: Replaces current alias with the given alias. To remove
* the current alias, set alias_name to NULL. * the current alias, set alias_name to NULL.
* *
* Returns: * Returns:
* 0 - OK * 0 - OK
* UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here * UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here
************************************************************************/ ************************************************************************/
int int
web_server_set_alias( IN const char *alias_name, web_server_set_alias( IN const char *alias_name,
IN const char *alias_content, IN const char *alias_content,
@@ -517,19 +516,19 @@ web_server_set_alias( IN const char *alias_name,
} }
/************************************************************************ /************************************************************************
* Function: web_server_init * Function: web_server_init
* *
* Parameters: * Parameters:
* none * none
* *
* Description: Initilialize the different documents. Initialize the * Description: Initilialize the different documents. Initialize the
* memory for root directory for web server. Call to initialize global * memory for root directory for web server. Call to initialize global
* XML document. Sets bWebServerState to WEB_SERVER_ENABLED * XML document. Sets bWebServerState to WEB_SERVER_ENABLED
* *
* Returns: * Returns:
* 0 - OK * 0 - OK
* UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here * UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here
************************************************************************/ ************************************************************************/
int int
web_server_init( void ) web_server_init( void )
{ {
@@ -553,18 +552,18 @@ web_server_init( void )
} }
/************************************************************************ /************************************************************************
* Function: web_server_destroy * Function: web_server_destroy
* *
* Parameters: * Parameters:
* none * none
* *
* 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
* Resets the flag bWebServerState to WEB_SERVER_DISABLED * Resets the flag bWebServerState to WEB_SERVER_DISABLED
* *
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
void void
web_server_destroy( void ) web_server_destroy( void )
{ {
@@ -585,22 +584,23 @@ web_server_destroy( void )
} }
/************************************************************************ /************************************************************************
* Function: get_file_info * Function: get_file_info
* *
* 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 the file last * attributes such as filelength, when was
* modified, whether a file or a directory and whether the * the file last modified, whether a file
* file or directory is readable. * or a directory and whether the file or
* * directory is readable.
* Description: Release memory allocated for the global web server root *
* directory and the global XML document * Description: Release memory allocated for the global web server root
* Resets the flag bWebServerState to WEB_SERVER_DISABLED * directory and the global XML document
* * Resets the flag bWebServerState to WEB_SERVER_DISABLED
* Returns: *
* int * Returns:
************************************************************************/ * int
************************************************************************/
static int static int
get_file_info( IN const char *filename, get_file_info( IN const char *filename,
OUT struct File_Info *info ) OUT struct File_Info *info )
@@ -647,19 +647,19 @@ get_file_info( IN const char *filename,
} }
/************************************************************************ /************************************************************************
* Function: web_server_set_root_dir * Function: web_server_set_root_dir
* *
* Parameters: * Parameters:
* IN const char* root_dir ; String having the root directory for the * IN const char* root_dir ; String having the root directory for the
* document * document
* *
* Description: Assign the path specfied by the IN const char* root_dir * Description: Assign the path specfied by the IN const char* root_dir
* parameter to the global Document root directory. Also check for * parameter to the global Document root directory. Also check for
* path names ending in '/' * path names ending in '/'
* *
* Returns: * Returns:
* int * int
************************************************************************/ ************************************************************************/
int int
web_server_set_root_dir( IN const char *root_dir ) web_server_set_root_dir( IN const char *root_dir )
{ {
@@ -682,23 +682,24 @@ web_server_set_root_dir( IN const char *root_dir )
} }
/************************************************************************ /************************************************************************
* Function: get_alias * Function: get_alias
* *
* Parameters: * Parameters:
* IN const char* request_file ; request file passed in to be compared with * IN const char* request_file ; request file passed in to be compared with
* 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 succeeds * filled up if the file comparison
* * succeeds
* Description: Compare the files names between the one on the XML alias *
* the one passed in as the input parameter. If equal extract file * Description: Compare the files names between the one on the XML alias
* information * the one passed in as the input parameter. If equal extract file
* * information
* Returns: *
* TRUE - On Success * Returns:
* FALSE if request is not an alias * TRUE - On Success
************************************************************************/ * FALSE if request is not an alias
************************************************************************/
static UPNP_INLINE xboolean static UPNP_INLINE xboolean
get_alias( IN const char *request_file, get_alias( IN const char *request_file,
OUT struct xml_alias_t *alias, OUT struct xml_alias_t *alias,
@@ -719,17 +720,17 @@ get_alias( IN const char *request_file,
} }
/************************************************************************ /************************************************************************
* Function: isFileInVirtualDir * Function: isFileInVirtualDir
* *
* Parameters: * Parameters:
* IN char *filePath ; directory path to be tested for virtual directory * IN char *filePath ; directory path to be tested for virtual directory
* *
* Description: Compares filePath with paths from the list of virtual * Description: Compares filePath with paths from the list of virtual
* directory lists * directory lists
* *
* Returns: * Returns:
* BOOLEAN * BOOLEAN
************************************************************************/ ************************************************************************/
int int
isFileInVirtualDir( IN char *filePath ) isFileInVirtualDir( IN char *filePath )
{ {
@@ -745,7 +746,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] == '/' || filePath[webDirLen] == '\0' || filePath[webDirLen] == '?' ) ) == 0 ) && ( filePath[webDirLen] == '/' ) )
return TRUE; return TRUE;
} }
@@ -756,16 +757,16 @@ isFileInVirtualDir( IN char *filePath )
} }
/************************************************************************ /************************************************************************
* Function: ToUpperCase * Function: ToUpperCase
* *
* Parameters: * Parameters:
* INOUT char * Str ; Input string to be converted * INOUT char * Str ; Input string to be converted
* *
* Description: Converts input string to upper case * Description: Converts input string to upper case
* *
* Returns: * Returns:
* int * int
************************************************************************/ ************************************************************************/
int int
ToUpperCase( char *Str ) ToUpperCase( char *Str )
{ {
@@ -778,17 +779,17 @@ ToUpperCase( char *Str )
} }
/************************************************************************ /************************************************************************
* Function: StrStr * Function: StrStr
* *
* Parameters: * Parameters:
* IN char * S1 ; Input string * IN char * S1 ; Input string
* IN char * S2 ; Input sub-string * IN char * S2 ; Input sub-string
* *
* Description: Finds a substring from a string * Description: Finds a substring from a string
* *
* Returns: * Returns:
* char * ptr - pointer to the first occurence of S2 in S1 * char * ptr - pointer to the first occurence of S2 in S1
************************************************************************/ ************************************************************************/
char * char *
StrStr( char *S1, StrStr( char *S1,
char *S2 ) char *S2 )
@@ -828,17 +829,17 @@ StrStr( char *S1,
} }
/************************************************************************ /************************************************************************
* Function: StrTok * Function: StrTok
* *
* Parameters: * Parameters:
* IN char ** Src ; String containing the token * IN char ** Src ; String containing the token
* IN char * del ; Set of delimiter characters * IN char * del ; Set of delimiter characters
* *
* Description: Finds next token in a string * Description: Finds next token in a string
* *
* Returns: * Returns:
* char * ptr - pointer to the first occurence of S2 in S1 * char * ptr - pointer to the first occurence of S2 in S1
************************************************************************/ ************************************************************************/
char * char *
StrTok( char **Src, StrTok( char **Src,
char *Del ) char *Del )
@@ -862,41 +863,39 @@ StrTok( char **Src,
} }
/************************************************************************ /************************************************************************
* Function: GetNextRange * Function: GetNextRange
* *
* Parameters: * Parameters:
* IN char ** SrcRangeStr ; string containing the token / range * IN char ** SrcRangeStr ; string containing the token / range
* 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 string * Description: Returns a range of integers from a sring
* *
* Returns: int ; * Returns: int ;
* always returns 1; * always returns 1;
************************************************************************/ ************************************************************************/
int int
GetNextRange( char **SrcRangeStr, GetNextRange( char **SrcRangeStr,
off_t *FirstByte, off_t *FirstByte,
off_t *LastByte ) off_t *LastByte )
{ {
char *Ptr; char *Ptr,
char *Tok; *Tok;
int i; int i,
int64_t F = -1; F = -1,
int64_t L = -1; 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, "%"SCNd64"%"SCNd64, &F, &L ); sscanf( Tok, "%d%d", &F, &L );
if( F == -1 || L == -1 ) { if( F == -1 || L == -1 ) {
*Ptr = '-'; *Ptr = '-';
@@ -911,35 +910,36 @@ GetNextRange( char **SrcRangeStr,
} }
if( Is_Suffix_byte_Range ) { if( Is_Suffix_byte_Range ) {
*FirstByte = (off_t)L; *FirstByte = L;
*LastByte = (off_t)F; *LastByte = F;
return 1; return 1;
} }
} }
*FirstByte = (off_t)F;
*LastByte = (off_t)L;
*FirstByte = F;
*LastByte = L;
return 1; return 1;
} }
/************************************************************************ /************************************************************************
* Function: CreateHTTPRangeResponseHeader * Function: CreateHTTPRangeResponseHeader
* *
* 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 * OUT struct SendInstruction * Instr ; SendInstruction object where the
* where the range operations will be stored * 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
* *
* Returns: * Returns:
* HTTP_BAD_REQUEST * HTTP_BAD_REQUEST
* UPNP_E_OUTOF_MEMORY * UPNP_E_OUTOF_MEMORY
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE * HTTP_REQUEST_RANGE_NOT_SATISFIABLE
* HTTP_OK * HTTP_OK
************************************************************************/ ************************************************************************/
int int
CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier, CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
off_t FileLength, off_t FileLength,
@@ -1035,24 +1035,24 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
} }
/************************************************************************ /************************************************************************
* Function: CheckOtherHTTPHeaders * Function: CheckOtherHTTPHeaders
* *
* Parameters: * Parameters:
* IN http_message_t * Req ; HTTP Request message * IN http_message_t * Req ; HTTP Request message
* OUT struct SendInstruction * RespInstr ; Send Instruction object to * OUT struct SendInstruction * RespInstr ; Send Instruction object to
* data for the response * data for the response
* int FileSize ; Size of the file containing the request document * int FileSize ; Size of the file containing the request document
* *
* Description: Get header id from the request parameter and take * Description: Get header id from the request parameter and take
* appropriate action based on the ids. * appropriate action based on the ids.
* as an HTTP Range Response * as an HTTP Range Response
* *
* Returns: * Returns:
* HTTP_BAD_REQUEST * HTTP_BAD_REQUEST
* UPNP_E_OUTOF_MEMORY * UPNP_E_OUTOF_MEMORY
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE * HTTP_REQUEST_RANGE_NOT_SATISFIABLE
* HTTP_OK * HTTP_OK
************************************************************************/ ************************************************************************/
int int
CheckOtherHTTPHeaders( IN http_message_t * Req, CheckOtherHTTPHeaders( IN http_message_t * Req,
OUT struct SendInstruction *RespInstr, OUT struct SendInstruction *RespInstr,
@@ -1166,27 +1166,27 @@ CheckOtherHTTPHeaders( IN http_message_t * Req,
} }
/************************************************************************ /************************************************************************
* Function: process_request * Function: process_request
* *
* Parameters: * Parameters:
* IN http_message_t *req ; HTTP Request message * IN http_message_t *req ; HTTP Request message
* OUT enum resp_type *rtype ; Tpye of response * OUT enum resp_type *rtype ; Tpye of response
* OUT membuffer *headers ; * OUT membuffer *headers ;
* OUT membuffer *filename ; Get filename from request document * OUT membuffer *filename ; Get filename from request document
* OUT struct xml_alias_t *alias ; Xml alias document from the * OUT struct xml_alias_t *alias ; Xml alias document from the
* request document, * request document,
* OUT struct SendInstruction * RespInstr ; Send Instruction object * OUT struct SendInstruction * RespInstr ; Send Instruction object
* where the response is set up. * where the response is set up.
* *
* Description: Processes the request and returns the result in the OUT * Description: Processes the request and returns the result in the OUT
* parameters * parameters
* *
* Returns: * Returns:
* HTTP_BAD_REQUEST * HTTP_BAD_REQUEST
* UPNP_E_OUTOF_MEMORY * UPNP_E_OUTOF_MEMORY
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE * HTTP_REQUEST_RANGE_NOT_SATISFIABLE
* HTTP_OK * HTTP_OK
************************************************************************/ ************************************************************************/
static int static int
process_request( IN http_message_t * req, process_request( IN http_message_t * req,
OUT enum resp_type *rtype, OUT enum resp_type *rtype,
@@ -1494,23 +1494,23 @@ process_request( IN http_message_t * req,
} }
/************************************************************************ /************************************************************************
* Function: http_RecvPostMessage * Function: http_RecvPostMessage
* *
* Parameters: * Parameters:
* http_parser_t* parser ; HTTP Parser object * http_parser_t* parser ; HTTP Parser object
* IN SOCKINFO *info ; Socket Information object * IN SOCKINFO *info ; Socket Information object
* char * filename ; File where received data is copied to * char * filename ; File where received data is copied to
* struct SendInstruction * Instr ; Send Instruction object which gives * struct SendInstruction * Instr ; Send Instruction object which gives
* information whether the file is a virtual file or not. * information whether the file is a virtual file or not.
* *
* Description: Receives the HTTP post message * Description: Receives the HTTP post message
* *
* Returns: * Returns:
* HTTP_INTERNAL_SERVER_ERROR * HTTP_INTERNAL_SERVER_ERROR
* HTTP_UNAUTHORIZED * HTTP_UNAUTHORIZED
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE * HTTP_REQUEST_RANGE_NOT_SATISFIABLE
* HTTP_OK * HTTP_OK
************************************************************************/ ************************************************************************/
int int
http_RecvPostMessage( http_parser_t * parser, http_RecvPostMessage( http_parser_t * parser,
IN SOCKINFO * info, IN SOCKINFO * info,
@@ -1531,7 +1531,7 @@ http_RecvPostMessage( http_parser_t * parser,
if( Instr && Instr->IsVirtualFile ) { if( Instr && Instr->IsVirtualFile ) {
Fp = (virtualDirCallback.open)( filename, UPNP_WRITE ); Fp = virtualDirCallback.open( filename, UPNP_WRITE );
if( Fp == NULL ) { if( Fp == NULL ) {
return HTTP_INTERNAL_SERVER_ERROR; return HTTP_INTERNAL_SERVER_ERROR;
} }
@@ -1658,19 +1658,19 @@ http_RecvPostMessage( http_parser_t * parser,
} }
/************************************************************************ /************************************************************************
* Function: web_server_callback * Function: web_server_callback
* *
* Parameters: * Parameters:
* IN http_parser_t *parser ; HTTP Parser Object * IN http_parser_t *parser ; HTTP Parser Object
* INOUT http_message_t* req ; HTTP Message request * INOUT http_message_t* req ; HTTP Message request
* IN SOCKINFO *info ; Socket information object * IN SOCKINFO *info ; Socket information object
* *
* 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 void
web_server_callback( IN http_parser_t * parser, web_server_callback( IN http_parser_t * parser,
INOUT http_message_t * req, INOUT http_message_t * req,
@@ -1763,4 +1763,3 @@ web_server_callback( IN http_parser_t * parser,
membuffer_destroy( &headers ); membuffer_destroy( &headers );
membuffer_destroy( &filename ); membuffer_destroy( &filename );
} }

View File

@@ -231,15 +231,6 @@ sock_read_write( IN SOCKINFO * info,
} }
} }
#ifdef SO_NOSIGPIPE
{
int old;
int set = 1;
socklen_t olen = sizeof(old);
getsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, &olen);
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &set, sizeof(set));
#endif
if( bRead ) { if( bRead ) {
// read data // read data
numBytes = recv( sockfd, buffer, bufsize,MSG_NOSIGNAL); numBytes = recv( sockfd, buffer, bufsize,MSG_NOSIGNAL);
@@ -252,9 +243,6 @@ sock_read_write( IN SOCKINFO * info,
send( sockfd, buffer + bytes_sent, byte_left, send( sockfd, buffer + bytes_sent, byte_left,
MSG_DONTROUTE|MSG_NOSIGNAL); MSG_DONTROUTE|MSG_NOSIGNAL);
if( num_written == -1 ) { if( num_written == -1 ) {
#ifdef SO_NOSIGPIPE
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, olen);
#endif
return num_written; return num_written;
} }
@@ -265,11 +253,6 @@ sock_read_write( IN SOCKINFO * info,
numBytes = bytes_sent; numBytes = bytes_sent;
} }
#ifdef SO_NOSIGPIPE
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, olen);
}
#endif
if( numBytes < 0 ) { if( numBytes < 0 ) {
return UPNP_E_SOCKET_ERROR; return UPNP_E_SOCKET_ERROR;
} }

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;
#if !defined(WIN32) && !(defined(__OSX__) || defined(__APPLE__)) #ifndef WIN32
char temp_hostbyname_buff[BUFFER_SIZE]; char temp_hostbyname_buff[BUFFER_SIZE];
struct hostent h_buf; struct hostent h_buf;
#endif #endif
@@ -626,61 +626,27 @@ parse_hostport( const char *in,
// TODO: Use autoconf to discover this rather than the // TODO: Use autoconf to discover this rather than the
// platform-specific stuff below // platform-specific stuff below
#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( errCode = gethostbyname_r( temp_host_name,
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( h = lwres_gethostbyname_r( temp_host_name,
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__) #else
h = gethostbyname(temp_host_name); errCode = gethostbyname_r( temp_host_name,
if ( h == NULL ) {
errCode = 1;
}
#elif defined(__linux__)
errCode = gethostbyname_r(
temp_host_name,
&h_buf, &h_buf,
temp_hostbyname_buff, temp_hostbyname_buff,
BUFFER_SIZE, &h, &errcode ); BUFFER_SIZE, &h, &errcode );
#else
{
struct addrinfo hints, *res, *res0;
h = NULL;
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_INET;
hints.ai_socktype = SOCK_STREAM;
errCode = getaddrinfo(temp_host_name, "http", &hints, &res0);
if (!errCode) {
for (res = res0; res; res = res->ai_next) {
if (res->ai_family == PF_INET &&
res->ai_addr->sa_family == AF_INET)
{
h = &h_buf;
h->h_addrtype = res->ai_addr->sa_family;
h->h_length = 4;
h->h_addr = (void *) temp_hostbyname_buff;
*(struct in_addr *)h->h_addr =
((struct sockaddr_in *)res->ai_addr)->sin_addr;
break;
}
}
freeaddrinfo(res0);
}
}
#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

@@ -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/inc/upnpdebug.h> see <upnp/upnpdebug.h>
*/ */
#define DEBUG_ALL 1 #define DEBUG_ALL 1

View File

@@ -50,78 +50,73 @@ int
http_CancelHttpGet( IN void *Handle ); http_CancelHttpGet( IN void *Handle );
/************************************************************************ /************************************************************************
* Function: http_FixUrl * Function: http_FixUrl
* *
* Parameters: * Parameters:
* 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: * Description: Validates URL
* Validates URL *
* * Returns:
* Returns: * UPNP_E_INVALID_URL
* UPNP_E_INVALID_URL * UPNP_E_SUCCESS
* UPNP_E_SUCCESS ************************************************************************/
************************************************************************/
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
* *
* Parameters: * Parameters:
* IN char* urlstr ; Character string as a URL * IN char* urlstr ; Character string as a 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: * Description: Parses URL and then validates URL
* Parses URL and then validates URL *
* * Returns:
* Returns: * UPNP_E_INVALID_URL
* UPNP_E_INVALID_URL * UPNP_E_SUCCESS
* UPNP_E_SUCCESS ************************************************************************/
************************************************************************/
int http_FixStrUrl( IN char* urlstr, IN int urlstrlen, OUT uri_type* fixed_url ); int http_FixStrUrl( IN char* urlstr, IN int urlstrlen, OUT uri_type* fixed_url );
/************************************************************************ /************************************************************************
* Function: http_Connect * Function: http_Connect
* *
* Parameters: * Parameters:
* 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: * Description: Gets destination address from URL and then connects to the
* Gets destination address from URL and then connects to the remote end * remote end
* *
* Returns: * Returns:
* socket descriptor on sucess * socket descriptor on sucess
* UPNP_E_OUTOF_SOCKET * UPNP_E_OUTOF_SOCKET
* UPNP_E_SOCKET_CONNECT on error * UPNP_E_SOCKET_CONNECT on error
************************************************************************/ ************************************************************************/
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: * Description: Get the data on the socket and take actions based on the
* Get the data on the socket and take actions based on the read data * read data to modify the parser objects buffer. If an error is reported
* to modify the parser objects buffer. If an error is reported while * while parsing the data, the error code is passed in the http_errr_code
* parsing the data, the error code is passed in the http_errr_code * parameter
* parameter *
* * Returns:
* Returns: * UPNP_E_BAD_HTTPMSG
* UPNP_E_BAD_HTTPMSG * UPNP_E_SUCCESS
* UPNP_E_SUCCESS ************************************************************************/
************************************************************************/
int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t* parser, int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t* parser,
IN http_method_t request_method, IN http_method_t request_method,
IN OUT int* timeout_secs, IN OUT int* timeout_secs,
@@ -129,311 +124,302 @@ int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t* parser,
/************************************************************************ /************************************************************************
* Function: http_SendMessage * Function: http_SendMessage
* *
* Parameters: * Parameters:
* IN SOCKINFO *info ; Socket information object * IN SOCKINFO *info ; Socket information object
* 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: * Description: Sends a message to the destination based on the
* 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 * 'm': arg1 = const char * mem_buffer; arg2= size_t buf_length
* 'm': arg1 = const char * mem_buffer; arg2= size_t buf_length * E.g.:
* E.g.: * char *buf = "POST /xyz.cgi http/1.1\r\n\r\n";
* char *buf = "POST /xyz.cgi http/1.1\r\n\r\n"; * char *filename = "foo.dat";
* char *filename = "foo.dat"; * int status = http_SendMessage( tcpsock, "mf",
* int status = http_SendMessage( tcpsock, "mf", * buf, strlen(buf), // args for memory buffer
* buf, strlen(buf), // args for memory buffer * filename ); // arg for file
* filename ); // arg for file *
* * Returns:
* Returns: * UPNP_E_OUTOF_MEMORY
* UPNP_E_OUTOF_MEMORY * 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
* *
* Parameters: * Parameters:
* IN uri_type* destination; Destination URI object which contains * IN uri_type* destination ; Destination URI object which contains
* remote IP address among other elements * remote IP address among other elements
* IN const char* request; Request to be sent * IN const char* request ; Request to be sent
* IN size_t request_length; Length of the request * IN size_t request_length ; Length of the request
* IN http_method_t req_method; HTTP Request method * IN http_method_t req_method ; HTTP Request method
* 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: * Description: Initiates socket, connects to the destination, sends a
* 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: * UPNP_E_SOCKET_ERROR
* UPNP_E_SOCKET_ERROR * UPNP_E_SOCKET_CONNECT
* UPNP_E_SOCKET_CONNECT * 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:
* 0 -- success
* UPNP_E_OUTOF_MEMORY
* UPNP_E_TIMEDOUT
* UPNP_E_BAD_REQUEST
* UPNP_E_BAD_RESPONSE
* UPNP_E_INVALID_URL
* UPNP_E_SOCKET_READ
* UPNP_E_SOCKET_WRITE
************************************************************************/
/************************************************************************ /************************************************************************
* return codes: * Function : http_Download
* 0 -- success *
* UPNP_E_OUTOF_MEMORY * Parameters :
* UPNP_E_TIMEDOUT * IN const char* url_str : String as a URL
* UPNP_E_BAD_REQUEST * IN int timeout_secs : time out value
* UPNP_E_BAD_RESPONSE * OUT char** document : buffer to store the document extracted
* UPNP_E_INVALID_URL * from the donloaded message.
* UPNP_E_SOCKET_READ * OUT int* doc_length : length of the extracted document
* UPNP_E_SOCKET_WRITE * OUT char* content_type : Type of content
************************************************************************/ *
* Description : Download the document message and extract the document
* from the message.
/************************************************************************ *
* Function: http_Download * Return : int;
* * UPNP_E_SUCCESS;
* Parameters: * UPNP_E_INVALID_URL;
* IN const char* url_str; String as a URL *
* IN int timeout_secs; time out value *
* OUT char** document; buffer to store the document extracted * Note :
* from the donloaded message. ************************************************************************/
* OUT int* doc_length; length of the extracted document int http_Download( IN const char* url,
* OUT char* content_type; Type of content
*
* Description:
* Download the document message and extract the document
* from the message.
*
* Return: int
* UPNP_E_SUCCESS
* UPNP_E_INVALID_URL
************************************************************************/
int http_Download(
IN const char* url,
IN int timeout_secs, IN int timeout_secs,
OUT char** document, OUT char** document, OUT int* doc_length,
OUT int* doc_length,
OUT char* content_type ); OUT char* content_type );
/************************************************************************ /************************************************************************
* Function: http_WriteHttpPost * Function : http_WriteHttpPost
* *
* Parameters: * Parameters :
* IN void *Handle: Handle to the http post object * IN void *Handle : Handle to the http post object
* IN char *buf: Buffer to send to peer, if format used * IN char *buf : Buffer to send to peer, if format used
* is not UPNP_USING_CHUNKED, * is not UPNP_USING_CHUNKED,
* 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: * Description : Formats data if format used is UPNP_USING_CHUNKED.
* 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: * Description : Sends remaining data if using UPNP_USING_CHUNKED
* 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: * Description : Makes the HTTP POST message, connects to the peer,
* 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,
IN const char *contentType, IN const char *contentType,
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 the buffer passed * IN OUT unsigned int *size : Size of tge buffer passed
* IN int timeout; time out value * IN int timeout : time out value
* *
* Description: * Description : Parses already existing data, then gets new data.
* 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( int http_ReadHttpGet(IN void *Handle,
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: * Description : Extracts information from the Handle to the HTTP get
* Extracts information from the Handle to the HTTP get object. * 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;
************************************************************************/ *
int http_HttpGetProgress( * Note :
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: * Description : Clears the handle allocated for the HTTP GET operation
* 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
* *
* 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: * Description : Makes the HTTP GET message, connects to the peer,
* 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 * IN const char *proxy_str : String as a URL to the proxy
* 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: * Description : Makes the HTTP GET message, connects to the peer,
* 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.
* 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 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,
IN OUT void **Handle, IN OUT void **Handle,
@@ -444,134 +430,126 @@ 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: * Description : Generate a response message for the status query and
* Generate a response message for the status query and send the * send the status response.
* 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, int http_SendStatusResponse( IN SOCKINFO *info, IN int http_status_code,
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 );
/************************************************************************ /************************************************************************
* 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: * Description : Generate an HTTP message based on the format that is
* Generate an HTTP message based on the format that is specified * specified in the input parameters.
* 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
* 'C': (no args) appends a HTTP CONNECTION: close header * 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt
* depending on major,minor version * 'D': (no args) appends HTTP DATE: header
* 'c': (no args) appends CRLF "\r\n" * 'S': (no args) appends HTTP SERVER: header
* 'D': (no args) appends HTTP DATE: header * 'U': (no args) appends HTTP USER-AGENT: header
* 'd': arg = int number // appends decimal number * 'C': (no args) appends a HTTP CONNECTION: close header
* 'G': arg = range information // add range header * depending on major,minor version
* 'h': arg = off_t number // appends off_t number * 'N': arg1 = int content_length // content-length header
* 'K': (no args) // add chunky header * 'Q': arg1 = http_method_t; arg2 = char* url;
* 'N': arg1 = off_t content_length // content-length header * arg3 = int url_length // start line of request
* 'q': arg1 = http_method_t // request start line and HOST header * 'R': arg = int status_code // adds a response start line
* arg2 = (uri_type *) * 'B': arg = int status_code
* 'Q': arg1 = http_method_t; // start line of request * appends content-length, content-type and HTML body for given code
* arg2 = char* url; * 'T': arg = char * content_type; format e.g: "text/html";
* arg3 = size_t url_length * content-type header
* 'R': arg = int status_code // adds a response start line *
* 'S': (no args) appends HTTP SERVER: header * Return : int;
* 's': arg = const char* C_string * 0 - On Success
* 'T': arg = char * content_type; format * UPNP_E_OUTOF_MEMORY
* e.g: "text/html"; content-type header * UPNP_E_INVALID_URL;
* 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt *
* 'U': (no args) appends HTTP USER-AGENT: header * Note :
* 'X': arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent ************************************************************************/
* int http_MakeMessage( INOUT membuffer* buf,
* Return: int
* 0 - On Success
* UPNP_E_OUTOF_MEMORY
* UPNP_E_INVALID_URL
************************************************************************/
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: * Description : Calculate HTTP response versions based on the request
* Calculate HTTP response versions based on the request versions. * versions.
* *
* Return: void * Return : void
************************************************************************/ *
* Note :
************************************************************************/
void http_CalcResponseVersion( void http_CalcResponseVersion(
IN int request_major_vers, IN int request_major_vers, IN int request_minor_vers,
IN int request_minor_vers, OUT int* response_major_vers, OUT int* response_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: * Description : Makes the HTTP GET message, connects to the peer,
* 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,
IN OUT char **contentType, IN OUT char **contentType,
@@ -581,19 +559,19 @@ 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; buffer to store the operating system information * OUT char *info ;
* *
* Description: * Description : Returns the server information for the operating
* Returns the server information for the operating system * system
* *
* Return: * Return : void ;
* UPNP_INLINE void *
************************************************************************/ * Note :
************************************************************************/
void get_sdk_info( OUT char *info ); void get_sdk_info( OUT char *info );
#ifdef __cplusplus #ifdef __cplusplus
@@ -602,4 +580,3 @@ void get_sdk_info( OUT char *info );
#endif // GENLIB_NET_HTTP_HTTPREADWRITE_H #endif // GENLIB_NET_HTTP_HTTPREADWRITE_H

View File

@@ -1,150 +1,154 @@
/************************************************************************ ///////////////////////////////////////////////////////////////////////////
* //
* 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 {
/* socket for listening for miniserver requests */ int miniServerSock; //socket for listening for miniserver
int miniServerSock; //requests
/* socket for stopping miniserver */ int miniServerStopSock; //socket for stopping miniserver
int miniServerStopSock; int ssdpSock; //socket for incoming advertisments and search requests
/* socket for incoming advertisments and search requests */
int ssdpSock;
int stopPort; int stopPort;
int miniServerPort; int miniServerPort;
/* socket for sending search requests and receiving search replies */ CLIENTONLY(int ssdpReqSock;) //socket for sending search
CLIENTONLY(int ssdpReqSock;) //requests and receiving
// search replies
} MiniServerSockArray; } MiniServerSockArray;
//typedef void (*MiniServerCallback) ( const char* document, int sockfd );
typedef void (*MiniServerCallback)( typedef void (*MiniServerCallback) ( IN http_parser_t *parser,
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
/************************************************************************ /************************************************************************
* 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 SetHTTPGetCallback( MiniServerCallback callback ); void 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 #ifdef INCLUDE_DEVICE_APIS
void SetSoapCallback( MiniServerCallback callback ); void SetSoapCallback( MiniServerCallback callback );
#else /* INCLUDE_DEVICE_APIS */ #else
static inline void SetSoapCallback( MiniServerCallback callback ) {} static inline void SetSoapCallback( MiniServerCallback callback ) {}
#endif /* INCLUDE_DEVICE_APIS */ #endif
/************************************************************************ /************************************************************************
* Function: SetGenaCallback * Function : SetGenaCallback
* *
* Parameters: * Parameters :
* MiniServerCallback callback; - GENA Callback to be invoked * MiniServerCallback callback ; - GENA Callback to be invoked
* *
* D6escription: Set GENA Callback * Description : Set GENA Callback
* *
* Return: void * Return : void
************************************************************************/ *
* Note :
************************************************************************/
void SetGenaCallback( MiniServerCallback callback ); void SetGenaCallback( MiniServerCallback callback );
/************************************************************************ /************************************************************************
* 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
* *
* 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 StartMiniServer( unsigned short listen_port ); int StartMiniServer( unsigned short listen_port );
/************************************************************************ /************************************************************************
* Function: StopMiniServer * Function : StopMiniServer
* *
* Parameters: * Parameters :
* void; * void ;
* *
* Description: Stop and Shutdown the MiniServer and free socket resources. * Description : Stop and Shutdown the MiniServer and free socket
* * resources.
* Return : int; *
* Always returns 0 * Return : int ;
************************************************************************/ * Always returns 0
int StopMiniServer(); *
* Note :
************************************************************************/
int StopMiniServer( void );
#ifdef __cplusplus #ifdef __cplusplus
} /* extern C */ } /* extern C */
#endif #endif
#endif /* MINISERVER_H */ #endif /* MINISERVER_H */

View File

@@ -98,25 +98,18 @@ struct Handle_Info
int aliasInstalled; // 0 = not installed; otherwise installed int aliasInstalled; // 0 = not installed; otherwise installed
}; };
extern ithread_rwlock_t GlobalHndRWLock; extern ithread_mutex_t GlobalHndMutex;
Upnp_Handle_Type GetHandleInfo(int Hnd, struct Handle_Info **HndInfo); Upnp_Handle_Type GetHandleInfo(int Hnd, struct Handle_Info **HndInfo);
#define HandleLock() HandleWriteLock() #define HandleLock() \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying Lock"); \
#define HandleWriteLock() \ ithread_mutex_lock(&GlobalHndMutex); \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying a write lock"); \ UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "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_rwlock_unlock(&GlobalHndRWLock); \ ithread_mutex_unlock(&GlobalHndMutex); \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Unlocked rwlock"); UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Unlock");
Upnp_Handle_Type GetClientHandleInfo(int *client_handle_out, Upnp_Handle_Type GetClientHandleInfo(int *client_handle_out,
struct Handle_Info **HndInfo); struct Handle_Info **HndInfo);
@@ -183,6 +176,7 @@ void UpnpThreadDistribution(struct UpnpNonblockParam * Param);
void AutoAdvertise(void *input); void AutoAdvertise(void *input);
int getlocalhostname(char *out); int getlocalhostname(char *out);
virtualDirList *pVirtualDirList;
extern WebServerState bWebServerState; extern WebServerState bWebServerState;
#endif #endif

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,4 +148,3 @@ 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

@@ -125,7 +125,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
// we are assuming that there can be only one client supported at a time // we are assuming that there can be only one client supported at a time
HandleReadLock(); HandleLock();
if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
@@ -159,7 +159,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
} }
// dest addr // dest addr
memcpy(&param.DestAddr, dest_addr, sizeof(struct sockaddr_in) ); param.DestAddr = dest_addr;
// EXT // EXT
param.Ext[0] = '\0'; param.Ext[0] = '\0';
@@ -267,7 +267,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
strlen( param.Location ) == 0 || !usn_found || !st_found ) { strlen( param.Location ) == 0 || !usn_found || !st_found ) {
return; // bad reply return; // bad reply
} }
// check each current search //check each current search
HandleLock(); HandleLock();
if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
HandleUnlock(); HandleUnlock();
@@ -275,14 +275,14 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
} }
node = ListHead( &ctrlpt_info->SsdpSearchList ); node = ListHead( &ctrlpt_info->SsdpSearchList );
// temporary add null termination //temporary add null termination
//save_char = hdr_value.buf[ hdr_value.length ]; //save_char = hdr_value.buf[ hdr_value.length ];
//hdr_value.buf[ hdr_value.length ] = '\0'; //hdr_value.buf[ hdr_value.length ] = '\0';
while( node != NULL ) { while( node != NULL ) {
searchArg = node->item; searchArg = node->item;
matched = 0; matched = 0;
// check for match of ST header and search target //check for match of ST header and search target
switch ( searchArg->requestType ) { switch ( searchArg->requestType ) {
case SSDP_ALL: case SSDP_ALL:
{ {
@@ -327,7 +327,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
} }
if( matched ) { if( matched ) {
// schedule call back //schedule call back
threadData = threadData =
( ResultData * ) malloc( sizeof( ResultData ) ); ( ResultData * ) malloc( sizeof( ResultData ) );
if( threadData != NULL ) { if( threadData != NULL ) {
@@ -366,7 +366,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
* *
***************************************************************************/ ***************************************************************************/
#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 good candidate for removal.
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,
@@ -538,7 +538,8 @@ SearchByTarget( IN int Mx,
if( ReqBuf == NULL ) if( ReqBuf == NULL )
return UPNP_E_OUTOF_MEMORY; return UPNP_E_OUTOF_MEMORY;
UpnpPrintf(UPNP_INFO, SSDP, __FILE__, __LINE__, ">>> SSDP SEND >>>\n"); UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
">>> SSDP SEND >>>\n%s\n", ReqBuf );
timeTillRead = Mx; timeTillRead = Mx;

View File

@@ -242,7 +242,7 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr,
// "If a multicast resource would send a response(s) to any copy of the // "If a multicast resource would send a response(s) to any copy of the
// request, it SHOULD send its response(s) to each copy of the request // request, it SHOULD send its response(s) to each copy of the request
// it receives. It MUST NOT repeat its response(s) per copy of the // it receives. It MUST NOT repeat its response(s) per copy of the
// request." // reuqest."
// //
// http://www.upnp.org/download/draft-goland-http-udp-04.txt // http://www.upnp.org/download/draft-goland-http-udp-04.txt
// //
@@ -335,7 +335,7 @@ CreateServicePacket( IN int msg_type,
&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, "HOST: ", SSDP_IP, ":", SSDP_PORT, 1, "HOST: ", SSDP_IP, ":", SSDP_PORT,
"CACHE-CONTROL: max-age=", duration, "CACHE-CONTROL: max-age=", duration,
"LOCATION: ", location, "LOCATION: ", location,
"NT: ", nt, "NT: ", nt,
@@ -530,6 +530,7 @@ 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.
@@ -606,9 +607,11 @@ 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
@@ -653,9 +656,11 @@ 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
@@ -695,6 +700,7 @@ 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.
@@ -815,4 +821,3 @@ DeviceShutdown( IN char *DevType,
#endif // EXCLUDE_SSDP #endif // EXCLUDE_SSDP
#endif // INCLUDE_DEVICE_APIS #endif // INCLUDE_DEVICE_APIS

View File

@@ -50,47 +50,47 @@
#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;
enum Listener { Idle, Stopping, Running }; enum Listener { Idle, Stopping, Running };
unsigned short ssdpStopPort; unsigned short ssdpStopPort;
struct SSDPSockArray { struct SSDPSockArray {
// socket for incoming advertisments and search requests int ssdpSock; //socket for incoming advertisments and search requests
int ssdpSock; CLIENTONLY( int ssdpReqSock;
// socket for sending search requests and receiving search replies ) //socket for sending search
CLIENTONLY( int ssdpReqSock; ) //requests and receiving
}; // search replies
};
#ifdef INCLUDE_DEVICE_APIS #ifdef INCLUDE_DEVICE_APIS
#if EXCLUDE_SSDP == 0 #if EXCLUDE_SSDP == 0
/************************************************************************ /************************************************************************
* Function : AdvertiseAndReply * Function : AdvertiseAndReply
* *
* Parameters: * Parameters:
* IN int AdFlag: * IN int AdFlag: -1 = Send shutdown, 0 = send reply,
* -1 = Send shutdown, * 1 = Send Advertisement
* 0 = send reply, * IN UpnpDevice_Handle Hnd: Device handle
* 1 = Send Advertisement * IN enum SsdpSearchType SearchType:Search type for sending replies
* IN UpnpDevice_Handle Hnd: Device handle * IN struct sockaddr_in *DestAddr:Destination address
* IN enum SsdpSearchType SearchType:Search type for sending replies * IN char *DeviceType:Device type
* IN struct sockaddr_in *DestAddr:Destination address * IN char *DeviceUDN:Device UDN
* IN char *DeviceType:Device type * IN char *ServiceType:Service type
* IN char *DeviceUDN:Device UDN * IN int Exp:Advertisement age
* IN char *ServiceType:Service type *
* IN int Exp:Advertisement age * Description:
* * This function sends SSDP advertisements, replies and shutdown messages.
* Description: *
* This function sends SSDP advertisements, replies and shutdown messages. * Returns: int
* * UPNP_E_SUCCESS if successful else appropriate error
* Returns: int ***************************************************************************/
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int AdvertiseAndReply( IN int AdFlag, int AdvertiseAndReply( IN int AdFlag,
IN UpnpDevice_Handle Hnd, IN UpnpDevice_Handle Hnd,
IN enum SsdpSearchType SearchType, IN enum SsdpSearchType SearchType,
@@ -120,14 +120,18 @@ int AdvertiseAndReply( IN int AdFlag,
"Inside AdvertiseAndReply with AdFlag = %d\n", "Inside AdvertiseAndReply with AdFlag = %d\n",
AdFlag ); AdFlag );
// Use a read lock 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;
} }
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 );
@@ -147,12 +151,14 @@ 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", dbgStr ); "Extracting device type once for %s\n",
dbgStr );
// extract device type // extract device type
ixmlNodeList_free( nodeList ); ixmlNodeList_free( nodeList );
nodeList = NULL; nodeList = NULL;
nodeList = ixmlElement_getElementsByTagName( nodeList =
( IXML_Element * ) tmpNode, "deviceType" ); ixmlElement_getElementsByTagName( ( IXML_Element * ) tmpNode,
"deviceType" );
if( nodeList == NULL ) { if( nodeList == NULL ) {
continue; continue;
} }
@@ -160,6 +166,7 @@ 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" );
@@ -234,7 +241,8 @@ 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 );
} }
@@ -316,9 +324,8 @@ 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;
@@ -360,21 +367,26 @@ 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)
@@ -389,27 +401,27 @@ int AdvertiseAndReply( IN int AdFlag,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting AdvertiseAndReply : \n" ); "Exiting AdvertiseAndReply : \n" );
HandleUnlock(); HandleUnlock( );
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} /****************** End of AdvertiseAndReply *********************/ } /****************** End of AdvertiseAndReply *********************/
#endif /* EXCLUDE_SSDP == 0 */ #endif
#endif /* INCLUDE_DEVICE_APIS */ #endif
/************************************************************************ /************************************************************************
* Function : Make_Socket_NoBlocking * Function : Make_Socket_NoBlocking
* *
* Parameters: * Parameters:
* IN int sock: socket * IN int sock: socket
* *
* Description: * Description:
* This function makes socket non-blocking. * This function makes socket non-blocking.
* *
* Returns: int * Returns: int
* 0 if successful else -1 * 0 if successful else -1
***************************************************************************/ ***************************************************************************/
int int
Make_Socket_NoBlocking( int sock ) Make_Socket_NoBlocking( int sock )
{ {
@@ -428,20 +440,20 @@ Make_Socket_NoBlocking( int sock )
} }
/************************************************************************ /************************************************************************
* Function : unique_service_name * Function : unique_service_name
* *
* Parameters: * Parameters:
* IN char *cmd: Service Name string * IN char *cmd: Service Name string
* OUT SsdpEvent *Evt: The SSDP event structure partially filled * OUT SsdpEvent *Evt: The SSDP event structure partially filled
* by all the function. * by all the function.
* *
* Description: * Description:
* This function fills the fields of the event structure like DeviceType, * This function fills the fields of the event structure like DeviceType,
* Device UDN and Service Type * Device UDN and Service Type
* *
* Returns: int * Returns: int
* 0 if successful else -1 * 0 if successful else -1
***************************************************************************/ ***************************************************************************/
int int
unique_service_name( IN char *cmd, unique_service_name( IN char *cmd,
IN SsdpEvent * Evt ) IN SsdpEvent * Evt )
@@ -523,18 +535,18 @@ unique_service_name( IN char *cmd,
} }
/************************************************************************ /************************************************************************
* Function : ssdp_request_type1 * Function : ssdp_request_type1
* *
* Parameters: * Parameters:
* IN char *cmd: command came in the ssdp request * IN char *cmd: command came in the ssdp request
* *
* Description: * Description:
* This function figures out the type of the SSDP search in the * This function figures out the type of the SSDP search in the
* in the request. * in the request.
* *
* Returns: enum SsdpSearchType * Returns: enum SsdpSearchType
* return appropriate search type else returns SSDP_ERROR * return appropriate search type else returns SSDP_ERROR
***************************************************************************/ ***************************************************************************/
enum SsdpSearchType enum SsdpSearchType
ssdp_request_type1( IN char *cmd ) ssdp_request_type1( IN char *cmd )
{ {
@@ -559,20 +571,20 @@ ssdp_request_type1( IN char *cmd )
} }
/************************************************************************ /************************************************************************
* Function : ssdp_request_type * Function : ssdp_request_type
* *
* Parameters: * Parameters:
* IN char *cmd: command came in the ssdp request * IN char *cmd: command came in the ssdp request
* OUT SsdpEvent *Evt: The event structure partially filled by * OUT SsdpEvent *Evt: The event structure partially filled by
* this function. * this function.
* *
* Description: * Description:
* This function starts filling the SSDP event structure based upon the * This function starts filling the SSDP event structure based upon the
* request received. * request received.
* *
* Returns: int * Returns: int
* 0 on success; -1 on error * 0 on success; -1 on error
***************************************************************************/ ***************************************************************************/
int int
ssdp_request_type( IN char *cmd, ssdp_request_type( IN char *cmd,
OUT SsdpEvent * Evt ) OUT SsdpEvent * Evt )
@@ -590,18 +602,18 @@ ssdp_request_type( IN char *cmd,
} }
/************************************************************************ /************************************************************************
* Function : free_ssdp_event_handler_data * Function : free_ssdp_event_handler_data
* *
* Parameters: * Parameters:
* IN void *the_data: ssdp_thread_data structure. This structure contains * IN void *the_data: ssdp_thread_data structure. This structure contains
* SSDP request message. * SSDP request message.
* *
* Description: * Description:
* This function frees the ssdp request * This function frees the ssdp request
* *
* Returns: VOID * Returns: VOID
* *
***************************************************************************/ ***************************************************************************/
static void static void
free_ssdp_event_handler_data( void *the_data ) free_ssdp_event_handler_data( void *the_data )
{ {
@@ -617,18 +629,18 @@ free_ssdp_event_handler_data( void *the_data )
} }
/************************************************************************ /************************************************************************
* Function : valid_ssdp_msg * Function : valid_ssdp_msg
* *
* Parameters: * Parameters:
* IN void *the_data: ssdp_thread_data structure. This structure contains * IN void *the_data: ssdp_thread_data structure. This structure contains
* SSDP request message. * SSDP request message.
* *
* Description: * Description:
* This function do some quick checking of the ssdp msg * This function do some quick checking of the ssdp msg
* *
* Returns: xboolean * Returns: xboolean
* returns TRUE if msg is valid else FALSE * returns TRUE if msg is valid else FALSE
***************************************************************************/ ***************************************************************************/
static UPNP_INLINE xboolean static UPNP_INLINE xboolean
valid_ssdp_msg( IN http_message_t * hmsg ) valid_ssdp_msg( IN http_message_t * hmsg )
{ {
@@ -658,19 +670,19 @@ valid_ssdp_msg( IN http_message_t * hmsg )
} }
/************************************************************************ /************************************************************************
* Function : start_event_handler * Function : start_event_handler
* *
* Parameters: * Parameters:
* IN void *the_data: ssdp_thread_data structure. This structure contains * IN void *the_data: ssdp_thread_data structure. This structure contains
* SSDP request message. * SSDP request message.
* *
* Description: * Description:
* This function parses the message and dispatches it to a handler * This function parses the message and dispatches it to a handler
* which handles the ssdp request msg * which handles the ssdp request msg
* *
* Returns: int * Returns: int
* 0 if successful -1 if error * 0 if successful -1 if error
***************************************************************************/ ***************************************************************************/
static UPNP_INLINE int static UPNP_INLINE int
start_event_handler( void *Data ) start_event_handler( void *Data )
{ {
@@ -710,18 +722,18 @@ start_event_handler( void *Data )
} }
/************************************************************************ /************************************************************************
* Function : ssdp_event_handler_thread * Function : ssdp_event_handler_thread
* *
* Parameters: * Parameters:
* IN void *the_data: ssdp_thread_data structure. This structure contains * IN void *the_data: ssdp_thread_data structure. This structure contains
* SSDP request message. * SSDP request message.
* *
* Description: * Description:
* This function is a thread that handles SSDP requests. * This function is a thread that handles SSDP requests.
* *
* Returns: void * Returns: void
* *
***************************************************************************/ ***************************************************************************/
static void static void
ssdp_event_handler_thread( void *the_data ) ssdp_event_handler_thread( void *the_data )
{ {
@@ -734,7 +746,8 @@ 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, FALSE, NULL );) CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, &data->dest_addr,
FALSE, NULL ););
} else { } else {
ssdp_handle_device_request( hmsg, &data->dest_addr ); ssdp_handle_device_request( hmsg, &data->dest_addr );
} }
@@ -744,17 +757,17 @@ ssdp_event_handler_thread( void *the_data )
} }
/************************************************************************ /************************************************************************
* Function : readFromSSDPSocket * Function : readFromSSDPSocket
* *
* Parameters: * Parameters:
* IN SOCKET socket: SSDP socket * IN SOCKET socket: SSDP socket
* *
* Description: * Description:
* This function reads the data from the ssdp socket. * This function reads the data from the ssdp socket.
* *
* Returns: void * Returns: void
* *
***************************************************************************/ ***************************************************************************/
void void
readFromSSDPSocket( SOCKET socket ) readFromSSDPSocket( SOCKET socket )
{ {
@@ -806,20 +819,18 @@ 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__,
"Start of received response ----------------------------------------------------\n" "Received response !!! "
"%s\n" "%s From host %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__,
"Start of received multicast packet --------------------------------------------\n" "Received multicast packet:"
"%s\n" "\n %s\n", requestBuf );
"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;
@@ -841,98 +852,98 @@ readFromSSDPSocket( SOCKET socket )
} }
/************************************************************************ /************************************************************************
* Function : get_ssdp_sockets * Function : get_ssdp_sockets
* *
* Parameters: * Parameters:
* OUT MiniServerSockArray *out: Arrays of SSDP sockets * OUT MiniServerSockArray *out: Arrays of SSDP sockets
* *
* Description: * Description:
* This function creates the ssdp sockets. It set their option to listen * This function creates the ssdp sockets. It set their option to listen
* for multicast traffic. * for multicast traffic.
* *
* Returns: int * Returns: int
* return UPNP_E_SUCCESS if successful else returns appropriate error * return UPNP_E_SUCCESS if successful else returns appropriate error
***************************************************************************/ ***************************************************************************/
int int
get_ssdp_sockets( MiniServerSockArray * out ) get_ssdp_sockets( MiniServerSockArray * out )
{ {
SOCKET ssdpSock;
CLIENTONLY( SOCKET ssdpReqSock;
)
int onOff = 1; int onOff = 1;
u_char ttl = 4; u_char ttl = 4;
struct ip_mreq ssdpMcastAddr; struct ip_mreq ssdpMcastAddr;
struct sockaddr_in ssdpAddr; struct sockaddr_in ssdpAddr;
int option = 1; int option = 1;
struct in_addr addr; struct in_addr addr;
SOCKET ssdpSock;
#if INCLUDE_CLIENT_APIS
SOCKET ssdpReqSock;
if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) { CLIENTONLY( if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) )
== UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL, UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__, SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" ); "Error in socket operation !!!\n" );
return UPNP_E_OUTOF_SOCKET;}
return UPNP_E_OUTOF_SOCKET; setsockopt( ssdpReqSock,
} IPPROTO_IP,
setsockopt( ssdpReqSock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
// just do it, regardless if fails or not. // just do it, regardless if fails or not.
Make_Socket_NoBlocking( ssdpReqSock ); Make_Socket_NoBlocking( ssdpReqSock ); gSsdpReqSocket = ssdpReqSock; ) //CLIENTONLY
gSsdpReqSocket = ssdpReqSock;
#endif /* INCLUDE_CLIENT_APIS */
if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) { if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) )
== UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL, UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__, SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" ); "Error in socket operation !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
return UPNP_E_OUTOF_SOCKET; return UPNP_E_OUTOF_SOCKET;
} }
onOff = 1; onOff = 1;
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR, if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR,
( char * )&onOff, sizeof( onOff ) ) != 0 ) { ( char * )&onOff, sizeof( onOff ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL, UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__, SSDP, __FILE__, __LINE__,
"Error in set reuse addr !!!\n" ); "Error in set reuse addr !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
shutdown( ssdpSock, SD_BOTH ); shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock ); UpnpCloseSocket( ssdpSock );
return UPNP_E_SOCKET_ERROR; return UPNP_E_SOCKET_ERROR;
} }
#if defined(__FreeBSD__) || defined(__OSX__) || defined(__APPLE__) #ifdef __FreeBSD__
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT, if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT,
( char * )&onOff, sizeof( onOff ) ) != 0 ) { ( char * )&onOff, sizeof( onOff ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL, UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__, SSDP, __FILE__, __LINE__,
"Error in set reuse port !!!\n" ); "Error in set reuse port !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
shutdown( ssdpSock, SD_BOTH ); shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock ); UpnpCloseSocket( ssdpSock );
return UPNP_E_SOCKET_ERROR; return UPNP_E_SOCKET_ERROR;
} }
#endif /* __FreeBSD__ */ #endif
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( ssdpSock, ( struct sockaddr * )&ssdpAddr, if( bind
( ssdpSock, ( struct sockaddr * )&ssdpAddr,
sizeof( ssdpAddr ) ) != 0 ) { sizeof( ssdpAddr ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL, UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__, SSDP, __FILE__, __LINE__,
"Error in binding !!!\n" ); "Error in binding !!!\n" );
shutdown( ssdpSock, SD_BOTH ); shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock ); UpnpCloseSocket( ssdpSock );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
return UPNP_E_SOCKET_BIND; return UPNP_E_SOCKET_BIND;
} }
@@ -940,49 +951,47 @@ get_ssdp_sockets( MiniServerSockArray * out )
ssdpMcastAddr.imr_interface.s_addr = inet_addr( LOCAL_HOST ); ssdpMcastAddr.imr_interface.s_addr = inet_addr( LOCAL_HOST );
ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP ); ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP );
if( setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, if( setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
( char * )&ssdpMcastAddr, sizeof( struct ip_mreq ) ) != 0 ) { ( char * )&ssdpMcastAddr,
sizeof( struct ip_mreq ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL, UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__, SSDP, __FILE__, __LINE__,
"Error in joining" " multicast group !!!\n" ); "Error in joining" " multicast group !!!\n" );
shutdown( ssdpSock, SD_BOTH ); shutdown( ssdpSock, SD_BOTH );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
UpnpCloseSocket( ssdpSock ); UpnpCloseSocket( ssdpSock );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
return UPNP_E_SOCKET_ERROR; return UPNP_E_SOCKET_ERROR;
} }
/* 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, if (setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF,
(char *)&addr, sizeof addr) != 0) { (char *)&addr, sizeof addr) != 0) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"Couldn't set multicast interface.\n" ); "Couldn't set multicast interface.\n" );
/* This is probably not a critical error, so let's continue. */ /* This is probably not a critical error, so let's continue. */
} }
/* result is not checked becuase it will fail in WinMe and Win9x. */ // result is not checked becuase it will fail in WinMe and Win9x.
setsockopt( ssdpSock, IPPROTO_IP, setsockopt( ssdpSock, IPPROTO_IP,
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST, if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST,
(char *)&option, sizeof(option) ) != 0) { ( char * )&option, sizeof( option ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL, UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__, SSDP, __FILE__, __LINE__,
"Error in setting broadcast !!!\n" ); "Error in setting broadcast !!!\n" );
shutdown( ssdpSock, SD_BOTH ); shutdown( ssdpSock, SD_BOTH );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); ) CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
UpnpCloseSocket( ssdpSock ); UpnpCloseSocket( ssdpSock );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); ) CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
return UPNP_E_NETWORK_ERROR; return UPNP_E_NETWORK_ERROR;
} }
CLIENTONLY( out->ssdpReqSock = ssdpReqSock; ) CLIENTONLY( out->ssdpReqSock = ssdpReqSock;
);
out->ssdpSock = ssdpSock; out->ssdpSock = ssdpSock;
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }
#endif /* EXCLUDE_SSDP */ #endif // EXCLUDE_SSDP

View File

@@ -32,7 +32,6 @@
#include "config.h" #include "config.h"
#include <assert.h> #include <assert.h>
#ifndef WIN32 #ifndef WIN32
#include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <arpa/inet.h> #include <arpa/inet.h>

View File

@@ -50,11 +50,22 @@
#define S43 15 #define S43 15
#define S44 21 #define S44 21
static void MD5Transform PROTO_LIST((UINT4[4], unsigned char[64])); static void MD5Transform PROTO_LIST( ( UINT4[4],
static void Encode PROTO_LIST((unsigned char *, UINT4 *, unsigned int)); unsigned char[64] ) );
static void Decode PROTO_LIST((UINT4 *, unsigned char *, unsigned int)); static void Encode PROTO_LIST( ( unsigned char *,
static void MD5_memcpy PROTO_LIST((POINTER, POINTER, unsigned int)); UINT4 *,
static void MD5_memset PROTO_LIST((POINTER, int, unsigned 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,
@@ -107,10 +118,14 @@ 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(MD5_CTX * context) MD5Init( 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;
@@ -124,72 +139,114 @@ MD5Init(MD5_CTX * context)
*/ */
void void
MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen) MD5Update( context,
input,
inputLen )
MD5_CTX *context; /* context */
unsigned char *input; /* input block */
unsigned int inputLen; /* length of input block */
{ {
unsigned int i; unsigned int i,
unsigned int index; index,
unsigned int partLen; partLen;
/* Compute number of bytes mod 64 */ /*
index = (unsigned int)((context->count[0] >> 3) & 0x3F); Compute number of bytes mod 64
*/
index = ( unsigned int )( ( context->count[0] >> 3 ) & 0x3F );
/* Update number of bits */ /*
if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) { Update number of bits
*/
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. */ /*
if (inputLen >= partLen) { Transform as many times as possible.
MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen); */
MD5Transform(context->state, context->buffer); if( inputLen >= partLen ) {
for (i = partLen; i + 63 < inputLen; i += 64) {
MD5Transform(context->state, &input[i]); MD5_memcpy
} ( ( POINTER ) & context->buffer[index], ( POINTER ) input,
index = 0; partLen );
} else { MD5Transform( context->state, context->buffer );
i = 0;
} for( i = partLen; i + 63 < inputLen; i += 64 )
MD5Transform( context->state, &input[i] );
index = 0;
} else
i = 0;
/*
Buffer remaining input
*/
MD5_memcpy
( ( POINTER ) & context->buffer[index], ( POINTER ) & input[i],
inputLen - i );
/* Buffer remaining input */
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(unsigned char digest[16], MD5_CTX *context) MD5Final( digest,
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,
unsigned int padLen; padLen;
/* Save number of bits */ /*
Encode(bits, context->count, 8); Save number of bits
*/
Encode( bits, context->count, 8 );
/* Pad out to 56 mod 64. */ /*
index = (unsigned int)((context->count[0] >> 3) & 0x3f); Pad out to 56 mod 64.
padLen = (index < 56) ? (56 - index) : (120 - index); */
MD5Update(context, PADDING, padLen); index = ( unsigned int )( ( context->count[0] >> 3 ) & 0x3f );
/* Append length (before padding) */ padLen = ( index < 56 ) ? ( 56 - index ) : ( 120 - index );
MD5Update(context, bits, 8);
/* Store state in digest */ MD5Update( context, PADDING, padLen );
Encode(digest, context->state, 16);
/*
Append length (before padding)
*/
MD5Update( context, bits, 8 );
/*
Store state in digest
*/
Encode( digest, context->state, 16 );
/*
Zeroize sensitive information.
*/
MD5_memset( ( POINTER ) context, 0, sizeof( *context ) );
/* Zeroize sensitive information. */
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(UINT4 state[4], unsigned char block[64]) MD5Transform( state,
block )
UINT4 state[4];
unsigned char block[64];
{ {
UINT4 a = state[0], UINT4 a = state[0],
b = state[1], b = state[1],
@@ -296,16 +353,23 @@ MD5Transform(UINT4 state[4], unsigned char block[64])
a multiple of 4. a multiple of 4.
*/ */
static void static void
Encode(unsigned char *output, UINT4 *input, unsigned int len) Encode( output,
input,
len )
unsigned char *output;
UINT4 *input;
unsigned int len;
{ {
unsigned int i; unsigned int i,
unsigned int j; j;
for (i = 0, j = 0; j < len; ++i, j += 4) {
output[j+0] = (unsigned char)((input[i] >> 0) & 0xff); for( i = 0, j = 0; j < len; i++, j += 4 ) {
output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); output[j] = ( unsigned char )( input[i] & 0xff );
output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); output[j + 1] = ( unsigned char )( ( input[i] >> 8 ) & 0xff );
output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); output[j + 2] = ( unsigned char )( ( input[i] >> 16 ) & 0xff );
output[j + 3] = ( unsigned char )( ( input[i] >> 24 ) & 0xff );
} }
} }
/* /*
@@ -314,40 +378,55 @@ Encode(unsigned char *output, UINT4 *input, unsigned int len)
*/ */
static void static void
Decode(UINT4 *output, unsigned char *input, unsigned int len) Decode( output,
input,
len )
UINT4 *output;
unsigned char *input;
unsigned int len;
{ {
unsigned int i; unsigned int i,
unsigned int j; 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+0]) << 0) | ( ( UINT4 ) input[j] ) | ( ( ( UINT4 ) input[j + 1] ) << 8 ) |
(((UINT4)input[j+1]) << 8) | ( ( ( UINT4 ) input[j + 2] ) << 16 ) |
(((UINT4)input[j+2]) << 16) | ( ( ( UINT4 ) input[j + 3] ) << 24 );
(((UINT4)input[j+3]) << 24);
}
} }
/* /*
Note: Replace for loop with standard memcpy if possible. Note: Replace &quot;for loop&quot; with standard memcpy if possible.
*/ */
static void static void
MD5_memcpy(POINTER output, POINTER input, unsigned int len) MD5_memcpy( output,
input,
len )
POINTER output;
POINTER input;
unsigned int len;
{ {
unsigned int i; unsigned int i;
for (i = 0; i < len; ++i) {
for( i = 0; i < len; i++ )
output[i] = input[i]; output[i] = input[i];
}
} }
/* /*
Note: Replace for loop with standard memset if possible. Note: Replace &quot;for loop&quot; with standard memset if possible.
*/ */
static void static void
MD5_memset(POINTER output, int value, unsigned int len) MD5_memset( output,
value,
len )
POINTER output;
int value;
unsigned int len;
{ {
unsigned int i; unsigned int i;
for (i = 0; i < len; ++i) {
((char *)output)[i] = (char)value;
}
}
for( i = 0; i < len; i++ )
( ( char * )output )[i] = ( char )value;
}

View File

@@ -33,16 +33,17 @@
This sample implementation generates a random node ID This sample implementation generates a random node ID
*/ */
void void
get_ieee_node_identifier(uuid_node_t *node) get_ieee_node_identifier( uuid_node_t * node )
{ {
char seed[16]; char seed[16];
static int inited = 0; static int inited = 0;
static uuid_node_t saved_node; static uuid_node_t saved_node;
if (!inited) { if( !inited ) {
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;
}; };
@@ -82,7 +83,7 @@ get_system_time( uuid_time_t * uuid_time )
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
void void
get_random_info(char seed[16]) get_random_info( char seed[16] )
{ {
MD5_CTX c; MD5_CTX c;
typedef struct { typedef struct {
@@ -96,34 +97,38 @@ get_random_info(char seed[16])
} randomness; } randomness;
randomness r; randomness r;
/* Initialize memory area so that valgrind does not complain */ MD5Init( &c );
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 */ /*
r.tc = GetTickCount(); milliseconds since last boot
*/
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 */ MD5Final( seed, &c );
MD5Init(&c);
MD5Update(&c, &r, sizeof r);
MD5Final(seed, &c);
}; };
#else
#else /* _WINDOWS_ */
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
void void
get_system_time(uuid_time_t *uuid_time) get_system_time( uuid_time_t * uuid_time )
{ {
struct timeval tp; struct timeval tp;
@@ -140,28 +145,22 @@ get_system_time(uuid_time_t *uuid_time)
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
void void
get_random_info(char seed[16]) get_random_info( char seed[16] )
{ {
MD5_CTX c; MD5_CTX c;
typedef struct { typedef struct {
//struct sysinfo s; // struct sysinfo s;
struct timeval t; struct timeval t;
char hostname[257]; char hostname[257];
} randomness; } randomness;
randomness r; randomness r;
/* Initialize memory area so that valgrind does not complain */ MD5Init( &c );
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 ) );
MD5Final( seed, &c );
/* MD5 it */
MD5Init(&c);
MD5Update(&c, &r, sizeof r);
MD5Final(seed, &c);
}; };
#endif /* _WINDOWS_ */ #endif

View File

@@ -53,10 +53,10 @@ static unsigned16 true_random( void );
uuid_create -- generator a UUID uuid_create -- generator a UUID
*/ */
int int
uuid_create(uuid_upnp *uid) uuid_create( uuid_upnp * uid )
{ {
uuid_time_t timestamp; uuid_time_t timestamp,
uuid_time_t last_time; last_time;
unsigned16 clockseq; unsigned16 clockseq;
uuid_node_t node; uuid_node_t node;
uuid_node_t last_node; uuid_node_t last_node;
@@ -65,64 +65,61 @@ uuid_create(uuid_upnp *uid)
/* /*
acquire system wide lock so we're alone acquire system wide lock so we're alone
*/ */
UUIDLock(); UUIDLock( );
/* /*
get current time get current time
*/ */
get_current_time(&timestamp); get_current_time( &timestamp );
/* /*
get node ID get node ID
*/ */
get_ieee_node_identifier(&node); get_ieee_node_identifier( &node );
/* /*
get saved state from NV storage get saved state from NV storage
*/ */
f = read_state(&clockseq, &last_time, &last_node); f = read_state( &clockseq, &last_time, &last_node );
/* /*
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
*/ */
format_uuid_v1(uid, clockseq, timestamp, node); format_uuid_v1( uid, clockseq, timestamp, node );
/* /*
save the state for next time save the state for next time
*/ */
write_state(clockseq, timestamp, node); write_state( clockseq, timestamp, node );
UUIDUnlock(); UUIDUnlock( );
return 1; return ( 1 );
}; };
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
void void
uuid_unpack(uuid_upnp *u, char *out) uuid_unpack( uuid_upnp * u,
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, ( unsigned int )u->time_low, u->time_mid,
u->time_mid, u->time_hi_and_version, u->clock_seq_hi_and_reserved,
u->time_hi_and_version, u->clock_seq_low, u->node[0], u->node[1], u->node[2],
u->clock_seq_hi_and_reserved, u->node[3], u->node[4], u->node[5] );
u->clock_seq_low,
u->node[0], *( out + 36 ) = '\0';
u->node[1],
u->node[2],
u->node[3],
u->node[4],
u->node[5]);
}; };
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
@@ -140,10 +137,11 @@ format_uuid_v1( uuid_upnp * uid,
Construct a version 1 uuid with the information we've gathered Construct a version 1 uuid with the information we've gathered
* plus a few constants. * plus a few constants.
*/ */
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) & 0x0FFF); uid->time_hi_and_version = ( unsigned short )( ( timestamp >> 48 ) &
uid->time_hi_and_version |= (1 << 12); 0x0FFF );
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;
uid->clock_seq_hi_and_reserved |= 0x80; uid->clock_seq_hi_and_reserved |= 0x80;
@@ -229,6 +227,7 @@ 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 ("Initializing UPnP ... \n"); printf ("Intializing 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();