Compare commits
172 Commits
branch-1.4
...
release-1.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
46cc47b167 | ||
![]() |
13a1fff7a1 | ||
![]() |
c9463545a8 | ||
![]() |
de1d7e81a3 | ||
![]() |
f87dbf8115 | ||
![]() |
83ee32afb7 | ||
![]() |
4f960c4e34 | ||
![]() |
c85537df11 | ||
![]() |
20905cb7a7 | ||
![]() |
5b744169d5 | ||
![]() |
c69e16b347 | ||
![]() |
cb7e6b7472 | ||
![]() |
fd80e5a8ff | ||
![]() |
b29de32110 | ||
![]() |
6455ac6eea | ||
![]() |
f7bb1f9582 | ||
![]() |
0728ab3b25 | ||
![]() |
cb9ee8254c | ||
![]() |
f08fdac9b6 | ||
![]() |
0db035cc7b | ||
![]() |
da11e52924 | ||
![]() |
bc7b0c9d4d | ||
![]() |
b2757d9d55 | ||
![]() |
7967a0cd45 | ||
![]() |
67b51187b9 | ||
![]() |
491f5ffef6 | ||
![]() |
e4bcf18599 | ||
![]() |
c856356414 | ||
![]() |
6acffb7ede | ||
![]() |
837f31bacd | ||
![]() |
5151d45203 | ||
![]() |
114389589d | ||
![]() |
b817ec5152 | ||
![]() |
d9de9a486c | ||
![]() |
13ebb40e08 | ||
![]() |
b614c81e94 | ||
![]() |
53766465a9 | ||
![]() |
9bc187d4c6 | ||
![]() |
80517f26a6 | ||
![]() |
468cb2a908 | ||
![]() |
d71db4c57c | ||
![]() |
947dfd9a85 | ||
![]() |
8f7fd0fc6d | ||
![]() |
81635d74c1 | ||
![]() |
d8ba182d85 | ||
![]() |
0a41ee988b | ||
![]() |
907eb0636a | ||
![]() |
80fc7c3bb0 | ||
![]() |
83fb96fbe2 | ||
![]() |
4e1240a0a8 | ||
![]() |
2c1dba2942 | ||
![]() |
4ceb6c67d1 | ||
![]() |
3fa207984a | ||
![]() |
b82c9c6009 | ||
![]() |
b1f6e83380 | ||
![]() |
00a33f5788 | ||
![]() |
dfec187e88 | ||
![]() |
dee3e96a63 | ||
![]() |
23e8160417 | ||
![]() |
99e11d4fd5 | ||
![]() |
fb4e7f659d | ||
![]() |
28799f26c9 | ||
![]() |
c1e5e4d6a4 | ||
![]() |
c0d9908afe | ||
![]() |
e80cc3ac64 | ||
![]() |
e04192e1d0 | ||
![]() |
bbe85ef599 | ||
![]() |
5c0893928c | ||
![]() |
948c959be5 | ||
![]() |
f8c4d81ee5 | ||
![]() |
286a45d4ad | ||
![]() |
59e0e015be | ||
![]() |
bdda54a66b | ||
![]() |
41cb45146c | ||
![]() |
2c2a5f7c18 | ||
![]() |
047b9534bb | ||
![]() |
88076a3c4b | ||
![]() |
c3060e0d0b | ||
![]() |
2ac3819f8c | ||
![]() |
0d451c9c8e | ||
![]() |
bbd16d75ed | ||
![]() |
a225d3b54e | ||
![]() |
08834bf0f0 | ||
![]() |
e31fcce11d | ||
![]() |
dce8f71256 | ||
![]() |
7a359f29e3 | ||
![]() |
ed9a594e73 | ||
![]() |
039b5fdae6 | ||
![]() |
f07bcb749f | ||
![]() |
f64c539395 | ||
![]() |
cab8e4f799 | ||
![]() |
2331839f69 | ||
![]() |
363ac6e007 | ||
![]() |
5c4e45fb4d | ||
![]() |
436bc8fc6d | ||
![]() |
c6d3d63223 | ||
![]() |
ae7ca6a2cf | ||
![]() |
9595ddcf3a | ||
![]() |
fd19d54144 | ||
![]() |
17db87ab96 | ||
![]() |
3b12ced1f8 | ||
![]() |
4abbd5a8a4 | ||
![]() |
836069f43b | ||
![]() |
353a876a54 | ||
![]() |
2bc6a1f8dd | ||
![]() |
1d9e8712b7 | ||
![]() |
819ad1f365 | ||
![]() |
e9e8ea5636 | ||
![]() |
14f72e1442 | ||
![]() |
ae13c481a7 | ||
![]() |
38a91fdaec | ||
![]() |
87f336c940 | ||
![]() |
74d2b0049b | ||
![]() |
635d6ffa93 | ||
![]() |
8c56f16607 | ||
![]() |
5d3ef166c1 | ||
![]() |
a4072c19b1 | ||
![]() |
1716c7a10d | ||
![]() |
83782e8ae2 | ||
![]() |
f1cc7db79d | ||
![]() |
e69d5a8609 | ||
![]() |
16637892e3 | ||
![]() |
d19a57c866 | ||
![]() |
8c21b2c4d9 | ||
![]() |
736efca5dd | ||
![]() |
d5449dc948 | ||
![]() |
7c49b3b8a4 | ||
![]() |
5c03ebe6e1 | ||
![]() |
d17eb5fcfc | ||
![]() |
8625298899 | ||
![]() |
864d3db0ad | ||
![]() |
1d4d1ff87e | ||
![]() |
a26769b27b | ||
![]() |
fbbec55457 | ||
![]() |
8245b0d808 | ||
![]() |
815d08420a | ||
![]() |
1d0ce01f31 | ||
![]() |
947896bcee | ||
![]() |
7ed934d858 | ||
![]() |
4a7708331c | ||
![]() |
ab66940a89 | ||
![]() |
ebac5fe596 | ||
![]() |
11de68d0e3 | ||
![]() |
dfe3071af4 | ||
![]() |
cd50cb678f | ||
![]() |
f13fd3d522 | ||
![]() |
927b86545f | ||
![]() |
a155612cba | ||
![]() |
df3df9eaed | ||
![]() |
eefeb86a96 | ||
![]() |
0452011b99 | ||
![]() |
a20707485d | ||
![]() |
ec86a6f92b | ||
![]() |
89e7a40fcc | ||
![]() |
90c3db2a96 | ||
![]() |
cf9ae4f6e5 | ||
![]() |
f28f81f820 | ||
![]() |
bcaba51f57 | ||
![]() |
4c5b61dc55 | ||
![]() |
9147c3517e | ||
![]() |
cbefc2ff49 | ||
![]() |
863e743c41 | ||
![]() |
26bde09028 | ||
![]() |
bc2941c2a7 | ||
![]() |
40186d3e9c | ||
![]() |
01d26f8f74 | ||
![]() |
b2cb458ee3 | ||
![]() |
16da6980d1 | ||
![]() |
211973749c | ||
![]() |
a22ba2f159 | ||
![]() |
142929623d | ||
![]() |
3170fbd730 |
176
ChangeLog
176
ChangeLog
@@ -1,7 +1,121 @@
|
|||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
Version 1.4.7
|
Version 1.6.1
|
||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
|
|
||||||
|
2007-11-07 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
* SF Bug Tracker [ 1825278 ] AdvertiseAndReply sleeps with handle lock out
|
||||||
|
Applied patch from Alex (afaucher) to change some write locks to read
|
||||||
|
locks.
|
||||||
|
|
||||||
|
2007-11-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
* Adjusting libtool library numbers to reflect the last changes.
|
||||||
|
|
||||||
|
2007-11-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
* SF Bug Tracker [ 1825278 ] AdvertiseAndReply sleeps with handle lock out
|
||||||
|
GlobalHndMutex, which was a mutex is now GlobalHndRWLock, which is a
|
||||||
|
rwlock. HandleLock() is mapped to HandleWriteLock() while all other
|
||||||
|
instances have not been checked. One instance in AdvertiseAndReply()
|
||||||
|
has been changed to HandleReadLock(). Thanks to Alex (afaucher) for the
|
||||||
|
bug report and suggestions.
|
||||||
|
|
||||||
|
2007-11-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
* Added support for rwlocks.
|
||||||
|
|
||||||
|
2007-11-05 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
* SF Bug Tracker [ 1825929 ] woker thread still alive after UpnpFinish()
|
||||||
|
Submitted By: Luke Kim - nereusuj
|
||||||
|
Worker thread still alive after calling UpnpFinish() because
|
||||||
|
ThreadPoolShutdown() is in the #ifdef DEBUG block.
|
||||||
|
421
|
||||||
|
422 #ifdef DEBUG
|
||||||
|
423 ThreadPoolShutdown( &gSendThreadPool );
|
||||||
|
424 ThreadPoolShutdown( &gRecvThreadPool );
|
||||||
|
|
||||||
|
2007-08-28 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
* Changed the calls to virtualDirCallback.open(filename, UPNP_WRITE)
|
||||||
|
to (virtualDirCallback.open)(filename, UPNP_WRITE) (notice the
|
||||||
|
parenthesis) due to a change in glibc that produces compilation
|
||||||
|
errors.
|
||||||
|
|
||||||
|
2007-08-28 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
* Initialization of the "randomness" struct so that valgrind does not
|
||||||
|
complain.
|
||||||
|
|
||||||
|
2007-08-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
* Merge of patch submitted By Keith Brindley - brindlk
|
||||||
|
SF Bug Tracker [ 1762758 ] Seek not working for large files
|
||||||
|
Problem:
|
||||||
|
Requests from the uPnP client to seek to a position beyond 2GB in a large
|
||||||
|
file are handled as a request to see from the 2GB point.
|
||||||
|
|
||||||
|
Impact:
|
||||||
|
Varies depending on client. The Xbox 360 kills the connection when it
|
||||||
|
realises.
|
||||||
|
|
||||||
|
Solution:
|
||||||
|
GetNextRange function (webserver.c) is updated to handle large file sizes.
|
||||||
|
Fix should also recognise when built on a 32bit platform rather than 64 and
|
||||||
|
handle accordingly.
|
||||||
|
|
||||||
|
2007-08-05 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
* Merge of Mac OS X patch from St<53>phane Corth<74>sy (davelopper),
|
||||||
|
SF Bug Tracker [ 1686420 ] Modifications for MacOSX.
|
||||||
|
Some of the proposed changes were already done by Rene Hexel's patch.
|
||||||
|
|
||||||
|
*******************************************************************************
|
||||||
|
Version 1.6.0
|
||||||
|
*******************************************************************************
|
||||||
|
|
||||||
|
2007-06-10 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
* More fixes to Mac OS X and NetBSD from Rene Hexel:
|
||||||
|
[pupnp-devel] NetBSD & Mac OS X packages and patches
|
||||||
|
|
||||||
|
Okay, I found a couple more things. I have attached a patch file
|
||||||
|
against the trunk (version 206) that make the repository code compile
|
||||||
|
and run on both Mac OS X and NetBSD.
|
||||||
|
|
||||||
|
This fixes the following issues:
|
||||||
|
|
||||||
|
upnp/src/api/upnpapi.c: SIOCGIFCONF didn't work properly, use
|
||||||
|
getifaddrs() instead (on BSD systems).
|
||||||
|
|
||||||
|
threadutil/src/ThreadPool.c: priorities only work if
|
||||||
|
_POSIX_PRIORITY_SCHEDULING is defined (and greater than 0).
|
||||||
|
|
||||||
|
threadutil/src/LinkedList.c and threadutil/src/iasnprintf.c: use
|
||||||
|
stdlib.h instead of malloc.h on all BSD systems (not just FreeBSD).
|
||||||
|
This is important, because malloc.h does not exist on Darwin/Mac OS X.
|
||||||
|
|
||||||
|
Cheers
|
||||||
|
,
|
||||||
|
Rene
|
||||||
|
|
||||||
|
2007-06-09 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
* [pupnp-devel] NetBSD & Mac OS X packages and patches.
|
||||||
|
Rene Hexel's <rh@netbsd.org> patch to compile in NetBSD and Mac OS X.
|
||||||
|
|
||||||
|
2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
* Updated the macro files acx_pthread.m4, ax_cflags_gcc_option.m4,
|
||||||
|
ax_cflags_warn_all.m4, m4/ax_cflags_warn_all_ansi.m4,
|
||||||
|
m4/type_socklen_t.m4.
|
||||||
|
|
||||||
|
2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
* Fixed an issue with the instalation of the file upnpdebug.h. Since
|
||||||
|
the last modifications that removed the macro DEBUV_ONLY, this file
|
||||||
|
must be installed even on a non-debug build.
|
||||||
|
|
||||||
|
2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
* SF Bug Tracker [ 1711325 ] Bad DestAddr in Upnp_Discovery structure
|
||||||
|
Submitted By: Bob Ciora
|
||||||
|
The field DestAddr of the structure Upnp_Discovery is now a full
|
||||||
|
SOCKADDRIN instead of a pointer to SOCKADDRIN. Commented code sugests
|
||||||
|
that in a previous moment, the function ssdp_handle_ctrlpt_msg() did
|
||||||
|
not use a postponed thread to call ctrlpt_callback(). Now the code
|
||||||
|
uses a thread, and most probably the original data would get lost and
|
||||||
|
the pointer would point to an invalid memory region. This fix caused
|
||||||
|
an interface change in the library and the minor library version was
|
||||||
|
bumped. Also, the libtool library numbers were changed accordingly.
|
||||||
|
|
||||||
2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
* Added support for the Basic Device
|
* Added support for the Basic Device
|
||||||
(http://www.upnp.org/standardizeddcps/basic.asp) as suggested by
|
(http://www.upnp.org/standardizeddcps/basic.asp) as suggested by
|
||||||
@@ -364,14 +478,14 @@ Version 1.4.0
|
|||||||
FORK FROM DEAD libupnp
|
FORK FROM DEAD libupnp
|
||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
|
|
||||||
2006-04-29 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-04-29 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* THANKS: new file with list of contributors
|
* THANKS: new file with list of contributors
|
||||||
|
|
||||||
* upnp/src/gena/gena_device.c (respond_ok): add 'Content-Length: 0'
|
* upnp/src/gena/gena_device.c (respond_ok): add 'Content-Length: 0'
|
||||||
in subscription response. Patch by Chaos (Bug # 1455367).
|
in subscription response. Patch by Chaos (Bug # 1455367).
|
||||||
|
|
||||||
2006-04-08 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-04-08 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/doc/UPnP_Programming_Guide.pdf: replace this document with
|
* upnp/doc/UPnP_Programming_Guide.pdf: replace this document with
|
||||||
the one in libupnp-doc-1.2.1 because current CVS version
|
the one in libupnp-doc-1.2.1 because current CVS version
|
||||||
@@ -382,20 +496,20 @@ FORK FROM DEAD libupnp
|
|||||||
* changes applied to several files to work under Sparc Solaris, temporarily
|
* changes applied to several files to work under Sparc Solaris, temporarily
|
||||||
requiring a define SPARC_SOLARIS
|
requiring a define SPARC_SOLARIS
|
||||||
|
|
||||||
2006-04-03 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-04-03 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/Makefile.am: install upnp samples in $(docdir)/examples
|
* upnp/Makefile.am: install upnp samples in $(docdir)/examples
|
||||||
|
|
||||||
2006-03-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-03-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* configure.ac: add --with-docdir option to choose where documentation
|
* configure.ac: add --with-docdir option to choose where documentation
|
||||||
is installed (or -without-docdir to not install the documentation)
|
is installed (or -without-docdir to not install the documentation)
|
||||||
|
|
||||||
2006-03-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-03-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* ixml/test: add simple test suite for xml parser
|
* ixml/test: add simple test suite for xml parser
|
||||||
|
|
||||||
2006-03-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-03-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* ixml/src/ixmlparser.c (Parser_processCDSect): fix bug which prevents
|
* ixml/src/ixmlparser.c (Parser_processCDSect): fix bug which prevents
|
||||||
CDATA sections which contain a 0 (zero) to be parsed (instead the
|
CDATA sections which contain a 0 (zero) to be parsed (instead the
|
||||||
@@ -406,18 +520,18 @@ FORK FROM DEAD libupnp
|
|||||||
option, and move samples compilation from check_PROGRAMS to
|
option, and move samples compilation from check_PROGRAMS to
|
||||||
noinst_PROGRAMS
|
noinst_PROGRAMS
|
||||||
|
|
||||||
2006-03-25 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-03-25 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/src/genlib/miniserver/miniserver.c (get_miniserver_sockets):
|
* upnp/src/genlib/miniserver/miniserver.c (get_miniserver_sockets):
|
||||||
fix bug if new socket created has fd 0 (can only occur when stdin
|
fix bug if new socket created has fd 0 (can only occur when stdin
|
||||||
has been closed). Patch by Oskar Liljeblad 2004-07-02 :
|
has been closed). Patch by Oskar Liljeblad 2004-07-02 :
|
||||||
http://sourceforge.net/mailarchive/message.php?msg_id=8870528
|
http://sourceforge.net/mailarchive/message.php?msg_id=8870528
|
||||||
|
|
||||||
2006-03-21 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-03-21 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/test/test_init.c: add some version checks and exit if failure
|
* upnp/test/test_init.c: add some version checks and exit if failure
|
||||||
|
|
||||||
2006-03-05 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-03-05 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* libupnp version 1.3.1
|
* libupnp version 1.3.1
|
||||||
|
|
||||||
@@ -432,11 +546,11 @@ FORK FROM DEAD libupnp
|
|||||||
dependencies between upnp and ixml / threadutil, so that programs
|
dependencies between upnp and ixml / threadutil, so that programs
|
||||||
linking against upnp only still work.
|
linking against upnp only still work.
|
||||||
|
|
||||||
2006-03-04 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-03-04 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* libupnp version 1.3.0
|
* libupnp version 1.3.0
|
||||||
|
|
||||||
2006-03-03 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-03-03 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/src/genlib/net/http/httpreadwrite.c (get_sdk_info): use
|
* upnp/src/genlib/net/http/httpreadwrite.c (get_sdk_info): use
|
||||||
package version string from configure to set sdk info
|
package version string from configure to set sdk info
|
||||||
@@ -444,7 +558,7 @@ FORK FROM DEAD libupnp
|
|||||||
* upnp/Makefile.am: add sample/tvdevice/web/ files in EXTRA_DIST
|
* upnp/Makefile.am: add sample/tvdevice/web/ files in EXTRA_DIST
|
||||||
+ do not distribute generated upnpconfig.h file.
|
+ do not distribute generated upnpconfig.h file.
|
||||||
|
|
||||||
2006-02-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-02-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/src/inc/config.h, configure.ac: use only new defines
|
* upnp/src/inc/config.h, configure.ac: use only new defines
|
||||||
UPNP_HAVE_xx instead of INCLUDE_yyy_APIS and INTERNAL_WEB_SERVER
|
UPNP_HAVE_xx instead of INCLUDE_yyy_APIS and INTERNAL_WEB_SERVER
|
||||||
@@ -453,7 +567,7 @@ FORK FROM DEAD libupnp
|
|||||||
the librarie LDFLAGS in order to export only the symbols defined
|
the librarie LDFLAGS in order to export only the symbols defined
|
||||||
in the API
|
in the API
|
||||||
|
|
||||||
2006-02-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-02-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* configure.ac: add libtool versions for the 3 libraries
|
* configure.ac: add libtool versions for the 3 libraries
|
||||||
|
|
||||||
@@ -461,7 +575,7 @@ FORK FROM DEAD libupnp
|
|||||||
|
|
||||||
* threadutil/src/ThreadPool.c (SetSeed): add missing 'static'
|
* threadutil/src/ThreadPool.c (SetSeed): add missing 'static'
|
||||||
|
|
||||||
2006-02-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-02-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* threadutil/inc/iasnprintf.h: add gcc __printf__ format attribute
|
* threadutil/inc/iasnprintf.h: add gcc __printf__ format attribute
|
||||||
to "iasnprintf"
|
to "iasnprintf"
|
||||||
@@ -482,11 +596,11 @@ FORK FROM DEAD libupnp
|
|||||||
the configuration of the installed libraries (generates installed
|
the configuration of the installed libraries (generates installed
|
||||||
file <upnp/upnpconfig.h>)
|
file <upnp/upnpconfig.h>)
|
||||||
|
|
||||||
2006-02-22 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-02-22 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/ : add missing include of config.h in some .c files
|
* upnp/ : add missing include of config.h in some .c files
|
||||||
|
|
||||||
2006-02-21 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-02-21 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/inc/upnp.h: move some definitions which should not be
|
* upnp/inc/upnp.h: move some definitions which should not be
|
||||||
exported into "upnp/src/inc/util.h"
|
exported into "upnp/src/inc/util.h"
|
||||||
@@ -494,12 +608,12 @@ FORK FROM DEAD libupnp
|
|||||||
* import all modifications below from libupnp in djmount 0.51
|
* import all modifications below from libupnp in djmount 0.51
|
||||||
into official libupnp
|
into official libupnp
|
||||||
|
|
||||||
2006-01-17 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-01-17 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* threadutil/Makefile.am (libthreadutil_la_SOURCES): remove extraneous
|
* threadutil/Makefile.am (libthreadutil_la_SOURCES): remove extraneous
|
||||||
file
|
file
|
||||||
|
|
||||||
2006-01-15 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-01-15 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* configure.ac: add checks for large-file support
|
* configure.ac: add checks for large-file support
|
||||||
|
|
||||||
@@ -519,53 +633,53 @@ FORK FROM DEAD libupnp
|
|||||||
* ixml/src/node.c (ixmlNode_getNodeType): fix compilation warning
|
* ixml/src/node.c (ixmlNode_getNodeType): fix compilation warning
|
||||||
on const return type
|
on const return type
|
||||||
|
|
||||||
2006-01-12 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-01-12 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/src/inc/readwrite.h : suppress unused C++ header file
|
* upnp/src/inc/readwrite.h : suppress unused C++ header file
|
||||||
|
|
||||||
2006-01-11 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2006-01-11 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/inc/config.h, upnp/src/inc/upnpapi.h,
|
* upnp/inc/config.h, upnp/src/inc/upnpapi.h,
|
||||||
upnp/src/inc/httpreadwrite.h: remove internal configuration variable
|
upnp/src/inc/httpreadwrite.h: remove internal configuration variable
|
||||||
MINIMUM_DELAY (no clear purpose)
|
MINIMUM_DELAY (no clear purpose)
|
||||||
|
|
||||||
2005-12-05 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2005-12-05 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/inc/upnp.h: re-declare obsolete method UpnpSetContentLength,
|
* upnp/inc/upnp.h: re-declare obsolete method UpnpSetContentLength,
|
||||||
for binary compatibility with previous libupnp version.
|
for binary compatibility with previous libupnp version.
|
||||||
|
|
||||||
* upnp/src/api/upnpapi.c: correct type of g_maxContentLength to size_t
|
* upnp/src/api/upnpapi.c: correct type of g_maxContentLength to size_t
|
||||||
|
|
||||||
2005-11-01 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2005-11-01 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* autoconfiscate library : replace all makefiles by Makefile.am
|
* autoconfiscate library : replace all makefiles by Makefile.am
|
||||||
for automake support, + preliminary autoconf support
|
for automake support, + preliminary autoconf support
|
||||||
(generated config.h not yet used in source files)
|
(generated config.h not yet used in source files)
|
||||||
|
|
||||||
2005-10-18 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2005-10-18 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/src/makefile: fix location of DEBUG STATIC libupnp library
|
* upnp/src/makefile: fix location of DEBUG STATIC libupnp library
|
||||||
|
|
||||||
* upnp/sample/tvctrlpt/linux/Makefile,
|
* upnp/sample/tvctrlpt/linux/Makefile,
|
||||||
upnp/sample/tvdevice/linux/Makefile: fix STATIC library support
|
upnp/sample/tvdevice/linux/Makefile: fix STATIC library support
|
||||||
|
|
||||||
2005-10-16 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2005-10-16 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* threadutil/src/Makefile (clean): remove built library
|
* threadutil/src/Makefile (clean): remove built library
|
||||||
|
|
||||||
2005-08-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2005-08-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* ixml/src/ixml.h, ixml/src/ixml.c (ixmlRelaxParser) : new function
|
* ixml/src/ixml.h, ixml/src/ixml.c (ixmlRelaxParser) : new function
|
||||||
|
|
||||||
* ixml/src/ixmlparser.h, ixml/src/ixmlparser.c (Parser_setErrorChar) :
|
* ixml/src/ixmlparser.h, ixml/src/ixmlparser.c (Parser_setErrorChar) :
|
||||||
new function
|
new function
|
||||||
|
|
||||||
2005-08-02 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2005-08-02 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* ixml/src/Makefile: correct bug for static library being incorrectly
|
* ixml/src/Makefile: correct bug for static library being incorrectly
|
||||||
stripped when building non-debug
|
stripped when building non-debug
|
||||||
|
|
||||||
2005-06-09 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2005-06-09 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* ixml/src/element.c (ixmlElement_removeAttributeNode):
|
* ixml/src/element.c (ixmlElement_removeAttributeNode):
|
||||||
remove some compilation warning
|
remove some compilation warning
|
||||||
@@ -576,7 +690,7 @@ FORK FROM DEAD libupnp
|
|||||||
* upnp/inc/upnptools.h, upnp/src/api/upnptools.c :
|
* upnp/inc/upnptools.h, upnp/src/api/upnptools.c :
|
||||||
add missing const's in public API
|
add missing const's in public API
|
||||||
|
|
||||||
2005-05-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2005-05-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/inc/config.h: suppress HTTP_READ_BYTES (unused)
|
* upnp/inc/config.h: suppress HTTP_READ_BYTES (unused)
|
||||||
and replace by DEFAULT_SOAP_CONTENT_LENGTH (previously in upnpapi.h)
|
and replace by DEFAULT_SOAP_CONTENT_LENGTH (previously in upnpapi.h)
|
||||||
@@ -597,7 +711,7 @@ FORK FROM DEAD libupnp
|
|||||||
* upnp/src/genlib/net/http/httpreadwrite.c : corrected an incorrect
|
* upnp/src/genlib/net/http/httpreadwrite.c : corrected an incorrect
|
||||||
sprintf format
|
sprintf format
|
||||||
|
|
||||||
2005-05-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2005-05-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/makefile, upnp/src/makefile,
|
* upnp/makefile, upnp/src/makefile,
|
||||||
ixml/Makefile, ixml/src/Makefile,
|
ixml/Makefile, ixml/src/Makefile,
|
||||||
@@ -605,7 +719,7 @@ FORK FROM DEAD libupnp
|
|||||||
implement STATIC library support (from patch at
|
implement STATIC library support (from patch at
|
||||||
http://sourceforge.net/tracker/?group_id=7189&atid=307189 )
|
http://sourceforge.net/tracker/?group_id=7189&atid=307189 )
|
||||||
|
|
||||||
2005-05-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
2005-05-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
|
||||||
|
|
||||||
* upnp/src/api/upnpapi.c, upnp/src/soap/soap_device.c,
|
* upnp/src/api/upnpapi.c, upnp/src/soap/soap_device.c,
|
||||||
upnp/src/soap/makefile :
|
upnp/src/soap/makefile :
|
||||||
|
@@ -1,8 +1,7 @@
|
|||||||
|
|
||||||
#
|
#
|
||||||
# Top-level "Makefile.am" for libupnp
|
# Top-level "Makefile.am" for libupnp
|
||||||
#
|
#
|
||||||
# Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
|
# Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
|
||||||
#
|
#
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
2
README
2
README
@@ -1,7 +1,7 @@
|
|||||||
Portable SDK for UPnP* Devices (libupnp)
|
Portable SDK for UPnP* Devices (libupnp)
|
||||||
|
|
||||||
Copyright (c) 2000-2003 Intel Corporation - All Rights Reserved.
|
Copyright (c) 2000-2003 Intel Corporation - All Rights Reserved.
|
||||||
Copyright (c) 2005-2006 R<>mi Turboult <r3mi@users.sourceforge.net>
|
Copyright (c) 2005-2006 R<>mi Turboult <r3mi@users.sourceforge.net>
|
||||||
Copyright (c) 2006 Michel Pfeiffer and others <virtual_worlds@gmx.de>
|
Copyright (c) 2006 Michel Pfeiffer and others <virtual_worlds@gmx.de>
|
||||||
|
|
||||||
See LICENSE for details.
|
See LICENSE for details.
|
||||||
|
7
THANKS
7
THANKS
@@ -6,7 +6,9 @@ suggesting various improvements or submitting actual code.
|
|||||||
Here is a list of these people. Help us keep it complete and
|
Here is a list of these people. Help us keep it complete and
|
||||||
exempt of errors.
|
exempt of errors.
|
||||||
|
|
||||||
|
- Alex (afaucher)
|
||||||
- Arno Willig
|
- Arno Willig
|
||||||
|
- Bob Ciora
|
||||||
- Chaos
|
- Chaos
|
||||||
- Craig Nelson
|
- Craig Nelson
|
||||||
- David Maass
|
- David Maass
|
||||||
@@ -19,16 +21,19 @@ exempt of errors.
|
|||||||
- Jiri Zouhar
|
- Jiri Zouhar
|
||||||
- John Dennis
|
- John Dennis
|
||||||
- Jonathan (no_dice)
|
- Jonathan (no_dice)
|
||||||
|
- Keith Brindley
|
||||||
- Leuk_He
|
- Leuk_He
|
||||||
- Loigu
|
- Loigu
|
||||||
- Luke Kim
|
- Luke Kim
|
||||||
- Marcelo Roberto Jimenez
|
- Marcelo Roberto Jimenez (mroberto)
|
||||||
- Markus Strobl
|
- Markus Strobl
|
||||||
- Nektarios K. Papadopoulos
|
- Nektarios K. Papadopoulos
|
||||||
- Oskar Liljeblad
|
- Oskar Liljeblad
|
||||||
- Michael (Oxy)
|
- Michael (Oxy)
|
||||||
- Paul Vixie
|
- Paul Vixie
|
||||||
|
- Rene Hexel
|
||||||
- Siva Chandran
|
- Siva Chandran
|
||||||
|
- Stéphane Corthésy
|
||||||
- Timothy Redaelli
|
- Timothy Redaelli
|
||||||
- Titus Winters
|
- Titus Winters
|
||||||
|
|
||||||
|
@@ -261,18 +261,18 @@
|
|||||||
|
|
||||||
/** @name Other debugging features
|
/** @name Other debugging features
|
||||||
The UPnP SDK contains other features to aid in debugging:
|
The UPnP SDK contains other features to aid in debugging:
|
||||||
see <upnp/upnpdebug.h>
|
see <upnp/inc/upnpdebug.h>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define DEBUG_ALL 1
|
#define DEBUG_ALL 1
|
||||||
#define DEBUG_SSDP 0
|
#define DEBUG_SSDP 0
|
||||||
#define DEBUG_SOAP 0
|
#define DEBUG_SOAP 0
|
||||||
#define DEBUG_GENA 0
|
#define DEBUG_GENA 0
|
||||||
#define DEBUG_TPOOL 0
|
#define DEBUG_TPOOL 0
|
||||||
#define DEBUG_MSERV 0
|
#define DEBUG_MSERV 0
|
||||||
#define DEBUG_DOM 0
|
#define DEBUG_DOM 0
|
||||||
#define DEBUG_HTTP 0
|
#define DEBUG_HTTP 0
|
||||||
#define DEBUG_API 0
|
#define DEBUG_API 0
|
||||||
|
|
||||||
//@} // Compile time configuration options
|
//@} // Compile time configuration options
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
// -*- C -*-
|
// -*- C -*-
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
|
// Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
|
||||||
// All rights reserved.
|
// All rights reserved.
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
@@ -5,17 +5,17 @@
|
|||||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||||
|
|
||||||
CFG=libupnp - Win32 Debug
|
CFG=libupnp - Win32 Debug
|
||||||
!MESSAGE Dies ist kein g<>ltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
|
!MESSAGE Dies ist kein g<>ltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
|
||||||
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und f<>hren Sie den Befehl
|
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und f<>hren Sie den Befehl
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE NMAKE /f "libupnp.mak".
|
!MESSAGE NMAKE /f "libupnp.mak".
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE Sie k<>nnen beim Ausf<73>hren von NMAKE eine Konfiguration angeben
|
!MESSAGE Sie k<>nnen beim Ausf<73>hren von NMAKE eine Konfiguration angeben
|
||||||
!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
|
!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE NMAKE /f "libupnp.mak" CFG="libupnp - Win32 Debug"
|
!MESSAGE NMAKE /f "libupnp.mak" CFG="libupnp - Win32 Debug"
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE F<>r die Konfiguration stehen zur Auswahl:
|
!MESSAGE F<>r die Konfiguration stehen zur Auswahl:
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE "libupnp - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library")
|
!MESSAGE "libupnp - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library")
|
||||||
!MESSAGE "libupnp - Win32 Debug" (basierend auf "Win32 (x86) Dynamic-Link Library")
|
!MESSAGE "libupnp - Win32 Debug" (basierend auf "Win32 (x86) Dynamic-Link Library")
|
||||||
|
74
configure.ac
74
configure.ac
@@ -4,14 +4,15 @@
|
|||||||
#
|
#
|
||||||
# Process this file with autoconf to produce a configure script.
|
# Process this file with autoconf to produce a configure script.
|
||||||
#
|
#
|
||||||
# (C) Copyright 2005-2006 R<>mi Turboult <r3mi@users.sourceforge.net>
|
# (C) Copyright 2005-2007 R<>mi Turboult <r3mi@users.sourceforge.net>
|
||||||
#
|
#
|
||||||
|
|
||||||
AC_PREREQ(2.60)
|
AC_PREREQ(2.60)
|
||||||
|
|
||||||
AC_INIT([libupnp], [1.4.7], [mroberto@users.sourceforge.net])
|
AC_INIT([libupnp], [1.6.1], [mroberto@users.sourceforge.net])
|
||||||
|
###############################################################################
|
||||||
# *Independently* of the above libupnp package version, the libtool version
|
# *Independently* of the above libupnp package version, the libtool version
|
||||||
# of the 3 libraries need to be updated whenever there is a change released :
|
# of the 3 libraries need to be updated whenever there is a change released:
|
||||||
# "current:revision:age" (this is NOT the same as the package version), where:
|
# "current:revision:age" (this is NOT the same as the package version), where:
|
||||||
# - library code modified: revision++
|
# - library code modified: revision++
|
||||||
# - interfaces changed/added/removed: current++ and revision=0
|
# - interfaces changed/added/removed: current++ and revision=0
|
||||||
@@ -19,11 +20,14 @@ AC_INIT([libupnp], [1.4.7], [mroberto@users.sourceforge.net])
|
|||||||
# - interfaces removed: age=0
|
# - interfaces removed: age=0
|
||||||
# *please update only once, before a formal release, not for each change*
|
# *please update only once, before a formal release, not for each change*
|
||||||
#
|
#
|
||||||
# For release 1.4.1, we had:
|
###############################################################################
|
||||||
|
# Release 1.4.1:
|
||||||
#AC_SUBST([LT_VERSION_IXML], [2:2:0])
|
#AC_SUBST([LT_VERSION_IXML], [2:2:0])
|
||||||
#AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0])
|
#AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0])
|
||||||
#AC_SUBST([LT_VERSION_UPNP], [2:2:0])
|
#AC_SUBST([LT_VERSION_UPNP], [2:2:0])
|
||||||
#
|
#
|
||||||
|
###############################################################################
|
||||||
|
# Release 1.4.6:
|
||||||
# "current:revision:age"
|
# "current:revision:age"
|
||||||
#
|
#
|
||||||
# - Code has changed in ixml
|
# - Code has changed in ixml
|
||||||
@@ -34,19 +38,73 @@ AC_INIT([libupnp], [1.4.7], [mroberto@users.sourceforge.net])
|
|||||||
# current: 2 -> 3
|
# current: 2 -> 3
|
||||||
# revisiion: 3 -> 0
|
# revisiion: 3 -> 0
|
||||||
# age: 0 -> 1
|
# age: 0 -> 1
|
||||||
# - Code has changed in upnp (revision 2 -> 3)
|
# - 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_IXML], [2:3:0])
|
||||||
AC_SUBST([LT_VERSION_UPNP], [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_CONFIG_AUX_DIR(config.aux)
|
AC_CONFIG_AUX_DIR(config.aux)
|
||||||
AC_CONFIG_MACRO_DIR(m4)
|
AC_CONFIG_MACRO_DIR(m4)
|
||||||
AC_CONFIG_SRCDIR(upnp/inc/upnp.h)
|
AC_CONFIG_SRCDIR(upnp/inc/upnp.h)
|
||||||
|
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects dist-bzip2])
|
AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects dist-bzip2])
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Get canonical host names in host and host_os
|
# Get canonical host names in host and host_os
|
||||||
#
|
#
|
||||||
|
@@ -9,4 +9,3 @@ Version: @VERSION@
|
|||||||
Libs: @PTHREAD_LIBS@ -L${libdir} -lupnp -lthreadutil -lixml
|
Libs: @PTHREAD_LIBS@ -L${libdir} -lupnp -lthreadutil -lixml
|
||||||
Cflags: @PTHREAD_CFLAGS@ -I${includedir}/upnp
|
Cflags: @PTHREAD_CFLAGS@ -I${includedir}/upnp
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
Version: 1.4.7
|
Version: 1.4.2
|
||||||
Summary: Universal Plug and Play (UPnP) SDK
|
Summary: Universal Plug and Play (UPnP) SDK
|
||||||
Name: libupnp
|
Name: libupnp
|
||||||
Release: 1%{?dist}
|
Release: 1%{?dist}
|
||||||
@@ -77,9 +77,6 @@ make install DESTDIR=$RPM_BUILD_ROOT
|
|||||||
rm -rf %{buildroot}
|
rm -rf %{buildroot}
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Mon Nov 19 2007 Marcelo Jimenez <mroberto@users.sourceforge.net> - 1.4.7-1
|
|
||||||
- Update to version 1.4.7
|
|
||||||
|
|
||||||
* Fri Feb 02 2007 Eric Tanguy <eric.tanguy@univ-nantes.fr> - 1.4.2-1
|
* Fri Feb 02 2007 Eric Tanguy <eric.tanguy@univ-nantes.fr> - 1.4.2-1
|
||||||
- Update to version 1.4.2
|
- Update to version 1.4.2
|
||||||
|
|
||||||
|
@@ -1,50 +1,88 @@
|
|||||||
dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
|
##### http://autoconf-archive.cryp.to/acx_pthread.html
|
||||||
dnl
|
#
|
||||||
dnl @summary figure out how to build C programs using POSIX threads
|
# SYNOPSIS
|
||||||
dnl
|
#
|
||||||
dnl This macro figures out how to build C programs using POSIX threads.
|
# ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
|
||||||
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
|
# DESCRIPTION
|
||||||
dnl C compiler flags that are needed. (The user can also force certain
|
#
|
||||||
dnl compiler flags/libs to be tested by setting these environment
|
# This macro figures out how to build C programs using POSIX threads.
|
||||||
dnl variables.)
|
# 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 Also sets PTHREAD_CC to any special C compiler that is needed for
|
# C compiler flags that are needed. (The user can also force certain
|
||||||
dnl multi-threaded programs (defaults to the value of CC otherwise).
|
# compiler flags/libs to be tested by setting these environment
|
||||||
dnl (This is necessary on AIX to use the special cc_r compiler alias.)
|
# variables.)
|
||||||
dnl
|
#
|
||||||
dnl NOTE: You are assumed to not only compile your program with these
|
# Also sets PTHREAD_CC to any special C compiler that is needed for
|
||||||
dnl flags, but also link it with them as well. e.g. you should link
|
# multi-threaded programs (defaults to the value of CC otherwise).
|
||||||
dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
|
# (This is necessary on AIX to use the special cc_r compiler alias.)
|
||||||
dnl $LIBS
|
#
|
||||||
dnl
|
# NOTE: You are assumed to not only compile your program with these
|
||||||
dnl If you are only building threads programs, you may wish to use
|
# flags, but also link it with them as well. e.g. you should link
|
||||||
dnl these variables in your default LIBS, CFLAGS, and CC:
|
# with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
|
||||||
dnl
|
# $LIBS
|
||||||
dnl LIBS="$PTHREAD_LIBS $LIBS"
|
#
|
||||||
dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
# If you are only building threads programs, you may wish to use
|
||||||
dnl CC="$PTHREAD_CC"
|
# these variables in your default LIBS, CFLAGS, and CC:
|
||||||
dnl
|
#
|
||||||
dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
|
# LIBS="$PTHREAD_LIBS $LIBS"
|
||||||
dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
|
# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||||
dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
|
# CC="$PTHREAD_CC"
|
||||||
dnl
|
#
|
||||||
dnl ACTION-IF-FOUND is a list of shell commands to run if a threads
|
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
|
||||||
dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to
|
# constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
|
||||||
dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the
|
# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
|
||||||
dnl default action will define HAVE_PTHREAD.
|
#
|
||||||
dnl
|
# ACTION-IF-FOUND is a list of shell commands to run if a threads
|
||||||
dnl Please let the authors know if this macro fails on any platform, or
|
# library is found, and ACTION-IF-NOT-FOUND is a list of commands to
|
||||||
dnl if you have any other suggestions or comments. This macro was based
|
# run it if it is not found. If ACTION-IF-FOUND is not specified, the
|
||||||
dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with
|
# default action will define HAVE_PTHREAD.
|
||||||
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.
|
# Please let the authors know if this macro fails on any platform, or
|
||||||
dnl We are also grateful for the helpful feedback of numerous users.
|
# if you have any other suggestions or comments. This macro was based
|
||||||
dnl
|
# on work by SGJ on autoconf scripts for FFTW (http://www.fftw.org/)
|
||||||
dnl @category InstalledPackages
|
# (with help from M. Frigo), as well as ac_pthread and hb_pthread
|
||||||
dnl @author Steven G. Johnson <stevenj@alum.mit.edu>
|
# macros posted by Alejandro Forero Cuervo to the autoconf macro
|
||||||
dnl @version 2005-06-15
|
# repository. We are also grateful for the helpful feedback of
|
||||||
dnl @license GPLWithACException
|
# 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.
|
||||||
|
|
||||||
AC_DEFUN([ACX_PTHREAD], [
|
AC_DEFUN([ACX_PTHREAD], [
|
||||||
AC_REQUIRE([AC_CANONICAL_HOST])
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
@@ -216,8 +254,12 @@ if test "x$acx_pthread_ok" = xyes; then
|
|||||||
LIBS="$save_LIBS"
|
LIBS="$save_LIBS"
|
||||||
CFLAGS="$save_CFLAGS"
|
CFLAGS="$save_CFLAGS"
|
||||||
|
|
||||||
# More AIX lossage: must compile with cc_r
|
# More AIX lossage: must compile with xlc_r or cc_r
|
||||||
AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC})
|
if test x"$GCC" != xyes; then
|
||||||
|
AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
|
||||||
|
else
|
||||||
|
PTHREAD_CC=$CC
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
PTHREAD_CC="$CC"
|
PTHREAD_CC="$CC"
|
||||||
fi
|
fi
|
||||||
|
@@ -1,48 +1,87 @@
|
|||||||
dnl @synopsis AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]])
|
##### http://autoconf-archive.cryp.to/ax_cflags_gcc_option.html
|
||||||
dnl
|
#
|
||||||
dnl AX_CFLAGS_GCC_OPTION(-fvomit-frame) would show a message as like
|
# SYNOPSIS
|
||||||
dnl "checking CFLAGS for gcc -fvomit-frame ... yes" and adds the
|
#
|
||||||
dnl optionflag to CFLAGS if it is understood. You can override the
|
# AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]])
|
||||||
dnl shellvar-default of CFLAGS of course. The order of arguments stems
|
#
|
||||||
dnl from the explicit macros like AX_CFLAGS_WARN_ALL.
|
# DESCRIPTION
|
||||||
dnl
|
#
|
||||||
dnl The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add
|
# AX_CFLAGS_GCC_OPTION(-fvomit-frame) would show a message as like
|
||||||
dnl to CXXFLAGS - and it uses the autoconf setup for C++ instead of C
|
# "checking CFLAGS for gcc -fvomit-frame ... yes" and adds the
|
||||||
dnl (since it is possible to use different compilers for C and C++).
|
# optionflag to CFLAGS if it is understood. You can override the
|
||||||
dnl
|
# shellvar-default of CFLAGS of course. The order of arguments stems
|
||||||
dnl The macro is a lot simpler than any special AX_CFLAGS_* macro (or
|
# from the explicit macros like AX_CFLAGS_WARN_ALL.
|
||||||
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
|
# The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add
|
||||||
dnl if you would make up a new function-macro and submit it to the
|
# to CXXFLAGS - and it uses the autoconf setup for C++ instead of C
|
||||||
dnl ac-archive.
|
# (since it is possible to use different compilers for C and C++).
|
||||||
dnl
|
#
|
||||||
dnl - $1 option-to-check-for : required ("-option" as non-value)
|
# The macro is a lot simpler than any special AX_CFLAGS_* macro (or
|
||||||
dnl - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case)
|
# ac_cxx_rtti.m4 macro) but allows to check for arbitrary options.
|
||||||
dnl - $3 action-if-found : add value to shellvariable
|
# However, if you use this macro in a few places, it would be great
|
||||||
dnl - $4 action-if-not-found : nothing
|
# if you would make up a new function-macro and submit it to the
|
||||||
dnl
|
# ac-archive.
|
||||||
dnl note: in earlier versions, $1-$2 were swapped. We try to detect the
|
#
|
||||||
dnl situation and accept a $2=~/-/ as being the old
|
# - $1 option-to-check-for : required ("-option" as non-value)
|
||||||
dnl option-to-check-for.
|
# - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case)
|
||||||
dnl
|
# - $3 action-if-found : add value to shellvariable
|
||||||
dnl also: there are other variants that emerged from the original macro
|
# - $4 action-if-not-found : nothing
|
||||||
dnl variant which did just test an option to be possibly added.
|
#
|
||||||
dnl However, some compilers accept an option silently, or possibly for
|
# note: in earlier versions, $1-$2 were swapped. We try to detect the
|
||||||
dnl just another option that was not intended. Therefore, we have to do
|
# situation and accept a $2=~/-/ as being the old
|
||||||
dnl a generic test for a compiler family. For gcc we check "-pedantic"
|
# option-to-check-for.
|
||||||
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
|
# also: there are other variants that emerged from the original macro
|
||||||
dnl sources.
|
# variant which did just test an option to be possibly added.
|
||||||
dnl
|
# However, some compilers accept an option silently, or possibly for
|
||||||
dnl see also:
|
# 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 AX_CFLAGS_SUN_OPTION AX_CFLAGS_HPUX_OPTION
|
# being accepted which is also understood by compilers who just want
|
||||||
dnl AX_CFLAGS_AIX_OPTION AX_CFLAGS_IRIX_OPTION
|
# to be compatible with gcc even when not being made from gcc
|
||||||
dnl
|
# sources.
|
||||||
dnl @category C
|
#
|
||||||
dnl @author Guido Draheim <guidod@gmx.de>
|
# see also:
|
||||||
dnl @version 2003-11-04
|
#
|
||||||
dnl @license GPLWithACException
|
# 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.
|
||||||
|
|
||||||
AC_DEFUN([AX_CFLAGS_GCC_OPTION_OLD], [dnl
|
AC_DEFUN([AX_CFLAGS_GCC_OPTION_OLD], [dnl
|
||||||
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
|
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
|
||||||
@@ -53,7 +92,8 @@ VAR,[VAR="no, unknown"
|
|||||||
AC_LANG_C
|
AC_LANG_C
|
||||||
ac_save_[]FLAGS="$[]FLAGS"
|
ac_save_[]FLAGS="$[]FLAGS"
|
||||||
for ac_arg dnl
|
for ac_arg dnl
|
||||||
in "-pedantic % m4_ifval($2,$2,-option)" dnl GCC
|
in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC
|
||||||
|
"-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC
|
||||||
#
|
#
|
||||||
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
|
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
|
||||||
AC_TRY_COMPILE([],[return 0;],
|
AC_TRY_COMPILE([],[return 0;],
|
||||||
@@ -85,10 +125,11 @@ AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$2])dnl
|
|||||||
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)],
|
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)],
|
||||||
VAR,[VAR="no, unknown"
|
VAR,[VAR="no, unknown"
|
||||||
AC_LANG_SAVE
|
AC_LANG_SAVE
|
||||||
AC_LANG_CXX
|
AC_LANG_CPLUSPLUS
|
||||||
ac_save_[]FLAGS="$[]FLAGS"
|
ac_save_[]FLAGS="$[]FLAGS"
|
||||||
for ac_arg dnl
|
for ac_arg dnl
|
||||||
in "-pedantic % m4_ifval($2,$2,-option)" dnl GCC
|
in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC
|
||||||
|
"-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC
|
||||||
#
|
#
|
||||||
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
|
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
|
||||||
AC_TRY_COMPILE([],[return 0;],
|
AC_TRY_COMPILE([],[return 0;],
|
||||||
@@ -122,7 +163,8 @@ VAR,[VAR="no, unknown"
|
|||||||
AC_LANG_C
|
AC_LANG_C
|
||||||
ac_save_[]FLAGS="$[]FLAGS"
|
ac_save_[]FLAGS="$[]FLAGS"
|
||||||
for ac_arg dnl
|
for ac_arg dnl
|
||||||
in "-pedantic % m4_ifval($1,$1,-option)" dnl GCC
|
in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC
|
||||||
|
"-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC
|
||||||
#
|
#
|
||||||
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
|
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
|
||||||
AC_TRY_COMPILE([],[return 0;],
|
AC_TRY_COMPILE([],[return 0;],
|
||||||
@@ -154,10 +196,11 @@ AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$1])dnl
|
|||||||
AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)],
|
AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)],
|
||||||
VAR,[VAR="no, unknown"
|
VAR,[VAR="no, unknown"
|
||||||
AC_LANG_SAVE
|
AC_LANG_SAVE
|
||||||
AC_LANG_CXX
|
AC_LANG_CPLUSPLUS
|
||||||
ac_save_[]FLAGS="$[]FLAGS"
|
ac_save_[]FLAGS="$[]FLAGS"
|
||||||
for ac_arg dnl
|
for ac_arg dnl
|
||||||
in "-pedantic % m4_ifval($1,$1,-option)" dnl GCC
|
in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC
|
||||||
|
"-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC
|
||||||
#
|
#
|
||||||
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
|
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
|
||||||
AC_TRY_COMPILE([],[return 0;],
|
AC_TRY_COMPILE([],[return 0;],
|
||||||
|
@@ -1,27 +1,66 @@
|
|||||||
dnl @synopsis AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
|
##### http://autoconf-archive.cryp.to/ax_cflags_warn_all.html
|
||||||
dnl
|
#
|
||||||
dnl Try to find a compiler option that enables most reasonable
|
# SYNOPSIS
|
||||||
dnl warnings. This macro is directly derived from VL_PROG_CC_WARNINGS
|
#
|
||||||
dnl which is split up into two AX_CFLAGS_WARN_ALL and
|
# AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
|
||||||
dnl AX_CFLAGS_WARN_ALL_ANSI
|
#
|
||||||
dnl
|
# DESCRIPTION
|
||||||
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.
|
# Try to find a compiler option that enables most reasonable
|
||||||
dnl
|
# warnings. This macro is directly derived from VL_PROG_CC_WARNINGS
|
||||||
dnl Currently this macro knows about GCC, Solaris C compiler, Digital
|
# which is split up into two AX_CFLAGS_WARN_ALL and
|
||||||
dnl Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C
|
# AX_CFLAGS_WARN_ALL_ANSI
|
||||||
dnl compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos
|
#
|
||||||
dnl 10.0.0.8) C compiler.
|
# 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 - $1 shell-variable-to-add-to : CFLAGS
|
#
|
||||||
dnl - $2 add-value-if-not-found : nothing
|
# Currently this macro knows about GCC, Solaris C compiler, Digital
|
||||||
dnl - $3 action-if-found : add value to shellvariable
|
# Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C
|
||||||
dnl - $4 action-if-not-found : nothing
|
# compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos
|
||||||
dnl
|
# 10.0.0.8) C compiler.
|
||||||
dnl @category C
|
#
|
||||||
dnl @author Guido Draheim <guidod@gmx.de>
|
# - $1 shell-variable-to-add-to : CFLAGS
|
||||||
dnl @version 2003-01-06
|
# - $2 add-value-if-not-found : nothing
|
||||||
dnl @license GPLWithACException
|
# - $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.
|
||||||
|
|
||||||
AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl
|
AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl
|
||||||
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
|
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
|
||||||
@@ -72,7 +111,7 @@ AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_warn_all])dnl
|
|||||||
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings],
|
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings],
|
||||||
VAR,[VAR="no, unknown"
|
VAR,[VAR="no, unknown"
|
||||||
AC_LANG_SAVE
|
AC_LANG_SAVE
|
||||||
AC_LANG_CXX
|
AC_LANG_CPLUSPLUS
|
||||||
ac_save_[]FLAGS="$[]FLAGS"
|
ac_save_[]FLAGS="$[]FLAGS"
|
||||||
for ac_arg dnl
|
for ac_arg dnl
|
||||||
in "-pedantic % -Wall" dnl GCC
|
in "-pedantic % -Wall" dnl GCC
|
||||||
@@ -115,4 +154,5 @@ dnl compilers will fail about it. That was needed since a lot of
|
|||||||
dnl compilers will give false positives for some option-syntax
|
dnl compilers will give false positives for some option-syntax
|
||||||
dnl like -Woption or -Xoption as they think of it is a pass-through
|
dnl like -Woption or -Xoption as they think of it is a pass-through
|
||||||
dnl to later compile stages or something. The "%" is used as a
|
dnl to later compile stages or something. The "%" is used as a
|
||||||
dnl delimimiter. A non-option comment can be given after "%%" marks.
|
dnl delimimiter. A non-option comment can be given after "%%" marks
|
||||||
|
dnl which will be shown but not added to the respective C/CXXFLAGS.
|
||||||
|
@@ -1,27 +1,66 @@
|
|||||||
dnl @synopsis AX_CFLAGS_WARN_ALL_ANSI [(shellvar [,default, [A/NA]])]
|
##### http://autoconf-archive.cryp.to/ax_cflags_warn_all_ansi.html
|
||||||
dnl
|
#
|
||||||
dnl Try to find a compiler option that enables most reasonable
|
# SYNOPSIS
|
||||||
dnl warnings. This macro is directly derived from VL_PROG_CC_WARNINGS
|
#
|
||||||
dnl which is split up into two AX_CFLAGS_WARN_ALL and
|
# AX_CFLAGS_WARN_ALL_ANSI [(shellvar [,default, [A/NA]])]
|
||||||
dnl AX_CFLAGS_WARN_ALL_ANSI
|
#
|
||||||
dnl
|
# DESCRIPTION
|
||||||
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.
|
# Try to find a compiler option that enables most reasonable
|
||||||
dnl
|
# warnings. This macro is directly derived from VL_PROG_CC_WARNINGS
|
||||||
dnl Currently this macro knows about GCC, Solaris C compiler, Digital
|
# which is split up into two AX_CFLAGS_WARN_ALL and
|
||||||
dnl Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C
|
# AX_CFLAGS_WARN_ALL_ANSI
|
||||||
dnl compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos
|
#
|
||||||
dnl 10.0.0.8) C compiler.
|
# 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 - $1 shell-variable-to-add-to : CFLAGS
|
#
|
||||||
dnl - $2 add-value-if-not-found : nothing
|
# Currently this macro knows about GCC, Solaris C compiler, Digital
|
||||||
dnl - $3 action-if-found : add value to shellvariable
|
# Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C
|
||||||
dnl - $4 action-if-not-found : nothing
|
# compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos
|
||||||
dnl
|
# 10.0.0.8) C compiler.
|
||||||
dnl @category C
|
#
|
||||||
dnl @author Guido Draheim <guidod@gmx.de>
|
# - $1 shell-variable-to-add-to : CFLAGS
|
||||||
dnl @version 2003-01-06
|
# - $2 add-value-if-not-found : nothing
|
||||||
dnl @license GPLWithACException
|
# - $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.
|
||||||
|
|
||||||
AC_DEFUN([AX_CFLAGS_WARN_ALL_ANSI],[dnl
|
AC_DEFUN([AX_CFLAGS_WARN_ALL_ANSI],[dnl
|
||||||
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
|
AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
|
||||||
@@ -77,7 +116,7 @@ AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_warn_all_ansi])dnl
|
|||||||
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum ansi warnings],
|
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum ansi warnings],
|
||||||
VAR,[VAR="no, unknown"
|
VAR,[VAR="no, unknown"
|
||||||
AC_LANG_SAVE
|
AC_LANG_SAVE
|
||||||
AC_LANG_CXX
|
AC_LANG_CPLUSPLUS
|
||||||
ac_save_[]FLAGS="$[]FLAGS"
|
ac_save_[]FLAGS="$[]FLAGS"
|
||||||
# IRIX C compiler:
|
# IRIX C compiler:
|
||||||
# -use_readonly_const is the default for IRIX C,
|
# -use_readonly_const is the default for IRIX C,
|
||||||
|
@@ -1,13 +1,52 @@
|
|||||||
dnl @synopsis TYPE_SOCKLEN_T
|
##### http://autoconf-archive.cryp.to/type_socklen_t.html
|
||||||
dnl
|
#
|
||||||
dnl Check whether sys/socket.h defines type socklen_t. Please note that
|
# SYNOPSIS
|
||||||
dnl some systems require sys/types.h to be included before sys/socket.h
|
#
|
||||||
dnl can be compiled.
|
# TYPE_SOCKLEN_T
|
||||||
dnl
|
#
|
||||||
dnl @category Misc
|
# DESCRIPTION
|
||||||
dnl @author Lars Brinkhoff <lars@nocrew.org>
|
#
|
||||||
dnl @version 2005-01-11
|
# Check whether sys/socket.h defines type socklen_t. Please note that
|
||||||
dnl @license GPLWithACException
|
# 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.
|
||||||
|
|
||||||
AC_DEFUN([TYPE_SOCKLEN_T],
|
AC_DEFUN([TYPE_SOCKLEN_T],
|
||||||
[AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t,
|
[AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t,
|
||||||
|
@@ -547,6 +547,10 @@ int TPAttrSetMaxJobsTotal(ThreadPoolAttr *attr, int maxJobsTotal);
|
|||||||
EXPORT int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats);
|
EXPORT int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats);
|
||||||
|
|
||||||
EXPORT void ThreadPoolPrintStats(ThreadPoolStats *stats);
|
EXPORT void ThreadPoolPrintStats(ThreadPoolStats *stats);
|
||||||
|
#else
|
||||||
|
static UPNP_INLINE int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats) {}
|
||||||
|
|
||||||
|
static UPNP_INLINE void ThreadPoolPrintStats(ThreadPoolStats *stats) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@@ -42,131 +42,158 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
|
#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PTHREAD_MUTEX_RECURSIVE
|
#ifdef PTHREAD_MUTEX_RECURSIVE
|
||||||
/* This system has SuS2-compliant mutex attributes.
|
/* This system has SuS2-compliant mutex attributes.
|
||||||
* E.g. on Cygwin, where we don't have the old nonportable (NP) symbols
|
* E.g. on Cygwin, where we don't have the old nonportable (NP) symbols
|
||||||
*/
|
*/
|
||||||
#define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_NORMAL
|
#define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_NORMAL
|
||||||
#define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
|
#define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
|
||||||
#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK
|
#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK
|
||||||
#else
|
#else /* PTHREAD_MUTEX_RECURSIVE */
|
||||||
#define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_FAST_NP
|
#define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_FAST_NP
|
||||||
#define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE_NP
|
#define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE_NP
|
||||||
#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK_NP
|
#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK_NP
|
||||||
#endif
|
#endif /* PTHREAD_MUTEX_RECURSIVE */
|
||||||
|
|
||||||
|
|
||||||
|
#define ITHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE
|
||||||
|
#define ITHREAD_PROCESS_SHARED PTHREAD_PROCESS_SHARED
|
||||||
|
|
||||||
|
|
||||||
#define ITHREAD_CANCELED PTHREAD_CANCELED
|
#define ITHREAD_CANCELED PTHREAD_CANCELED
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Name: ithread_t
|
* Name: ithread_t
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Thread handle.
|
* Thread handle.
|
||||||
* typedef to pthread_t.
|
* typedef to pthread_t.
|
||||||
* Internal Use Only.
|
* Internal Use Only.
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
typedef pthread_t ithread_t;
|
typedef pthread_t ithread_t;
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ithread_attr_t
|
* Name: ithread_attr_t
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Thread attribute.
|
* Thread attribute.
|
||||||
* typedef to pthread_attr_t
|
* typedef to pthread_attr_t
|
||||||
* Internal Use Only
|
* Internal Use Only
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
typedef pthread_attr_t ithread_attr_t;
|
typedef pthread_attr_t ithread_attr_t;
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: start_routine
|
* Name: start_routine
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Thread start routine
|
* Thread start routine
|
||||||
* Internal Use Only.
|
* Internal Use Only.
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
typedef void * (*start_routine) (void *arg);
|
typedef void * (*start_routine) (void *arg);
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ithread_cond_t
|
* Name: ithread_cond_t
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* condition variable.
|
* condition variable.
|
||||||
* typedef to pthread_cond_t
|
* typedef to pthread_cond_t
|
||||||
* Internal Use Only.
|
* Internal Use Only.
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
typedef pthread_cond_t ithread_cond_t;
|
typedef pthread_cond_t ithread_cond_t;
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ithread_mutexattr_t
|
* Name: ithread_mutexattr_t
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Mutex attribute.
|
* Mutex attribute.
|
||||||
* typedef to pthread_mutexattr_t
|
* typedef to pthread_mutexattr_t
|
||||||
* Internal Use Only
|
* Internal Use Only
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
typedef pthread_mutexattr_t ithread_mutexattr_t;
|
typedef pthread_mutexattr_t ithread_mutexattr_t;
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ithread_mutex_t
|
* Name: ithread_mutex_t
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Mutex.
|
* Mutex.
|
||||||
* typedef to pthread_mutex_t
|
* typedef to pthread_mutex_t
|
||||||
* Internal Use Only.
|
* Internal Use Only.
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
typedef pthread_mutex_t ithread_mutex_t;
|
typedef pthread_mutex_t ithread_mutex_t;
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ithread_condattr_t
|
* Name: ithread_condattr_t
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Condition attribute.
|
* Condition attribute.
|
||||||
* typedef to pthread_condattr_t
|
* typedef to pthread_condattr_t
|
||||||
* NOT USED
|
* NOT USED
|
||||||
* Internal Use Only
|
* Internal Use Only
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
typedef pthread_condattr_t ithread_condattr_t;
|
typedef pthread_condattr_t ithread_condattr_t;
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Function: ithread_mutexattr_init
|
/****************************************************************************
|
||||||
*
|
* Name: ithread_rwlockattr_t
|
||||||
* Description:
|
*
|
||||||
* Initializes a mutex attribute variable.
|
* Description:
|
||||||
* Used to set the type of the mutex.
|
* Mutex attribute.
|
||||||
* Parameters:
|
* typedef to pthread_rwlockattr_t
|
||||||
* ithread_mutexattr_init * attr (must be valid non NULL pointer to
|
* Internal Use Only
|
||||||
* pthread_mutexattr_t)
|
***************************************************************************/
|
||||||
* Returns:
|
typedef pthread_rwlockattr_t ithread_rwlockattr_t;
|
||||||
* 0 on success, Nonzero on failure.
|
|
||||||
* Always returns 0.
|
|
||||||
* See man page for pthread_mutexattr_init
|
/****************************************************************************
|
||||||
***************************************************************************/
|
* 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
|
||||||
|
***************************************************************************/
|
||||||
#define ithread_mutexattr_init pthread_mutexattr_init
|
#define ithread_mutexattr_init pthread_mutexattr_init
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Function: ithread_mutexattr_destroy
|
/****************************************************************************
|
||||||
*
|
* Function: ithread_mutexattr_destroy
|
||||||
* Description:
|
*
|
||||||
* Releases any resources held by the mutex attribute.
|
* Description:
|
||||||
* Currently there are no resources associated with the attribute
|
* Releases any resources held by the mutex attribute.
|
||||||
* Parameters:
|
* Currently there are no resources associated with the attribute
|
||||||
* ithread_mutexattr_t * attr (must be valid non NULL pointer to
|
* Parameters:
|
||||||
* pthread_mutexattr_t)
|
* ithread_mutexattr_t * attr (must be valid non NULL pointer to
|
||||||
* Returns:
|
* pthread_mutexattr_t)
|
||||||
* 0 on success, Nonzero on failure.
|
* Returns:
|
||||||
* Always returns 0.
|
* 0 on success, Nonzero on failure.
|
||||||
* See man page for pthread_mutexattr_destroy
|
* Always returns 0.
|
||||||
***************************************************************************/
|
* See man page for pthread_mutexattr_destroy
|
||||||
|
***************************************************************************/
|
||||||
#define ithread_mutexattr_destroy pthread_mutexattr_destroy
|
#define ithread_mutexattr_destroy pthread_mutexattr_destroy
|
||||||
|
|
||||||
|
|
||||||
@@ -180,7 +207,7 @@ extern "C" {
|
|||||||
* ITHREAD_MUTEX_ERRORCHECK_NP
|
* ITHREAD_MUTEX_ERRORCHECK_NP
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* ithread_mutexattr_t * mutex (must be valid non NULL pointer to
|
* ithread_mutexattr_t * attr (must be valid non NULL pointer to
|
||||||
* ithread_mutexattr_t)
|
* ithread_mutexattr_t)
|
||||||
* int kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP
|
* int kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP
|
||||||
* or ITHREAD_MUTEX_ERRORCHECK_NP)
|
* or ITHREAD_MUTEX_ERRORCHECK_NP)
|
||||||
@@ -190,9 +217,9 @@ extern "C" {
|
|||||||
* See man page for pthread_mutexattr_setkind_np
|
* See man page for pthread_mutexattr_setkind_np
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#ifdef PTHREAD_MUTEX_RECURSIVE
|
#ifdef PTHREAD_MUTEX_RECURSIVE
|
||||||
#define ithread_mutexattr_setkind_np pthread_mutexattr_settype
|
#define ithread_mutexattr_setkind_np pthread_mutexattr_settype
|
||||||
#else
|
#else
|
||||||
#define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np
|
#define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -205,7 +232,7 @@ extern "C" {
|
|||||||
* ITHREAD_MUTEX_ERRORCHECK_NP
|
* ITHREAD_MUTEX_ERRORCHECK_NP
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* ithread_mutexattr_t * mutex (must be valid non NULL pointer to
|
* ithread_mutexattr_t * attr (must be valid non NULL pointer to
|
||||||
* pthread_mutexattr_t)
|
* pthread_mutexattr_t)
|
||||||
* int *kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP
|
* int *kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP
|
||||||
* or ITHREAD_MUTEX_ERRORCHECK_NP)
|
* or ITHREAD_MUTEX_ERRORCHECK_NP)
|
||||||
@@ -215,9 +242,9 @@ extern "C" {
|
|||||||
* See man page for pthread_mutexattr_getkind_np
|
* See man page for pthread_mutexattr_getkind_np
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#ifdef PTHREAD_MUTEX_RECURSIVE
|
#ifdef PTHREAD_MUTEX_RECURSIVE
|
||||||
#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype
|
#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype
|
||||||
#else
|
#else
|
||||||
#define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np
|
#define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -237,7 +264,8 @@ extern "C" {
|
|||||||
* See man page for pthread_mutex_init
|
* See man page for pthread_mutex_init
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#define ithread_mutex_init pthread_mutex_init
|
#define ithread_mutex_init pthread_mutex_init
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: ithread_mutex_lock
|
* Function: ithread_mutex_lock
|
||||||
*
|
*
|
||||||
@@ -291,7 +319,170 @@ extern "C" {
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#define ithread_mutex_destroy pthread_mutex_destroy
|
#define ithread_mutex_destroy pthread_mutex_destroy
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Function: ithread_rwlockattr_init
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Initializes a rwlock attribute variable to default values.
|
||||||
|
* Parameters:
|
||||||
|
* const ithread_rwlockattr_init *attr (must be valid non NULL pointer to
|
||||||
|
* pthread_rwlockattr_t)
|
||||||
|
* Returns:
|
||||||
|
* 0 on success, Nonzero on failure.
|
||||||
|
* Always returns 0.
|
||||||
|
* See man page for pthread_rwlockattr_init
|
||||||
|
***************************************************************************/
|
||||||
|
#define ithread_rwlockattr_init pthread_rwlockattr_init
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Function: ithread_rwlockattr_destroy
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Releases any resources held by the rwlock attribute.
|
||||||
|
* Parameters:
|
||||||
|
* ithread_rwlockattr_t *attr (must be valid non NULL pointer to
|
||||||
|
* pthread_rwlockattr_t)
|
||||||
|
* Returns:
|
||||||
|
* 0 on success, Nonzero on failure.
|
||||||
|
* Always returns 0.
|
||||||
|
* See man page for pthread_rwlockattr_destroy
|
||||||
|
***************************************************************************/
|
||||||
|
#define ithread_rwlockattr_destroy pthread_rwlockattr_destroy
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Function: ithread_rwlockatttr_setpshared
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Sets the rwlock type in the attribute.
|
||||||
|
* Valid types are: ITHREAD_PROCESS_PRIVATE
|
||||||
|
* ITHREAD_PROCESS_SHARED
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* ithread_rwlockattr_t * attr (must be valid non NULL pointer to
|
||||||
|
* ithread_rwlockattr_t)
|
||||||
|
* int kind (one of ITHREAD_PROCESS_PRIVATE or ITHREAD_PROCESS_SHARED)
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* 0 on success. Nonzero on failure.
|
||||||
|
* Returns EINVAL if the kind is not supported.
|
||||||
|
* See man page for pthread_rwlockattr_setkind_np
|
||||||
|
*****************************************************************************/
|
||||||
|
#define ithread_rwlockatttr_setpshared pthread_rwlockatttr_setpshared
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Function: ithread_rwlockatttr_getpshared
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Gets the rwlock type in the attribute.
|
||||||
|
* Valid types are: ITHREAD_PROCESS_PRIVATE
|
||||||
|
* ITHREAD_PROCESS_SHARED
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* ithread_rwlockattr_t * attr (must be valid non NULL pointer to
|
||||||
|
* pthread_rwlockattr_t)
|
||||||
|
* int *kind (one of ITHREAD_PROCESS_PRIVATE or ITHREAD_PROCESS_SHARED)
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* 0 on success. Nonzero on failure.
|
||||||
|
* Always returns 0.
|
||||||
|
* See man page for pthread_rwlockatttr_getpshared
|
||||||
|
*****************************************************************************/
|
||||||
|
#define ithread_rwlockatttr_getpshared pthread_rwlockatttr_getpshared
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Function: ithread_rwlock_init
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Initializes rwlock.
|
||||||
|
* Must be called before use.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t)
|
||||||
|
* const ithread_rwlockattr_t * rwlock_attr
|
||||||
|
* Returns:
|
||||||
|
* 0 on success, Nonzero on failure.
|
||||||
|
* Always returns 0.
|
||||||
|
* See man page for pthread_rwlock_init
|
||||||
|
*****************************************************************************/
|
||||||
|
#define ithread_rwlock_init pthread_rwlock_init
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Function: ithread_rwlock_rdlock
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Locks rwlock for reading.
|
||||||
|
* Parameters:
|
||||||
|
* ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t)
|
||||||
|
* rwlock must be initialized.
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* 0 on success, Nonzero on failure.
|
||||||
|
* Always returns 0.
|
||||||
|
* See man page for pthread_rwlock_rdlock
|
||||||
|
*****************************************************************************/
|
||||||
|
#define ithread_rwlock_rdlock pthread_rwlock_rdlock
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Function: ithread_rwlock_wrlock
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Locks rwlock for writting.
|
||||||
|
* Parameters:
|
||||||
|
* ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t)
|
||||||
|
* rwlock must be initialized.
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* 0 on success, Nonzero on failure.
|
||||||
|
* Always returns 0.
|
||||||
|
* See man page for pthread_rwlock_wrlock
|
||||||
|
*****************************************************************************/
|
||||||
|
#define ithread_rwlock_wrlock pthread_rwlock_wrlock
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Function: ithread_rwlock_unlock
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Unlocks rwlock.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t)
|
||||||
|
* rwlock must be initialized.
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* 0 on success, Nonzero on failure.
|
||||||
|
* Always returns 0.
|
||||||
|
* See man page for pthread_rwlock_unlock
|
||||||
|
*****************************************************************************/
|
||||||
|
#define ithread_rwlock_unlock pthread_rwlock_unlock
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Function: ithread_rwlock_destroy
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Releases any resources held by the rwlock.
|
||||||
|
* rwlock can no longer be used after this call.
|
||||||
|
* rwlock is only destroyed when there are no longer any threads waiting on it.
|
||||||
|
* rwlock cannot be destroyed if it is locked.
|
||||||
|
* Parameters:
|
||||||
|
* ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t)
|
||||||
|
* rwlock must be initialized.
|
||||||
|
* Returns:
|
||||||
|
* 0 on success. Nonzero on failure.
|
||||||
|
* Always returns 0.
|
||||||
|
* See man page for pthread_rwlock_destroy
|
||||||
|
*****************************************************************************/
|
||||||
|
#define ithread_rwlock_destroy pthread_rwlock_destroy
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: ithread_cond_init
|
* Function: ithread_cond_init
|
||||||
*
|
*
|
||||||
|
@@ -30,7 +30,8 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include "LinkedList.h"
|
#include "LinkedList.h"
|
||||||
#ifdef __FreeBSD__
|
#include <sys/param.h>
|
||||||
|
#if (defined(BSD) && BSD >= 199306) || defined(__OSX__)
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#else
|
#else
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
@@ -90,20 +90,23 @@ FreeThreadPoolJob( ThreadPool * tp,
|
|||||||
static int
|
static int
|
||||||
SetPolicyType( PolicyType in )
|
SetPolicyType( PolicyType in )
|
||||||
{
|
{
|
||||||
#ifdef __CYGWIN__
|
#ifdef __CYGWIN__
|
||||||
/* TODO not currently working... */
|
/* TODO not currently working... */
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#elif defined(__OSX__)
|
||||||
#ifdef WIN32
|
setpriority(PRIO_PROCESS, 0, 0);
|
||||||
|
return 0;
|
||||||
|
#elif defined(WIN32)
|
||||||
return sched_setscheduler( 0, in);
|
return sched_setscheduler( 0, in);
|
||||||
#else
|
#elif defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0
|
||||||
struct sched_param current;
|
struct sched_param current;
|
||||||
|
|
||||||
sched_getparam( 0, ¤t );
|
sched_getparam( 0, ¤t );
|
||||||
current.sched_priority = DEFAULT_SCHED_PARAM;
|
current.sched_priority = DEFAULT_SCHED_PARAM;
|
||||||
return sched_setscheduler( 0, in, ¤t );
|
return sched_setscheduler( 0, in, ¤t );
|
||||||
#endif
|
#else
|
||||||
#endif
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -123,7 +126,7 @@ SetPolicyType( PolicyType in )
|
|||||||
static int
|
static int
|
||||||
SetPriority( ThreadPriority priority )
|
SetPriority( ThreadPriority priority )
|
||||||
{
|
{
|
||||||
|
#if defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0
|
||||||
int currentPolicy;
|
int currentPolicy;
|
||||||
int minPriority = 0;
|
int minPriority = 0;
|
||||||
int maxPriority = 0;
|
int maxPriority = 0;
|
||||||
@@ -155,7 +158,9 @@ SetPriority( ThreadPriority priority )
|
|||||||
|
|
||||||
return pthread_setschedparam( ithread_self(), currentPolicy,
|
return pthread_setschedparam( ithread_self(), currentPolicy,
|
||||||
&newPriority );
|
&newPriority );
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -354,18 +359,25 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
|
|||||||
* Parameters:
|
* Parameters:
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
static void SetSeed() {
|
static void SetSeed() {
|
||||||
struct timeb t;
|
struct timeb t;
|
||||||
|
|
||||||
ftime( &t );
|
ftime( &t );
|
||||||
#if defined(WIN32)
|
#if defined(WIN32)
|
||||||
srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id().p );
|
srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id().p );
|
||||||
#elif defined(__FreeBSD__)
|
#elif defined(__FreeBSD__) || defined(__OSX__)
|
||||||
srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id() );
|
srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id() );
|
||||||
|
#elif defined(__linux__)
|
||||||
|
srand( ( unsigned int )t.millitm + ithread_get_current_thread_id() );
|
||||||
#else
|
#else
|
||||||
srand( ( unsigned int )t.millitm + ithread_get_current_thread_id() );
|
{
|
||||||
|
volatile union { volatile pthread_t tid; volatile unsigned i; } idu;
|
||||||
|
|
||||||
|
idu.tid = ithread_get_current_thread_id();
|
||||||
|
srand( ( unsigned int )t.millitm + idu.i );
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: WorkerThread
|
* Function: WorkerThread
|
||||||
@@ -1499,36 +1511,33 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef STATS
|
#ifdef STATS
|
||||||
void ThreadPoolPrintStats( ThreadPoolStats * stats ) {
|
void ThreadPoolPrintStats(ThreadPoolStats * stats)
|
||||||
assert( stats != NULL ); if( stats == NULL ) {
|
{
|
||||||
return;}
|
assert( stats != NULL );
|
||||||
|
if (stats == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
printf( "ThreadPoolStats at Time: %d\n", time( NULL ) );
|
printf("ThreadPoolStats at Time: %d\n", time(NULL));
|
||||||
#else
|
#else /* __FreeBSD__ */
|
||||||
printf( "ThreadPoolStats at Time: %ld\n", time( NULL ) );
|
printf("ThreadPoolStats at Time: %ld\n", time(NULL));
|
||||||
#endif
|
#endif /* __FreeBSD__ */
|
||||||
printf
|
printf("High Jobs pending: %d\n", stats->currentJobsHQ);
|
||||||
( "Average Wait in High Priority Q in milliseconds: %f\n",
|
printf("Med Jobs Pending: %d\n", stats->currentJobsMQ);
|
||||||
stats->avgWaitHQ );
|
printf("Low Jobs Pending: %d\n", stats->currentJobsLQ);
|
||||||
printf
|
printf("Average Wait in High Priority Q in milliseconds: %f\n", stats->avgWaitHQ);
|
||||||
( "Average Wait in Med Priority Q in milliseconds: %f\n",
|
printf("Average Wait in Med Priority Q in milliseconds: %f\n", stats->avgWaitMQ);
|
||||||
stats->avgWaitMQ );
|
printf("Averate Wait in Low Priority Q in milliseconds: %f\n", stats->avgWaitLQ);
|
||||||
printf
|
printf("Max Threads Active: %d\n", stats->maxThreads);
|
||||||
( "Averate Wait in Low Priority Q in milliseconds: %f\n",
|
printf("Current Worker Threads: %d\n", stats->workerThreads);
|
||||||
stats->avgWaitLQ );
|
printf("Current Persistent Threads: %d\n", stats->persistentThreads);
|
||||||
printf( "Max Threads Active: %d\n", stats->maxThreads );
|
printf("Current Idle Threads: %d\n", stats->idleThreads);
|
||||||
printf( "Current Worker Threads: %d\n",
|
printf("Total Threads : %d\n", stats->totalThreads);
|
||||||
stats->workerThreads );
|
printf("Total Time spent Working in seconds: %f\n", stats->totalWorkTime);
|
||||||
printf( "Current Persistent Threads: %d\n",
|
printf("Total Time spent Idle in seconds : %f\n", stats->totalIdleTime);
|
||||||
stats->persistentThreads );
|
}
|
||||||
printf( "Current Idle Threads: %d\n", stats->idleThreads );
|
#endif /* STATS */
|
||||||
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
|
* Function: TPAttrSetMaxJobsTotal
|
||||||
@@ -1541,17 +1550,19 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
|
|||||||
* Returns:
|
* Returns:
|
||||||
* Always returns 0.
|
* Always returns 0.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TPAttrSetMaxJobsTotal( ThreadPoolAttr * attr,
|
int TPAttrSetMaxJobsTotal(
|
||||||
int maxJobsTotal ) {
|
ThreadPoolAttr * attr,
|
||||||
assert( attr != NULL );
|
int maxJobsTotal )
|
||||||
|
{
|
||||||
|
assert( attr != NULL );
|
||||||
|
|
||||||
if( attr == NULL ) {
|
if( attr == NULL ) {
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
attr->maxJobsTotal = maxJobsTotal;
|
attr->maxJobsTotal = maxJobsTotal;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: ThreadPoolGetStats
|
* Function: ThreadPoolGetStats
|
||||||
@@ -1568,40 +1579,54 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#ifdef STATS
|
#ifdef STATS
|
||||||
int
|
int
|
||||||
ThreadPoolGetStats( ThreadPool * tp,
|
ThreadPoolGetStats(
|
||||||
ThreadPoolStats * stats ) {
|
ThreadPool *tp,
|
||||||
|
ThreadPoolStats *stats)
|
||||||
|
{
|
||||||
|
assert(tp != NULL);
|
||||||
|
assert(stats != NULL);
|
||||||
|
|
||||||
assert( tp != NULL );
|
if (tp == NULL || stats == NULL) {
|
||||||
assert( stats != NULL );
|
return EINVAL;
|
||||||
if( ( tp == NULL ) || ( stats == NULL ) ) {
|
}
|
||||||
return EINVAL;}
|
|
||||||
|
|
||||||
//if not shutdown then acquire mutex
|
//if not shutdown then acquire mutex
|
||||||
if( !tp->shutdown ) {
|
if (!tp->shutdown) {
|
||||||
ithread_mutex_lock( &tp->mutex );}
|
ithread_mutex_lock(&tp->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
( *stats ) = tp->stats; if( stats->totalJobsHQ > 0 )
|
*stats = tp->stats;
|
||||||
stats->avgWaitHQ =
|
if (stats->totalJobsHQ > 0) {
|
||||||
stats->totalTimeHQ / stats->totalJobsHQ;
|
stats->avgWaitHQ = stats->totalTimeHQ / stats->totalJobsHQ;
|
||||||
else
|
} else {
|
||||||
stats->avgWaitHQ = 0; if( stats->totalJobsMQ > 0 )
|
stats->avgWaitHQ = 0;
|
||||||
stats->avgWaitMQ =
|
}
|
||||||
stats->totalTimeMQ / stats->totalJobsMQ;
|
|
||||||
else
|
if( stats->totalJobsMQ > 0 ) {
|
||||||
stats->avgWaitMQ = 0; if( stats->totalJobsLQ > 0 )
|
stats->avgWaitMQ = stats->totalTimeMQ / stats->totalJobsMQ;
|
||||||
stats->avgWaitLQ =
|
} else {
|
||||||
stats->totalTimeLQ / stats->totalJobsLQ;
|
stats->avgWaitMQ = 0;
|
||||||
else
|
}
|
||||||
stats->avgWaitLQ = 0;
|
|
||||||
stats->totalThreads = tp->totalThreads;
|
if( stats->totalJobsLQ > 0 ) {
|
||||||
stats->persistentThreads = tp->persistentThreads;
|
stats->avgWaitLQ = stats->totalTimeLQ / stats->totalJobsLQ;
|
||||||
stats->currentJobsHQ = ListSize( &tp->highJobQ );
|
} else {
|
||||||
stats->currentJobsLQ = ListSize( &tp->lowJobQ );
|
stats->avgWaitLQ = 0;
|
||||||
stats->currentJobsMQ = ListSize( &tp->medJobQ );
|
}
|
||||||
//if not shutdown then release mutex
|
|
||||||
if( !tp->shutdown ) {
|
|
||||||
ithread_mutex_unlock( &tp->mutex );}
|
|
||||||
|
|
||||||
return 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 );
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* STATS */
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@@ -31,7 +31,8 @@
|
|||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#ifdef __FreeBSD__
|
#include <sys/param.h>
|
||||||
|
#if (defined(BSD) && BSD >= 199306) || defined(__OSX__)
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#else
|
#else
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
@@ -1,8 +1,7 @@
|
|||||||
|
|
||||||
#
|
#
|
||||||
# "Makefile.am" for "libupnp/upnp"
|
# "Makefile.am" for "libupnp/upnp"
|
||||||
#
|
#
|
||||||
# Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
|
# Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
|
||||||
#
|
#
|
||||||
|
|
||||||
SUBDIRS = doc . sample
|
SUBDIRS = doc . sample
|
||||||
@@ -23,14 +22,14 @@ LDADD = \
|
|||||||
|
|
||||||
|
|
||||||
upnpincludedir = $(includedir)/upnp
|
upnpincludedir = $(includedir)/upnp
|
||||||
upnpinclude_HEADERS = inc/upnp.h
|
upnpinclude_HEADERS = \
|
||||||
|
inc/upnp.h \
|
||||||
|
inc/upnpdebug.h
|
||||||
|
|
||||||
nodist_upnpinclude_HEADERS = inc/upnpconfig.h
|
nodist_upnpinclude_HEADERS = inc/upnpconfig.h
|
||||||
if ENABLE_TOOLS
|
if ENABLE_TOOLS
|
||||||
upnpinclude_HEADERS += inc/upnptools.h
|
upnpinclude_HEADERS += inc/upnptools.h
|
||||||
endif
|
endif
|
||||||
if ENABLE_DEBUG
|
|
||||||
upnpinclude_HEADERS += inc/upnpdebug.h
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
lib_LTLIBRARIES = libupnp.la
|
lib_LTLIBRARIES = libupnp.la
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# "Makefile.am" for "libunp/upnp/doc"
|
# "Makefile.am" for "libunp/upnp/doc"
|
||||||
#
|
#
|
||||||
# (C) Copyright 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
|
# (C) Copyright 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
|
||||||
#
|
#
|
||||||
##########################################################################
|
##########################################################################
|
||||||
#
|
#
|
||||||
|
Binary file not shown.
@@ -47,7 +47,8 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#ifdef __FreeBSD__
|
#include <sys/param.h>
|
||||||
|
#if (defined(BSD) && BSD >= 199306)
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#endif
|
#endif
|
||||||
#include "ixml.h"
|
#include "ixml.h"
|
||||||
@@ -828,46 +829,42 @@ struct Upnp_Event
|
|||||||
* Upnp_Discovery structure correctly.
|
* Upnp_Discovery structure correctly.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct sockaddr_in SOCKADDRIN;
|
|
||||||
|
|
||||||
/** Returned in a {\bf UPNP_DISCOVERY_RESULT} callback. */
|
/** Returned in a {\bf UPNP_DISCOVERY_RESULT} callback. */
|
||||||
|
|
||||||
struct Upnp_Discovery
|
struct Upnp_Discovery
|
||||||
{
|
{
|
||||||
|
/** The result code of the {\bf UpnpSearchAsync} call. */
|
||||||
/** The result code of the {\bf UpnpSearchAsync} call. */
|
int ErrCode;
|
||||||
int ErrCode;
|
|
||||||
|
|
||||||
/** The expiration time of the advertisement. */
|
/** The expiration time of the advertisement. */
|
||||||
int Expires;
|
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];
|
|
||||||
|
|
||||||
/** Date when the response was generated. */
|
/** The unique device identifier. */
|
||||||
char Date[LINE_SIZE];
|
char DeviceId[LINE_SIZE];
|
||||||
|
|
||||||
/** 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;
|
|
||||||
|
|
||||||
|
/** 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];
|
||||||
|
|
||||||
|
/** Date when the response was generated. */
|
||||||
|
char Date[LINE_SIZE];
|
||||||
|
|
||||||
|
/** Confirmation that the MAN header was understood by the device. */
|
||||||
|
char Ext[LINE_SIZE];
|
||||||
|
|
||||||
|
/** The host address of the device responding to the search. */
|
||||||
|
struct sockaddr_in DestAddr;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Returned along with a {\bf UPNP_EVENT_SUBSCRIBE_COMPLETE} or {\bf
|
/** Returned along with a {\bf UPNP_EVENT_SUBSCRIBE_COMPLETE} or {\bf
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/* -*- C -*- */
|
/* -*- C -*- */
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
|
* Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright (c) 2000-2003 Intel Corporation
|
* Copyright (c) 2000-2003 Intel Corporation
|
||||||
* Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
|
* Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -246,15 +246,19 @@ static UPNP_INLINE int DebugAtThisLevel(
|
|||||||
* Returns: void
|
* Returns: void
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
void UpnpPrintf (Upnp_LogLevel DLevel, Dbg_Module Module,
|
void UpnpPrintf(
|
||||||
const char* DbgFileName, int DbgLineNo,
|
Upnp_LogLevel DLevel,
|
||||||
const char* FmtStr,
|
Dbg_Module Module,
|
||||||
...)
|
const char* DbgFileName,
|
||||||
|
int DbgLineNo,
|
||||||
|
const char* FmtStr,
|
||||||
|
...)
|
||||||
#if (__GNUC__ >= 3)
|
#if (__GNUC__ >= 3)
|
||||||
|
/* This enables printf like format checking by the compiler */
|
||||||
__attribute__((format (__printf__, 5, 6)))
|
__attribute__((format (__printf__, 5, 6)))
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
#else
|
#else /* DEBUG */
|
||||||
static UPNP_INLINE void UpnpPrintf(
|
static UPNP_INLINE void UpnpPrintf(
|
||||||
Upnp_LogLevel DLevel,
|
Upnp_LogLevel DLevel,
|
||||||
Dbg_Module Module,
|
Dbg_Module Module,
|
||||||
@@ -262,7 +266,7 @@ static UPNP_INLINE void UpnpPrintf(
|
|||||||
int DbgLineNo,
|
int DbgLineNo,
|
||||||
const char* FmtStr,
|
const char* FmtStr,
|
||||||
...) {}
|
...) {}
|
||||||
#endif
|
#endif /* DEBUG */
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
@@ -79,8 +79,9 @@ endif
|
|||||||
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
tvdevice/web/tvcontrolSCPD.xml \
|
web/tvcombodesc.xml \
|
||||||
tvdevice/web/tvdevicedesc.xml \
|
web/tvcontrolSCPD.xml \
|
||||||
tvdevice/web/tvdevicepres.html \
|
web/tvdevicedesc.xml \
|
||||||
tvdevice/web/tvpictureSCPD.xml
|
web/tvdevicepres.html \
|
||||||
|
web/tvpictureSCPD.xml
|
||||||
|
|
||||||
|
@@ -1362,7 +1362,7 @@ TvCtrlPointStart( print_string printFunctionPtr,
|
|||||||
|
|
||||||
ithread_mutex_init( &DeviceListMutex, 0 );
|
ithread_mutex_init( &DeviceListMutex, 0 );
|
||||||
|
|
||||||
SampleUtil_Print( "Intializing UPnP with ipaddress=%s port=%d",
|
SampleUtil_Print( "Initializing UPnP with ipaddress=%s port=%d",
|
||||||
ip_address, port );
|
ip_address, port );
|
||||||
rc = UpnpInit( ip_address, port );
|
rc = UpnpInit( ip_address, port );
|
||||||
if( UPNP_E_SUCCESS != rc ) {
|
if( UPNP_E_SUCCESS != rc ) {
|
||||||
|
@@ -37,6 +37,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
@@ -53,6 +54,11 @@
|
|||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/utsname.h>
|
#include <sys/utsname.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <sys/param.h>
|
||||||
|
#if (defined(BSD) && BSD >= 199306)
|
||||||
|
#include <ifaddrs.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#include "upnpapi.h"
|
#include "upnpapi.h"
|
||||||
#include "httpreadwrite.h"
|
#include "httpreadwrite.h"
|
||||||
@@ -73,11 +79,13 @@
|
|||||||
#include "urlconfig.h"
|
#include "urlconfig.h"
|
||||||
#endif // INTERNAL_WEB_SERVER
|
#endif // INTERNAL_WEB_SERVER
|
||||||
|
|
||||||
|
virtualDirList *pVirtualDirList;
|
||||||
|
|
||||||
// Mutex to synchronize the subscription handling at the client side
|
// Mutex to synchronize the subscription handling at the client side
|
||||||
CLIENTONLY( ithread_mutex_t GlobalClientSubscribeMutex; )
|
CLIENTONLY( ithread_mutex_t GlobalClientSubscribeMutex; )
|
||||||
|
|
||||||
//Mutex to synchronize handles ( root device or control point handle)
|
// rwlock to synchronize handles (root device or control point handle)
|
||||||
ithread_mutex_t GlobalHndMutex;
|
ithread_rwlock_t GlobalHndRWLock;
|
||||||
|
|
||||||
// Mutex to synchronize the uuid creation process
|
// Mutex to synchronize the uuid creation process
|
||||||
ithread_mutex_t gUUIDMutex;
|
ithread_mutex_t gUUIDMutex;
|
||||||
@@ -205,26 +213,26 @@ int UpnpInit( IN const char *HostIP,
|
|||||||
#ifdef __CYGWIN__
|
#ifdef __CYGWIN__
|
||||||
/* On Cygwin, pthread_mutex_init() fails without this memset. */
|
/* On Cygwin, pthread_mutex_init() fails without this memset. */
|
||||||
/* TODO: Fix Cygwin so we don't need this memset(). */
|
/* TODO: Fix Cygwin so we don't need this memset(). */
|
||||||
memset(&GlobalHndMutex, 0, sizeof(GlobalHndMutex));
|
memset(&GlobalHndRWLock, 0, sizeof(GlobalHndRWLock));
|
||||||
#endif
|
#endif
|
||||||
if( ithread_mutex_init( &GlobalHndMutex, NULL ) != 0 ) {
|
if (ithread_rwlock_init(&GlobalHndRWLock, NULL) != 0) {
|
||||||
return UPNP_E_INIT_FAILED;
|
return UPNP_E_INIT_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ithread_mutex_init( &gUUIDMutex, NULL ) != 0 ) {
|
if (ithread_mutex_init(&gUUIDMutex, NULL) != 0) {
|
||||||
return UPNP_E_INIT_FAILED;
|
return UPNP_E_INIT_FAILED;
|
||||||
}
|
}
|
||||||
// initialize subscribe mutex
|
// initialize subscribe mutex
|
||||||
#ifdef INCLUDE_CLIENT_APIS
|
#ifdef INCLUDE_CLIENT_APIS
|
||||||
if ( ithread_mutex_init( &GlobalClientSubscribeMutex, NULL ) != 0 ) {
|
if (ithread_mutex_init(&GlobalClientSubscribeMutex, NULL) != 0) {
|
||||||
return UPNP_E_INIT_FAILED;
|
return UPNP_E_INIT_FAILED;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
HandleLock();
|
HandleLock();
|
||||||
if( HostIP != NULL )
|
if( HostIP != NULL ) {
|
||||||
strcpy( LOCAL_HOST, HostIP );
|
strcpy( LOCAL_HOST, HostIP );
|
||||||
else {
|
} else {
|
||||||
if( getlocalhostname( LOCAL_HOST ) != UPNP_E_SUCCESS ) {
|
if( getlocalhostname( LOCAL_HOST ) != UPNP_E_SUCCESS ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INIT_FAILED;
|
return UPNP_E_INIT_FAILED;
|
||||||
@@ -315,29 +323,56 @@ int UpnpInit( IN const char *HostIP,
|
|||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
static void
|
static void
|
||||||
PrintThreadPoolStats (const char* DbgFileName, int DbgLineNo,
|
PrintThreadPoolStats(
|
||||||
const char* msg, const ThreadPoolStats* const stats)
|
ThreadPool *tp,
|
||||||
|
const char *DbgFileName,
|
||||||
|
int DbgLineNo,
|
||||||
|
const char *msg)
|
||||||
{
|
{
|
||||||
UpnpPrintf (UPNP_INFO, API, DbgFileName, DbgLineNo,
|
ThreadPoolStats stats;
|
||||||
"%s \n High Jobs pending = %d \nMed Jobs Pending = %d\n"
|
ThreadPoolGetStats(tp, &stats);
|
||||||
" Low Jobs Pending = %d \nWorker Threads = %d\n"
|
UpnpPrintf(UPNP_INFO, API, DbgFileName, DbgLineNo,
|
||||||
"Idle Threads = %d\nPersistent Threads = %d\n"
|
"%s \n"
|
||||||
"Average Time spent in High Q = %lf\n"
|
"High Jobs pending: %d\n"
|
||||||
"Average Time spent in Med Q = %lf\n"
|
"Med Jobs Pending: %d\n"
|
||||||
"Average Time spent in Low Q = %lf\n"
|
"Low Jobs Pending: %d\n"
|
||||||
"Max Threads Used: %d\nTotal Work Time= %lf\n"
|
"Average wait in High Q in milliseconds: %lf\n"
|
||||||
"Total Idle Time = %lf\n",
|
"Average wait in Med Q in milliseconds: %lf\n"
|
||||||
msg,
|
"Average wait in Low Q in milliseconds: %lf\n"
|
||||||
stats->currentJobsHQ, stats->currentJobsMQ,
|
"Max Threads Used: %d\n"
|
||||||
stats->currentJobsLQ, stats->workerThreads,
|
"Worker Threads: %d\n"
|
||||||
stats->idleThreads, stats->persistentThreads,
|
"Persistent Threads: %d\n"
|
||||||
stats->avgWaitHQ, stats->avgWaitMQ, stats->avgWaitLQ,
|
"Idle Threads: %d\n"
|
||||||
stats->maxThreads, stats->totalWorkTime,
|
"Total Threads: %d\n"
|
||||||
stats->totalIdleTime );
|
"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);
|
||||||
}
|
}
|
||||||
#endif
|
#else /* DEBUG */
|
||||||
|
static UPNP_INLINE void
|
||||||
|
PrintThreadPoolStats(
|
||||||
|
ThreadPool *tp,
|
||||||
|
const char *DbgFileName,
|
||||||
|
int DbgLineNo,
|
||||||
|
const char *msg)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif /* DEBUG */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: UpnpFinish
|
* Function: UpnpFinish
|
||||||
*
|
*
|
||||||
@@ -366,10 +401,6 @@ UpnpFinish()
|
|||||||
#endif
|
#endif
|
||||||
struct Handle_Info *temp;
|
struct Handle_Info *temp;
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
ThreadPoolStats stats;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
// WSACleanup( );
|
// WSACleanup( );
|
||||||
#endif
|
#endif
|
||||||
@@ -381,18 +412,12 @@ UpnpFinish()
|
|||||||
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpFinish : UpnpSdkInit is :%d:\n",
|
"Inside UpnpFinish : UpnpSdkInit is :%d:\n",
|
||||||
UpnpSdkInit );
|
UpnpSdkInit );
|
||||||
#ifdef DEBUG
|
|
||||||
if( UpnpSdkInit == 1 ) {
|
if( UpnpSdkInit == 1 ) {
|
||||||
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
||||||
"UpnpFinish : UpnpSdkInit is ONE\n" );
|
"UpnpFinish : UpnpSdkInit is ONE\n" );
|
||||||
}
|
}
|
||||||
ThreadPoolGetStats( &gRecvThreadPool, &stats );
|
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
|
||||||
PrintThreadPoolStats (__FILE__, __LINE__,
|
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool");
|
||||||
"Recv Thread Pool", &stats);
|
|
||||||
ThreadPoolGetStats( &gSendThreadPool, &stats );
|
|
||||||
PrintThreadPoolStats (__FILE__, __LINE__,
|
|
||||||
"Send Thread Pool", &stats);
|
|
||||||
#endif
|
|
||||||
#ifdef INCLUDE_DEVICE_APIS
|
#ifdef INCLUDE_DEVICE_APIS
|
||||||
if( GetDeviceHandleInfo( &device_handle, &temp ) == HND_DEVICE )
|
if( GetDeviceHandleInfo( &device_handle, &temp ) == HND_DEVICE )
|
||||||
UpnpUnRegisterRootDevice( device_handle );
|
UpnpUnRegisterRootDevice( device_handle );
|
||||||
@@ -411,44 +436,38 @@ UpnpFinish()
|
|||||||
web_server_destroy();
|
web_server_destroy();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG
|
ThreadPoolShutdown(&gSendThreadPool);
|
||||||
ThreadPoolShutdown( &gSendThreadPool );
|
ThreadPoolShutdown(&gRecvThreadPool);
|
||||||
ThreadPoolShutdown( &gRecvThreadPool );
|
|
||||||
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
||||||
"Exiting UpnpFinish : UpnpSdkInit is :%d:\n",
|
"Exiting UpnpFinish : UpnpSdkInit is :%d:\n", UpnpSdkInit);
|
||||||
UpnpSdkInit );
|
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
|
||||||
ThreadPoolGetStats( &gRecvThreadPool, &stats );
|
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool");
|
||||||
PrintThreadPoolStats( __FILE__, __LINE__,
|
|
||||||
"Recv Thread Pool", &stats);
|
|
||||||
ThreadPoolGetStats( &gSendThreadPool, &stats );
|
|
||||||
PrintThreadPoolStats(__FILE__, __LINE__,
|
|
||||||
"Send Thread Pool", &stats);
|
|
||||||
UpnpCloseLog();
|
UpnpCloseLog();
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef INCLUDE_CLIENT_APIS
|
#ifdef INCLUDE_CLIENT_APIS
|
||||||
ithread_mutex_destroy( &GlobalClientSubscribeMutex );
|
ithread_mutex_destroy(&GlobalClientSubscribeMutex);
|
||||||
#endif
|
#endif
|
||||||
ithread_mutex_destroy( &GlobalHndMutex );
|
ithread_rwlock_destroy(&GlobalHndRWLock);
|
||||||
ithread_mutex_destroy( &gUUIDMutex );
|
ithread_mutex_destroy(&gUUIDMutex);
|
||||||
|
|
||||||
// remove all virtual dirs
|
// remove all virtual dirs
|
||||||
UpnpRemoveAllVirtualDirs();
|
UpnpRemoveAllVirtualDirs();
|
||||||
// leuk_he allow static linking:
|
|
||||||
|
// allow static linking
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#ifdef PTW32_STATIC_LIB
|
#ifdef PTW32_STATIC_LIB
|
||||||
pthread_win32_thread_detach_np ();
|
pthread_win32_thread_detach_np ();
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
UpnpSdkInit = 0;
|
UpnpSdkInit = 0;
|
||||||
|
|
||||||
return UPNP_E_SUCCESS;
|
return UPNP_E_SUCCESS;
|
||||||
|
|
||||||
} /********************* End of UpnpFinish *************************/
|
}
|
||||||
|
/*************************** End of UpnpFinish *****************************/
|
||||||
|
|
||||||
/****************************************************************************
|
/******************************************************************************
|
||||||
* Function: UpnpGetServerPort
|
* Function: UpnpGetServerPort
|
||||||
*
|
*
|
||||||
* Parameters: NONE
|
* Parameters: NONE
|
||||||
@@ -945,7 +964,7 @@ GetDescDocumentAndURL( IN Upnp_DescType descriptionType,
|
|||||||
char *temp_str = NULL;
|
char *temp_str = NULL;
|
||||||
FILE *fp = NULL;
|
FILE *fp = NULL;
|
||||||
off_t fileLen;
|
off_t fileLen;
|
||||||
unsigned num_read;
|
size_t num_read;
|
||||||
time_t last_modified;
|
time_t last_modified;
|
||||||
struct stat file_info;
|
struct stat file_info;
|
||||||
struct sockaddr_in serverAddr;
|
struct sockaddr_in serverAddr;
|
||||||
@@ -1551,7 +1570,7 @@ UpnpSearchAsync( IN UpnpClient_Handle Hnd,
|
|||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpSearchAsync \n" );
|
"Inside UpnpSearchAsync \n" );
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -1727,7 +1746,7 @@ UpnpSubscribeAsync( IN UpnpClient_Handle Hnd,
|
|||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpSubscribeAsync \n" );
|
"Inside UpnpSubscribeAsync \n" );
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -1744,15 +1763,13 @@ UpnpSubscribeAsync( IN UpnpClient_Handle Hnd,
|
|||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_PARAM;
|
return UPNP_E_INVALID_PARAM;
|
||||||
}
|
}
|
||||||
|
HandleUnlock();
|
||||||
|
|
||||||
Param =
|
Param = (struct UpnpNonblockParam *)
|
||||||
( struct UpnpNonblockParam * )
|
malloc(sizeof (struct UpnpNonblockParam));
|
||||||
malloc( sizeof( struct UpnpNonblockParam ) );
|
|
||||||
if( Param == NULL ) {
|
if( Param == NULL ) {
|
||||||
HandleUnlock();
|
|
||||||
return UPNP_E_OUTOF_MEMORY;
|
return UPNP_E_OUTOF_MEMORY;
|
||||||
}
|
}
|
||||||
HandleUnlock();
|
|
||||||
|
|
||||||
Param->FunName = SUBSCRIBE;
|
Param->FunName = SUBSCRIBE;
|
||||||
Param->Handle = Hnd;
|
Param->Handle = Hnd;
|
||||||
@@ -1812,7 +1829,7 @@ UpnpSubscribe( IN UpnpClient_Handle Hnd,
|
|||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpSubscribe \n" );
|
"Inside UpnpSubscribe \n" );
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -1872,7 +1889,7 @@ UpnpUnSubscribe( IN UpnpClient_Handle Hnd,
|
|||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpUnSubscribe \n" );
|
"Inside UpnpUnSubscribe \n" );
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -1931,7 +1948,7 @@ UpnpUnSubscribeAsync( IN UpnpClient_Handle Hnd,
|
|||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpUnSubscribeAsync \n" );
|
"Inside UpnpUnSubscribeAsync \n" );
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -2005,7 +2022,7 @@ UpnpRenewSubscription( IN UpnpClient_Handle Hnd,
|
|||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpRenewSubscription \n" );
|
"Inside UpnpRenewSubscription \n" );
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -2070,7 +2087,7 @@ UpnpRenewSubscriptionAsync( IN UpnpClient_Handle Hnd,
|
|||||||
|
|
||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpRenewSubscriptionAsync \n" );
|
"Inside UpnpRenewSubscriptionAsync \n" );
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -2165,7 +2182,7 @@ UpnpNotify( IN UpnpDevice_Handle Hnd,
|
|||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpNotify \n" );
|
"Inside UpnpNotify \n" );
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -2236,7 +2253,7 @@ UpnpNotifyExt( IN UpnpDevice_Handle Hnd,
|
|||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpNotify \n" );
|
"Inside UpnpNotify \n" );
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -2313,7 +2330,7 @@ UpnpAcceptSubscription( IN UpnpDevice_Handle Hnd,
|
|||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpAcceptSubscription \n" );
|
"Inside UpnpAcceptSubscription \n" );
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -2389,7 +2406,7 @@ UpnpAcceptSubscriptionExt( IN UpnpDevice_Handle Hnd,
|
|||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpAcceptSubscription \n" );
|
"Inside UpnpAcceptSubscription \n" );
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -2485,7 +2502,7 @@ UpnpSendAction( IN UpnpClient_Handle Hnd,
|
|||||||
}
|
}
|
||||||
DevUDN_const = NULL;
|
DevUDN_const = NULL;
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -2569,7 +2586,7 @@ UpnpSendActionEx( IN UpnpClient_Handle Hnd,
|
|||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -2645,7 +2662,7 @@ UpnpSendActionAsync( IN UpnpClient_Handle Hnd,
|
|||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpSendActionAsync \n" );
|
"Inside UpnpSendActionAsync \n" );
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -2765,7 +2782,7 @@ UpnpSendActionExAsync( IN UpnpClient_Handle Hnd,
|
|||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -2879,7 +2896,7 @@ UpnpGetServiceVarStatusAsync( IN UpnpClient_Handle Hnd,
|
|||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpGetServiceVarStatusAsync \n" );
|
"Inside UpnpGetServiceVarStatusAsync \n" );
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -2959,7 +2976,7 @@ UpnpGetServiceVarStatus( IN UpnpClient_Handle Hnd,
|
|||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Inside UpnpGetServiceVarStatus \n" );
|
"Inside UpnpGetServiceVarStatus \n" );
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -3287,17 +3304,15 @@ UpnpDownloadXmlDoc( const char *url,
|
|||||||
} else {
|
} else {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
xml_buf = ixmlPrintNode( ( IXML_Node * ) * xmlDoc );
|
xml_buf = ixmlPrintNode( ( IXML_Node * ) * xmlDoc );
|
||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Printing the Parsed xml document \n %s\n",
|
"Printing the Parsed xml document \n %s\n", xml_buf );
|
||||||
xml_buf );
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
"****************** END OF Parsed XML Doc *****************\n" );
|
||||||
"****************** END OF Parsed XML Doc *****************\n" );
|
ixmlFreeDOMString( xml_buf );
|
||||||
ixmlFreeDOMString( xml_buf );
|
|
||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
|
||||||
"Exiting UpnpDownloadXmlDoc\n" );
|
|
||||||
#endif
|
#endif
|
||||||
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
return UPNP_E_SUCCESS;
|
"Exiting UpnpDownloadXmlDoc\n" );
|
||||||
|
return UPNP_E_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3629,7 +3644,6 @@ int PrintHandleInfo( IN UpnpClient_Handle Hnd )
|
|||||||
struct Handle_Info * HndInfo;
|
struct Handle_Info * HndInfo;
|
||||||
if (HandleTable[Hnd] != NULL) {
|
if (HandleTable[Hnd] != NULL) {
|
||||||
HndInfo = HandleTable[Hnd];
|
HndInfo = HandleTable[Hnd];
|
||||||
#ifdef DEBUG
|
|
||||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Printing information for Handle_%d\n", Hnd);
|
"Printing information for Handle_%d\n", Hnd);
|
||||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
@@ -3638,7 +3652,6 @@ int PrintHandleInfo( IN UpnpClient_Handle Hnd )
|
|||||||
if(HndInfo->HType != HND_CLIENT)
|
if(HndInfo->HType != HND_CLIENT)
|
||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"DescURL_%s\n", HndInfo->DescURL );
|
"DescURL_%s\n", HndInfo->DescURL );
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
@@ -3717,8 +3730,44 @@ void printNodes( IXML_Node * tmpRoot, int depth )
|
|||||||
strcpy( out, inet_ntoa(LocalAddr.sin_addr));
|
strcpy( out, inet_ntoa(LocalAddr.sin_addr));
|
||||||
}
|
}
|
||||||
return UPNP_E_SUCCESS;
|
return UPNP_E_SUCCESS;
|
||||||
#else
|
#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 )];
|
char szBuffer[MAX_INTERFACES * sizeof( struct ifreq )];
|
||||||
struct ifconf ifConf;
|
struct ifconf ifConf;
|
||||||
struct ifreq ifReq;
|
struct ifreq ifReq;
|
||||||
|
@@ -173,7 +173,7 @@ int DebugAtThisLevel(
|
|||||||
IN Upnp_LogLevel DLevel,
|
IN Upnp_LogLevel DLevel,
|
||||||
IN Dbg_Module Module)
|
IN Dbg_Module Module)
|
||||||
{
|
{
|
||||||
int ret = g_log_level >= DLevel;
|
int ret = DLevel <= g_log_level;
|
||||||
ret &=
|
ret &=
|
||||||
DEBUG_ALL ||
|
DEBUG_ALL ||
|
||||||
(Module == SSDP && DEBUG_SSDP ) ||
|
(Module == SSDP && DEBUG_SSDP ) ||
|
||||||
|
@@ -36,7 +36,7 @@
|
|||||||
#include "uri.h"
|
#include "uri.h"
|
||||||
#define HEADER_LENGTH 2000
|
#define HEADER_LENGTH 2000
|
||||||
|
|
||||||
//Structure to maintain a error code and string associated with the
|
// Structure to maintain a error code and string associated with the
|
||||||
// error code
|
// error code
|
||||||
struct ErrorString {
|
struct ErrorString {
|
||||||
int rc; /* error code */
|
int rc; /* error code */
|
||||||
@@ -44,7 +44,7 @@ struct ErrorString {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//Intializing the array of error structures.
|
// Initializing the array of error structures.
|
||||||
struct ErrorString ErrorMessages[] = { {UPNP_E_SUCCESS, "UPNP_E_SUCCESS"},
|
struct ErrorString ErrorMessages[] = { {UPNP_E_SUCCESS, "UPNP_E_SUCCESS"},
|
||||||
{UPNP_E_INVALID_HANDLE, "UPNP_E_INVALID_HANDLE"},
|
{UPNP_E_INVALID_HANDLE, "UPNP_E_INVALID_HANDLE"},
|
||||||
{UPNP_E_INVALID_PARAM, "UPNP_E_INVALID_PARAM"},
|
{UPNP_E_INVALID_PARAM, "UPNP_E_INVALID_PARAM"},
|
||||||
@@ -81,13 +81,13 @@ struct ErrorString ErrorMessages[] = { {UPNP_E_SUCCESS, "UPNP_E_SUCCESS"},
|
|||||||
};
|
};
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : UpnpGetErrorMessage
|
* Function : UpnpGetErrorMessage
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN int rc: error code
|
* IN int rc: error code
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This functions returns the error string mapped to the error code
|
* This functions returns the error string mapped to the error code
|
||||||
* Returns: const char *
|
* Returns: const char *
|
||||||
* return either the right string or "Unknown Error"
|
* return either the right string or "Unknown Error"
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
@@ -108,14 +108,14 @@ UpnpGetErrorMessage( IN int rc )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : UpnpResolveURL
|
* Function : UpnpResolveURL
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN char * BaseURL: Base URL string
|
* IN char * BaseURL: Base URL string
|
||||||
* IN char * RelURL: relative URL string
|
* IN char * RelURL: relative URL string
|
||||||
* OUT char * AbsURL: Absolute URL string
|
* OUT char * AbsURL: Absolute URL string
|
||||||
* Description:
|
* Description:
|
||||||
* This functions concatinates the base URL and relative URL to generate
|
* This functions concatinates the base URL and relative URL to generate
|
||||||
* the absolute URL
|
* the absolute URL
|
||||||
* Returns: int
|
* Returns: int
|
||||||
* return either UPNP_E_SUCCESS or appropriate error
|
* return either UPNP_E_SUCCESS or appropriate error
|
||||||
@@ -151,19 +151,19 @@ UpnpResolveURL( IN const char *BaseURL,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : addToAction
|
* Function : addToAction
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN int response: flag to tell if the ActionDoc is for response
|
* IN int response: flag to tell if the ActionDoc is for response
|
||||||
* or request
|
* or request
|
||||||
* INOUT IXML_Document **ActionDoc: request or response document
|
* INOUT IXML_Document **ActionDoc: request or response document
|
||||||
* IN char *ActionName: Name of the action request or response
|
* IN char *ActionName: Name of the action request or response
|
||||||
* IN char *ServType: Service type
|
* IN char *ServType: Service type
|
||||||
* IN char * ArgName: Name of the argument
|
* IN char * ArgName: Name of the argument
|
||||||
* IN char * ArgValue: Value of the argument
|
* IN char * ArgValue: Value of the argument
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function adds the argument in the action request or response.
|
* This function adds the argument in the action request or response.
|
||||||
* This function creates the action request or response if it is a first
|
* This function creates the action request or response if it is a first
|
||||||
* argument else it will add the argument in the document
|
* argument else it will add the argument in the document
|
||||||
*
|
*
|
||||||
@@ -230,22 +230,22 @@ addToAction( IN int response,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : makeAction
|
* Function : makeAction
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN int response: flag to tell if the ActionDoc is for response
|
* IN int response: flag to tell if the ActionDoc is for response
|
||||||
* or request
|
* or request
|
||||||
* IN char * ActionName: Name of the action request or response
|
* IN char * ActionName: Name of the action request or response
|
||||||
* IN char * ServType: Service type
|
* IN char * ServType: Service type
|
||||||
* IN int NumArg :Number of arguments in the action request or response
|
* IN int NumArg :Number of arguments in the action request or response
|
||||||
* IN char * Arg : pointer to the first argument
|
* IN char * Arg : pointer to the first argument
|
||||||
* IN va_list ArgList: Argument list
|
* IN va_list ArgList: Argument list
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function creates the action request or response from the argument
|
* This function creates the action request or response from the argument
|
||||||
* list.
|
* list.
|
||||||
* Returns: IXML_Document *
|
* Returns: IXML_Document *
|
||||||
* returns action request or response document if successful
|
* returns action request or response document if successful
|
||||||
* else returns NULL
|
* else returns NULL
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
static IXML_Document *
|
static IXML_Document *
|
||||||
@@ -326,9 +326,9 @@ makeAction( IN int response,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : UpnpMakeAction
|
* Function : UpnpMakeAction
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN char * ActionName: Name of the action request or response
|
* IN char * ActionName: Name of the action request or response
|
||||||
* IN char * ServType: Service type
|
* IN char * ServType: Service type
|
||||||
* IN int NumArg :Number of arguments in the action request or response
|
* 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 ... : variable argument list
|
||||||
* IN va_list ArgList: Argument list
|
* IN va_list ArgList: Argument list
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function creates the action request from the argument
|
* This function creates the action request from the argument
|
||||||
* list. Its a wrapper function that calls makeAction function to create
|
* list. Its a wrapper function that calls makeAction function to create
|
||||||
* the action request.
|
* the action request.
|
||||||
@@ -363,9 +363,9 @@ UpnpMakeAction( const char *ActionName,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : UpnpMakeActionResponse
|
* Function : UpnpMakeActionResponse
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN char * ActionName: Name of the action request or response
|
* IN char * ActionName: Name of the action request or response
|
||||||
* IN char * ServType: Service type
|
* IN char * ServType: Service type
|
||||||
* IN int NumArg :Number of arguments in the action request or response
|
* 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 ... : variable argument list
|
||||||
* IN va_list ArgList: Argument list
|
* IN va_list ArgList: Argument list
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function creates the action response from the argument
|
* This function creates the action response from the argument
|
||||||
* list. Its a wrapper function that calls makeAction function to create
|
* list. Its a wrapper function that calls makeAction function to create
|
||||||
* the action response.
|
* the action response.
|
||||||
*
|
*
|
||||||
* Returns: IXML_Document *
|
* Returns: IXML_Document *
|
||||||
* returns action response document if successful
|
* returns action response document if successful
|
||||||
* else returns NULL
|
* else returns NULL
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
IXML_Document *
|
IXML_Document *
|
||||||
@@ -400,22 +400,22 @@ UpnpMakeActionResponse( const char *ActionName,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : UpnpAddToActionResponse
|
* Function : UpnpAddToActionResponse
|
||||||
*
|
*
|
||||||
* Parameters:
|
* 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 * ActionName: Name of the action request or response
|
||||||
* IN char * ServType: Service type
|
* IN char * ServType: Service type
|
||||||
* IN int ArgName :Name of argument to be added in the action response
|
* IN int ArgName :Name of argument to be added in the action response
|
||||||
* IN char * ArgValue : value of the argument
|
* IN char * ArgValue : value of the argument
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function adds the argument in the action response. Its a wrapper
|
* This function adds the argument in the action response. Its a wrapper
|
||||||
* function that calls addToAction function to add the argument in the
|
* function that calls addToAction function to add the argument in the
|
||||||
* action response.
|
* action response.
|
||||||
*
|
*
|
||||||
* Returns: int
|
* Returns: int
|
||||||
* returns UPNP_E_SUCCESS if successful
|
* returns UPNP_E_SUCCESS if successful
|
||||||
* else returns appropriate error
|
* else returns appropriate error
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
int
|
int
|
||||||
@@ -430,22 +430,22 @@ UpnpAddToActionResponse( INOUT IXML_Document ** ActionResponse,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : UpnpAddToAction
|
* Function : UpnpAddToAction
|
||||||
*
|
*
|
||||||
* Parameters:
|
* 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 * ActionName: Name of the action request or response
|
||||||
* IN char * ServType: Service type
|
* IN char * ServType: Service type
|
||||||
* IN int ArgName :Name of argument to be added in the action response
|
* IN int ArgName :Name of argument to be added in the action response
|
||||||
* IN char * ArgValue : value of the argument
|
* IN char * ArgValue : value of the argument
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function adds the argument in the action request. Its a wrapper
|
* This function adds the argument in the action request. Its a wrapper
|
||||||
* function that calls addToAction function to add the argument in the
|
* function that calls addToAction function to add the argument in the
|
||||||
* action request.
|
* action request.
|
||||||
*
|
*
|
||||||
* Returns: int
|
* Returns: int
|
||||||
* returns UPNP_E_SUCCESS if successful
|
* returns UPNP_E_SUCCESS if successful
|
||||||
* else returns appropriate error
|
* else returns appropriate error
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
int
|
int
|
||||||
@@ -461,15 +461,15 @@ UpnpAddToAction( IXML_Document ** ActionDoc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : UpnpAddToPropertySet
|
* Function : UpnpAddToPropertySet
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* INOUT IXML_Document **PropSet: propertyset document
|
* INOUT IXML_Document **PropSet: propertyset document
|
||||||
* IN char *ArgName: Name of the argument
|
* IN char *ArgName: Name of the argument
|
||||||
* IN char *ArgValue: value of the argument
|
* IN char *ArgValue: value of the argument
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function adds the argument in the propertyset node
|
* This function adds the argument in the propertyset node
|
||||||
*
|
*
|
||||||
* Returns: int
|
* Returns: int
|
||||||
* returns UPNP_E_SUCCESS if successful else returns appropriate error
|
* returns UPNP_E_SUCCESS if successful else returns appropriate error
|
||||||
@@ -516,14 +516,14 @@ UpnpAddToPropertySet( INOUT IXML_Document ** PropSet,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : UpnpCreatePropertySet
|
* Function : UpnpCreatePropertySet
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN int NumArg: Number of argument that will go in the propertyset node
|
* IN int NumArg: Number of argument that will go in the propertyset node
|
||||||
* IN char * Args: argument strings
|
* IN char * Args: argument strings
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function creates a propertyset node and put all the input
|
* This function creates a propertyset node and put all the input
|
||||||
* parameters in the node as elements
|
* parameters in the node as elements
|
||||||
*
|
*
|
||||||
* Returns: IXML_Document *
|
* Returns: IXML_Document *
|
||||||
@@ -581,4 +581,5 @@ UpnpCreatePropertySet( IN int NumArg,
|
|||||||
return PropSet;
|
return PropSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif // EXCLUDE_DOM == 0
|
||||||
|
|
||||||
|
@@ -45,12 +45,12 @@
|
|||||||
extern ithread_mutex_t GlobalClientSubscribeMutex;
|
extern ithread_mutex_t GlobalClientSubscribeMutex;
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : GenaAutoRenewSubscription
|
* Function : GenaAutoRenewSubscription
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN void *input: Thread data(upnp_timeout *) needed to send the renewal
|
* 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
|
* This is a thread function to send the renewal just before the
|
||||||
* subscription times out.
|
* subscription times out.
|
||||||
*
|
*
|
||||||
@@ -93,7 +93,7 @@ GenaAutoRenewSubscription( IN void *input )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( send_callback ) {
|
if( send_callback ) {
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
if( GetHandleInfo( event->handle, &handle_info ) != HND_CLIENT ) {
|
if( GetHandleInfo( event->handle, &handle_info ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
free_upnp_timeout( event );
|
free_upnp_timeout( event );
|
||||||
@@ -113,14 +113,14 @@ GenaAutoRenewSubscription( IN void *input )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : ScheduleGenaAutoRenew
|
* Function : ScheduleGenaAutoRenew
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN int client_handle: Handle that also contains the subscription list
|
* IN int client_handle: Handle that also contains the subscription list
|
||||||
* IN int TimeOut: The time out value of the subscription
|
* IN int TimeOut: The time out value of the subscription
|
||||||
* IN client_subscription * sub: Subscription being renewed
|
* IN client_subscription * sub: Subscription being renewed
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function schedules a job to renew the subscription just before
|
* This function schedules a job to renew the subscription just before
|
||||||
* time out.
|
* time out.
|
||||||
*
|
*
|
||||||
@@ -188,14 +188,14 @@ ScheduleGenaAutoRenew( IN int client_handle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : gena_unsubscribe
|
* Function : gena_unsubscribe
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN char *url: Event URL of the service
|
* IN char *url: Event URL of the service
|
||||||
* IN char *sid: The subcription ID.
|
* IN char *sid: The subcription ID.
|
||||||
* OUT http_parser_t* response: The UNSUBCRIBE response from the device
|
* OUT http_parser_t* response: The UNSUBCRIBE response from the device
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function sends the UNSUBCRIBE gena request and recieves the
|
* This function sends the UNSUBCRIBE gena request and recieves the
|
||||||
* response from the device and returns it as a parameter
|
* response from the device and returns it as a parameter
|
||||||
*
|
*
|
||||||
@@ -251,9 +251,9 @@ gena_unsubscribe( IN char *url,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : gena_subscribe
|
* Function : gena_subscribe
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN char *url: url of service to subscribe
|
* IN char *url: url of service to subscribe
|
||||||
* INOUT int* timeout:subscription time desired (in secs)
|
* INOUT int* timeout:subscription time desired (in secs)
|
||||||
* IN char* renewal_sid:for renewal, this contains a currently h
|
* 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
|
* subscription, this must be NULL
|
||||||
* OUT char** sid: SID returned by the subscription or renew msg
|
* OUT char** sid: SID returned by the subscription or renew msg
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function subscribes or renew subscription
|
* This function subscribes or renew subscription
|
||||||
*
|
*
|
||||||
* Returns: int
|
* Returns: int
|
||||||
@@ -374,13 +374,13 @@ gena_subscribe( IN char *url,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : genaUnregisterClient
|
* Function : genaUnregisterClient
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN UpnpClient_Handle client_handle: Handle containing all the control
|
* IN UpnpClient_Handle client_handle: Handle containing all the control
|
||||||
* point related information
|
* point related information
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function unsubcribes all the outstanding subscriptions and cleans
|
* This function unsubcribes all the outstanding subscriptions and cleans
|
||||||
* the subscription list. This function is called when control point
|
* the subscription list. This function is called when control point
|
||||||
* unregisters.
|
* unregisters.
|
||||||
@@ -435,12 +435,12 @@ genaUnregisterClient( IN UpnpClient_Handle client_handle )
|
|||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : genaUnSubscribe
|
* Function : genaUnSubscribe
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN UpnpClient_Handle client_handle: UPnP client handle
|
* IN UpnpClient_Handle client_handle: UPnP client handle
|
||||||
* IN SID in_sid: The subscription ID
|
* IN SID in_sid: The subscription ID
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function unsubscribes a SID. It first validates the SID and
|
* This function unsubscribes a SID. It first validates the SID and
|
||||||
* client_handle,copies the subscription, sends UNSUBSCRIBE http request
|
* client_handle,copies the subscription, sends UNSUBSCRIBE http request
|
||||||
* to service processes request and finally removes the subscription
|
* to service processes request and finally removes the subscription
|
||||||
@@ -506,8 +506,8 @@ genaUnSubscribe( IN UpnpClient_Handle client_handle,
|
|||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : genaSubscribe
|
* Function : genaSubscribe
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN UpnpClient_Handle client_handle:
|
* IN UpnpClient_Handle client_handle:
|
||||||
* IN char * PublisherURL: NULL Terminated, of the form :
|
* IN char * PublisherURL: NULL Terminated, of the form :
|
||||||
* "http://134.134.156.80:4000/RedBulb/Event"
|
* "http://134.134.156.80:4000/RedBulb/Event"
|
||||||
@@ -516,7 +516,7 @@ genaUnSubscribe( IN UpnpClient_Handle client_handle,
|
|||||||
* by Service, -1 for infinite
|
* by Service, -1 for infinite
|
||||||
* OUT Upnp_SID out_sid:sid of subscription, memory passed in by caller
|
* 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
|
* This function subscribes to a PublisherURL ( also mentioned as EventURL
|
||||||
* some places). It sends SUBSCRIBE http request to service processes
|
* some places). It sends SUBSCRIBE http request to service processes
|
||||||
* request. Finally adds a Subscription to
|
* request. Finally adds a Subscription to
|
||||||
@@ -543,10 +543,10 @@ genaSubscribe( IN UpnpClient_Handle client_handle,
|
|||||||
|
|
||||||
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
|
||||||
"GENA SUBSCRIBE BEGIN" );
|
"GENA SUBSCRIBE BEGIN" );
|
||||||
HandleLock();
|
|
||||||
|
|
||||||
memset( out_sid, 0, sizeof( Upnp_SID ) );
|
memset( out_sid, 0, sizeof( Upnp_SID ) );
|
||||||
|
|
||||||
|
HandleReadLock();
|
||||||
// validate handle
|
// validate handle
|
||||||
if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {
|
if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
@@ -616,15 +616,15 @@ genaSubscribe( IN UpnpClient_Handle client_handle,
|
|||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : genaRenewSubscription
|
* Function : genaRenewSubscription
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN UpnpClient_Handle client_handle: Client handle
|
* IN UpnpClient_Handle client_handle: Client handle
|
||||||
* IN const Upnp_SID in_sid: subscription ID
|
* IN const Upnp_SID in_sid: subscription ID
|
||||||
* INOUT int * TimeOut: requested Duration, if -1, then "infinite".
|
* INOUT int * TimeOut: requested Duration, if -1, then "infinite".
|
||||||
* in the OUT case: actual Duration granted
|
* in the OUT case: actual Duration granted
|
||||||
* by Service, -1 for infinite
|
* by Service, -1 for infinite
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function renews a SID. It first validates the SID and
|
* This function renews a SID. It first validates the SID and
|
||||||
* client_handle and copies the subscription. It sends RENEW
|
* client_handle and copies the subscription. It sends RENEW
|
||||||
* (modified SUBSCRIBE) http request to service and processes
|
* (modified SUBSCRIBE) http request to service and processes
|
||||||
@@ -724,14 +724,14 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
|
|||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : gena_process_notification_event
|
* Function : gena_process_notification_event
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN SOCKINFO *info: Socket structure containing the device socket
|
* IN SOCKINFO *info: Socket structure containing the device socket
|
||||||
* information
|
* information
|
||||||
* IN http_message_t* event: The http message contains the GENA
|
* IN http_message_t* event: The http message contains the GENA
|
||||||
* notification
|
* notification
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function processes NOTIFY events that are sent by devices.
|
* This function processes NOTIFY events that are sent by devices.
|
||||||
* called by genacallback()
|
* called by genacallback()
|
||||||
*
|
*
|
||||||
@@ -881,3 +881,4 @@ gena_process_notification_event( IN SOCKINFO * info,
|
|||||||
|
|
||||||
#endif // INCLUDE_CLIENT_APIS
|
#endif // INCLUDE_CLIENT_APIS
|
||||||
#endif // EXCLUDE_GENA
|
#endif // EXCLUDE_GENA
|
||||||
|
|
||||||
|
@@ -365,7 +365,7 @@ genaNotifyThread( IN void *input )
|
|||||||
struct Handle_Info *handle_info;
|
struct Handle_Info *handle_info;
|
||||||
ThreadPoolJob job;
|
ThreadPoolJob job;
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
//validate context
|
//validate context
|
||||||
|
|
||||||
if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) {
|
if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) {
|
||||||
|
@@ -396,7 +396,7 @@ scanner_get_str( IN scanner_t * scanner )
|
|||||||
* Note :
|
* Note :
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
#warning The only use of the function 'scanner_pushback()' in the code is commented out.
|
#warning The only use of the function 'scanner_pushback()' in the code is commented out.
|
||||||
#warning 'scanner_pushback()' is a good candidate for removal.
|
#warning 'scanner_pushback()' is a candidate for removal.
|
||||||
static UPNP_INLINE void
|
static UPNP_INLINE void
|
||||||
scanner_pushback( INOUT scanner_t * scanner,
|
scanner_pushback( INOUT scanner_t * scanner,
|
||||||
IN size_t pushback_bytes )
|
IN size_t pushback_bytes )
|
||||||
@@ -966,7 +966,7 @@ read_until_crlf( INOUT scanner_t * scanner,
|
|||||||
* PARSE_INCOMPLETE
|
* PARSE_INCOMPLETE
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
#warning There are currently no uses of the function 'skip_to_end_of_header()' in the code.
|
#warning There are currently no uses of the function 'skip_to_end_of_header()' in the code.
|
||||||
#warning 'skip_to_end_of_header()' is a good candidate for removal.
|
#warning 'skip_to_end_of_header()' is a candidate for removal.
|
||||||
static UPNP_INLINE int
|
static UPNP_INLINE int
|
||||||
skip_to_end_of_header( INOUT scanner_t * scanner )
|
skip_to_end_of_header( INOUT scanner_t * scanner )
|
||||||
{
|
{
|
||||||
|
@@ -349,7 +349,7 @@ http_SendMessage( IN SOCKINFO * info,
|
|||||||
filename = ( char * )va_arg( argp, char * );
|
filename = ( char * )va_arg( argp, char * );
|
||||||
|
|
||||||
if( Instr && Instr->IsVirtualFile )
|
if( Instr && Instr->IsVirtualFile )
|
||||||
Fp = virtualDirCallback.open( filename, UPNP_READ );
|
Fp = (virtualDirCallback.open)( filename, UPNP_READ );
|
||||||
else
|
else
|
||||||
Fp = fopen( filename, "rb" );
|
Fp = fopen( filename, "rb" );
|
||||||
|
|
||||||
@@ -475,11 +475,13 @@ http_SendMessage( IN SOCKINFO * info,
|
|||||||
buf_length = ( size_t ) va_arg( argp, size_t );
|
buf_length = ( size_t ) va_arg( argp, size_t );
|
||||||
if( buf_length > 0 ) {
|
if( buf_length > 0 ) {
|
||||||
num_written = sock_write( info, buf, buf_length, TimeOut );
|
num_written = sock_write( info, buf, buf_length, TimeOut );
|
||||||
|
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 )
|
if( ( size_t ) num_written != buf_length )
|
||||||
goto end;
|
goto end;
|
||||||
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
|
|
||||||
">>> (SENT) >>>\n%.*s\n------------\n",
|
|
||||||
( int )buf_length, buf );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -880,22 +880,24 @@ GetNextRange( char **SrcRangeStr,
|
|||||||
off_t *FirstByte,
|
off_t *FirstByte,
|
||||||
off_t *LastByte )
|
off_t *LastByte )
|
||||||
{
|
{
|
||||||
char *Ptr,
|
char *Ptr;
|
||||||
*Tok;
|
char *Tok;
|
||||||
int i,
|
int i;
|
||||||
F = -1,
|
int64_t F = -1;
|
||||||
L = -1;
|
int64_t L = -1;
|
||||||
int Is_Suffix_byte_Range = 1;
|
int Is_Suffix_byte_Range = 1;
|
||||||
|
|
||||||
if( *SrcRangeStr == NULL )
|
if( *SrcRangeStr == NULL ) {
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
Tok = StrTok( SrcRangeStr, "," );
|
Tok = StrTok( SrcRangeStr, "," );
|
||||||
|
|
||||||
if( ( Ptr = strstr( Tok, "-" ) ) == NULL )
|
if( ( Ptr = strstr( Tok, "-" ) ) == NULL ) {
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
*Ptr = ' ';
|
*Ptr = ' ';
|
||||||
sscanf( Tok, "%d%d", &F, &L );
|
sscanf( Tok, "%"SCNd64"%"SCNd64, &F, &L );
|
||||||
|
|
||||||
if( F == -1 || L == -1 ) {
|
if( F == -1 || L == -1 ) {
|
||||||
*Ptr = '-';
|
*Ptr = '-';
|
||||||
@@ -910,16 +912,15 @@ GetNextRange( char **SrcRangeStr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( Is_Suffix_byte_Range ) {
|
if( Is_Suffix_byte_Range ) {
|
||||||
*FirstByte = L;
|
*FirstByte = (off_t)L;
|
||||||
*LastByte = F;
|
*LastByte = (off_t)F;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*FirstByte = (off_t)F;
|
||||||
|
*LastByte = (off_t)L;
|
||||||
|
|
||||||
*FirstByte = F;
|
|
||||||
*LastByte = L;
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
@@ -1531,7 +1532,7 @@ http_RecvPostMessage( http_parser_t * parser,
|
|||||||
|
|
||||||
if( Instr && Instr->IsVirtualFile ) {
|
if( Instr && Instr->IsVirtualFile ) {
|
||||||
|
|
||||||
Fp = virtualDirCallback.open( filename, UPNP_WRITE );
|
Fp = (virtualDirCallback.open)( filename, UPNP_WRITE );
|
||||||
if( Fp == NULL ) {
|
if( Fp == NULL ) {
|
||||||
return HTTP_INTERNAL_SERVER_ERROR;
|
return HTTP_INTERNAL_SERVER_ERROR;
|
||||||
}
|
}
|
||||||
|
@@ -231,6 +231,15 @@ sock_read_write( IN SOCKINFO * info,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SO_NOSIGPIPE
|
||||||
|
{
|
||||||
|
int old;
|
||||||
|
int set = 1;
|
||||||
|
socklen_t olen = sizeof(old);
|
||||||
|
getsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, &olen);
|
||||||
|
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &set, sizeof(set));
|
||||||
|
#endif
|
||||||
|
|
||||||
if( bRead ) {
|
if( bRead ) {
|
||||||
// read data
|
// read data
|
||||||
numBytes = recv( sockfd, buffer, bufsize,MSG_NOSIGNAL);
|
numBytes = recv( sockfd, buffer, bufsize,MSG_NOSIGNAL);
|
||||||
@@ -243,6 +252,9 @@ sock_read_write( IN SOCKINFO * info,
|
|||||||
send( sockfd, buffer + bytes_sent, byte_left,
|
send( sockfd, buffer + bytes_sent, byte_left,
|
||||||
MSG_DONTROUTE|MSG_NOSIGNAL);
|
MSG_DONTROUTE|MSG_NOSIGNAL);
|
||||||
if( num_written == -1 ) {
|
if( num_written == -1 ) {
|
||||||
|
#ifdef SO_NOSIGPIPE
|
||||||
|
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, olen);
|
||||||
|
#endif
|
||||||
return num_written;
|
return num_written;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,6 +265,11 @@ sock_read_write( IN SOCKINFO * info,
|
|||||||
numBytes = bytes_sent;
|
numBytes = bytes_sent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SO_NOSIGPIPE
|
||||||
|
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, olen);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if( numBytes < 0 ) {
|
if( numBytes < 0 ) {
|
||||||
return UPNP_E_SOCKET_ERROR;
|
return UPNP_E_SOCKET_ERROR;
|
||||||
}
|
}
|
||||||
|
@@ -555,7 +555,7 @@ parse_hostport( const char *in,
|
|||||||
int begin_port;
|
int begin_port;
|
||||||
int hostport_size = 0;
|
int hostport_size = 0;
|
||||||
int host_size = 0;
|
int host_size = 0;
|
||||||
#ifndef WIN32
|
#if !defined(WIN32) && !defined(__OSX__)
|
||||||
char temp_hostbyname_buff[BUFFER_SIZE];
|
char temp_hostbyname_buff[BUFFER_SIZE];
|
||||||
struct hostent h_buf;
|
struct hostent h_buf;
|
||||||
#endif
|
#endif
|
||||||
@@ -626,27 +626,61 @@ parse_hostport( const char *in,
|
|||||||
// TODO: Use autoconf to discover this rather than the
|
// TODO: Use autoconf to discover this rather than the
|
||||||
// platform-specific stuff below
|
// platform-specific stuff below
|
||||||
#if defined(WIN32) || defined(__CYGWIN__)
|
#if defined(WIN32) || defined(__CYGWIN__)
|
||||||
h=gethostbyname(temp_host_name);
|
h = gethostbyname(temp_host_name);
|
||||||
#elif defined(SPARC_SOLARIS)
|
#elif defined(SPARC_SOLARIS)
|
||||||
errCode = gethostbyname_r( temp_host_name,
|
errCode = gethostbyname_r(
|
||||||
&h,
|
temp_host_name,
|
||||||
temp_hostbyname_buff,
|
&h,
|
||||||
BUFFER_SIZE, &errcode );
|
temp_hostbyname_buff,
|
||||||
|
BUFFER_SIZE, &errcode );
|
||||||
#elif defined(__FreeBSD__) && __FreeBSD_version < 601103
|
#elif defined(__FreeBSD__) && __FreeBSD_version < 601103
|
||||||
h = lwres_gethostbyname_r( temp_host_name,
|
h = lwres_gethostbyname_r(
|
||||||
&h_buf,
|
temp_host_name,
|
||||||
temp_hostbyname_buff,
|
&h_buf,
|
||||||
BUFFER_SIZE, &errcode );
|
temp_hostbyname_buff,
|
||||||
|
BUFFER_SIZE, &errcode );
|
||||||
if ( h == NULL ) {
|
if ( h == NULL ) {
|
||||||
errCode = 1;
|
errCode = 1;
|
||||||
}
|
}
|
||||||
|
#elif defined(__OSX__)
|
||||||
|
h = gethostbyname(temp_host_name);
|
||||||
|
if ( h == NULL ) {
|
||||||
|
errCode = 1;
|
||||||
|
}
|
||||||
|
#elif defined(__linux__)
|
||||||
|
errCode = gethostbyname_r(
|
||||||
|
temp_host_name,
|
||||||
|
&h_buf,
|
||||||
|
temp_hostbyname_buff,
|
||||||
|
BUFFER_SIZE, &h, &errcode );
|
||||||
#else
|
#else
|
||||||
errCode = gethostbyname_r( temp_host_name,
|
{
|
||||||
&h_buf,
|
struct addrinfo hints, *res, *res0;
|
||||||
temp_hostbyname_buff,
|
|
||||||
BUFFER_SIZE, &h, &errcode );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
h = NULL;
|
||||||
|
memset(&hints, 0, sizeof(hints));
|
||||||
|
hints.ai_family = PF_INET;
|
||||||
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
errCode = getaddrinfo(temp_host_name, "http", &hints, &res0);
|
||||||
|
|
||||||
|
if (!errCode) {
|
||||||
|
for (res = res0; res; res = res->ai_next) {
|
||||||
|
if (res->ai_family == PF_INET &&
|
||||||
|
res->ai_addr->sa_family == AF_INET)
|
||||||
|
{
|
||||||
|
h = &h_buf;
|
||||||
|
h->h_addrtype = res->ai_addr->sa_family;
|
||||||
|
h->h_length = 4;
|
||||||
|
h->h_addr = (void *) temp_hostbyname_buff;
|
||||||
|
*(struct in_addr *)h->h_addr =
|
||||||
|
((struct sockaddr_in *)res->ai_addr)->sin_addr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
freeaddrinfo(res0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if( errCode == 0 ) {
|
if( errCode == 0 ) {
|
||||||
if( h ) {
|
if( h ) {
|
||||||
if( ( h->h_addrtype == AF_INET ) && ( h->h_length == 4 ) ) {
|
if( ( h->h_addrtype == AF_INET ) && ( h->h_length == 4 ) ) {
|
||||||
|
@@ -261,18 +261,18 @@
|
|||||||
|
|
||||||
/** @name Other debugging features
|
/** @name Other debugging features
|
||||||
The UPnP SDK contains other features to aid in debugging:
|
The UPnP SDK contains other features to aid in debugging:
|
||||||
see <upnp/upnpdebug.h>
|
see <upnp/inc/upnpdebug.h>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define DEBUG_ALL 1
|
#define DEBUG_ALL 1
|
||||||
#define DEBUG_SSDP 0
|
#define DEBUG_SSDP 0
|
||||||
#define DEBUG_SOAP 0
|
#define DEBUG_SOAP 0
|
||||||
#define DEBUG_GENA 0
|
#define DEBUG_GENA 0
|
||||||
#define DEBUG_TPOOL 0
|
#define DEBUG_TPOOL 0
|
||||||
#define DEBUG_MSERV 0
|
#define DEBUG_MSERV 0
|
||||||
#define DEBUG_DOM 0
|
#define DEBUG_DOM 0
|
||||||
#define DEBUG_HTTP 0
|
#define DEBUG_HTTP 0
|
||||||
#define DEBUG_API 0
|
#define DEBUG_API 0
|
||||||
|
|
||||||
//@} // Compile time configuration options
|
//@} // Compile time configuration options
|
||||||
|
|
||||||
|
@@ -98,18 +98,25 @@ struct Handle_Info
|
|||||||
int aliasInstalled; // 0 = not installed; otherwise installed
|
int aliasInstalled; // 0 = not installed; otherwise installed
|
||||||
};
|
};
|
||||||
|
|
||||||
extern ithread_mutex_t GlobalHndMutex;
|
extern ithread_rwlock_t GlobalHndRWLock;
|
||||||
Upnp_Handle_Type GetHandleInfo(int Hnd, struct Handle_Info **HndInfo);
|
Upnp_Handle_Type GetHandleInfo(int Hnd, struct Handle_Info **HndInfo);
|
||||||
|
|
||||||
#define HandleLock() \
|
#define HandleLock() HandleWriteLock()
|
||||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying Lock"); \
|
|
||||||
ithread_mutex_lock(&GlobalHndMutex); \
|
#define HandleWriteLock() \
|
||||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "LOCK");
|
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying a write lock"); \
|
||||||
|
ithread_rwlock_wrlock(&GlobalHndRWLock); \
|
||||||
|
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Write lock acquired");
|
||||||
|
|
||||||
|
#define HandleReadLock() \
|
||||||
|
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying a read lock"); \
|
||||||
|
ithread_rwlock_rdlock(&GlobalHndRWLock); \
|
||||||
|
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Read lock acquired");
|
||||||
|
|
||||||
#define HandleUnlock() \
|
#define HandleUnlock() \
|
||||||
UpnpPrintf(UPNP_INFO, API,__FILE__, __LINE__, "Trying Unlock"); \
|
UpnpPrintf(UPNP_INFO, API,__FILE__, __LINE__, "Trying Unlock"); \
|
||||||
ithread_mutex_unlock(&GlobalHndMutex); \
|
ithread_rwlock_unlock(&GlobalHndRWLock); \
|
||||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Unlock");
|
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Unlocked rwlock");
|
||||||
|
|
||||||
Upnp_Handle_Type GetClientHandleInfo(int *client_handle_out,
|
Upnp_Handle_Type GetClientHandleInfo(int *client_handle_out,
|
||||||
struct Handle_Info **HndInfo);
|
struct Handle_Info **HndInfo);
|
||||||
@@ -176,7 +183,6 @@ void UpnpThreadDistribution(struct UpnpNonblockParam * Param);
|
|||||||
void AutoAdvertise(void *input);
|
void AutoAdvertise(void *input);
|
||||||
int getlocalhostname(char *out);
|
int getlocalhostname(char *out);
|
||||||
|
|
||||||
virtualDirList *pVirtualDirList;
|
|
||||||
extern WebServerState bWebServerState;
|
extern WebServerState bWebServerState;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -125,7 +125,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
|
|||||||
|
|
||||||
// we are assuming that there can be only one client supported at a time
|
// we are assuming that there can be only one client supported at a time
|
||||||
|
|
||||||
HandleLock();
|
HandleReadLock();
|
||||||
|
|
||||||
if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
|
if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
@@ -159,7 +159,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// dest addr
|
// dest addr
|
||||||
param.DestAddr = dest_addr;
|
memcpy(¶m.DestAddr, dest_addr, sizeof(struct sockaddr_in) );
|
||||||
|
|
||||||
// EXT
|
// EXT
|
||||||
param.Ext[0] = '\0';
|
param.Ext[0] = '\0';
|
||||||
@@ -267,7 +267,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
|
|||||||
strlen( param.Location ) == 0 || !usn_found || !st_found ) {
|
strlen( param.Location ) == 0 || !usn_found || !st_found ) {
|
||||||
return; // bad reply
|
return; // bad reply
|
||||||
}
|
}
|
||||||
//check each current search
|
// check each current search
|
||||||
HandleLock();
|
HandleLock();
|
||||||
if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
|
if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
@@ -275,14 +275,14 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
|
|||||||
}
|
}
|
||||||
node = ListHead( &ctrlpt_info->SsdpSearchList );
|
node = ListHead( &ctrlpt_info->SsdpSearchList );
|
||||||
|
|
||||||
//temporary add null termination
|
// temporary add null termination
|
||||||
//save_char = hdr_value.buf[ hdr_value.length ];
|
//save_char = hdr_value.buf[ hdr_value.length ];
|
||||||
//hdr_value.buf[ hdr_value.length ] = '\0';
|
//hdr_value.buf[ hdr_value.length ] = '\0';
|
||||||
|
|
||||||
while( node != NULL ) {
|
while( node != NULL ) {
|
||||||
searchArg = node->item;
|
searchArg = node->item;
|
||||||
matched = 0;
|
matched = 0;
|
||||||
//check for match of ST header and search target
|
// check for match of ST header and search target
|
||||||
switch ( searchArg->requestType ) {
|
switch ( searchArg->requestType ) {
|
||||||
case SSDP_ALL:
|
case SSDP_ALL:
|
||||||
{
|
{
|
||||||
@@ -327,7 +327,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( matched ) {
|
if( matched ) {
|
||||||
//schedule call back
|
// schedule call back
|
||||||
threadData =
|
threadData =
|
||||||
( ResultData * ) malloc( sizeof( ResultData ) );
|
( ResultData * ) malloc( sizeof( ResultData ) );
|
||||||
if( threadData != NULL ) {
|
if( threadData != NULL ) {
|
||||||
@@ -366,7 +366,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
|
|||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#warning There are currently no uses of the function 'process_reply()' in the code.
|
#warning There are currently no uses of the function 'process_reply()' in the code.
|
||||||
#warning 'process_reply()' is a good candidate for removal.
|
#warning 'process_reply()' is a candidate for removal.
|
||||||
static UPNP_INLINE void
|
static UPNP_INLINE void
|
||||||
process_reply( IN char *request_buf,
|
process_reply( IN char *request_buf,
|
||||||
IN int buf_len,
|
IN int buf_len,
|
||||||
@@ -538,8 +538,7 @@ SearchByTarget( IN int Mx,
|
|||||||
if( ReqBuf == NULL )
|
if( ReqBuf == NULL )
|
||||||
return UPNP_E_OUTOF_MEMORY;
|
return UPNP_E_OUTOF_MEMORY;
|
||||||
|
|
||||||
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
|
UpnpPrintf(UPNP_INFO, SSDP, __FILE__, __LINE__, ">>> SSDP SEND >>>\n");
|
||||||
">>> SSDP SEND >>>\n%s\n", ReqBuf );
|
|
||||||
|
|
||||||
timeTillRead = Mx;
|
timeTillRead = Mx;
|
||||||
|
|
||||||
|
@@ -1,30 +1,30 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (c) 2000-2003 Intel Corporation
|
// Copyright (c) 2000-2003 Intel Corporation
|
||||||
// All rights reserved.
|
// All rights reserved.
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without
|
// Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are met:
|
// modification, are permitted provided that the following conditions are met:
|
||||||
//
|
//
|
||||||
// * Redistributions of source code must retain the above copyright notice,
|
// * Redistributions of source code must retain the above copyright notice,
|
||||||
// this list of conditions and the following disclaimer.
|
// this list of conditions and the following disclaimer.
|
||||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
// this list of conditions and the following disclaimer in the documentation
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
// and/or other materials provided with the distribution.
|
// and/or other materials provided with the distribution.
|
||||||
// * Neither name of Intel Corporation nor the names of its contributors
|
// * Neither name of Intel Corporation nor the names of its contributors
|
||||||
// may be used to endorse or promote products derived from this software
|
// may be used to endorse or promote products derived from this software
|
||||||
// without specific prior written permission.
|
// without specific prior written permission.
|
||||||
//
|
//
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
//
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
@@ -83,11 +83,11 @@ advertiseAndReplyThread( IN void *data )
|
|||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : ssdp_handle_device_request
|
* Function : ssdp_handle_device_request
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN http_message_t* hmsg: SSDP search request from the control point
|
* IN http_message_t* hmsg: SSDP search request from the control point
|
||||||
* IN struct sockaddr_in* dest_addr: The address info of 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
|
* 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 (
|
* the request and then schedules a thread to send a random time reply (
|
||||||
* random within maximum time given by the control point to 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
|
#endif
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : NewRequestHandler
|
* Function : NewRequestHandler
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN struct sockaddr_in * DestAddr: Ip address, to send the reply.
|
* IN struct sockaddr_in * DestAddr: Ip address, to send the reply.
|
||||||
* IN int NumPacket: Number of packet to be sent.
|
* IN int NumPacket: Number of packet to be sent.
|
||||||
* IN char **RqPacket:Number of packet to be sent.
|
* IN char **RqPacket:Number of packet to be sent.
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function works as a request handler which passes the HTTP
|
* This function works as a request handler which passes the HTTP
|
||||||
* request string to multicast channel then
|
* request string to multicast channel then
|
||||||
*
|
*
|
||||||
* Returns: void *
|
* 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
|
// "If a multicast resource would send a response(s) to any copy of the
|
||||||
// request, it SHOULD send its response(s) to each copy of the request
|
// request, it SHOULD send its response(s) to each copy of the request
|
||||||
// it receives. It MUST NOT repeat its response(s) per copy of the
|
// it receives. It MUST NOT repeat its response(s) per copy of the
|
||||||
// reuqest."
|
// request."
|
||||||
//
|
//
|
||||||
// http://www.upnp.org/download/draft-goland-http-udp-04.txt
|
// http://www.upnp.org/download/draft-goland-http-udp-04.txt
|
||||||
//
|
//
|
||||||
@@ -266,24 +266,24 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : CreateServiceRequestPacket
|
* Function : CreateServiceRequestPacket
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN int msg_type : type of the message ( Search Reply, Advertisement
|
* IN int msg_type : type of the message ( Search Reply, Advertisement
|
||||||
* or Shutdown )
|
* or Shutdown )
|
||||||
* IN char * nt : ssdp type
|
* IN char * nt : ssdp type
|
||||||
* IN char * usn : unique service name ( go in the HTTP Header)
|
* IN char * usn : unique service name ( go in the HTTP Header)
|
||||||
* IN char * location :Location URL.
|
* IN char * location :Location URL.
|
||||||
* IN int duration :Service duration in sec.
|
* IN int duration :Service duration in sec.
|
||||||
* OUT char** packet :Output buffer filled with HTTP statement.
|
* OUT char** packet :Output buffer filled with HTTP statement.
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function creates a HTTP request packet. Depending
|
* This function creates a HTTP request packet. Depending
|
||||||
* on the input parameter it either creates a service advertisement
|
* on the input parameter it either creates a service advertisement
|
||||||
* request or service shutdown request etc.
|
* request or service shutdown request etc.
|
||||||
*
|
*
|
||||||
* Returns: void
|
* Returns: void
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
void
|
void
|
||||||
CreateServicePacket( IN int msg_type,
|
CreateServicePacket( IN int msg_type,
|
||||||
@@ -358,9 +358,9 @@ CreateServicePacket( IN int msg_type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : DeviceAdvertisement
|
* Function : DeviceAdvertisement
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN char * DevType : type of the device
|
* IN char * DevType : type of the device
|
||||||
* IN int RootDev: flag to indicate if the device is root device
|
* IN int RootDev: flag to indicate if the device is root device
|
||||||
* IN char * nt : ssdp type
|
* IN char * nt : ssdp type
|
||||||
@@ -368,7 +368,7 @@ CreateServicePacket( IN int msg_type,
|
|||||||
* IN char * location :Location URL.
|
* IN char * location :Location URL.
|
||||||
* IN int duration :Service duration in sec.
|
* IN int duration :Service duration in sec.
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function creates the device advertisement request based on
|
* This function creates the device advertisement request based on
|
||||||
* the input parameter, and send it to the multicast channel.
|
* the input parameter, and send it to the multicast channel.
|
||||||
*
|
*
|
||||||
@@ -444,9 +444,9 @@ DeviceAdvertisement( IN char *DevType,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : SendReply
|
* Function : SendReply
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN struct sockaddr_in * DestAddr:destination IP address.
|
* IN struct sockaddr_in * DestAddr:destination IP address.
|
||||||
* IN char *DevType: Device type
|
* IN char *DevType: Device type
|
||||||
* IN int RootDev: 1 means root device 0 means embedded device.
|
* 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 Duration :Life time of this device.
|
||||||
* IN int ByType:
|
* IN int ByType:
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function creates the reply packet based on the input parameter,
|
* This function creates the reply packet based on the input parameter,
|
||||||
* and send it to the client addesss given in its input parameter DestAddr.
|
* and send it to the client addesss given in its input parameter DestAddr.
|
||||||
*
|
*
|
||||||
@@ -521,17 +521,16 @@ SendReply( IN struct sockaddr_in *DestAddr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : DeviceReply
|
* Function : DeviceReply
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN struct sockaddr_in * DestAddr:destination IP address.
|
* IN struct sockaddr_in * DestAddr:destination IP address.
|
||||||
* IN char *DevType: Device type
|
* IN char *DevType: Device type
|
||||||
* IN int RootDev: 1 means root device 0 means embedded device.
|
* IN int RootDev: 1 means root device 0 means embedded device.
|
||||||
* IN char * Udn: Device UDN
|
* IN char * Udn: Device UDN
|
||||||
* IN char * Location: Location of Device description document.
|
* IN char * Location: Location of Device description document.
|
||||||
* IN int Duration :Life time of this device.
|
* IN int Duration :Life time of this device.
|
||||||
|
* Description:
|
||||||
* Description:
|
|
||||||
* This function creates the reply packet based on the input parameter,
|
* This function creates the reply packet based on the input parameter,
|
||||||
* and send it to the client address given in its input parameter DestAddr.
|
* and send it to the client address given in its input parameter DestAddr.
|
||||||
*
|
*
|
||||||
@@ -600,18 +599,16 @@ DeviceReply( IN struct sockaddr_in *DestAddr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : ServiceAdvertisement
|
* Function : ServiceAdvertisement
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN char * Udn: Device UDN
|
* IN char * Udn: Device UDN
|
||||||
* IN char *ServType: Service Type.
|
* IN char *ServType: Service Type.
|
||||||
* IN char * Location: Location of Device description document.
|
* IN char * Location: Location of Device description document.
|
||||||
* IN int Duration :Life time of this device.
|
* IN int Duration :Life time of this device.
|
||||||
|
* Description:
|
||||||
* Description:
|
* This function creates the advertisement packet based
|
||||||
* This function creates the advertisement packet based
|
|
||||||
* on the input parameter, and send it to the multicast channel.
|
* on the input parameter, and send it to the multicast channel.
|
||||||
|
|
||||||
*
|
*
|
||||||
* Returns: int
|
* Returns: int
|
||||||
* UPNP_E_SUCCESS if successful else appropriate error
|
* UPNP_E_SUCCESS if successful else appropriate error
|
||||||
@@ -648,19 +645,17 @@ ServiceAdvertisement( IN char *Udn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : ServiceReply
|
* Function : ServiceReply
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN struct sockaddr_in *DestAddr:
|
* IN struct sockaddr_in *DestAddr:
|
||||||
* IN char * Udn: Device UDN
|
* IN char * Udn: Device UDN
|
||||||
* IN char *ServType: Service Type.
|
* IN char *ServType: Service Type.
|
||||||
* IN char * Location: Location of Device description document.
|
* IN char * Location: Location of Device description document.
|
||||||
* IN int Duration :Life time of this device.
|
* IN int Duration :Life time of this device.
|
||||||
|
* Description:
|
||||||
* Description:
|
|
||||||
* This function creates the advertisement packet based
|
* This function creates the advertisement packet based
|
||||||
* on the input parameter, and send it to the multicast channel.
|
* on the input parameter, and send it to the multicast channel.
|
||||||
|
|
||||||
*
|
*
|
||||||
* Returns: int
|
* Returns: int
|
||||||
* UPNP_E_SUCCESS if successful else appropriate error
|
* UPNP_E_SUCCESS if successful else appropriate error
|
||||||
@@ -693,15 +688,14 @@ ServiceReply( IN struct sockaddr_in *DestAddr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : ServiceShutdown
|
* Function : ServiceShutdown
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN char * Udn: Device UDN
|
* IN char * Udn: Device UDN
|
||||||
* IN char *ServType: Service Type.
|
* IN char *ServType: Service Type.
|
||||||
* IN char * Location: Location of Device description document.
|
* IN char * Location: Location of Device description document.
|
||||||
* IN int Duration :Service duration in sec.
|
* IN int Duration :Service duration in sec.
|
||||||
|
* Description:
|
||||||
* Description:
|
|
||||||
* This function creates a HTTP service shutdown request packet
|
* This function creates a HTTP service shutdown request packet
|
||||||
* and sent it to the multicast channel through RequestHandler.
|
* and sent it to the multicast channel through RequestHandler.
|
||||||
*
|
*
|
||||||
@@ -739,16 +733,16 @@ ServiceShutdown( IN char *Udn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : DeviceShutdown
|
* Function : DeviceShutdown
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN char *DevType: Device Type.
|
* IN char *DevType: Device Type.
|
||||||
* IN int RootDev:1 means root device.
|
* IN int RootDev:1 means root device.
|
||||||
* IN char * Udn: Device UDN
|
* IN char * Udn: Device UDN
|
||||||
* IN char * Location: Location URL
|
* IN char * Location: Location URL
|
||||||
* IN int Duration :Device duration in sec.
|
* IN int Duration :Device duration in sec.
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function creates a HTTP device shutdown request packet
|
* This function creates a HTTP device shutdown request packet
|
||||||
* and sent it to the multicast channel through RequestHandler.
|
* and sent it to the multicast channel through RequestHandler.
|
||||||
*
|
*
|
||||||
@@ -821,3 +815,4 @@ DeviceShutdown( IN char *DevType,
|
|||||||
|
|
||||||
#endif // EXCLUDE_SSDP
|
#endif // EXCLUDE_SSDP
|
||||||
#endif // INCLUDE_DEVICE_APIS
|
#endif // INCLUDE_DEVICE_APIS
|
||||||
|
|
||||||
|
@@ -72,11 +72,13 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
|
|||||||
#if EXCLUDE_SSDP == 0
|
#if EXCLUDE_SSDP == 0
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : AdvertiseAndReply
|
* Function : AdvertiseAndReply
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN int AdFlag: -1 = Send shutdown, 0 = send reply,
|
* IN int AdFlag:
|
||||||
* 1 = Send Advertisement
|
* -1 = Send shutdown,
|
||||||
|
* 0 = send reply,
|
||||||
|
* 1 = Send Advertisement
|
||||||
* IN UpnpDevice_Handle Hnd: Device handle
|
* IN UpnpDevice_Handle Hnd: Device handle
|
||||||
* IN enum SsdpSearchType SearchType:Search type for sending replies
|
* IN enum SsdpSearchType SearchType:Search type for sending replies
|
||||||
* IN struct sockaddr_in *DestAddr:Destination address
|
* IN struct sockaddr_in *DestAddr:Destination address
|
||||||
@@ -85,7 +87,7 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
|
|||||||
* IN char *ServiceType:Service type
|
* IN char *ServiceType:Service type
|
||||||
* IN int Exp:Advertisement age
|
* IN int Exp:Advertisement age
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function sends SSDP advertisements, replies and shutdown messages.
|
* This function sends SSDP advertisements, replies and shutdown messages.
|
||||||
*
|
*
|
||||||
* Returns: int
|
* Returns: int
|
||||||
@@ -120,16 +122,13 @@ int AdvertiseAndReply( IN int AdFlag,
|
|||||||
"Inside AdvertiseAndReply with AdFlag = %d\n",
|
"Inside AdvertiseAndReply with AdFlag = %d\n",
|
||||||
AdFlag );
|
AdFlag );
|
||||||
|
|
||||||
HandleLock();
|
// Use a read lock
|
||||||
|
HandleReadLock();
|
||||||
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
|
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return UPNP_E_INVALID_HANDLE;
|
return UPNP_E_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
defaultExp = SInfo->MaxAge;
|
defaultExp = SInfo->MaxAge;
|
||||||
|
|
||||||
//Modifed to prevent more than one thread from accessing the
|
|
||||||
//UpnpDocument stored with the handle at the same time
|
|
||||||
// HandleUnlock();
|
|
||||||
nodeList = NULL;
|
nodeList = NULL;
|
||||||
|
|
||||||
//get server info
|
//get server info
|
||||||
@@ -150,15 +149,13 @@ int AdvertiseAndReply( IN int AdFlag,
|
|||||||
}
|
}
|
||||||
|
|
||||||
dbgStr = ixmlNode_getNodeName( tmpNode );
|
dbgStr = ixmlNode_getNodeName( tmpNode );
|
||||||
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
||||||
"Extracting device type once for %s\n",
|
"Extracting device type once for %s\n", dbgStr );
|
||||||
dbgStr );
|
// extract device type
|
||||||
// extract device type
|
ixmlNodeList_free( nodeList );
|
||||||
ixmlNodeList_free( nodeList );
|
|
||||||
nodeList = NULL;
|
nodeList = NULL;
|
||||||
nodeList =
|
nodeList = ixmlElement_getElementsByTagName(
|
||||||
ixmlElement_getElementsByTagName( ( IXML_Element * ) tmpNode,
|
( IXML_Element * ) tmpNode, "deviceType" );
|
||||||
"deviceType" );
|
|
||||||
if( nodeList == NULL ) {
|
if( nodeList == NULL ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -166,7 +163,6 @@ int AdvertiseAndReply( IN int AdFlag,
|
|||||||
dbgStr = ixmlNode_getNodeName( tmpNode );
|
dbgStr = ixmlNode_getNodeName( tmpNode );
|
||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Extracting UDN for %s\n", dbgStr );
|
"Extracting UDN for %s\n", dbgStr );
|
||||||
|
|
||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Extracting device type\n" );
|
"Extracting device type\n" );
|
||||||
|
|
||||||
@@ -236,13 +232,12 @@ int AdvertiseAndReply( IN int AdFlag,
|
|||||||
|
|
||||||
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
||||||
"Sending UDNStr = %s \n", UDNstr );
|
"Sending UDNStr = %s \n", UDNstr );
|
||||||
if( AdFlag ) {
|
if( AdFlag ) {
|
||||||
// send the device advertisement
|
// send the device advertisement
|
||||||
if( AdFlag == 1 ) {
|
if( AdFlag == 1 ) {
|
||||||
DeviceAdvertisement( devType, i == 0,
|
DeviceAdvertisement( devType, i == 0,
|
||||||
UDNstr, SInfo->DescURL, Exp );
|
UDNstr, SInfo->DescURL, Exp );
|
||||||
} else // AdFlag == -1
|
} else { // AdFlag == -1
|
||||||
{
|
|
||||||
DeviceShutdown( devType, i == 0, UDNstr,
|
DeviceShutdown( devType, i == 0, UDNstr,
|
||||||
SERVER, SInfo->DescURL, Exp );
|
SERVER, SInfo->DescURL, Exp );
|
||||||
}
|
}
|
||||||
@@ -324,8 +319,9 @@ int AdvertiseAndReply( IN int AdFlag,
|
|||||||
}
|
}
|
||||||
for( j = 0;; j++ ) {
|
for( j = 0;; j++ ) {
|
||||||
tmpNode = ixmlNodeList_item( nodeList, j );
|
tmpNode = ixmlNodeList_item( nodeList, j );
|
||||||
if( tmpNode == NULL )
|
if( tmpNode == NULL ) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
ixmlNodeList_free( tmpNodeList );
|
ixmlNodeList_free( tmpNodeList );
|
||||||
tmpNodeList = NULL;
|
tmpNodeList = NULL;
|
||||||
@@ -334,7 +330,7 @@ int AdvertiseAndReply( IN int AdFlag,
|
|||||||
if( tmpNodeList == NULL ) {
|
if( tmpNodeList == NULL ) {
|
||||||
UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
|
||||||
"ServiceType not found \n" );
|
"ServiceType not found \n" );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
tmpNode2 = ixmlNodeList_item( tmpNodeList, 0 );
|
tmpNode2 = ixmlNodeList_item( tmpNodeList, 0 );
|
||||||
if( tmpNode2 == NULL ) {
|
if( tmpNode2 == NULL ) {
|
||||||
@@ -367,26 +363,21 @@ int AdvertiseAndReply( IN int AdFlag,
|
|||||||
} else {
|
} else {
|
||||||
switch ( SearchType ) {
|
switch ( SearchType ) {
|
||||||
case SSDP_ALL:
|
case SSDP_ALL:
|
||||||
{
|
ServiceReply( DestAddr, servType,
|
||||||
ServiceReply( DestAddr, servType,
|
UDNstr, SInfo->DescURL,
|
||||||
UDNstr, SInfo->DescURL,
|
defaultExp );
|
||||||
defaultExp );
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SSDP_SERVICE:
|
case SSDP_SERVICE:
|
||||||
{
|
if( ServiceType != NULL ) {
|
||||||
if( ServiceType != NULL ) {
|
if( !strncasecmp( ServiceType,
|
||||||
if( !strncasecmp( ServiceType,
|
servType,
|
||||||
servType,
|
strlen( ServiceType ) ) ) {
|
||||||
strlen( ServiceType ) ) )
|
ServiceReply( DestAddr, servType,
|
||||||
{
|
UDNstr, SInfo->DescURL,
|
||||||
ServiceReply( DestAddr, servType,
|
defaultExp );
|
||||||
UDNstr, SInfo->DescURL,
|
|
||||||
defaultExp );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
} // switch(SearchType)
|
} // switch(SearchType)
|
||||||
@@ -401,7 +392,7 @@ int AdvertiseAndReply( IN int AdFlag,
|
|||||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||||
"Exiting AdvertiseAndReply : \n" );
|
"Exiting AdvertiseAndReply : \n" );
|
||||||
|
|
||||||
HandleUnlock( );
|
HandleUnlock();
|
||||||
|
|
||||||
return UPNP_E_SUCCESS;
|
return UPNP_E_SUCCESS;
|
||||||
|
|
||||||
@@ -411,12 +402,12 @@ int AdvertiseAndReply( IN int AdFlag,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : Make_Socket_NoBlocking
|
* Function : Make_Socket_NoBlocking
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* IN int sock: socket
|
|
||||||
*
|
*
|
||||||
* Description:
|
* Parameters:
|
||||||
|
* IN int sock: socket
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
* This function makes socket non-blocking.
|
* This function makes socket non-blocking.
|
||||||
*
|
*
|
||||||
* Returns: int
|
* Returns: int
|
||||||
@@ -440,19 +431,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.
|
|
||||||
*
|
*
|
||||||
* Description:
|
* Parameters:
|
||||||
|
* IN char *cmd: Service Name string
|
||||||
|
* OUT SsdpEvent *Evt: The SSDP event structure partially filled
|
||||||
|
* by all the function.
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
* This function fills the fields of the event structure like DeviceType,
|
* This function fills the fields of the event structure like DeviceType,
|
||||||
* Device UDN and Service Type
|
* Device UDN and Service Type
|
||||||
*
|
*
|
||||||
* Returns: int
|
* Returns: int
|
||||||
* 0 if successful else -1
|
* 0 if successful else -1
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
int
|
int
|
||||||
unique_service_name( IN char *cmd,
|
unique_service_name( IN char *cmd,
|
||||||
@@ -535,13 +526,13 @@ unique_service_name( IN char *cmd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : ssdp_request_type1
|
* Function : ssdp_request_type1
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN char *cmd: command came in the ssdp request
|
* IN char *cmd: command came in the ssdp request
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function figures out the type of the SSDP search in the
|
* This function figures out the type of the SSDP search in the
|
||||||
* in the request.
|
* in the request.
|
||||||
*
|
*
|
||||||
* Returns: enum SsdpSearchType
|
* Returns: enum SsdpSearchType
|
||||||
@@ -571,16 +562,16 @@ ssdp_request_type1( IN char *cmd )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : ssdp_request_type
|
* Function : ssdp_request_type
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN char *cmd: command came in the ssdp request
|
* IN char *cmd: command came in the ssdp request
|
||||||
* OUT SsdpEvent *Evt: The event structure partially filled by
|
* OUT SsdpEvent *Evt: The event structure partially filled by
|
||||||
* this function.
|
* this function.
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function starts filling the SSDP event structure based upon the
|
* This function starts filling the SSDP event structure based upon the
|
||||||
* request received.
|
* request received.
|
||||||
*
|
*
|
||||||
* Returns: int
|
* Returns: int
|
||||||
* 0 on success; -1 on error
|
* 0 on success; -1 on error
|
||||||
@@ -602,17 +593,17 @@ ssdp_request_type( IN char *cmd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : free_ssdp_event_handler_data
|
* Function : free_ssdp_event_handler_data
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
||||||
* SSDP request message.
|
* SSDP request message.
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function frees the ssdp request
|
* This function frees the ssdp request
|
||||||
*
|
*
|
||||||
* Returns: VOID
|
* Returns: VOID
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
static void
|
static void
|
||||||
free_ssdp_event_handler_data( void *the_data )
|
free_ssdp_event_handler_data( void *the_data )
|
||||||
@@ -629,13 +620,13 @@ free_ssdp_event_handler_data( void *the_data )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : valid_ssdp_msg
|
* Function : valid_ssdp_msg
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
||||||
* SSDP request message.
|
* SSDP request message.
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function do some quick checking of the ssdp msg
|
* This function do some quick checking of the ssdp msg
|
||||||
*
|
*
|
||||||
* Returns: xboolean
|
* Returns: xboolean
|
||||||
@@ -670,14 +661,14 @@ valid_ssdp_msg( IN http_message_t * hmsg )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : start_event_handler
|
* Function : start_event_handler
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
||||||
* SSDP request message.
|
* SSDP request message.
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function parses the message and dispatches it to a handler
|
* This function parses the message and dispatches it to a handler
|
||||||
* which handles the ssdp request msg
|
* which handles the ssdp request msg
|
||||||
*
|
*
|
||||||
* Returns: int
|
* Returns: int
|
||||||
@@ -722,17 +713,17 @@ start_event_handler( void *Data )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : ssdp_event_handler_thread
|
* Function : ssdp_event_handler_thread
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
||||||
* SSDP request message.
|
* SSDP request message.
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function is a thread that handles SSDP requests.
|
* This function is a thread that handles SSDP requests.
|
||||||
*
|
*
|
||||||
* Returns: void
|
* Returns: void
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
static void
|
static void
|
||||||
ssdp_event_handler_thread( void *the_data )
|
ssdp_event_handler_thread( void *the_data )
|
||||||
@@ -757,16 +748,16 @@ ssdp_event_handler_thread( void *the_data )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : readFromSSDPSocket
|
* Function : readFromSSDPSocket
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* IN SOCKET socket: SSDP socket
|
* IN SOCKET socket: SSDP socket
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function reads the data from the ssdp socket.
|
* This function reads the data from the ssdp socket.
|
||||||
*
|
*
|
||||||
* Returns: void
|
* Returns: void
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
void
|
void
|
||||||
readFromSSDPSocket( SOCKET socket )
|
readFromSSDPSocket( SOCKET socket )
|
||||||
@@ -819,18 +810,20 @@ readFromSSDPSocket( SOCKET socket )
|
|||||||
( struct sockaddr * )&clientAddr, &socklen );
|
( struct sockaddr * )&clientAddr, &socklen );
|
||||||
|
|
||||||
if( byteReceived > 0 ) {
|
if( byteReceived > 0 ) {
|
||||||
|
|
||||||
requestBuf[byteReceived] = '\0';
|
requestBuf[byteReceived] = '\0';
|
||||||
UpnpPrintf( UPNP_INFO, SSDP,
|
UpnpPrintf( UPNP_INFO, SSDP,
|
||||||
__FILE__, __LINE__,
|
__FILE__, __LINE__,
|
||||||
"Received response !!! "
|
"Start of received response ----------------------------------------------------\n"
|
||||||
"%s From host %s \n",
|
"%s\n"
|
||||||
requestBuf,
|
"End of received response ------------------------------------------------------\n"
|
||||||
inet_ntoa( clientAddr.sin_addr ) );
|
"From host %s\n",
|
||||||
|
requestBuf,
|
||||||
|
inet_ntoa( clientAddr.sin_addr ) );
|
||||||
UpnpPrintf( UPNP_PACKET, SSDP, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_PACKET, SSDP, __FILE__, __LINE__,
|
||||||
"Received multicast packet:"
|
"Start of received multicast packet --------------------------------------------\n"
|
||||||
"\n %s\n", requestBuf );
|
"%s\n"
|
||||||
|
"End of received multicast packet ----------------------------------------------\n",
|
||||||
|
requestBuf );
|
||||||
//add thread pool job to handle request
|
//add thread pool job to handle request
|
||||||
if( data != NULL ) {
|
if( data != NULL ) {
|
||||||
data->parser.msg.msg.length += byteReceived;
|
data->parser.msg.msg.length += byteReceived;
|
||||||
@@ -853,12 +846,12 @@ readFromSSDPSocket( SOCKET socket )
|
|||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : get_ssdp_sockets
|
* Function : get_ssdp_sockets
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* OUT MiniServerSockArray *out: Arrays of SSDP sockets
|
* OUT MiniServerSockArray *out: Arrays of SSDP sockets
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function creates the ssdp sockets. It set their option to listen
|
* This function creates the ssdp sockets. It set their option to listen
|
||||||
* for multicast traffic.
|
* for multicast traffic.
|
||||||
*
|
*
|
||||||
* Returns: int
|
* Returns: int
|
||||||
@@ -869,8 +862,7 @@ get_ssdp_sockets( MiniServerSockArray * out )
|
|||||||
{
|
{
|
||||||
SOCKET ssdpSock;
|
SOCKET ssdpSock;
|
||||||
|
|
||||||
CLIENTONLY( SOCKET ssdpReqSock;
|
CLIENTONLY( SOCKET ssdpReqSock; )
|
||||||
)
|
|
||||||
int onOff = 1;
|
int onOff = 1;
|
||||||
u_char ttl = 4;
|
u_char ttl = 4;
|
||||||
struct ip_mreq ssdpMcastAddr;
|
struct ip_mreq ssdpMcastAddr;
|
||||||
@@ -878,32 +870,31 @@ get_ssdp_sockets( MiniServerSockArray * out )
|
|||||||
int option = 1;
|
int option = 1;
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
|
|
||||||
CLIENTONLY( if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) )
|
CLIENTONLY(
|
||||||
== UPNP_INVALID_SOCKET ) {
|
if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) {
|
||||||
UpnpPrintf( UPNP_CRITICAL,
|
UpnpPrintf( UPNP_CRITICAL,
|
||||||
SSDP, __FILE__, __LINE__,
|
SSDP, __FILE__, __LINE__,
|
||||||
"Error in socket operation !!!\n" );
|
"Error in socket operation !!!\n" );
|
||||||
return UPNP_E_OUTOF_SOCKET;}
|
|
||||||
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;
|
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
|
||||||
|
|
||||||
|
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;
|
onOff = 1;
|
||||||
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR,
|
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR,
|
||||||
( char * )&onOff, sizeof( onOff ) ) != 0 ) {
|
( char * )&onOff, sizeof( onOff ) ) != 0 ) {
|
||||||
|
|
||||||
UpnpPrintf( UPNP_CRITICAL,
|
UpnpPrintf( UPNP_CRITICAL,
|
||||||
SSDP, __FILE__, __LINE__,
|
SSDP, __FILE__, __LINE__,
|
||||||
"Error in set reuse addr !!!\n" );
|
"Error in set reuse addr !!!\n" );
|
||||||
@@ -916,8 +907,7 @@ get_ssdp_sockets( MiniServerSockArray * out )
|
|||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT,
|
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT,
|
||||||
( char * )&onOff, sizeof( onOff ) ) != 0 ) {
|
( char * )&onOff, sizeof( onOff ) ) != 0 ) {
|
||||||
|
|
||||||
UpnpPrintf( UPNP_CRITICAL,
|
UpnpPrintf( UPNP_CRITICAL,
|
||||||
SSDP, __FILE__, __LINE__,
|
SSDP, __FILE__, __LINE__,
|
||||||
"Error in set reuse port !!!\n" );
|
"Error in set reuse port !!!\n" );
|
||||||
@@ -934,9 +924,8 @@ get_ssdp_sockets( MiniServerSockArray * out )
|
|||||||
// ssdpAddr.sin_addr.s_addr = inet_addr(LOCAL_HOST);
|
// ssdpAddr.sin_addr.s_addr = inet_addr(LOCAL_HOST);
|
||||||
ssdpAddr.sin_addr.s_addr = htonl( INADDR_ANY );
|
ssdpAddr.sin_addr.s_addr = htonl( INADDR_ANY );
|
||||||
ssdpAddr.sin_port = htons( SSDP_PORT );
|
ssdpAddr.sin_port = htons( SSDP_PORT );
|
||||||
if( bind
|
if( bind( ssdpSock, ( struct sockaddr * )&ssdpAddr,
|
||||||
( ssdpSock, ( struct sockaddr * )&ssdpAddr,
|
sizeof( ssdpAddr ) ) != 0 ) {
|
||||||
sizeof( ssdpAddr ) ) != 0 ) {
|
|
||||||
UpnpPrintf( UPNP_CRITICAL,
|
UpnpPrintf( UPNP_CRITICAL,
|
||||||
SSDP, __FILE__, __LINE__,
|
SSDP, __FILE__, __LINE__,
|
||||||
"Error in binding !!!\n" );
|
"Error in binding !!!\n" );
|
||||||
@@ -951,8 +940,7 @@ get_ssdp_sockets( MiniServerSockArray * out )
|
|||||||
ssdpMcastAddr.imr_interface.s_addr = inet_addr( LOCAL_HOST );
|
ssdpMcastAddr.imr_interface.s_addr = inet_addr( LOCAL_HOST );
|
||||||
ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP );
|
ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP );
|
||||||
if( setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
if( setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
||||||
( char * )&ssdpMcastAddr,
|
( char * )&ssdpMcastAddr, sizeof( struct ip_mreq ) ) != 0 ) {
|
||||||
sizeof( struct ip_mreq ) ) != 0 ) {
|
|
||||||
UpnpPrintf( UPNP_CRITICAL,
|
UpnpPrintf( UPNP_CRITICAL,
|
||||||
SSDP, __FILE__, __LINE__,
|
SSDP, __FILE__, __LINE__,
|
||||||
"Error in joining" " multicast group !!!\n" );
|
"Error in joining" " multicast group !!!\n" );
|
||||||
@@ -966,8 +954,8 @@ get_ssdp_sockets( MiniServerSockArray * out )
|
|||||||
/* Set multicast interface. */
|
/* Set multicast interface. */
|
||||||
memset( ( void * )&addr, 0, sizeof( struct in_addr ));
|
memset( ( void * )&addr, 0, sizeof( struct in_addr ));
|
||||||
addr.s_addr = inet_addr(LOCAL_HOST);
|
addr.s_addr = inet_addr(LOCAL_HOST);
|
||||||
if (setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF,
|
if ( setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF,
|
||||||
(char *)&addr, sizeof addr) != 0) {
|
(char *)&addr, sizeof addr) != 0) {
|
||||||
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
|
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
|
||||||
"Couldn't set multicast interface.\n" );
|
"Couldn't set multicast interface.\n" );
|
||||||
/* This is probably not a critical error, so let's continue. */
|
/* This is probably not a critical error, so let's continue. */
|
||||||
@@ -977,7 +965,7 @@ get_ssdp_sockets( MiniServerSockArray * out )
|
|||||||
setsockopt( ssdpSock, IPPROTO_IP,
|
setsockopt( ssdpSock, IPPROTO_IP,
|
||||||
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
|
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
|
||||||
if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST,
|
if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST,
|
||||||
( char * )&option, sizeof( option ) ) != 0 ) {
|
(char *)&option, sizeof(option) ) != 0) {
|
||||||
UpnpPrintf( UPNP_CRITICAL,
|
UpnpPrintf( UPNP_CRITICAL,
|
||||||
SSDP, __FILE__, __LINE__,
|
SSDP, __FILE__, __LINE__,
|
||||||
"Error in setting broadcast !!!\n" );
|
"Error in setting broadcast !!!\n" );
|
||||||
@@ -988,10 +976,10 @@ get_ssdp_sockets( MiniServerSockArray * out )
|
|||||||
return UPNP_E_NETWORK_ERROR;
|
return UPNP_E_NETWORK_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
CLIENTONLY( out->ssdpReqSock = ssdpReqSock;
|
CLIENTONLY( out->ssdpReqSock = ssdpReqSock; );
|
||||||
);
|
|
||||||
out->ssdpSock = ssdpSock;
|
out->ssdpSock = ssdpSock;
|
||||||
return UPNP_E_SUCCESS;
|
return UPNP_E_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // EXCLUDE_SSDP
|
#endif // EXCLUDE_SSDP
|
||||||
|
|
||||||
|
@@ -32,6 +32,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
@@ -50,22 +50,11 @@
|
|||||||
#define S43 15
|
#define S43 15
|
||||||
#define S44 21
|
#define S44 21
|
||||||
|
|
||||||
static void MD5Transform PROTO_LIST( ( UINT4[4],
|
static void MD5Transform PROTO_LIST((UINT4[4], unsigned char[64]));
|
||||||
unsigned char[64] ) );
|
static void Encode PROTO_LIST((unsigned char *, UINT4 *, unsigned int));
|
||||||
static void Encode PROTO_LIST( ( unsigned char *,
|
static void Decode PROTO_LIST((UINT4 *, unsigned char *, unsigned int));
|
||||||
UINT4 *,
|
static void MD5_memcpy PROTO_LIST((POINTER, POINTER, unsigned int));
|
||||||
unsigned int ) );
|
static void MD5_memset PROTO_LIST((POINTER, int, unsigned int));
|
||||||
|
|
||||||
static void Decode PROTO_LIST( ( UINT4 *,
|
|
||||||
unsigned char *,
|
|
||||||
unsigned int ) );
|
|
||||||
|
|
||||||
static void MD5_memcpy PROTO_LIST( ( POINTER,
|
|
||||||
POINTER,
|
|
||||||
unsigned int ) );
|
|
||||||
static void MD5_memset PROTO_LIST( ( POINTER,
|
|
||||||
int,
|
|
||||||
unsigned int ) );
|
|
||||||
|
|
||||||
static unsigned char PADDING[64] = {
|
static unsigned char PADDING[64] = {
|
||||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
@@ -118,14 +107,10 @@ static unsigned char PADDING[64] = {
|
|||||||
MD5 initialization. Begins an MD5 operation, writing a new context.
|
MD5 initialization. Begins an MD5 operation, writing a new context.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
MD5Init( context )
|
MD5Init(MD5_CTX * context)
|
||||||
MD5_CTX *context; /* context */
|
|
||||||
{
|
{
|
||||||
context->count[0] = context->count[1] = 0;
|
context->count[0] = context->count[1] = 0;
|
||||||
|
/* Load magic initialization constants. */
|
||||||
/*
|
|
||||||
Load magic initialization constants.
|
|
||||||
*/
|
|
||||||
context->state[0] = 0x67452301;
|
context->state[0] = 0x67452301;
|
||||||
context->state[1] = 0xefcdab89;
|
context->state[1] = 0xefcdab89;
|
||||||
context->state[2] = 0x98badcfe;
|
context->state[2] = 0x98badcfe;
|
||||||
@@ -139,114 +124,72 @@ MD5Init( context )
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
MD5Update( context,
|
MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen)
|
||||||
input,
|
|
||||||
inputLen )
|
|
||||||
MD5_CTX *context; /* context */
|
|
||||||
unsigned char *input; /* input block */
|
|
||||||
unsigned int inputLen; /* length of input block */
|
|
||||||
{
|
{
|
||||||
unsigned int i,
|
unsigned int i;
|
||||||
index,
|
unsigned int index;
|
||||||
partLen;
|
unsigned int partLen;
|
||||||
|
|
||||||
/*
|
/* Compute number of bytes mod 64 */
|
||||||
Compute number of bytes mod 64
|
index = (unsigned int)((context->count[0] >> 3) & 0x3F);
|
||||||
*/
|
|
||||||
index = ( unsigned int )( ( context->count[0] >> 3 ) & 0x3F );
|
|
||||||
|
|
||||||
/*
|
/* Update number of bits */
|
||||||
Update number of bits
|
if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) {
|
||||||
*/
|
context->count[1]++;
|
||||||
if( ( context->count[0] +=
|
}
|
||||||
( ( UINT4 ) inputLen << 3 ) ) < ( ( UINT4 ) inputLen << 3 ) )
|
context->count[1] += ((UINT4)inputLen >> 29);
|
||||||
context->count[1]++;
|
partLen = 64 - index;
|
||||||
|
|
||||||
context->count[1] += ( ( UINT4 ) inputLen >> 29 );
|
/* Transform as many times as possible. */
|
||||||
|
if (inputLen >= partLen) {
|
||||||
partLen = 64 - index;
|
MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen);
|
||||||
|
MD5Transform(context->state, context->buffer);
|
||||||
/*
|
for (i = partLen; i + 63 < inputLen; i += 64) {
|
||||||
Transform as many times as possible.
|
MD5Transform(context->state, &input[i]);
|
||||||
*/
|
}
|
||||||
if( inputLen >= partLen ) {
|
index = 0;
|
||||||
|
} else {
|
||||||
MD5_memcpy
|
i = 0;
|
||||||
( ( 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
|
MD5 finalization. Ends an MD5 message-digest operation, writing the
|
||||||
the message digest and zeroizing the context.
|
the message digest and zeroizing the context.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
MD5Final( digest,
|
MD5Final(unsigned char digest[16], MD5_CTX *context)
|
||||||
context )
|
|
||||||
unsigned char digest[16]; /* message digest */
|
|
||||||
MD5_CTX *context; /* context */
|
|
||||||
{
|
{
|
||||||
|
|
||||||
unsigned char bits[8];
|
unsigned char bits[8];
|
||||||
unsigned int index,
|
unsigned int index;
|
||||||
padLen;
|
unsigned int padLen;
|
||||||
|
|
||||||
/*
|
/* Save number of bits */
|
||||||
Save number of bits
|
Encode(bits, context->count, 8);
|
||||||
*/
|
|
||||||
Encode( bits, context->count, 8 );
|
|
||||||
|
|
||||||
/*
|
/* Pad out to 56 mod 64. */
|
||||||
Pad out to 56 mod 64.
|
index = (unsigned int)((context->count[0] >> 3) & 0x3f);
|
||||||
*/
|
padLen = (index < 56) ? (56 - index) : (120 - index);
|
||||||
index = ( unsigned int )( ( context->count[0] >> 3 ) & 0x3f );
|
MD5Update(context, PADDING, padLen);
|
||||||
|
|
||||||
padLen = ( index < 56 ) ? ( 56 - index ) : ( 120 - index );
|
/* Append length (before padding) */
|
||||||
|
MD5Update(context, bits, 8);
|
||||||
|
|
||||||
MD5Update( context, PADDING, padLen );
|
/* Store state in digest */
|
||||||
|
Encode(digest, context->state, 16);
|
||||||
/*
|
|
||||||
Append length (before padding)
|
|
||||||
*/
|
|
||||||
MD5Update( context, bits, 8 );
|
|
||||||
|
|
||||||
/*
|
|
||||||
Store state in digest
|
|
||||||
*/
|
|
||||||
Encode( digest, context->state, 16 );
|
|
||||||
|
|
||||||
/*
|
|
||||||
Zeroize sensitive information.
|
|
||||||
*/
|
|
||||||
MD5_memset( ( POINTER ) context, 0, sizeof( *context ) );
|
|
||||||
|
|
||||||
|
/* Zeroize sensitive information. */
|
||||||
|
MD5_memset((POINTER)context, 0, sizeof(*context));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
MD5 basic transformation. Transforms state based on block.
|
MD5 basic transformation. Transforms state based on block.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
MD5Transform( state,
|
MD5Transform(UINT4 state[4], unsigned char block[64])
|
||||||
block )
|
|
||||||
UINT4 state[4];
|
|
||||||
unsigned char block[64];
|
|
||||||
{
|
{
|
||||||
UINT4 a = state[0],
|
UINT4 a = state[0],
|
||||||
b = state[1],
|
b = state[1],
|
||||||
@@ -353,23 +296,16 @@ MD5Transform( state,
|
|||||||
a multiple of 4.
|
a multiple of 4.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
Encode( output,
|
Encode(unsigned char *output, UINT4 *input, unsigned int len)
|
||||||
input,
|
|
||||||
len )
|
|
||||||
unsigned char *output;
|
|
||||||
UINT4 *input;
|
|
||||||
unsigned int len;
|
|
||||||
{
|
{
|
||||||
unsigned int i,
|
unsigned int i;
|
||||||
j;
|
unsigned int j;
|
||||||
|
for (i = 0, j = 0; j < len; ++i, j += 4) {
|
||||||
for( i = 0, j = 0; j < len; i++, j += 4 ) {
|
output[j+0] = (unsigned char)((input[i] >> 0) & 0xff);
|
||||||
output[j] = ( unsigned char )( input[i] & 0xff );
|
output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
|
||||||
output[j + 1] = ( unsigned char )( ( input[i] >> 8 ) & 0xff );
|
output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
|
||||||
output[j + 2] = ( unsigned char )( ( input[i] >> 16 ) & 0xff );
|
output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
|
||||||
output[j + 3] = ( unsigned char )( ( input[i] >> 24 ) & 0xff );
|
}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -378,55 +314,40 @@ Encode( output,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
Decode( output,
|
Decode(UINT4 *output, unsigned char *input, unsigned int len)
|
||||||
input,
|
|
||||||
len )
|
|
||||||
UINT4 *output;
|
|
||||||
unsigned char *input;
|
|
||||||
unsigned int len;
|
|
||||||
{
|
{
|
||||||
unsigned int i,
|
unsigned int i;
|
||||||
j;
|
unsigned int j;
|
||||||
|
for (i = 0, j = 0; j < len; ++i, j += 4) {
|
||||||
for( i = 0, j = 0; j < len; i++, j += 4 )
|
output[i] =
|
||||||
output[i] =
|
(((UINT4)input[j+0]) << 0) |
|
||||||
( ( UINT4 ) input[j] ) | ( ( ( UINT4 ) input[j + 1] ) << 8 ) |
|
(((UINT4)input[j+1]) << 8) |
|
||||||
( ( ( UINT4 ) input[j + 2] ) << 16 ) |
|
(((UINT4)input[j+2]) << 16) |
|
||||||
( ( ( UINT4 ) input[j + 3] ) << 24 );
|
(((UINT4)input[j+3]) << 24);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Note: Replace "for loop" with standard memcpy if possible.
|
Note: Replace for loop with standard memcpy if possible.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
MD5_memcpy( output,
|
MD5_memcpy(POINTER output, POINTER input, unsigned int len)
|
||||||
input,
|
|
||||||
len )
|
|
||||||
POINTER output;
|
|
||||||
POINTER input;
|
|
||||||
unsigned int len;
|
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
for (i = 0; i < len; ++i) {
|
||||||
for( i = 0; i < len; i++ )
|
output[i] = input[i];
|
||||||
output[i] = input[i];
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Note: Replace "for loop" with standard memset if possible.
|
Note: Replace for loop with standard memset if possible.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
MD5_memset( output,
|
MD5_memset(POINTER output, int value, unsigned int len)
|
||||||
value,
|
|
||||||
len )
|
|
||||||
POINTER output;
|
|
||||||
int value;
|
|
||||||
unsigned int len;
|
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
for (i = 0; i < len; ++i) {
|
||||||
for( i = 0; i < len; i++ )
|
((char *)output)[i] = (char)value;
|
||||||
( ( char * )output )[i] = ( char )value;
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -33,17 +33,16 @@
|
|||||||
This sample implementation generates a random node ID
|
This sample implementation generates a random node ID
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
get_ieee_node_identifier( uuid_node_t * node )
|
get_ieee_node_identifier(uuid_node_t *node)
|
||||||
{
|
{
|
||||||
char seed[16];
|
char seed[16];
|
||||||
static int inited = 0;
|
static int inited = 0;
|
||||||
static uuid_node_t saved_node;
|
static uuid_node_t saved_node;
|
||||||
|
|
||||||
if( !inited ) {
|
if (!inited) {
|
||||||
get_random_info( seed );
|
get_random_info(seed);
|
||||||
seed[0] |= 0x80;
|
seed[0] |= 0x80;
|
||||||
memcpy( &saved_node, seed, sizeof( uuid_node_t ) );
|
memcpy(&saved_node, seed, sizeof (uuid_node_t));
|
||||||
|
|
||||||
inited = 1;
|
inited = 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -83,52 +82,48 @@ get_system_time( uuid_time_t * uuid_time )
|
|||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
get_random_info( char seed[16] )
|
get_random_info(char seed[16])
|
||||||
{
|
{
|
||||||
MD5_CTX c;
|
MD5_CTX c;
|
||||||
typedef struct {
|
typedef struct {
|
||||||
MEMORYSTATUS m;
|
MEMORYSTATUS m;
|
||||||
SYSTEM_INFO s;
|
SYSTEM_INFO s;
|
||||||
FILETIME t;
|
FILETIME t;
|
||||||
LARGE_INTEGER pc;
|
LARGE_INTEGER pc;
|
||||||
DWORD tc;
|
DWORD tc;
|
||||||
DWORD l;
|
DWORD l;
|
||||||
char hostname[MAX_COMPUTERNAME_LENGTH + 1];
|
char hostname[MAX_COMPUTERNAME_LENGTH + 1];
|
||||||
} randomness;
|
} randomness;
|
||||||
randomness r;
|
randomness r;
|
||||||
|
|
||||||
MD5Init( &c );
|
/* Initialize memory area so that valgrind does not complain */
|
||||||
/*
|
memset(&r, 0, sizeof r);
|
||||||
memory usage stats
|
|
||||||
*/
|
|
||||||
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 );
|
/* memory usage stats */
|
||||||
MD5Update( &c, &r, sizeof( randomness ) );
|
GlobalMemoryStatus( &r.m );
|
||||||
MD5Final( seed, &c );
|
/* 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);
|
||||||
};
|
};
|
||||||
#else
|
|
||||||
|
#else /* _WINDOWS_ */
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
get_system_time( uuid_time_t * uuid_time )
|
get_system_time(uuid_time_t *uuid_time)
|
||||||
{
|
{
|
||||||
struct timeval tp;
|
struct timeval tp;
|
||||||
|
|
||||||
@@ -145,22 +140,28 @@ get_system_time( uuid_time_t * uuid_time )
|
|||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
get_random_info( char seed[16] )
|
get_random_info(char seed[16])
|
||||||
{
|
{
|
||||||
MD5_CTX c;
|
MD5_CTX c;
|
||||||
typedef struct {
|
typedef struct {
|
||||||
// struct sysinfo s;
|
//struct sysinfo s;
|
||||||
struct timeval t;
|
struct timeval t;
|
||||||
char hostname[257];
|
char hostname[257];
|
||||||
} randomness;
|
} randomness;
|
||||||
randomness r;
|
randomness r;
|
||||||
|
|
||||||
MD5Init( &c );
|
/* Initialize memory area so that valgrind does not complain */
|
||||||
|
memset(&r, 0, sizeof r);
|
||||||
|
|
||||||
gettimeofday( &r.t, ( struct timezone * )0 );
|
/* Get some random stuff */
|
||||||
gethostname( r.hostname, 256 );
|
gettimeofday(&r.t, (struct timezone *)0);
|
||||||
MD5Update( &c, &r, sizeof( randomness ) );
|
gethostname(r.hostname, 256 );
|
||||||
MD5Final( seed, &c );
|
|
||||||
|
/* MD5 it */
|
||||||
|
MD5Init(&c);
|
||||||
|
MD5Update(&c, &r, sizeof r);
|
||||||
|
MD5Final(seed, &c);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif /* _WINDOWS_ */
|
||||||
|
|
||||||
|
@@ -53,10 +53,10 @@ static unsigned16 true_random( void );
|
|||||||
uuid_create -- generator a UUID
|
uuid_create -- generator a UUID
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
uuid_create( uuid_upnp * uid )
|
uuid_create(uuid_upnp *uid)
|
||||||
{
|
{
|
||||||
uuid_time_t timestamp,
|
uuid_time_t timestamp;
|
||||||
last_time;
|
uuid_time_t last_time;
|
||||||
unsigned16 clockseq;
|
unsigned16 clockseq;
|
||||||
uuid_node_t node;
|
uuid_node_t node;
|
||||||
uuid_node_t last_node;
|
uuid_node_t last_node;
|
||||||
@@ -65,61 +65,64 @@ uuid_create( uuid_upnp * uid )
|
|||||||
/*
|
/*
|
||||||
acquire system wide lock so we're alone
|
acquire system wide lock so we're alone
|
||||||
*/
|
*/
|
||||||
UUIDLock( );
|
UUIDLock();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
get current time
|
get current time
|
||||||
*/
|
*/
|
||||||
get_current_time( ×tamp );
|
get_current_time(×tamp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
get node ID
|
get node ID
|
||||||
*/
|
*/
|
||||||
get_ieee_node_identifier( &node );
|
get_ieee_node_identifier(&node);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
get saved state from NV storage
|
get saved state from NV storage
|
||||||
*/
|
*/
|
||||||
f = read_state( &clockseq, &last_time, &last_node );
|
f = read_state(&clockseq, &last_time, &last_node);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if no NV state, or if clock went backwards, or node ID changed
|
if no NV state, or if clock went backwards, or node ID changed
|
||||||
(e.g., net card swap) change clockseq
|
(e.g., net card swap) change clockseq
|
||||||
*/
|
*/
|
||||||
if( !f || memcmp( &node, &last_node, sizeof( uuid_node_t ) ) )
|
if (!f || memcmp(&node, &last_node, sizeof(uuid_node_t))) {
|
||||||
clockseq = true_random( );
|
clockseq = true_random();
|
||||||
else if( timestamp < last_time )
|
} else if (timestamp < last_time) {
|
||||||
clockseq++;
|
clockseq++;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
stuff fields into the UUID
|
stuff fields into the UUID
|
||||||
*/
|
*/
|
||||||
format_uuid_v1( uid, clockseq, timestamp, node );
|
format_uuid_v1(uid, clockseq, timestamp, node);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
save the state for next time
|
save the state for next time
|
||||||
*/
|
*/
|
||||||
write_state( clockseq, timestamp, node );
|
write_state(clockseq, timestamp, node);
|
||||||
|
|
||||||
UUIDUnlock( );
|
UUIDUnlock();
|
||||||
return ( 1 );
|
return 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
uuid_unpack( uuid_upnp * u,
|
uuid_unpack(uuid_upnp *u, char *out)
|
||||||
char *out )
|
|
||||||
{
|
{
|
||||||
|
sprintf(out,
|
||||||
sprintf( out,
|
"%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x",
|
||||||
"%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x",
|
(unsigned int)u->time_low,
|
||||||
( unsigned int )u->time_low, u->time_mid,
|
u->time_mid,
|
||||||
u->time_hi_and_version, u->clock_seq_hi_and_reserved,
|
u->time_hi_and_version,
|
||||||
u->clock_seq_low, u->node[0], u->node[1], u->node[2],
|
u->clock_seq_hi_and_reserved,
|
||||||
u->node[3], u->node[4], u->node[5] );
|
u->clock_seq_low,
|
||||||
|
u->node[0],
|
||||||
*( out + 36 ) = '\0';
|
u->node[1],
|
||||||
|
u->node[2],
|
||||||
|
u->node[3],
|
||||||
|
u->node[4],
|
||||||
|
u->node[5]);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
@@ -137,11 +140,10 @@ format_uuid_v1( uuid_upnp * uid,
|
|||||||
Construct a version 1 uuid with the information we've gathered
|
Construct a version 1 uuid with the information we've gathered
|
||||||
* plus a few constants.
|
* plus a few constants.
|
||||||
*/
|
*/
|
||||||
uid->time_low = ( unsigned long )( timestamp & 0xFFFFFFFF );
|
uid->time_low = (unsigned long)(timestamp & 0xFFFFFFFF);
|
||||||
uid->time_mid = ( unsigned short )( ( timestamp >> 32 ) & 0xFFFF );
|
uid->time_mid = (unsigned short)((timestamp >> 32) & 0xFFFF);
|
||||||
uid->time_hi_and_version = ( unsigned short )( ( timestamp >> 48 ) &
|
uid->time_hi_and_version = (unsigned short)((timestamp >> 48) & 0x0FFF);
|
||||||
0x0FFF );
|
uid->time_hi_and_version |= (1 << 12);
|
||||||
uid->time_hi_and_version |= ( 1 << 12 );
|
|
||||||
uid->clock_seq_low = clock_seq & 0xFF;
|
uid->clock_seq_low = clock_seq & 0xFF;
|
||||||
uid->clock_seq_hi_and_reserved = ( clock_seq & 0x3F00 ) >> 8;
|
uid->clock_seq_hi_and_reserved = ( clock_seq & 0x3F00 ) >> 8;
|
||||||
uid->clock_seq_hi_and_reserved |= 0x80;
|
uid->clock_seq_hi_and_reserved |= 0x80;
|
||||||
@@ -227,7 +229,6 @@ get_current_time( uuid_time_t * timestamp )
|
|||||||
static int inited = 0;
|
static int inited = 0;
|
||||||
|
|
||||||
if( !inited ) {
|
if( !inited ) {
|
||||||
get_system_time( &time_now );
|
|
||||||
uuids_this_tick = UUIDS_PER_TICK;
|
uuids_this_tick = UUIDS_PER_TICK;
|
||||||
inited = 1;
|
inited = 1;
|
||||||
};
|
};
|
||||||
|
@@ -105,7 +105,7 @@ main (int argc, char* argv[])
|
|||||||
* Test library initialisation
|
* Test library initialisation
|
||||||
*/
|
*/
|
||||||
printf ("\n");
|
printf ("\n");
|
||||||
printf ("Intializing UPnP ... \n");
|
printf ("Initializing UPnP ... \n");
|
||||||
rc = UpnpInit (NULL, 0);
|
rc = UpnpInit (NULL, 0);
|
||||||
if ( UPNP_E_SUCCESS == rc ) {
|
if ( UPNP_E_SUCCESS == rc ) {
|
||||||
const char* ip_address = UpnpGetServerIpAddress();
|
const char* ip_address = UpnpGetServerIpAddress();
|
||||||
|
Reference in New Issue
Block a user