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
48 changed files with 1188 additions and 1803 deletions

176
ChangeLog
View File

@@ -1,121 +1,7 @@
*******************************************************************************
Version 1.6.1
Version 1.4.7
*******************************************************************************
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.
2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Added support for the Basic Device
(http://www.upnp.org/standardizeddcps/basic.asp) as suggested by
@@ -478,14 +364,14 @@ Version 1.4.0
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
* upnp/src/gena/gena_device.c (respond_ok): add 'Content-Length: 0'
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
the one in libupnp-doc-1.2.1 because current CVS version
@@ -496,20 +382,20 @@ FORK FROM DEAD libupnp
* changes applied to several files to work under Sparc Solaris, temporarily
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
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
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
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
CDATA sections which contain a 0 (zero) to be parsed (instead the
@@ -520,18 +406,18 @@ FORK FROM DEAD libupnp
option, and move samples compilation from check_PROGRAMS to
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):
fix bug if new socket created has fd 0 (can only occur when stdin
has been closed). Patch by Oskar Liljeblad 2004-07-02 :
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
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
@@ -546,11 +432,11 @@ FORK FROM DEAD libupnp
dependencies between upnp and ixml / threadutil, so that programs
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
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
package version string from configure to set sdk info
@@ -558,7 +444,7 @@ FORK FROM DEAD libupnp
* upnp/Makefile.am: add sample/tvdevice/web/ files in EXTRA_DIST
+ 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_HAVE_xx instead of INCLUDE_yyy_APIS and INTERNAL_WEB_SERVER
@@ -567,7 +453,7 @@ FORK FROM DEAD libupnp
the librarie LDFLAGS in order to export only the symbols defined
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
@@ -575,7 +461,7 @@ FORK FROM DEAD libupnp
* 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
to "iasnprintf"
@@ -596,11 +482,11 @@ FORK FROM DEAD libupnp
the configuration of the installed libraries (generates installed
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
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
exported into "upnp/src/inc/util.h"
@@ -608,12 +494,12 @@ FORK FROM DEAD libupnp
* import all modifications below from libupnp in djmount 0.51
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
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
@@ -633,53 +519,53 @@ FORK FROM DEAD libupnp
* ixml/src/node.c (ixmlNode_getNodeType): fix compilation warning
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
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/src/inc/httpreadwrite.h: remove internal configuration variable
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,
for binary compatibility with previous libupnp version.
* 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
for automake support, + preliminary autoconf support
(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/sample/tvctrlpt/linux/Makefile,
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
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/ixmlparser.h, ixml/src/ixmlparser.c (Parser_setErrorChar) :
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
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):
remove some compilation warning
@@ -690,7 +576,7 @@ FORK FROM DEAD libupnp
* upnp/inc/upnptools.h, upnp/src/api/upnptools.c :
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)
and replace by DEFAULT_SOAP_CONTENT_LENGTH (previously in upnpapi.h)
@@ -711,7 +597,7 @@ FORK FROM DEAD libupnp
* upnp/src/genlib/net/http/httpreadwrite.c : corrected an incorrect
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,
ixml/Makefile, ixml/src/Makefile,
@@ -719,7 +605,7 @@ FORK FROM DEAD libupnp
implement STATIC library support (from patch at
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/soap/makefile :

View File

@@ -1,7 +1,8 @@
#
# 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

2
README
View File

@@ -1,7 +1,7 @@
Portable SDK for UPnP* Devices (libupnp)
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>
See LICENSE for details.

7
THANKS
View File

@@ -6,9 +6,7 @@ suggesting various improvements or submitting actual code.
Here is a list of these people. Help us keep it complete and
exempt of errors.
- Alex (afaucher)
- Arno Willig
- Bob Ciora
- Chaos
- Craig Nelson
- David Maass
@@ -21,19 +19,16 @@ exempt of errors.
- Jiri Zouhar
- John Dennis
- Jonathan (no_dice)
- Keith Brindley
- Leuk_He
- Loigu
- Luke Kim
- Marcelo Roberto Jimenez (mroberto)
- Marcelo Roberto Jimenez
- Markus Strobl
- Nektarios K. Papadopoulos
- Oskar Liljeblad
- Michael (Oxy)
- Paul Vixie
- Rene Hexel
- Siva Chandran
- Stéphane Corthésy
- Timothy Redaelli
- Titus Winters

View File

@@ -261,18 +261,18 @@
/** @name Other debugging features
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_SSDP 0
#define DEBUG_SOAP 0
#define DEBUG_GENA 0
#define DEBUG_TPOOL 0
#define DEBUG_ALL 1
#define DEBUG_SSDP 0
#define DEBUG_SOAP 0
#define DEBUG_GENA 0
#define DEBUG_TPOOL 0
#define DEBUG_MSERV 0
#define DEBUG_DOM 0
#define DEBUG_HTTP 0
#define DEBUG_API 0
#define DEBUG_API 0
//@} // Compile time configuration options

View File

@@ -2,7 +2,7 @@
// -*- C -*-
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
// Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without

View File

@@ -5,17 +5,17 @@
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=libupnp - Win32 Debug
!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 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
!MESSAGE NMAKE /f "libupnp.mak".
!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
!MESSAGE NMAKE /f "libupnp.mak" CFG="libupnp - Win32 Debug"
!MESSAGE
!MESSAGE F<>r die Konfiguration stehen zur Auswahl:
!MESSAGE F<>r die Konfiguration stehen zur Auswahl:
!MESSAGE
!MESSAGE "libupnp - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library")
!MESSAGE "libupnp - Win32 Debug" (basierend auf "Win32 (x86) Dynamic-Link Library")

View File

@@ -4,15 +4,14 @@
#
# 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_INIT([libupnp], [1.6.1], [mroberto@users.sourceforge.net])
###############################################################################
AC_INIT([libupnp], [1.4.7], [mroberto@users.sourceforge.net])
# *Independently* of the above libupnp package version, the libtool version
# of the 3 libraries need to be updated whenever there is a change released:
# of the 3 libraries need to be updated whenever there is a change released :
# "current:revision:age" (this is NOT the same as the package version), where:
# - library code modified: revision++
# - interfaces changed/added/removed: current++ and revision=0
@@ -20,14 +19,11 @@ AC_INIT([libupnp], [1.6.1], [mroberto@users.sourceforge.net])
# - interfaces removed: age=0
# *please update only once, before a formal release, not for each change*
#
###############################################################################
# Release 1.4.1:
# For release 1.4.1, we had:
#AC_SUBST([LT_VERSION_IXML], [2:2:0])
#AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0])
#AC_SUBST([LT_VERSION_UPNP], [2:2:0])
#
###############################################################################
# Release 1.4.6:
# "current:revision:age"
#
# - Code has changed in ixml
@@ -38,73 +34,19 @@ AC_INIT([libupnp], [1.6.1], [mroberto@users.sourceforge.net])
# current: 2 -> 3
# revisiion: 3 -> 0
# age: 0 -> 1
# - Code has changed in upnp
# - Code has changed in upnp (revision 2 -> 3)
# revision: 2 -> 3
#
#AC_SUBST([LT_VERSION_IXML], [2:3:0])
#AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1])
#AC_SUBST([LT_VERSION_UPNP], [2:3:0])
#
###############################################################################
# Release 1.6.0:
# "current:revision:age"
#
# - Code has changed in ixml
# revision: 3 -> 4
# - Code has changed in threadutil
# revision: 0 -> 1
# - Code has changed in upnp
# revision: 3 -> 4
# - Interface changed in upnp
# current: 2 -> 3
# revision: 4 -> 0
# - Interface removed in upnp
# age: 0 -> 0
#
#AC_SUBST([LT_VERSION_IXML], [2:4:0])
#AC_SUBST([LT_VERSION_THREADUTIL], [3:1:1])
#AC_SUBST([LT_VERSION_UPNP], [3:0:0])
#
###############################################################################
# Release 1.6.1:
# "current:revision:age"
#
# - Code has changed in threadutil
# revision: 1 -> 2
# - Interface added in threadutil
# current: 3 -> 4
# revision: 2 -> 0
# - Interface added in threadutil
# age: 1 -> 2
# - Code has changed in upnp
# revision: 0 -> 1
#
#AC_SUBST([LT_VERSION_IXML], [2:4:0])
#AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2])
#AC_SUBST([LT_VERSION_UPNP], [3:1:0])
#
###############################################################################
AC_SUBST([LT_VERSION_IXML], [2:4:0])
AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2])
AC_SUBST([LT_VERSION_UPNP], [3:1:0])
###############################################################################
# Repeating the algorithm so that it is closer to the modificatin place:
# - library code modified: revision++
# - interfaces changed/added/removed: current++ and revision=0
# - interfaces added: age++
# - interfaces removed: age=0
# *please update only once, before a formal release, not for each change*
###############################################################################
AC_SUBST([LT_VERSION_IXML], [2:3:0])
AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1])
AC_SUBST([LT_VERSION_UPNP], [2:3:0])
AC_CONFIG_AUX_DIR(config.aux)
AC_CONFIG_MACRO_DIR(m4)
AC_CONFIG_SRCDIR(upnp/inc/upnp.h)
AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects dist-bzip2])
#
# Get canonical host names in host and host_os
#

View File

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

View File

@@ -1,4 +1,4 @@
Version: 1.4.2
Version: 1.4.7
Summary: Universal Plug and Play (UPnP) SDK
Name: libupnp
Release: 1%{?dist}
@@ -77,6 +77,9 @@ make install DESTDIR=$RPM_BUILD_ROOT
rm -rf %{buildroot}
%changelog
* Mon Nov 19 2007 Marcelo Jimenez <mroberto@users.sourceforge.net> - 1.4.7-1
- Update to version 1.4.7
* Fri Feb 02 2007 Eric Tanguy <eric.tanguy@univ-nantes.fr> - 1.4.2-1
- Update to version 1.4.2

View File

@@ -1,88 +1,50 @@
##### http://autoconf-archive.cryp.to/acx_pthread.html
#
# SYNOPSIS
#
# ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
#
# DESCRIPTION
#
# This macro figures out how to build C programs using POSIX threads.
# It sets the PTHREAD_LIBS output variable to the threads library and
# linker flags, and the PTHREAD_CFLAGS output variable to any special
# C compiler flags that are needed. (The user can also force certain
# compiler flags/libs to be tested by setting these environment
# variables.)
#
# Also sets PTHREAD_CC to any special C compiler that is needed for
# multi-threaded programs (defaults to the value of CC otherwise).
# (This is necessary on AIX to use the special cc_r compiler alias.)
#
# NOTE: You are assumed to not only compile your program with these
# flags, but also link it with them as well. e.g. you should link
# with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
# $LIBS
#
# If you are only building threads programs, you may wish to use
# these variables in your default LIBS, CFLAGS, and CC:
#
# LIBS="$PTHREAD_LIBS $LIBS"
# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
# CC="$PTHREAD_CC"
#
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
# constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
#
# ACTION-IF-FOUND is a list of shell commands to run if a threads
# library is found, and ACTION-IF-NOT-FOUND is a list of commands to
# run it if it is not found. If ACTION-IF-FOUND is not specified, the
# default action will define HAVE_PTHREAD.
#
# Please let the authors know if this macro fails on any platform, or
# if you have any other suggestions or comments. This macro was based
# on work by SGJ on autoconf scripts for FFTW (http://www.fftw.org/)
# (with help from M. Frigo), as well as ac_pthread and hb_pthread
# macros posted by Alejandro Forero Cuervo to the autoconf macro
# repository. We are also grateful for the helpful feedback of
# numerous users.
#
# 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.
dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
dnl
dnl @summary figure out how to build C programs using POSIX threads
dnl
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
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
dnl compiler flags/libs to be tested by setting these environment
dnl variables.)
dnl
dnl Also sets PTHREAD_CC to any special C compiler that is needed for
dnl multi-threaded programs (defaults to the value of CC otherwise).
dnl (This is necessary on AIX to use the special cc_r compiler alias.)
dnl
dnl 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 with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
dnl $LIBS
dnl
dnl If you are only building threads programs, you may wish to use
dnl these variables in your default LIBS, CFLAGS, and CC:
dnl
dnl LIBS="$PTHREAD_LIBS $LIBS"
dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
dnl CC="$PTHREAD_CC"
dnl
dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
dnl
dnl 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 run it if it is not found. If ACTION-IF-FOUND is not specified, the
dnl default action will define HAVE_PTHREAD.
dnl
dnl Please let the authors know if this macro fails on any platform, or
dnl if you have any other suggestions or comments. This macro was based
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
dnl posted by Alejandro Forero Cuervo to the autoconf macro repository.
dnl We are also grateful for the helpful feedback of numerous users.
dnl
dnl @category InstalledPackages
dnl @author Steven G. Johnson <stevenj@alum.mit.edu>
dnl @version 2005-06-15
dnl @license GPLWithACException
AC_DEFUN([ACX_PTHREAD], [
AC_REQUIRE([AC_CANONICAL_HOST])
@@ -254,12 +216,8 @@ if test "x$acx_pthread_ok" = xyes; then
LIBS="$save_LIBS"
CFLAGS="$save_CFLAGS"
# More AIX lossage: must compile with xlc_r or cc_r
if test x"$GCC" != xyes; then
AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
else
PTHREAD_CC=$CC
fi
# More AIX lossage: must compile with cc_r
AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC})
else
PTHREAD_CC="$CC"
fi

View File

@@ -1,87 +1,48 @@
##### http://autoconf-archive.cryp.to/ax_cflags_gcc_option.html
#
# SYNOPSIS
#
# AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]])
#
# DESCRIPTION
#
# AX_CFLAGS_GCC_OPTION(-fvomit-frame) would show a message as like
# "checking CFLAGS for gcc -fvomit-frame ... yes" and adds the
# optionflag to CFLAGS if it is understood. You can override the
# shellvar-default of CFLAGS of course. The order of arguments stems
# from the explicit macros like AX_CFLAGS_WARN_ALL.
#
# The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add
# to CXXFLAGS - and it uses the autoconf setup for C++ instead of C
# (since it is possible to use different compilers for C and C++).
#
# The macro is a lot simpler than any special AX_CFLAGS_* macro (or
# ac_cxx_rtti.m4 macro) but allows to check for arbitrary options.
# However, if you use this macro in a few places, it would be great
# if you would make up a new function-macro and submit it to the
# ac-archive.
#
# - $1 option-to-check-for : required ("-option" as non-value)
# - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case)
# - $3 action-if-found : add value to shellvariable
# - $4 action-if-not-found : nothing
#
# note: in earlier versions, $1-$2 were swapped. We try to detect the
# situation and accept a $2=~/-/ as being the old
# option-to-check-for.
#
# also: there are other variants that emerged from the original macro
# variant which did just test an option to be possibly added.
# However, some compilers accept an option silently, or possibly for
# just another option that was not intended. Therefore, we have to do
# a generic test for a compiler family. For gcc we check "-pedantic"
# being accepted which is also understood by compilers who just want
# to be compatible with gcc even when not being made from gcc
# sources.
#
# see also:
#
# AX_CFLAGS_SUN_OPTION AX_CFLAGS_HPUX_OPTION
# 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.
dnl @synopsis AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]])
dnl
dnl AX_CFLAGS_GCC_OPTION(-fvomit-frame) would show a message as like
dnl "checking CFLAGS for gcc -fvomit-frame ... yes" and adds the
dnl optionflag to CFLAGS if it is understood. You can override the
dnl shellvar-default of CFLAGS of course. The order of arguments stems
dnl from the explicit macros like AX_CFLAGS_WARN_ALL.
dnl
dnl The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add
dnl to CXXFLAGS - and it uses the autoconf setup for C++ instead of C
dnl (since it is possible to use different compilers for C and C++).
dnl
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.
dnl However, if you use this macro in a few places, it would be great
dnl if you would make up a new function-macro and submit it to the
dnl ac-archive.
dnl
dnl - $1 option-to-check-for : required ("-option" as non-value)
dnl - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case)
dnl - $3 action-if-found : add value to shellvariable
dnl - $4 action-if-not-found : nothing
dnl
dnl note: in earlier versions, $1-$2 were swapped. We try to detect the
dnl situation and accept a $2=~/-/ as being the old
dnl option-to-check-for.
dnl
dnl also: there are other variants that emerged from the original macro
dnl variant which did just test an option to be possibly added.
dnl However, some compilers accept an option silently, or possibly for
dnl just another option that was not intended. Therefore, we have to do
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
dnl to be compatible with gcc even when not being made from gcc
dnl sources.
dnl
dnl see also:
dnl
dnl AX_CFLAGS_SUN_OPTION AX_CFLAGS_HPUX_OPTION
dnl AX_CFLAGS_AIX_OPTION AX_CFLAGS_IRIX_OPTION
dnl
dnl @category C
dnl @author Guido Draheim <guidod@gmx.de>
dnl @version 2003-11-04
dnl @license GPLWithACException
AC_DEFUN([AX_CFLAGS_GCC_OPTION_OLD], [dnl
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
@@ -92,8 +53,7 @@ VAR,[VAR="no, unknown"
AC_LANG_C
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC
"-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC
in "-pedantic % m4_ifval($2,$2,-option)" dnl GCC
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
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)],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_LANG_CXX
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC
"-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC
in "-pedantic % m4_ifval($2,$2,-option)" dnl GCC
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],
@@ -163,8 +122,7 @@ VAR,[VAR="no, unknown"
AC_LANG_C
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC
"-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC
in "-pedantic % m4_ifval($1,$1,-option)" dnl GCC
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
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)],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_LANG_CXX
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC
"-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC
in "-pedantic % m4_ifval($1,$1,-option)" dnl GCC
#
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;],

View File

@@ -1,66 +1,27 @@
##### http://autoconf-archive.cryp.to/ax_cflags_warn_all.html
#
# SYNOPSIS
#
# AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
#
# DESCRIPTION
#
# Try to find a compiler option that enables most reasonable
# warnings. This macro is directly derived from VL_PROG_CC_WARNINGS
# which is split up into two AX_CFLAGS_WARN_ALL and
# AX_CFLAGS_WARN_ALL_ANSI
#
# For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The
# result is added to the shellvar being CFLAGS by default.
#
# Currently this macro knows about GCC, Solaris C compiler, Digital
# Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C
# compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos
# 10.0.0.8) C compiler.
#
# - $1 shell-variable-to-add-to : CFLAGS
# - $2 add-value-if-not-found : nothing
# - $3 action-if-found : add value to shellvariable
# - $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.
dnl @synopsis AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
dnl
dnl Try to find a compiler option that enables most reasonable
dnl warnings. This macro is directly derived from VL_PROG_CC_WARNINGS
dnl which is split up into two AX_CFLAGS_WARN_ALL and
dnl AX_CFLAGS_WARN_ALL_ANSI
dnl
dnl For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The
dnl result is added to the shellvar being CFLAGS by default.
dnl
dnl Currently this macro knows about GCC, Solaris C compiler, Digital
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
dnl 10.0.0.8) C compiler.
dnl
dnl - $1 shell-variable-to-add-to : CFLAGS
dnl - $2 add-value-if-not-found : nothing
dnl - $3 action-if-found : add value to shellvariable
dnl - $4 action-if-not-found : nothing
dnl
dnl @category C
dnl @author Guido Draheim <guidod@gmx.de>
dnl @version 2003-01-06
dnl @license GPLWithACException
AC_DEFUN([AX_CFLAGS_WARN_ALL],[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],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_LANG_CXX
ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl
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 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 delimimiter. A non-option comment can be given after "%%" marks
dnl which will be shown but not added to the respective C/CXXFLAGS.
dnl delimimiter. A non-option comment can be given after "%%" marks.

View File

@@ -1,66 +1,27 @@
##### http://autoconf-archive.cryp.to/ax_cflags_warn_all_ansi.html
#
# SYNOPSIS
#
# AX_CFLAGS_WARN_ALL_ANSI [(shellvar [,default, [A/NA]])]
#
# DESCRIPTION
#
# Try to find a compiler option that enables most reasonable
# warnings. This macro is directly derived from VL_PROG_CC_WARNINGS
# which is split up into two AX_CFLAGS_WARN_ALL and
# AX_CFLAGS_WARN_ALL_ANSI
#
# For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The
# result is added to the shellvar being CFLAGS by default.
#
# Currently this macro knows about GCC, Solaris C compiler, Digital
# Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C
# compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos
# 10.0.0.8) C compiler.
#
# - $1 shell-variable-to-add-to : CFLAGS
# - $2 add-value-if-not-found : nothing
# - $3 action-if-found : add value to shellvariable
# - $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.
dnl @synopsis AX_CFLAGS_WARN_ALL_ANSI [(shellvar [,default, [A/NA]])]
dnl
dnl Try to find a compiler option that enables most reasonable
dnl warnings. This macro is directly derived from VL_PROG_CC_WARNINGS
dnl which is split up into two AX_CFLAGS_WARN_ALL and
dnl AX_CFLAGS_WARN_ALL_ANSI
dnl
dnl For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The
dnl result is added to the shellvar being CFLAGS by default.
dnl
dnl Currently this macro knows about GCC, Solaris C compiler, Digital
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
dnl 10.0.0.8) C compiler.
dnl
dnl - $1 shell-variable-to-add-to : CFLAGS
dnl - $2 add-value-if-not-found : nothing
dnl - $3 action-if-found : add value to shellvariable
dnl - $4 action-if-not-found : nothing
dnl
dnl @category C
dnl @author Guido Draheim <guidod@gmx.de>
dnl @version 2003-01-06
dnl @license GPLWithACException
AC_DEFUN([AX_CFLAGS_WARN_ALL_ANSI],[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],
VAR,[VAR="no, unknown"
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_LANG_CXX
ac_save_[]FLAGS="$[]FLAGS"
# IRIX C compiler:
# -use_readonly_const is the default for IRIX C,

View File

@@ -1,52 +1,13 @@
##### http://autoconf-archive.cryp.to/type_socklen_t.html
#
# SYNOPSIS
#
# TYPE_SOCKLEN_T
#
# DESCRIPTION
#
# Check whether sys/socket.h defines type socklen_t. Please note that
# some systems require sys/types.h to be included before sys/socket.h
# 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.
dnl @synopsis TYPE_SOCKLEN_T
dnl
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
dnl can be compiled.
dnl
dnl @category Misc
dnl @author Lars Brinkhoff <lars@nocrew.org>
dnl @version 2005-01-11
dnl @license GPLWithACException
AC_DEFUN([TYPE_SOCKLEN_T],
[AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t,

View File

@@ -547,10 +547,6 @@ int TPAttrSetMaxJobsTotal(ThreadPoolAttr *attr, int maxJobsTotal);
EXPORT int ThreadPoolGetStats(ThreadPool *tp, 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
#ifdef __cplusplus

View File

@@ -42,158 +42,131 @@ extern "C" {
#endif
#ifdef __FreeBSD__
#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
#endif
#ifdef PTHREAD_MUTEX_RECURSIVE
/* This system has SuS2-compliant mutex attributes.
* 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_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK
#else /* PTHREAD_MUTEX_RECURSIVE */
#define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_FAST_NP
#define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE_NP
#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK_NP
#endif /* PTHREAD_MUTEX_RECURSIVE */
#define ITHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE
#define ITHREAD_PROCESS_SHARED PTHREAD_PROCESS_SHARED
/* This system has SuS2-compliant mutex attributes.
* 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_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK
#else
#define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_FAST_NP
#define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE_NP
#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK_NP
#endif
#define ITHREAD_CANCELED PTHREAD_CANCELED
/***************************************************************************
* Name: ithread_t
*
* Description:
* Thread handle.
* typedef to pthread_t.
* Internal Use Only.
***************************************************************************/
typedef pthread_t ithread_t;
/***************************************************************************
* Name: ithread_t
*
* Description:
* Thread handle.
* typedef to pthread_t.
* Internal Use Only.
***************************************************************************/
typedef pthread_t ithread_t;
/****************************************************************************
* Name: ithread_attr_t
*
* Description:
* Thread attribute.
* typedef to pthread_attr_t
* Internal Use Only
***************************************************************************/
typedef pthread_attr_t ithread_attr_t;
/****************************************************************************
* Name: ithread_attr_t
*
* Description:
* Thread attribute.
* typedef to pthread_attr_t
* Internal Use Only
***************************************************************************/
typedef pthread_attr_t ithread_attr_t;
/****************************************************************************
* Name: start_routine
*
* Description:
* Thread start routine
* Internal Use Only.
***************************************************************************/
typedef void * (*start_routine) (void *arg);
/****************************************************************************
* Name: start_routine
*
* Description:
* Thread start routine
* Internal Use Only.
***************************************************************************/
typedef void * (*start_routine) (void *arg);
/****************************************************************************
* Name: ithread_cond_t
*
* Description:
* condition variable.
* typedef to pthread_cond_t
* Internal Use Only.
***************************************************************************/
typedef pthread_cond_t ithread_cond_t;
/****************************************************************************
* Name: ithread_cond_t
*
* Description:
* condition variable.
* typedef to pthread_cond_t
* Internal Use Only.
***************************************************************************/
typedef pthread_cond_t ithread_cond_t;
/****************************************************************************
* Name: ithread_mutexattr_t
*
* Description:
* Mutex attribute.
* typedef to pthread_mutexattr_t
* Internal Use Only
***************************************************************************/
typedef pthread_mutexattr_t ithread_mutexattr_t;
/****************************************************************************
* Name: ithread_mutexattr_t
*
* Description:
* Mutex attribute.
* typedef to pthread_mutexattr_t
* Internal Use Only
***************************************************************************/
typedef pthread_mutexattr_t ithread_mutexattr_t;
/****************************************************************************
* Name: ithread_mutex_t
*
* Description:
* Mutex.
* typedef to pthread_mutex_t
* Internal Use Only.
***************************************************************************/
typedef pthread_mutex_t ithread_mutex_t;
/****************************************************************************
* Name: ithread_mutex_t
*
* Description:
* Mutex.
* typedef to pthread_mutex_t
* Internal Use Only.
***************************************************************************/
typedef pthread_mutex_t ithread_mutex_t;
/****************************************************************************
* Name: ithread_condattr_t
*
* Description:
* Condition attribute.
* typedef to pthread_condattr_t
* NOT USED
* Internal Use Only
***************************************************************************/
typedef pthread_condattr_t ithread_condattr_t;
/****************************************************************************
* Name: ithread_condattr_t
*
* Description:
* Condition attribute.
* typedef to pthread_condattr_t
* NOT USED
* Internal Use Only
***************************************************************************/
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
*
* Description:
* Initializes a mutex attribute variable.
* Used to set the type of the mutex.
* Parameters:
* ithread_mutexattr_init * attr (must be valid non NULL pointer to
* pthread_mutexattr_t)
* Returns:
* 0 on success, Nonzero on failure.
* Always returns 0.
* See man page for pthread_mutexattr_init
***************************************************************************/
/****************************************************************************
* Function: ithread_mutexattr_init
*
* Description:
* Initializes a mutex attribute variable.
* Used to set the type of the mutex.
* Parameters:
* ithread_mutexattr_init * attr (must be valid non NULL pointer to
* pthread_mutexattr_t)
* Returns:
* 0 on success, Nonzero on failure.
* Always returns 0.
* See man page for pthread_mutexattr_init
***************************************************************************/
#define ithread_mutexattr_init pthread_mutexattr_init
/****************************************************************************
* Function: ithread_mutexattr_destroy
*
* Description:
* Releases any resources held by the mutex attribute.
* Currently there are no resources associated with the attribute
* Parameters:
* ithread_mutexattr_t * attr (must be valid non NULL pointer to
* pthread_mutexattr_t)
* Returns:
* 0 on success, Nonzero on failure.
* Always returns 0.
* See man page for pthread_mutexattr_destroy
***************************************************************************/
/****************************************************************************
* Function: ithread_mutexattr_destroy
*
* Description:
* Releases any resources held by the mutex attribute.
* Currently there are no resources associated with the attribute
* Parameters:
* ithread_mutexattr_t * attr (must be valid non NULL pointer to
* pthread_mutexattr_t)
* Returns:
* 0 on success, Nonzero on failure.
* Always returns 0.
* See man page for pthread_mutexattr_destroy
***************************************************************************/
#define ithread_mutexattr_destroy pthread_mutexattr_destroy
@@ -207,7 +180,7 @@ typedef pthread_rwlock_t ithread_rwlock_t;
* ITHREAD_MUTEX_ERRORCHECK_NP
*
* 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)
* int kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_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
*****************************************************************************/
#ifdef PTHREAD_MUTEX_RECURSIVE
#define ithread_mutexattr_setkind_np pthread_mutexattr_settype
#define ithread_mutexattr_setkind_np pthread_mutexattr_settype
#else
#define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np
#define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np
#endif
/****************************************************************************
@@ -232,7 +205,7 @@ typedef pthread_rwlock_t ithread_rwlock_t;
* ITHREAD_MUTEX_ERRORCHECK_NP
*
* 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)
* int *kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_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
*****************************************************************************/
#ifdef PTHREAD_MUTEX_RECURSIVE
#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype
#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype
#else
#define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np
#define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np
#endif
@@ -264,8 +237,7 @@ typedef pthread_rwlock_t ithread_rwlock_t;
* See man page for pthread_mutex_init
*****************************************************************************/
#define ithread_mutex_init pthread_mutex_init
/****************************************************************************
* Function: ithread_mutex_lock
*
@@ -319,170 +291,7 @@ typedef pthread_rwlock_t ithread_rwlock_t;
*****************************************************************************/
#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
*

View File

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

View File

@@ -90,23 +90,20 @@ FreeThreadPoolJob( ThreadPool * tp,
static int
SetPolicyType( PolicyType in )
{
#ifdef __CYGWIN__
/* TODO not currently working... */
return 0;
#elif defined(__OSX__)
setpriority(PRIO_PROCESS, 0, 0);
return 0;
#elif defined(WIN32)
#ifdef __CYGWIN__
/* TODO not currently working... */
return 0;
#else
#ifdef WIN32
return sched_setscheduler( 0, in);
#elif defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0
#else
struct sched_param current;
sched_getparam( 0, &current );
current.sched_priority = DEFAULT_SCHED_PARAM;
return sched_setscheduler( 0, in, &current );
#else
return 0;
#endif
#endif
#endif
}
/****************************************************************************
@@ -126,7 +123,7 @@ SetPolicyType( PolicyType in )
static int
SetPriority( ThreadPriority priority )
{
#if defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0
int currentPolicy;
int minPriority = 0;
int maxPriority = 0;
@@ -158,9 +155,7 @@ SetPriority( ThreadPriority priority )
return pthread_setschedparam( ithread_self(), currentPolicy,
&newPriority );
#else
return 0;
#endif
}
/****************************************************************************
@@ -359,25 +354,18 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
* Parameters:
*
*****************************************************************************/
static void SetSeed() {
struct timeb t;
static void SetSeed() {
struct timeb t;
ftime( &t );
ftime( &t );
#if defined(WIN32)
srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id().p );
#elif defined(__FreeBSD__) || defined(__OSX__)
srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id() );
#elif defined(__linux__)
srand( ( unsigned int )t.millitm + ithread_get_current_thread_id() );
srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id().p );
#elif defined(__FreeBSD__)
srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id() );
#else
{
volatile union { volatile pthread_t tid; volatile unsigned i; } idu;
idu.tid = ithread_get_current_thread_id();
srand( ( unsigned int )t.millitm + idu.i );
}
srand( ( unsigned int )t.millitm + ithread_get_current_thread_id() );
#endif
}
}
/****************************************************************************
* Function: WorkerThread
@@ -1511,33 +1499,36 @@ static void SetSeed() {
}
#ifdef STATS
void ThreadPoolPrintStats(ThreadPoolStats * stats)
{
assert( stats != NULL );
if (stats == NULL) {
return;
}
void ThreadPoolPrintStats( ThreadPoolStats * stats ) {
assert( stats != NULL ); if( stats == NULL ) {
return;}
#ifdef __FreeBSD__
printf("ThreadPoolStats at Time: %d\n", time(NULL));
#else /* __FreeBSD__ */
printf("ThreadPoolStats at Time: %ld\n", time(NULL));
#endif /* __FreeBSD__ */
printf("High Jobs pending: %d\n", stats->currentJobsHQ);
printf("Med Jobs Pending: %d\n", stats->currentJobsMQ);
printf("Low Jobs Pending: %d\n", stats->currentJobsLQ);
printf("Average Wait in High Priority Q in milliseconds: %f\n", stats->avgWaitHQ);
printf("Average Wait in Med Priority Q in milliseconds: %f\n", stats->avgWaitMQ);
printf("Averate Wait in Low Priority Q in milliseconds: %f\n", stats->avgWaitLQ);
printf("Max Threads Active: %d\n", stats->maxThreads);
printf("Current Worker Threads: %d\n", stats->workerThreads);
printf("Current Persistent Threads: %d\n", stats->persistentThreads);
printf("Current Idle Threads: %d\n", stats->idleThreads);
printf("Total Threads : %d\n", stats->totalThreads);
printf("Total Time spent Working in seconds: %f\n", stats->totalWorkTime);
printf("Total Time spent Idle in seconds : %f\n", stats->totalIdleTime);
}
#endif /* STATS */
#ifdef __FreeBSD__
printf( "ThreadPoolStats at Time: %d\n", time( NULL ) );
#else
printf( "ThreadPoolStats at Time: %ld\n", time( NULL ) );
#endif
printf
( "Average Wait in High Priority Q in milliseconds: %f\n",
stats->avgWaitHQ );
printf
( "Average Wait in Med Priority Q in milliseconds: %f\n",
stats->avgWaitMQ );
printf
( "Averate Wait in Low Priority Q in milliseconds: %f\n",
stats->avgWaitLQ );
printf( "Max Threads Active: %d\n", stats->maxThreads );
printf( "Current Worker Threads: %d\n",
stats->workerThreads );
printf( "Current Persistent Threads: %d\n",
stats->persistentThreads );
printf( "Current Idle Threads: %d\n", stats->idleThreads );
printf( "Total Threads : %d\n", stats->totalThreads );
printf( "Total Time spent Working in seconds: %f\n",
stats->totalWorkTime );
printf( "Total Time spent Idle in seconds : %f\n",
stats->totalIdleTime );}
#endif
/****************************************************************************
* Function: TPAttrSetMaxJobsTotal
@@ -1550,19 +1541,17 @@ void ThreadPoolPrintStats(ThreadPoolStats * stats)
* Returns:
* Always returns 0.
*****************************************************************************/
int TPAttrSetMaxJobsTotal(
ThreadPoolAttr * attr,
int maxJobsTotal )
{
assert( attr != NULL );
int TPAttrSetMaxJobsTotal( ThreadPoolAttr * attr,
int maxJobsTotal ) {
assert( attr != NULL );
if( attr == NULL ) {
return EINVAL;
}
if( attr == NULL ) {
return EINVAL;
}
attr->maxJobsTotal = maxJobsTotal;
return 0;
}
attr->maxJobsTotal = maxJobsTotal;
return 0;
}
/****************************************************************************
* Function: ThreadPoolGetStats
@@ -1579,54 +1568,40 @@ int TPAttrSetMaxJobsTotal(
*****************************************************************************/
#ifdef STATS
int
ThreadPoolGetStats(
ThreadPool *tp,
ThreadPoolStats *stats)
{
assert(tp != NULL);
assert(stats != NULL);
ThreadPoolGetStats( ThreadPool * tp,
ThreadPoolStats * stats ) {
if (tp == NULL || stats == NULL) {
return EINVAL;
}
assert( tp != NULL );
assert( stats != NULL );
if( ( tp == NULL ) || ( stats == NULL ) ) {
return EINVAL;}
//if not shutdown then acquire mutex
if (!tp->shutdown) {
ithread_mutex_lock(&tp->mutex);
}
//if not shutdown then acquire mutex
if( !tp->shutdown ) {
ithread_mutex_lock( &tp->mutex );}
*stats = tp->stats;
if (stats->totalJobsHQ > 0) {
stats->avgWaitHQ = stats->totalTimeHQ / stats->totalJobsHQ;
} else {
stats->avgWaitHQ = 0;
}
if( stats->totalJobsMQ > 0 ) {
stats->avgWaitMQ = stats->totalTimeMQ / stats->totalJobsMQ;
} else {
stats->avgWaitMQ = 0;
}
if( stats->totalJobsLQ > 0 ) {
stats->avgWaitLQ = stats->totalTimeLQ / stats->totalJobsLQ;
} else {
stats->avgWaitLQ = 0;
}
( *stats ) = tp->stats; if( stats->totalJobsHQ > 0 )
stats->avgWaitHQ =
stats->totalTimeHQ / stats->totalJobsHQ;
else
stats->avgWaitHQ = 0; if( stats->totalJobsMQ > 0 )
stats->avgWaitMQ =
stats->totalTimeMQ / stats->totalJobsMQ;
else
stats->avgWaitMQ = 0; if( stats->totalJobsLQ > 0 )
stats->avgWaitLQ =
stats->totalTimeLQ / stats->totalJobsLQ;
else
stats->avgWaitLQ = 0;
stats->totalThreads = tp->totalThreads;
stats->persistentThreads = tp->persistentThreads;
stats->currentJobsHQ = ListSize( &tp->highJobQ );
stats->currentJobsLQ = ListSize( &tp->lowJobQ );
stats->currentJobsMQ = ListSize( &tp->medJobQ );
//if not shutdown then release mutex
if( !tp->shutdown ) {
ithread_mutex_unlock( &tp->mutex );}
stats->totalThreads = tp->totalThreads;
stats->persistentThreads = tp->persistentThreads;
stats->currentJobsHQ = ListSize( &tp->highJobQ );
stats->currentJobsLQ = ListSize( &tp->lowJobQ );
stats->currentJobsMQ = ListSize( &tp->medJobQ );
//if not shutdown then release mutex
if( !tp->shutdown ) {
ithread_mutex_unlock( &tp->mutex );
}
return 0;
}
#endif /* STATS */
return 0;}
#endif

View File

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

View File

@@ -1,7 +1,8 @@
#
# "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
@@ -22,14 +23,14 @@ LDADD = \
upnpincludedir = $(includedir)/upnp
upnpinclude_HEADERS = \
inc/upnp.h \
inc/upnpdebug.h
upnpinclude_HEADERS = inc/upnp.h
nodist_upnpinclude_HEADERS = inc/upnpconfig.h
if ENABLE_TOOLS
upnpinclude_HEADERS += inc/upnptools.h
endif
if ENABLE_DEBUG
upnpinclude_HEADERS += inc/upnpdebug.h
endif
lib_LTLIBRARIES = libupnp.la

View File

@@ -2,7 +2,7 @@
#
# "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 <sys/param.h>
#if (defined(BSD) && BSD >= 199306)
#ifdef __FreeBSD__
#include <time.h>
#endif
#include "ixml.h"
@@ -829,42 +828,46 @@ struct Upnp_Event
* Upnp_Discovery structure correctly.
*/
typedef struct sockaddr_in SOCKADDRIN;
/** Returned in a {\bf UPNP_DISCOVERY_RESULT} callback. */
struct Upnp_Discovery
{
/** The result code of the {\bf UpnpSearchAsync} call. */
int ErrCode;
/** The expiration time of the advertisement. */
int Expires;
/** The unique device identifier. */
char DeviceId[LINE_SIZE];
/** The device type. */
char DeviceType[LINE_SIZE];
/** The service type. */
char ServiceType[LINE_SIZE];
/** The service version. */
char ServiceVer[LINE_SIZE];
/** The URL to the UPnP description document for the device. */
char Location[LINE_SIZE];
/** The operating system the device is running. */
char Os[LINE_SIZE];
/** The result code of the {\bf UpnpSearchAsync} call. */
int ErrCode;
/** Date when the response was generated. */
char Date[LINE_SIZE];
/** The expiration time of the advertisement. */
int Expires;
/** The unique device identifier. */
char DeviceId[LINE_SIZE];
/** The device type. */
char DeviceType[LINE_SIZE];
/** The service type. */
char ServiceType[LINE_SIZE];
/** The service version. */
char ServiceVer[LINE_SIZE];
/** The URL to the UPnP description document for the device. */
char Location[LINE_SIZE];
/** The operating system the device is running. */
char Os[LINE_SIZE];
/** Confirmation that the MAN header was understood by the device. */
char Ext[LINE_SIZE];
/** Date when the response was generated. */
char Date[LINE_SIZE];
/** The host address of the device responding to the search. */
struct sockaddr_in DestAddr;
/** Confirmation that the MAN header was understood by the device. */
char Ext[LINE_SIZE];
/** The host address of the device responding to the search. */
SOCKADDRIN * DestAddr;
};
/** Returned along with a {\bf UPNP_EVENT_SUBSCRIBE_COMPLETE} or {\bf

View File

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

View File

@@ -79,9 +79,8 @@ endif
EXTRA_DIST = \
web/tvcombodesc.xml \
web/tvcontrolSCPD.xml \
web/tvdevicedesc.xml \
web/tvdevicepres.html \
web/tvpictureSCPD.xml
tvdevice/web/tvcontrolSCPD.xml \
tvdevice/web/tvdevicedesc.xml \
tvdevice/web/tvdevicepres.html \
tvdevice/web/tvpictureSCPD.xml

View File

@@ -1362,7 +1362,7 @@ TvCtrlPointStart( print_string printFunctionPtr,
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 );
rc = UpnpInit( ip_address, port );
if( UPNP_E_SUCCESS != rc ) {

View File

@@ -37,7 +37,6 @@
#include <string.h>
#include <sys/stat.h>
#ifndef WIN32
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
@@ -54,11 +53,6 @@
#include <sys/ioctl.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <sys/param.h>
#if (defined(BSD) && BSD >= 199306)
#include <ifaddrs.h>
#endif
#endif
#include "upnpapi.h"
#include "httpreadwrite.h"
@@ -79,13 +73,11 @@
#include "urlconfig.h"
#endif // INTERNAL_WEB_SERVER
virtualDirList *pVirtualDirList;
// Mutex to synchronize the subscription handling at the client side
CLIENTONLY( ithread_mutex_t GlobalClientSubscribeMutex; )
// rwlock to synchronize handles (root device or control point handle)
ithread_rwlock_t GlobalHndRWLock;
//Mutex to synchronize handles ( root device or control point handle)
ithread_mutex_t GlobalHndMutex;
// Mutex to synchronize the uuid creation process
ithread_mutex_t gUUIDMutex;
@@ -213,26 +205,26 @@ int UpnpInit( IN const char *HostIP,
#ifdef __CYGWIN__
/* On Cygwin, pthread_mutex_init() fails without this memset. */
/* TODO: Fix Cygwin so we don't need this memset(). */
memset(&GlobalHndRWLock, 0, sizeof(GlobalHndRWLock));
memset(&GlobalHndMutex, 0, sizeof(GlobalHndMutex));
#endif
if (ithread_rwlock_init(&GlobalHndRWLock, NULL) != 0) {
if( ithread_mutex_init( &GlobalHndMutex, NULL ) != 0 ) {
return UPNP_E_INIT_FAILED;
}
if (ithread_mutex_init(&gUUIDMutex, NULL) != 0) {
if( ithread_mutex_init( &gUUIDMutex, NULL ) != 0 ) {
return UPNP_E_INIT_FAILED;
}
// initialize subscribe mutex
#ifdef INCLUDE_CLIENT_APIS
if (ithread_mutex_init(&GlobalClientSubscribeMutex, NULL) != 0) {
if ( ithread_mutex_init( &GlobalClientSubscribeMutex, NULL ) != 0 ) {
return UPNP_E_INIT_FAILED;
}
#endif
HandleLock();
if( HostIP != NULL ) {
HandleLock();
if( HostIP != NULL )
strcpy( LOCAL_HOST, HostIP );
} else {
else {
if( getlocalhostname( LOCAL_HOST ) != UPNP_E_SUCCESS ) {
HandleUnlock();
return UPNP_E_INIT_FAILED;
@@ -323,56 +315,29 @@ int UpnpInit( IN const char *HostIP,
#ifdef DEBUG
static void
PrintThreadPoolStats(
ThreadPool *tp,
const char *DbgFileName,
int DbgLineNo,
const char *msg)
PrintThreadPoolStats (const char* DbgFileName, int DbgLineNo,
const char* msg, const ThreadPoolStats* const stats)
{
ThreadPoolStats stats;
ThreadPoolGetStats(tp, &stats);
UpnpPrintf(UPNP_INFO, API, DbgFileName, DbgLineNo,
"%s \n"
"High Jobs pending: %d\n"
"Med Jobs Pending: %d\n"
"Low Jobs Pending: %d\n"
"Average wait in High Q in milliseconds: %lf\n"
"Average wait in Med Q in milliseconds: %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,
stats.currentJobsHQ,
stats.currentJobsMQ,
stats.currentJobsLQ,
stats.avgWaitHQ,
stats.avgWaitMQ,
stats.avgWaitLQ,
stats.maxThreads,
stats.workerThreads,
stats.persistentThreads,
stats.idleThreads,
stats.totalThreads,
stats.totalWorkTime,
stats.totalIdleTime);
UpnpPrintf (UPNP_INFO, API, DbgFileName, DbgLineNo,
"%s \n High Jobs pending = %d \nMed Jobs Pending = %d\n"
" Low Jobs Pending = %d \nWorker Threads = %d\n"
"Idle Threads = %d\nPersistent Threads = %d\n"
"Average Time spent in High Q = %lf\n"
"Average Time spent in Med Q = %lf\n"
"Average Time spent in Low Q = %lf\n"
"Max Threads Used: %d\nTotal Work Time= %lf\n"
"Total Idle Time = %lf\n",
msg,
stats->currentJobsHQ, stats->currentJobsMQ,
stats->currentJobsLQ, stats->workerThreads,
stats->idleThreads, stats->persistentThreads,
stats->avgWaitHQ, stats->avgWaitMQ, stats->avgWaitLQ,
stats->maxThreads, stats->totalWorkTime,
stats->totalIdleTime );
}
#else /* DEBUG */
static UPNP_INLINE void
PrintThreadPoolStats(
ThreadPool *tp,
const char *DbgFileName,
int DbgLineNo,
const char *msg)
{
}
#endif /* DEBUG */
#endif
/****************************************************************************
* Function: UpnpFinish
*
@@ -401,6 +366,10 @@ UpnpFinish()
#endif
struct Handle_Info *temp;
#ifdef DEBUG
ThreadPoolStats stats;
#endif
#ifdef WIN32
// WSACleanup( );
#endif
@@ -412,12 +381,18 @@ UpnpFinish()
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Inside UpnpFinish : UpnpSdkInit is :%d:\n",
UpnpSdkInit );
#ifdef DEBUG
if( UpnpSdkInit == 1 ) {
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"UpnpFinish : UpnpSdkInit is ONE\n" );
}
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool");
ThreadPoolGetStats( &gRecvThreadPool, &stats );
PrintThreadPoolStats (__FILE__, __LINE__,
"Recv Thread Pool", &stats);
ThreadPoolGetStats( &gSendThreadPool, &stats );
PrintThreadPoolStats (__FILE__, __LINE__,
"Send Thread Pool", &stats);
#endif
#ifdef INCLUDE_DEVICE_APIS
if( GetDeviceHandleInfo( &device_handle, &temp ) == HND_DEVICE )
UpnpUnRegisterRootDevice( device_handle );
@@ -436,38 +411,44 @@ UpnpFinish()
web_server_destroy();
#endif
ThreadPoolShutdown(&gSendThreadPool);
ThreadPoolShutdown(&gRecvThreadPool);
#ifdef DEBUG
ThreadPoolShutdown( &gSendThreadPool );
ThreadPoolShutdown( &gRecvThreadPool );
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Exiting UpnpFinish : UpnpSdkInit is :%d:\n", UpnpSdkInit);
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool");
"Exiting UpnpFinish : UpnpSdkInit is :%d:\n",
UpnpSdkInit );
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
ithread_mutex_destroy(&GlobalClientSubscribeMutex);
ithread_mutex_destroy( &GlobalClientSubscribeMutex );
#endif
ithread_rwlock_destroy(&GlobalHndRWLock);
ithread_mutex_destroy(&gUUIDMutex);
ithread_mutex_destroy( &GlobalHndMutex );
ithread_mutex_destroy( &gUUIDMutex );
// remove all virtual dirs
UpnpRemoveAllVirtualDirs();
// allow static linking
// leuk_he allow static linking:
#ifdef WIN32
#ifdef PTW32_STATIC_LIB
pthread_win32_thread_detach_np ();
#endif
#endif
UpnpSdkInit = 0;
return UPNP_E_SUCCESS;
}
/*************************** End of UpnpFinish *****************************/
} /********************* End of UpnpFinish *************************/
/******************************************************************************
/****************************************************************************
* Function: UpnpGetServerPort
*
* Parameters: NONE
@@ -964,7 +945,7 @@ GetDescDocumentAndURL( IN Upnp_DescType descriptionType,
char *temp_str = NULL;
FILE *fp = NULL;
off_t fileLen;
size_t num_read;
unsigned num_read;
time_t last_modified;
struct stat file_info;
struct sockaddr_in serverAddr;
@@ -1570,7 +1551,7 @@ UpnpSearchAsync( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpSearchAsync \n" );
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -1746,7 +1727,7 @@ UpnpSubscribeAsync( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpSubscribeAsync \n" );
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -1763,13 +1744,15 @@ UpnpSubscribeAsync( IN UpnpClient_Handle Hnd,
HandleUnlock();
return UPNP_E_INVALID_PARAM;
}
HandleUnlock();
Param = (struct UpnpNonblockParam *)
malloc(sizeof (struct UpnpNonblockParam));
Param =
( struct UpnpNonblockParam * )
malloc( sizeof( struct UpnpNonblockParam ) );
if( Param == NULL ) {
HandleUnlock();
return UPNP_E_OUTOF_MEMORY;
}
HandleUnlock();
Param->FunName = SUBSCRIBE;
Param->Handle = Hnd;
@@ -1829,7 +1812,7 @@ UpnpSubscribe( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpSubscribe \n" );
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -1889,7 +1872,7 @@ UpnpUnSubscribe( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpUnSubscribe \n" );
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -1948,7 +1931,7 @@ UpnpUnSubscribeAsync( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpUnSubscribeAsync \n" );
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -2022,7 +2005,7 @@ UpnpRenewSubscription( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpRenewSubscription \n" );
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -2087,7 +2070,7 @@ UpnpRenewSubscriptionAsync( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpRenewSubscriptionAsync \n" );
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -2182,7 +2165,7 @@ UpnpNotify( IN UpnpDevice_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpNotify \n" );
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -2253,7 +2236,7 @@ UpnpNotifyExt( IN UpnpDevice_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpNotify \n" );
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -2330,7 +2313,7 @@ UpnpAcceptSubscription( IN UpnpDevice_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpAcceptSubscription \n" );
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -2406,7 +2389,7 @@ UpnpAcceptSubscriptionExt( IN UpnpDevice_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpAcceptSubscription \n" );
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -2502,7 +2485,7 @@ UpnpSendAction( IN UpnpClient_Handle Hnd,
}
DevUDN_const = NULL;
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -2586,7 +2569,7 @@ UpnpSendActionEx( IN UpnpClient_Handle Hnd,
return retVal;
}
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -2662,7 +2645,7 @@ UpnpSendActionAsync( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpSendActionAsync \n" );
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -2782,7 +2765,7 @@ UpnpSendActionExAsync( IN UpnpClient_Handle Hnd,
return retVal;
}
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -2896,7 +2879,7 @@ UpnpGetServiceVarStatusAsync( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpGetServiceVarStatusAsync \n" );
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -2976,7 +2959,7 @@ UpnpGetServiceVarStatus( IN UpnpClient_Handle Hnd,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside UpnpGetServiceVarStatus \n" );
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
@@ -3304,15 +3287,17 @@ UpnpDownloadXmlDoc( const char *url,
} else {
#ifdef DEBUG
xml_buf = ixmlPrintNode( ( IXML_Node * ) * xmlDoc );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Printing the Parsed xml document \n %s\n", xml_buf );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"****************** END OF Parsed XML Doc *****************\n" );
ixmlFreeDOMString( xml_buf );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Printing the Parsed xml document \n %s\n",
xml_buf );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"****************** END OF Parsed XML Doc *****************\n" );
ixmlFreeDOMString( xml_buf );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting UpnpDownloadXmlDoc\n" );
#endif
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting UpnpDownloadXmlDoc\n" );
return UPNP_E_SUCCESS;
return UPNP_E_SUCCESS;
}
}
@@ -3644,6 +3629,7 @@ int PrintHandleInfo( IN UpnpClient_Handle Hnd )
struct Handle_Info * HndInfo;
if (HandleTable[Hnd] != NULL) {
HndInfo = HandleTable[Hnd];
#ifdef DEBUG
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
"Printing information for Handle_%d\n", Hnd);
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
@@ -3652,6 +3638,7 @@ int PrintHandleInfo( IN UpnpClient_Handle Hnd )
if(HndInfo->HType != HND_CLIENT)
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"DescURL_%s\n", HndInfo->DescURL );
#endif
#endif
} else {
return UPNP_E_INVALID_HANDLE;
@@ -3730,44 +3717,8 @@ void printNodes( IXML_Node * tmpRoot, int depth )
strcpy( out, inet_ntoa(LocalAddr.sin_addr));
}
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
char szBuffer[MAX_INTERFACES * sizeof( struct ifreq )];
struct ifconf ifConf;
struct ifreq ifReq;

View File

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

View File

@@ -36,7 +36,7 @@
#include "uri.h"
#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
struct ErrorString {
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"},
{UPNP_E_INVALID_HANDLE, "UPNP_E_INVALID_HANDLE"},
{UPNP_E_INVALID_PARAM, "UPNP_E_INVALID_PARAM"},
@@ -81,13 +81,13 @@ struct ErrorString ErrorMessages[] = { {UPNP_E_SUCCESS, "UPNP_E_SUCCESS"},
};
/************************************************************************
* Function : UpnpGetErrorMessage
*
* Parameters:
* Function : UpnpGetErrorMessage
*
* Parameters:
* IN int rc: error code
*
* Description:
* This functions returns the error string mapped to the error code
*
* Description:
* This functions returns the error string mapped to the error code
* Returns: const char *
* return either the right string or "Unknown Error"
***************************************************************************/
@@ -108,14 +108,14 @@ UpnpGetErrorMessage( IN int rc )
}
/************************************************************************
* Function : UpnpResolveURL
*
* Parameters:
* Function : UpnpResolveURL
*
* Parameters:
* IN char * BaseURL: Base URL string
* IN char * RelURL: relative URL string
* OUT char * AbsURL: Absolute URL string
* Description:
* This functions concatinates the base URL and relative URL to generate
* Description:
* This functions concatinates the base URL and relative URL to generate
* the absolute URL
* Returns: int
* return either UPNP_E_SUCCESS or appropriate error
@@ -151,19 +151,19 @@ UpnpResolveURL( IN const char *BaseURL,
}
/************************************************************************
* Function : addToAction
*
* Parameters:
* IN int response: flag to tell if the ActionDoc is for response
* or request
* Function : addToAction
*
* Parameters:
* IN int response: flag to tell if the ActionDoc is for response
* or request
* INOUT IXML_Document **ActionDoc: request or response document
* IN char *ActionName: Name of the action request or response
* IN char *ServType: Service type
* IN char * ArgName: Name of the argument
* IN char * ArgValue: Value of the argument
*
* Description:
* This function adds the argument in the action request or response.
* Description:
* This function adds the argument in the action request or response.
* This function creates the action request or response if it is a first
* argument else it will add the argument in the document
*
@@ -230,22 +230,22 @@ addToAction( IN int response,
}
/************************************************************************
* Function : makeAction
*
* Parameters:
* IN int response: flag to tell if the ActionDoc is for response
* or request
* Function : makeAction
*
* Parameters:
* IN int response: flag to tell if the ActionDoc is for response
* or request
* IN char * ActionName: Name of the action request or response
* IN char * ServType: Service type
* IN int NumArg :Number of arguments in the action request or response
* IN char * Arg : pointer to the first argument
* IN va_list ArgList: Argument list
*
* Description:
* Description:
* This function creates the action request or response from the argument
* list.
* Returns: IXML_Document *
* returns action request or response document if successful
* returns action request or response document if successful
* else returns NULL
***************************************************************************/
static IXML_Document *
@@ -326,9 +326,9 @@ makeAction( IN int response,
}
/************************************************************************
* Function : UpnpMakeAction
*
* Parameters:
* Function : UpnpMakeAction
*
* Parameters:
* IN char * ActionName: Name of the action request or response
* IN char * ServType: Service type
* IN int NumArg :Number of arguments in the action request or response
@@ -336,7 +336,7 @@ makeAction( IN int response,
* IN ... : variable argument list
* IN va_list ArgList: Argument list
*
* Description:
* Description:
* This function creates the action request from the argument
* list. Its a wrapper function that calls makeAction function to create
* the action request.
@@ -363,9 +363,9 @@ UpnpMakeAction( const char *ActionName,
}
/************************************************************************
* Function : UpnpMakeActionResponse
*
* Parameters:
* Function : UpnpMakeActionResponse
*
* Parameters:
* IN char * ActionName: Name of the action request or response
* IN char * ServType: Service type
* IN int NumArg :Number of arguments in the action request or response
@@ -373,13 +373,13 @@ UpnpMakeAction( const char *ActionName,
* IN ... : variable argument list
* IN va_list ArgList: Argument list
*
* Description:
* Description:
* This function creates the action response from the argument
* list. Its a wrapper function that calls makeAction function to create
* the action response.
*
* Returns: IXML_Document *
* returns action response document if successful
* returns action response document if successful
* else returns NULL
***************************************************************************/
IXML_Document *
@@ -400,22 +400,22 @@ UpnpMakeActionResponse( const char *ActionName,
}
/************************************************************************
* Function : UpnpAddToActionResponse
*
* Function : UpnpAddToActionResponse
*
* Parameters:
* INOUT IXML_Document **ActionResponse: action response document
* INOUT IXML_Document **ActionResponse: action response document
* IN char * ActionName: Name of the action request or response
* IN char * ServType: Service type
* IN int ArgName :Name of argument to be added in the action response
* IN char * ArgValue : value of the argument
*
* Description:
* This function adds the argument in the action response. Its a wrapper
* function that calls addToAction function to add the argument in the
* Description:
* This function adds the argument in the action response. Its a wrapper
* function that calls addToAction function to add the argument in the
* action response.
*
* Returns: int
* returns UPNP_E_SUCCESS if successful
* returns UPNP_E_SUCCESS if successful
* else returns appropriate error
***************************************************************************/
int
@@ -430,22 +430,22 @@ UpnpAddToActionResponse( INOUT IXML_Document ** ActionResponse,
}
/************************************************************************
* Function : UpnpAddToAction
*
* Function : UpnpAddToAction
*
* Parameters:
* INOUT IXML_Document **ActionDoc: action request document
* INOUT IXML_Document **ActionDoc: action request document
* IN char * ActionName: Name of the action request or response
* IN char * ServType: Service type
* IN int ArgName :Name of argument to be added in the action response
* IN char * ArgValue : value of the argument
*
* Description:
* This function adds the argument in the action request. Its a wrapper
* function that calls addToAction function to add the argument in the
* Description:
* This function adds the argument in the action request. Its a wrapper
* function that calls addToAction function to add the argument in the
* action request.
*
* Returns: int
* returns UPNP_E_SUCCESS if successful
* returns UPNP_E_SUCCESS if successful
* else returns appropriate error
***************************************************************************/
int
@@ -461,15 +461,15 @@ UpnpAddToAction( IXML_Document ** ActionDoc,
}
/************************************************************************
* Function : UpnpAddToPropertySet
*
* Parameters:
* Function : UpnpAddToPropertySet
*
* Parameters:
* INOUT IXML_Document **PropSet: propertyset document
* IN char *ArgName: Name of the argument
* IN char *ArgValue: value of the argument
*
* Description:
* This function adds the argument in the propertyset node
* Description:
* This function adds the argument in the propertyset node
*
* Returns: int
* returns UPNP_E_SUCCESS if successful else returns appropriate error
@@ -516,14 +516,14 @@ UpnpAddToPropertySet( INOUT IXML_Document ** PropSet,
}
/************************************************************************
* Function : UpnpCreatePropertySet
*
* Parameters:
* Function : UpnpCreatePropertySet
*
* Parameters:
* IN int NumArg: Number of argument that will go in the propertyset node
* IN char * Args: argument strings
*
* Description:
* This function creates a propertyset node and put all the input
* Description:
* This function creates a propertyset node and put all the input
* parameters in the node as elements
*
* Returns: IXML_Document *
@@ -581,5 +581,4 @@ UpnpCreatePropertySet( IN int NumArg,
return PropSet;
}
#endif // EXCLUDE_DOM == 0
#endif

View File

@@ -45,12 +45,12 @@
extern ithread_mutex_t GlobalClientSubscribeMutex;
/************************************************************************
* Function : GenaAutoRenewSubscription
*
* Function : GenaAutoRenewSubscription
*
* Parameters:
* IN void *input: Thread data(upnp_timeout *) needed to send the renewal
*
* Description:
* Description:
* This is a thread function to send the renewal just before the
* subscription times out.
*
@@ -93,7 +93,7 @@ GenaAutoRenewSubscription( IN void *input )
}
}
if( send_callback ) {
HandleReadLock();
HandleLock();
if( GetHandleInfo( event->handle, &handle_info ) != HND_CLIENT ) {
HandleUnlock();
free_upnp_timeout( event );
@@ -113,14 +113,14 @@ GenaAutoRenewSubscription( IN void *input )
}
/************************************************************************
* Function : ScheduleGenaAutoRenew
*
* Function : ScheduleGenaAutoRenew
*
* Parameters:
* IN int client_handle: Handle that also contains the subscription list
* IN int TimeOut: The time out value of the subscription
* IN client_subscription * sub: Subscription being renewed
*
* Description:
* Description:
* This function schedules a job to renew the subscription just before
* time out.
*
@@ -188,14 +188,14 @@ ScheduleGenaAutoRenew( IN int client_handle,
}
/************************************************************************
* Function : gena_unsubscribe
*
* Function : gena_unsubscribe
*
* Parameters:
* IN char *url: Event URL of the service
* IN char *sid: The subcription ID.
* OUT http_parser_t* response: The UNSUBCRIBE response from the device
*
* Description:
* Description:
* This function sends the UNSUBCRIBE gena request and recieves the
* response from the device and returns it as a parameter
*
@@ -251,9 +251,9 @@ gena_unsubscribe( IN char *url,
}
/************************************************************************
* Function : gena_subscribe
*
* Parameters:
* Function : gena_subscribe
*
* Parameters:
* IN char *url: url of service to subscribe
* INOUT int* timeout:subscription time desired (in secs)
* IN char* renewal_sid:for renewal, this contains a currently h
@@ -261,7 +261,7 @@ gena_unsubscribe( IN char *url,
* subscription, this must be NULL
* OUT char** sid: SID returned by the subscription or renew msg
*
* Description:
* Description:
* This function subscribes or renew subscription
*
* Returns: int
@@ -374,13 +374,13 @@ gena_subscribe( IN char *url,
}
/************************************************************************
* Function : genaUnregisterClient
*
* Parameters:
* Function : genaUnregisterClient
*
* Parameters:
* IN UpnpClient_Handle client_handle: Handle containing all the control
* point related information
*
* Description:
* Description:
* This function unsubcribes all the outstanding subscriptions and cleans
* the subscription list. This function is called when control point
* unregisters.
@@ -435,12 +435,12 @@ genaUnregisterClient( IN UpnpClient_Handle client_handle )
/************************************************************************
* Function : genaUnSubscribe
*
* Parameters:
*
* Parameters:
* IN UpnpClient_Handle client_handle: UPnP client handle
* IN SID in_sid: The subscription ID
*
* Description:
* Description:
* This function unsubscribes a SID. It first validates the SID and
* client_handle,copies the subscription, sends UNSUBSCRIBE http request
* to service processes request and finally removes the subscription
@@ -506,8 +506,8 @@ genaUnSubscribe( IN UpnpClient_Handle client_handle,
/************************************************************************
* Function : genaSubscribe
*
* Parameters:
*
* Parameters:
* IN UpnpClient_Handle client_handle:
* IN char * PublisherURL: NULL Terminated, of the form :
* "http://134.134.156.80:4000/RedBulb/Event"
@@ -516,7 +516,7 @@ genaUnSubscribe( IN UpnpClient_Handle client_handle,
* by Service, -1 for infinite
* OUT Upnp_SID out_sid:sid of subscription, memory passed in by caller
*
* Description:
* Description:
* This function subscribes to a PublisherURL ( also mentioned as EventURL
* some places). It sends SUBSCRIBE http request to service processes
* request. Finally adds a Subscription to
@@ -543,10 +543,10 @@ genaSubscribe( IN UpnpClient_Handle client_handle,
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA SUBSCRIBE BEGIN" );
HandleLock();
memset( out_sid, 0, sizeof( Upnp_SID ) );
HandleReadLock();
// validate handle
if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {
HandleUnlock();
@@ -616,15 +616,15 @@ genaSubscribe( IN UpnpClient_Handle client_handle,
/************************************************************************
* Function : genaRenewSubscription
*
* Parameters:
*
* Parameters:
* IN UpnpClient_Handle client_handle: Client handle
* IN const Upnp_SID in_sid: subscription ID
* INOUT int * TimeOut: requested Duration, if -1, then "infinite".
* in the OUT case: actual Duration granted
* by Service, -1 for infinite
*
* Description:
* Description:
* This function renews a SID. It first validates the SID and
* client_handle and copies the subscription. It sends RENEW
* (modified SUBSCRIBE) http request to service and processes
@@ -724,14 +724,14 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
/************************************************************************
* Function : gena_process_notification_event
*
* Parameters:
*
* Parameters:
* IN SOCKINFO *info: Socket structure containing the device socket
* information
* IN http_message_t* event: The http message contains the GENA
* notification
*
* Description:
* Description:
* This function processes NOTIFY events that are sent by devices.
* called by genacallback()
*
@@ -881,4 +881,3 @@ gena_process_notification_event( IN SOCKINFO * info,
#endif // INCLUDE_CLIENT_APIS
#endif // EXCLUDE_GENA

View File

@@ -365,7 +365,7 @@ genaNotifyThread( IN void *input )
struct Handle_Info *handle_info;
ThreadPoolJob job;
HandleReadLock();
HandleLock();
//validate context
if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) {

View File

@@ -396,7 +396,7 @@ scanner_get_str( IN scanner_t * scanner )
* Note :
************************************************************************/
#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
scanner_pushback( INOUT scanner_t * scanner,
IN size_t pushback_bytes )
@@ -966,7 +966,7 @@ read_until_crlf( INOUT scanner_t * scanner,
* PARSE_INCOMPLETE
************************************************************************/
#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
skip_to_end_of_header( INOUT scanner_t * scanner )
{

View File

@@ -349,7 +349,7 @@ http_SendMessage( IN SOCKINFO * info,
filename = ( char * )va_arg( argp, char * );
if( Instr && Instr->IsVirtualFile )
Fp = (virtualDirCallback.open)( filename, UPNP_READ );
Fp = virtualDirCallback.open( filename, UPNP_READ );
else
Fp = fopen( filename, "rb" );
@@ -475,13 +475,11 @@ http_SendMessage( IN SOCKINFO * info,
buf_length = ( size_t ) va_arg( argp, size_t );
if( buf_length > 0 ) {
num_written = sock_write( info, buf, buf_length, TimeOut );
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
">>> (SENT) >>>\n"
"%.*s\nbuf_length=%d, num_written=%d\n"
"------------\n",
(int)buf_length, buf, (int)buf_length, num_written );
if( ( size_t ) num_written != buf_length )
goto end;
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
">>> (SENT) >>>\n%.*s\n------------\n",
( int )buf_length, buf );
}
}
}

View File

@@ -880,24 +880,22 @@ GetNextRange( char **SrcRangeStr,
off_t *FirstByte,
off_t *LastByte )
{
char *Ptr;
char *Tok;
int i;
int64_t F = -1;
int64_t L = -1;
char *Ptr,
*Tok;
int i,
F = -1,
L = -1;
int Is_Suffix_byte_Range = 1;
if( *SrcRangeStr == NULL ) {
if( *SrcRangeStr == NULL )
return -1;
}
Tok = StrTok( SrcRangeStr, "," );
if( ( Ptr = strstr( Tok, "-" ) ) == NULL ) {
if( ( Ptr = strstr( Tok, "-" ) ) == NULL )
return -1;
}
*Ptr = ' ';
sscanf( Tok, "%"SCNd64"%"SCNd64, &F, &L );
sscanf( Tok, "%d%d", &F, &L );
if( F == -1 || L == -1 ) {
*Ptr = '-';
@@ -912,15 +910,16 @@ GetNextRange( char **SrcRangeStr,
}
if( Is_Suffix_byte_Range ) {
*FirstByte = (off_t)L;
*LastByte = (off_t)F;
*FirstByte = L;
*LastByte = F;
return 1;
}
}
*FirstByte = (off_t)F;
*LastByte = (off_t)L;
*FirstByte = F;
*LastByte = L;
return 1;
}
/************************************************************************
@@ -1532,7 +1531,7 @@ http_RecvPostMessage( http_parser_t * parser,
if( Instr && Instr->IsVirtualFile ) {
Fp = (virtualDirCallback.open)( filename, UPNP_WRITE );
Fp = virtualDirCallback.open( filename, UPNP_WRITE );
if( Fp == NULL ) {
return HTTP_INTERNAL_SERVER_ERROR;
}

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

View File

@@ -555,7 +555,7 @@ parse_hostport( const char *in,
int begin_port;
int hostport_size = 0;
int host_size = 0;
#if !defined(WIN32) && !defined(__OSX__)
#ifndef WIN32
char temp_hostbyname_buff[BUFFER_SIZE];
struct hostent h_buf;
#endif
@@ -626,61 +626,27 @@ parse_hostport( const char *in,
// TODO: Use autoconf to discover this rather than the
// platform-specific stuff below
#if defined(WIN32) || defined(__CYGWIN__)
h = gethostbyname(temp_host_name);
h=gethostbyname(temp_host_name);
#elif defined(SPARC_SOLARIS)
errCode = gethostbyname_r(
temp_host_name,
&h,
temp_hostbyname_buff,
BUFFER_SIZE, &errcode );
errCode = gethostbyname_r( temp_host_name,
&h,
temp_hostbyname_buff,
BUFFER_SIZE, &errcode );
#elif defined(__FreeBSD__) && __FreeBSD_version < 601103
h = lwres_gethostbyname_r(
temp_host_name,
&h_buf,
temp_hostbyname_buff,
BUFFER_SIZE, &errcode );
h = lwres_gethostbyname_r( temp_host_name,
&h_buf,
temp_hostbyname_buff,
BUFFER_SIZE, &errcode );
if ( h == NULL ) {
errCode = 1;
errCode = 1;
}
#elif defined(__OSX__)
h = gethostbyname(temp_host_name);
if ( h == NULL ) {
errCode = 1;
}
#elif defined(__linux__)
errCode = gethostbyname_r(
temp_host_name,
&h_buf,
temp_hostbyname_buff,
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);
}
}
errCode = gethostbyname_r( temp_host_name,
&h_buf,
temp_hostbyname_buff,
BUFFER_SIZE, &h, &errcode );
#endif
if( errCode == 0 ) {
if( h ) {
if( ( h->h_addrtype == AF_INET ) && ( h->h_length == 4 ) ) {

View File

@@ -261,18 +261,18 @@
/** @name Other debugging features
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_SSDP 0
#define DEBUG_SOAP 0
#define DEBUG_GENA 0
#define DEBUG_TPOOL 0
#define DEBUG_ALL 1
#define DEBUG_SSDP 0
#define DEBUG_SOAP 0
#define DEBUG_GENA 0
#define DEBUG_TPOOL 0
#define DEBUG_MSERV 0
#define DEBUG_DOM 0
#define DEBUG_HTTP 0
#define DEBUG_API 0
#define DEBUG_API 0
//@} // Compile time configuration options

View File

@@ -98,25 +98,18 @@ struct Handle_Info
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);
#define HandleLock() HandleWriteLock()
#define HandleWriteLock() \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying a write lock"); \
ithread_rwlock_wrlock(&GlobalHndRWLock); \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Write lock acquired");
#define HandleReadLock() \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying a read lock"); \
ithread_rwlock_rdlock(&GlobalHndRWLock); \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Read lock acquired");
#define HandleLock() \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying Lock"); \
ithread_mutex_lock(&GlobalHndMutex); \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "LOCK");
#define HandleUnlock() \
UpnpPrintf(UPNP_INFO, API,__FILE__, __LINE__, "Trying Unlock"); \
ithread_rwlock_unlock(&GlobalHndRWLock); \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Unlocked rwlock");
ithread_mutex_unlock(&GlobalHndMutex); \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Unlock");
Upnp_Handle_Type GetClientHandleInfo(int *client_handle_out,
struct Handle_Info **HndInfo);
@@ -183,6 +176,7 @@ void UpnpThreadDistribution(struct UpnpNonblockParam * Param);
void AutoAdvertise(void *input);
int getlocalhostname(char *out);
virtualDirList *pVirtualDirList;
extern WebServerState bWebServerState;
#endif

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
HandleReadLock();
HandleLock();
if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
HandleUnlock();
@@ -159,7 +159,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
}
// dest addr
memcpy(&param.DestAddr, dest_addr, sizeof(struct sockaddr_in) );
param.DestAddr = dest_addr;
// EXT
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 ) {
return; // bad reply
}
// check each current search
//check each current search
HandleLock();
if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
HandleUnlock();
@@ -275,14 +275,14 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
}
node = ListHead( &ctrlpt_info->SsdpSearchList );
// temporary add null termination
//temporary add null termination
//save_char = hdr_value.buf[ hdr_value.length ];
//hdr_value.buf[ hdr_value.length ] = '\0';
while( node != NULL ) {
searchArg = node->item;
matched = 0;
// check for match of ST header and search target
//check for match of ST header and search target
switch ( searchArg->requestType ) {
case SSDP_ALL:
{
@@ -327,7 +327,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
}
if( matched ) {
// schedule call back
//schedule call back
threadData =
( ResultData * ) malloc( sizeof( ResultData ) );
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 'process_reply()' is a candidate for removal.
#warning 'process_reply()' is a good candidate for removal.
static UPNP_INLINE void
process_reply( IN char *request_buf,
IN int buf_len,
@@ -538,7 +538,8 @@ SearchByTarget( IN int Mx,
if( ReqBuf == NULL )
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;

View File

@@ -1,30 +1,30 @@
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// 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:
// 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
// * 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
// 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
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
@@ -83,11 +83,11 @@ advertiseAndReplyThread( IN void *data )
/************************************************************************
* Function : ssdp_handle_device_request
*
* Parameters:
* Parameters:
* IN http_message_t* hmsg: SSDP search request from the control point
* IN struct sockaddr_in* dest_addr: The address info of control point
*
* Description:
* Description:
* This function handles the search request. It do the sanity checks of
* the request and then schedules a thread to send a random time reply (
* random within maximum time given by the control point to reply).
@@ -194,15 +194,15 @@ ssdp_handle_device_request( IN http_message_t * hmsg,
#endif
/************************************************************************
* Function : NewRequestHandler
*
* Parameters:
* Function : NewRequestHandler
*
* Parameters:
* IN struct sockaddr_in * DestAddr: Ip address, to send the reply.
* IN int NumPacket: Number of packet to be sent.
* IN char **RqPacket:Number of packet to be sent.
*
* Description:
* This function works as a request handler which passes the HTTP
* Description:
* This function works as a request handler which passes the HTTP
* request string to multicast channel then
*
* Returns: void *
@@ -242,7 +242,7 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr,
// "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
// 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
//
@@ -266,24 +266,24 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr,
}
/************************************************************************
* Function : CreateServiceRequestPacket
*
* Parameters:
* IN int msg_type : type of the message ( Search Reply, Advertisement
* or Shutdown )
* Function : CreateServiceRequestPacket
*
* Parameters:
* IN int msg_type : type of the message ( Search Reply, Advertisement
* or Shutdown )
* IN char * nt : ssdp type
* IN char * usn : unique service name ( go in the HTTP Header)
* IN char * location :Location URL.
* IN int duration :Service duration in sec.
* OUT char** packet :Output buffer filled with HTTP statement.
*
* Description:
* This function creates a HTTP request packet. Depending
* Description:
* This function creates a HTTP request packet. Depending
* on the input parameter it either creates a service advertisement
* request or service shutdown request etc.
* request or service shutdown request etc.
*
* Returns: void
*
*
***************************************************************************/
void
CreateServicePacket( IN int msg_type,
@@ -358,9 +358,9 @@ CreateServicePacket( IN int msg_type,
}
/************************************************************************
* Function : DeviceAdvertisement
*
* Parameters:
* Function : DeviceAdvertisement
*
* Parameters:
* IN char * DevType : type of the device
* IN int RootDev: flag to indicate if the device is root device
* IN char * nt : ssdp type
@@ -368,7 +368,7 @@ CreateServicePacket( IN int msg_type,
* IN char * location :Location URL.
* IN int duration :Service duration in sec.
*
* Description:
* Description:
* This function creates the device advertisement request based on
* the input parameter, and send it to the multicast channel.
*
@@ -444,9 +444,9 @@ DeviceAdvertisement( IN char *DevType,
}
/************************************************************************
* Function : SendReply
*
* Parameters:
* Function : SendReply
*
* Parameters:
* IN struct sockaddr_in * DestAddr:destination IP address.
* IN char *DevType: Device type
* IN int RootDev: 1 means root device 0 means embedded device.
@@ -455,7 +455,7 @@ DeviceAdvertisement( IN char *DevType,
* IN int Duration :Life time of this device.
* IN int ByType:
*
* Description:
* Description:
* This function creates the reply packet based on the input parameter,
* and send it to the client addesss given in its input parameter DestAddr.
*
@@ -521,16 +521,17 @@ SendReply( IN struct sockaddr_in *DestAddr,
}
/************************************************************************
* Function : DeviceReply
*
* Parameters:
* Function : DeviceReply
*
* Parameters:
* IN struct sockaddr_in * DestAddr:destination IP address.
* IN char *DevType: Device type
* IN int RootDev: 1 means root device 0 means embedded device.
* IN char * Udn: Device UDN
* IN char * Location: Location of Device description document.
* IN int Duration :Life time of this device.
* Description:
* Description:
* This function creates the reply packet based on the input parameter,
* and send it to the client address given in its input parameter DestAddr.
*
@@ -599,16 +600,18 @@ DeviceReply( IN struct sockaddr_in *DestAddr,
}
/************************************************************************
* Function : ServiceAdvertisement
*
* Parameters:
* Function : ServiceAdvertisement
*
* Parameters:
* IN char * Udn: Device UDN
* IN char *ServType: Service Type.
* IN char * Location: Location of Device description document.
* IN int Duration :Life time of this device.
* Description:
* This function creates the advertisement packet based
* Description:
* This function creates the advertisement packet based
* on the input parameter, and send it to the multicast channel.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
@@ -645,17 +648,19 @@ ServiceAdvertisement( IN char *Udn,
}
/************************************************************************
* Function : ServiceReply
*
* Parameters:
* Function : ServiceReply
*
* Parameters:
* IN struct sockaddr_in *DestAddr:
* IN char * Udn: Device UDN
* IN char *ServType: Service Type.
* IN char * Location: Location of Device description document.
* IN int Duration :Life time of this device.
* Description:
* Description:
* This function creates the advertisement packet based
* on the input parameter, and send it to the multicast channel.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
@@ -688,14 +693,15 @@ ServiceReply( IN struct sockaddr_in *DestAddr,
}
/************************************************************************
* Function : ServiceShutdown
*
* Parameters:
* Function : ServiceShutdown
*
* Parameters:
* IN char * Udn: Device UDN
* IN char *ServType: Service Type.
* IN char * Location: Location of Device description document.
* IN int Duration :Service duration in sec.
* Description:
* Description:
* This function creates a HTTP service shutdown request packet
* and sent it to the multicast channel through RequestHandler.
*
@@ -733,16 +739,16 @@ ServiceShutdown( IN char *Udn,
}
/************************************************************************
* Function : DeviceShutdown
*
* Parameters:
* Function : DeviceShutdown
*
* Parameters:
* IN char *DevType: Device Type.
* IN int RootDev:1 means root device.
* IN char * Udn: Device UDN
* IN char * Location: Location URL
* IN int Duration :Device duration in sec.
*
* Description:
* Description:
* This function creates a HTTP device shutdown request packet
* and sent it to the multicast channel through RequestHandler.
*
@@ -815,4 +821,3 @@ DeviceShutdown( IN char *DevType,
#endif // EXCLUDE_SSDP
#endif // INCLUDE_DEVICE_APIS

View File

@@ -72,13 +72,11 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
#if EXCLUDE_SSDP == 0
/************************************************************************
* Function : AdvertiseAndReply
*
* Parameters:
* IN int AdFlag:
* -1 = Send shutdown,
* 0 = send reply,
* 1 = Send Advertisement
* Function : AdvertiseAndReply
*
* Parameters:
* IN int AdFlag: -1 = Send shutdown, 0 = send reply,
* 1 = Send Advertisement
* IN UpnpDevice_Handle Hnd: Device handle
* IN enum SsdpSearchType SearchType:Search type for sending replies
* IN struct sockaddr_in *DestAddr:Destination address
@@ -87,7 +85,7 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
* IN char *ServiceType:Service type
* IN int Exp:Advertisement age
*
* Description:
* Description:
* This function sends SSDP advertisements, replies and shutdown messages.
*
* Returns: int
@@ -122,13 +120,16 @@ int AdvertiseAndReply( IN int AdFlag,
"Inside AdvertiseAndReply with AdFlag = %d\n",
AdFlag );
// Use a read lock
HandleReadLock();
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
}
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
@@ -149,13 +150,15 @@ int AdvertiseAndReply( IN int AdFlag,
}
dbgStr = ixmlNode_getNodeName( tmpNode );
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Extracting device type once for %s\n", dbgStr );
// extract device type
ixmlNodeList_free( nodeList );
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Extracting device type once for %s\n",
dbgStr );
// extract device type
ixmlNodeList_free( nodeList );
nodeList = NULL;
nodeList = ixmlElement_getElementsByTagName(
( IXML_Element * ) tmpNode, "deviceType" );
nodeList =
ixmlElement_getElementsByTagName( ( IXML_Element * ) tmpNode,
"deviceType" );
if( nodeList == NULL ) {
continue;
}
@@ -163,6 +166,7 @@ int AdvertiseAndReply( IN int AdFlag,
dbgStr = ixmlNode_getNodeName( tmpNode );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting UDN for %s\n", dbgStr );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting device type\n" );
@@ -232,12 +236,13 @@ int AdvertiseAndReply( IN int AdFlag,
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Sending UDNStr = %s \n", UDNstr );
if( AdFlag ) {
if( AdFlag ) {
// send the device advertisement
if( AdFlag == 1 ) {
DeviceAdvertisement( devType, i == 0,
UDNstr, SInfo->DescURL, Exp );
} else { // AdFlag == -1
} else // AdFlag == -1
{
DeviceShutdown( devType, i == 0, UDNstr,
SERVER, SInfo->DescURL, Exp );
}
@@ -319,9 +324,8 @@ int AdvertiseAndReply( IN int AdFlag,
}
for( j = 0;; j++ ) {
tmpNode = ixmlNodeList_item( nodeList, j );
if( tmpNode == NULL ) {
if( tmpNode == NULL )
break;
}
ixmlNodeList_free( tmpNodeList );
tmpNodeList = NULL;
@@ -330,7 +334,7 @@ int AdvertiseAndReply( IN int AdFlag,
if( tmpNodeList == NULL ) {
UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
"ServiceType not found \n" );
continue;
continue;
}
tmpNode2 = ixmlNodeList_item( tmpNodeList, 0 );
if( tmpNode2 == NULL ) {
@@ -363,21 +367,26 @@ int AdvertiseAndReply( IN int AdFlag,
} else {
switch ( SearchType ) {
case SSDP_ALL:
ServiceReply( DestAddr, servType,
UDNstr, SInfo->DescURL,
defaultExp );
break;
case SSDP_SERVICE:
if( ServiceType != NULL ) {
if( !strncasecmp( ServiceType,
servType,
strlen( ServiceType ) ) ) {
ServiceReply( DestAddr, servType,
UDNstr, SInfo->DescURL,
defaultExp );
}
{
ServiceReply( DestAddr, servType,
UDNstr, SInfo->DescURL,
defaultExp );
break;
}
case SSDP_SERVICE:
{
if( ServiceType != NULL ) {
if( !strncasecmp( ServiceType,
servType,
strlen( ServiceType ) ) )
{
ServiceReply( DestAddr, servType,
UDNstr, SInfo->DescURL,
defaultExp );
}
}
break;
}
break;
default:
break;
} // switch(SearchType)
@@ -392,7 +401,7 @@ int AdvertiseAndReply( IN int AdFlag,
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting AdvertiseAndReply : \n" );
HandleUnlock();
HandleUnlock( );
return UPNP_E_SUCCESS;
@@ -402,12 +411,12 @@ int AdvertiseAndReply( IN int AdFlag,
#endif
/************************************************************************
* Function : Make_Socket_NoBlocking
* Function : Make_Socket_NoBlocking
*
* Parameters:
* IN int sock: socket
*
* Parameters:
* IN int sock: socket
*
* Description:
* Description:
* This function makes socket non-blocking.
*
* Returns: int
@@ -431,19 +440,19 @@ Make_Socket_NoBlocking( int sock )
}
/************************************************************************
* Function : unique_service_name
* Function : unique_service_name
*
* Parameters:
* IN char *cmd: Service Name string
* OUT SsdpEvent *Evt: The SSDP event structure partially filled
* by all the function.
*
* Parameters:
* IN char *cmd: Service Name string
* OUT SsdpEvent *Evt: The SSDP event structure partially filled
* by all the function.
*
* Description:
* Description:
* This function fills the fields of the event structure like DeviceType,
* Device UDN and Service Type
*
* Returns: int
* 0 if successful else -1
* 0 if successful else -1
***************************************************************************/
int
unique_service_name( IN char *cmd,
@@ -526,13 +535,13 @@ unique_service_name( IN char *cmd,
}
/************************************************************************
* Function : ssdp_request_type1
*
* Parameters:
* Function : ssdp_request_type1
*
* Parameters:
* IN char *cmd: command came in the ssdp request
*
* Description:
* This function figures out the type of the SSDP search in the
* Description:
* This function figures out the type of the SSDP search in the
* in the request.
*
* Returns: enum SsdpSearchType
@@ -562,16 +571,16 @@ ssdp_request_type1( IN char *cmd )
}
/************************************************************************
* Function : ssdp_request_type
*
* Parameters:
* Function : ssdp_request_type
*
* Parameters:
* IN char *cmd: command came in the ssdp request
* OUT SsdpEvent *Evt: The event structure partially filled by
* this function.
*
* Description:
* Description:
* This function starts filling the SSDP event structure based upon the
* request received.
* request received.
*
* Returns: int
* 0 on success; -1 on error
@@ -593,17 +602,17 @@ ssdp_request_type( IN char *cmd,
}
/************************************************************************
* Function : free_ssdp_event_handler_data
*
* Parameters:
* Function : free_ssdp_event_handler_data
*
* Parameters:
* IN void *the_data: ssdp_thread_data structure. This structure contains
* SSDP request message.
*
* Description:
* Description:
* This function frees the ssdp request
*
* Returns: VOID
*
*
***************************************************************************/
static void
free_ssdp_event_handler_data( void *the_data )
@@ -620,13 +629,13 @@ free_ssdp_event_handler_data( void *the_data )
}
/************************************************************************
* Function : valid_ssdp_msg
*
* Parameters:
* Function : valid_ssdp_msg
*
* Parameters:
* IN void *the_data: ssdp_thread_data structure. This structure contains
* SSDP request message.
*
* Description:
* Description:
* This function do some quick checking of the ssdp msg
*
* Returns: xboolean
@@ -661,14 +670,14 @@ valid_ssdp_msg( IN http_message_t * hmsg )
}
/************************************************************************
* Function : start_event_handler
*
* Parameters:
* Function : start_event_handler
*
* Parameters:
* IN void *the_data: ssdp_thread_data structure. This structure contains
* SSDP request message.
*
* Description:
* This function parses the message and dispatches it to a handler
* Description:
* This function parses the message and dispatches it to a handler
* which handles the ssdp request msg
*
* Returns: int
@@ -713,17 +722,17 @@ start_event_handler( void *Data )
}
/************************************************************************
* Function : ssdp_event_handler_thread
*
* Parameters:
* Function : ssdp_event_handler_thread
*
* Parameters:
* IN void *the_data: ssdp_thread_data structure. This structure contains
* SSDP request message.
*
* Description:
* Description:
* This function is a thread that handles SSDP requests.
*
* Returns: void
*
*
***************************************************************************/
static void
ssdp_event_handler_thread( void *the_data )
@@ -748,16 +757,16 @@ ssdp_event_handler_thread( void *the_data )
}
/************************************************************************
* Function : readFromSSDPSocket
*
* Parameters:
* Function : readFromSSDPSocket
*
* Parameters:
* IN SOCKET socket: SSDP socket
*
* Description:
* Description:
* This function reads the data from the ssdp socket.
*
* Returns: void
*
*
***************************************************************************/
void
readFromSSDPSocket( SOCKET socket )
@@ -810,20 +819,18 @@ readFromSSDPSocket( SOCKET socket )
( struct sockaddr * )&clientAddr, &socklen );
if( byteReceived > 0 ) {
requestBuf[byteReceived] = '\0';
UpnpPrintf( UPNP_INFO, SSDP,
__FILE__, __LINE__,
"Start of received response ----------------------------------------------------\n"
"%s\n"
"End of received response ------------------------------------------------------\n"
"From host %s\n",
requestBuf,
inet_ntoa( clientAddr.sin_addr ) );
__FILE__, __LINE__,
"Received response !!! "
"%s From host %s \n",
requestBuf,
inet_ntoa( clientAddr.sin_addr ) );
UpnpPrintf( UPNP_PACKET, SSDP, __FILE__, __LINE__,
"Start of received multicast packet --------------------------------------------\n"
"%s\n"
"End of received multicast packet ----------------------------------------------\n",
requestBuf );
"Received multicast packet:"
"\n %s\n", requestBuf );
//add thread pool job to handle request
if( data != NULL ) {
data->parser.msg.msg.length += byteReceived;
@@ -846,12 +853,12 @@ readFromSSDPSocket( SOCKET socket )
/************************************************************************
* Function : get_ssdp_sockets
*
* Parameters:
*
* Parameters:
* OUT MiniServerSockArray *out: Arrays of SSDP sockets
*
* Description:
* This function creates the ssdp sockets. It set their option to listen
* Description:
* This function creates the ssdp sockets. It set their option to listen
* for multicast traffic.
*
* Returns: int
@@ -862,7 +869,8 @@ get_ssdp_sockets( MiniServerSockArray * out )
{
SOCKET ssdpSock;
CLIENTONLY( SOCKET ssdpReqSock; )
CLIENTONLY( SOCKET ssdpReqSock;
)
int onOff = 1;
u_char ttl = 4;
struct ip_mreq ssdpMcastAddr;
@@ -870,31 +878,32 @@ get_ssdp_sockets( MiniServerSockArray * out )
int option = 1;
struct in_addr addr;
CLIENTONLY(
if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
return UPNP_E_OUTOF_SOCKET;
}
setsockopt( ssdpReqSock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
// just do it, regardless if fails or not.
Make_Socket_NoBlocking( ssdpReqSock );
gSsdpReqSocket = ssdpReqSock; )
// END CLIENTONLY
CLIENTONLY( if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) )
== UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
return UPNP_E_OUTOF_SOCKET;}
setsockopt( ssdpReqSock,
IPPROTO_IP,
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
// just do it, regardless if fails or not.
Make_Socket_NoBlocking( ssdpReqSock ); gSsdpReqSocket = ssdpReqSock; ) //CLIENTONLY
if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
return UPNP_E_OUTOF_SOCKET;
}
if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) )
== UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
return UPNP_E_OUTOF_SOCKET;
}
onOff = 1;
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR,
( char * )&onOff, sizeof( onOff ) ) != 0 ) {
( char * )&onOff, sizeof( onOff ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in set reuse addr !!!\n" );
@@ -907,7 +916,8 @@ CLIENTONLY(
#ifdef __FreeBSD__
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT,
( char * )&onOff, sizeof( onOff ) ) != 0 ) {
( char * )&onOff, sizeof( onOff ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in set reuse port !!!\n" );
@@ -924,8 +934,9 @@ CLIENTONLY(
// ssdpAddr.sin_addr.s_addr = inet_addr(LOCAL_HOST);
ssdpAddr.sin_addr.s_addr = htonl( INADDR_ANY );
ssdpAddr.sin_port = htons( SSDP_PORT );
if( bind( ssdpSock, ( struct sockaddr * )&ssdpAddr,
sizeof( ssdpAddr ) ) != 0 ) {
if( bind
( ssdpSock, ( struct sockaddr * )&ssdpAddr,
sizeof( ssdpAddr ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in binding !!!\n" );
@@ -940,7 +951,8 @@ CLIENTONLY(
ssdpMcastAddr.imr_interface.s_addr = inet_addr( LOCAL_HOST );
ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP );
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,
SSDP, __FILE__, __LINE__,
"Error in joining" " multicast group !!!\n" );
@@ -954,8 +966,8 @@ CLIENTONLY(
/* Set multicast interface. */
memset( ( void * )&addr, 0, sizeof( struct in_addr ));
addr.s_addr = inet_addr(LOCAL_HOST);
if ( setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF,
(char *)&addr, sizeof addr) != 0) {
if (setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF,
(char *)&addr, sizeof addr) != 0) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"Couldn't set multicast interface.\n" );
/* This is probably not a critical error, so let's continue. */
@@ -965,7 +977,7 @@ CLIENTONLY(
setsockopt( ssdpSock, IPPROTO_IP,
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST,
(char *)&option, sizeof(option) ) != 0) {
( char * )&option, sizeof( option ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in setting broadcast !!!\n" );
@@ -976,10 +988,10 @@ CLIENTONLY(
return UPNP_E_NETWORK_ERROR;
}
CLIENTONLY( out->ssdpReqSock = ssdpReqSock; );
CLIENTONLY( out->ssdpReqSock = ssdpReqSock;
);
out->ssdpSock = ssdpSock;
return UPNP_E_SUCCESS;
}
#endif // EXCLUDE_SSDP

View File

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

View File

@@ -50,11 +50,22 @@
#define S43 15
#define S44 21
static void MD5Transform PROTO_LIST((UINT4[4], unsigned char[64]));
static void Encode PROTO_LIST((unsigned char *, UINT4 *, 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 void MD5Transform PROTO_LIST( ( UINT4[4],
unsigned char[64] ) );
static void Encode PROTO_LIST( ( unsigned char *,
UINT4 *,
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] = {
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.
*/
void
MD5Init(MD5_CTX * context)
MD5Init( context )
MD5_CTX *context; /* context */
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants. */
/*
Load magic initialization constants.
*/
context->state[0] = 0x67452301;
context->state[1] = 0xefcdab89;
context->state[2] = 0x98badcfe;
@@ -124,72 +139,114 @@ MD5Init(MD5_CTX * context)
*/
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 index;
unsigned int partLen;
unsigned int i,
index,
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)) {
context->count[1]++;
}
context->count[1] += ((UINT4)inputLen >> 29);
partLen = 64 - index;
/*
Update number of bits
*/
if( ( context->count[0] +=
( ( UINT4 ) inputLen << 3 ) ) < ( ( UINT4 ) inputLen << 3 ) )
context->count[1]++;
/* Transform as many times as possible. */
if (inputLen >= partLen) {
MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen);
MD5Transform(context->state, context->buffer);
for (i = partLen; i + 63 < inputLen; i += 64) {
MD5Transform(context->state, &input[i]);
}
index = 0;
} else {
i = 0;
}
context->count[1] += ( ( UINT4 ) inputLen >> 29 );
partLen = 64 - index;
/*
Transform as many times as possible.
*/
if( inputLen >= partLen ) {
MD5_memcpy
( ( POINTER ) & context->buffer[index], ( POINTER ) input,
partLen );
MD5Transform( context->state, context->buffer );
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
the message digest and zeroizing the context.
*/
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 int index;
unsigned int padLen;
unsigned int index,
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);
padLen = (index < 56) ? (56 - index) : (120 - index);
MD5Update(context, PADDING, padLen);
/*
Pad out to 56 mod 64.
*/
index = ( unsigned int )( ( context->count[0] >> 3 ) & 0x3f );
/* Append length (before padding) */
MD5Update(context, bits, 8);
padLen = ( index < 56 ) ? ( 56 - index ) : ( 120 - index );
/* Store state in digest */
Encode(digest, context->state, 16);
MD5Update( context, PADDING, padLen );
/*
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.
*/
static void
MD5Transform(UINT4 state[4], unsigned char block[64])
MD5Transform( state,
block )
UINT4 state[4];
unsigned char block[64];
{
UINT4 a = state[0],
b = state[1],
@@ -296,16 +353,23 @@ MD5Transform(UINT4 state[4], unsigned char block[64])
a multiple of 4.
*/
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 j;
for (i = 0, j = 0; j < len; ++i, j += 4) {
output[j+0] = (unsigned char)((input[i] >> 0) & 0xff);
output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
}
unsigned int i,
j;
for( i = 0, j = 0; j < len; i++, j += 4 ) {
output[j] = ( unsigned char )( input[i] & 0xff );
output[j + 1] = ( unsigned char )( ( input[i] >> 8 ) & 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
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 j;
for (i = 0, j = 0; j < len; ++i, j += 4) {
output[i] =
(((UINT4)input[j+0]) << 0) |
(((UINT4)input[j+1]) << 8) |
(((UINT4)input[j+2]) << 16) |
(((UINT4)input[j+3]) << 24);
}
unsigned int i,
j;
for( i = 0, j = 0; j < len; i++, j += 4 )
output[i] =
( ( UINT4 ) input[j] ) | ( ( ( UINT4 ) input[j + 1] ) << 8 ) |
( ( ( UINT4 ) input[j + 2] ) << 16 ) |
( ( ( 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
MD5_memcpy(POINTER output, POINTER input, unsigned int len)
MD5_memcpy( output,
input,
len )
POINTER output;
POINTER input;
unsigned int len;
{
unsigned int i;
for (i = 0; i < len; ++i) {
output[i] = input[i];
}
unsigned int i;
for( i = 0; i < len; 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
MD5_memset(POINTER output, int value, unsigned int len)
MD5_memset( output,
value,
len )
POINTER output;
int value;
unsigned int len;
{
unsigned int i;
for (i = 0; i < len; ++i) {
((char *)output)[i] = (char)value;
}
}
unsigned int i;
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
*/
void
get_ieee_node_identifier(uuid_node_t *node)
get_ieee_node_identifier( uuid_node_t * node )
{
char seed[16];
static int inited = 0;
static uuid_node_t saved_node;
if (!inited) {
get_random_info(seed);
if( !inited ) {
get_random_info( seed );
seed[0] |= 0x80;
memcpy(&saved_node, seed, sizeof (uuid_node_t));
memcpy( &saved_node, seed, sizeof( uuid_node_t ) );
inited = 1;
};
@@ -82,48 +83,52 @@ get_system_time( uuid_time_t * uuid_time )
/*-----------------------------------------------------------------------------*/
void
get_random_info(char seed[16])
get_random_info( char seed[16] )
{
MD5_CTX c;
typedef struct {
MEMORYSTATUS m;
SYSTEM_INFO s;
FILETIME t;
LARGE_INTEGER pc;
DWORD tc;
DWORD l;
char hostname[MAX_COMPUTERNAME_LENGTH + 1];
} randomness;
randomness r;
MD5_CTX c;
typedef struct {
MEMORYSTATUS m;
SYSTEM_INFO s;
FILETIME t;
LARGE_INTEGER pc;
DWORD tc;
DWORD l;
char hostname[MAX_COMPUTERNAME_LENGTH + 1];
} randomness;
randomness r;
/* Initialize memory area so that valgrind does not complain */
memset(&r, 0, sizeof r);
MD5Init( &c );
/*
memory usage stats
*/
GlobalMemoryStatus( &r.m );
/*
random system stats
*/
GetSystemInfo( &r.s );
/*
100ns resolution (nominally) time of day
*/
GetSystemTimeAsFileTime( &r.t );
/*
high resolution performance counter
*/
QueryPerformanceCounter( &r.pc );
/*
milliseconds since last boot
*/
r.tc = GetTickCount( );
r.l = MAX_COMPUTERNAME_LENGTH + 1;
/* memory usage stats */
GlobalMemoryStatus( &r.m );
/* random system stats */
GetSystemInfo( &r.s );
/* 100ns resolution (nominally) time of day */
GetSystemTimeAsFileTime( &r.t );
/* high resolution performance counter */
QueryPerformanceCounter( &r.pc );
/* milliseconds since last boot */
r.tc = GetTickCount();
r.l = MAX_COMPUTERNAME_LENGTH + 1;
GetComputerName( r.hostname, &r.l );
/* MD5 it */
MD5Init(&c);
MD5Update(&c, &r, sizeof r);
MD5Final(seed, &c);
GetComputerName( r.hostname, &r.l );
MD5Update( &c, &r, sizeof( randomness ) );
MD5Final( seed, &c );
};
#else /* _WINDOWS_ */
#else
/*-----------------------------------------------------------------------------*/
void
get_system_time(uuid_time_t *uuid_time)
get_system_time( uuid_time_t * uuid_time )
{
struct timeval tp;
@@ -140,28 +145,22 @@ get_system_time(uuid_time_t *uuid_time)
/*-----------------------------------------------------------------------------*/
void
get_random_info(char seed[16])
get_random_info( char seed[16] )
{
MD5_CTX c;
typedef struct {
//struct sysinfo s;
struct timeval t;
char hostname[257];
} randomness;
randomness r;
MD5_CTX c;
typedef struct {
// struct sysinfo s;
struct timeval t;
char hostname[257];
} randomness;
randomness r;
/* Initialize memory area so that valgrind does not complain */
memset(&r, 0, sizeof r);
MD5Init( &c );
/* Get some random stuff */
gettimeofday(&r.t, (struct timezone *)0);
gethostname(r.hostname, 256 );
/* MD5 it */
MD5Init(&c);
MD5Update(&c, &r, sizeof r);
MD5Final(seed, &c);
gettimeofday( &r.t, ( struct timezone * )0 );
gethostname( r.hostname, 256 );
MD5Update( &c, &r, sizeof( randomness ) );
MD5Final( seed, &c );
};
#endif /* _WINDOWS_ */
#endif

View File

@@ -53,10 +53,10 @@ static unsigned16 true_random( void );
uuid_create -- generator a UUID
*/
int
uuid_create(uuid_upnp *uid)
uuid_create( uuid_upnp * uid )
{
uuid_time_t timestamp;
uuid_time_t last_time;
uuid_time_t timestamp,
last_time;
unsigned16 clockseq;
uuid_node_t node;
uuid_node_t last_node;
@@ -65,64 +65,61 @@ uuid_create(uuid_upnp *uid)
/*
acquire system wide lock so we're alone
*/
UUIDLock();
UUIDLock( );
/*
get current time
*/
get_current_time(&timestamp);
get_current_time( &timestamp );
/*
get node ID
*/
get_ieee_node_identifier(&node);
get_ieee_node_identifier( &node );
/*
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
(e.g., net card swap) change clockseq
*/
if (!f || memcmp(&node, &last_node, sizeof(uuid_node_t))) {
clockseq = true_random();
} else if (timestamp < last_time) {
if( !f || memcmp( &node, &last_node, sizeof( uuid_node_t ) ) )
clockseq = true_random( );
else if( timestamp < last_time )
clockseq++;
}
/*
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
*/
write_state(clockseq, timestamp, node);
write_state( clockseq, timestamp, node );
UUIDUnlock();
return 1;
UUIDUnlock( );
return ( 1 );
};
/*-----------------------------------------------------------------------------*/
void
uuid_unpack(uuid_upnp *u, char *out)
uuid_unpack( uuid_upnp * u,
char *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",
(unsigned int)u->time_low,
u->time_mid,
u->time_hi_and_version,
u->clock_seq_hi_and_reserved,
u->clock_seq_low,
u->node[0],
u->node[1],
u->node[2],
u->node[3],
u->node[4],
u->node[5]);
sprintf( out,
"%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x",
( unsigned int )u->time_low, u->time_mid,
u->time_hi_and_version, u->clock_seq_hi_and_reserved,
u->clock_seq_low, u->node[0], u->node[1], u->node[2],
u->node[3], u->node[4], u->node[5] );
*( out + 36 ) = '\0';
};
/*-----------------------------------------------------------------------------*/
@@ -140,10 +137,11 @@ format_uuid_v1( uuid_upnp * uid,
Construct a version 1 uuid with the information we've gathered
* plus a few constants.
*/
uid->time_low = (unsigned long)(timestamp & 0xFFFFFFFF);
uid->time_mid = (unsigned short)((timestamp >> 32) & 0xFFFF);
uid->time_hi_and_version = (unsigned short)((timestamp >> 48) & 0x0FFF);
uid->time_hi_and_version |= (1 << 12);
uid->time_low = ( unsigned long )( timestamp & 0xFFFFFFFF );
uid->time_mid = ( unsigned short )( ( timestamp >> 32 ) & 0xFFFF );
uid->time_hi_and_version = ( unsigned short )( ( timestamp >> 48 ) &
0x0FFF );
uid->time_hi_and_version |= ( 1 << 12 );
uid->clock_seq_low = clock_seq & 0xFF;
uid->clock_seq_hi_and_reserved = ( clock_seq & 0x3F00 ) >> 8;
uid->clock_seq_hi_and_reserved |= 0x80;
@@ -229,6 +227,7 @@ get_current_time( uuid_time_t * timestamp )
static int inited = 0;
if( !inited ) {
get_system_time( &time_now );
uuids_this_tick = UUIDS_PER_TICK;
inited = 1;
};

View File

@@ -105,7 +105,7 @@ main (int argc, char* argv[])
* Test library initialisation
*/
printf ("\n");
printf ("Initializing UPnP ... \n");
printf ("Intializing UPnP ... \n");
rc = UpnpInit (NULL, 0);
if ( UPNP_E_SUCCESS == rc ) {
const char* ip_address = UpnpGetServerIpAddress();