Compare commits

...

21 Commits

Author SHA1 Message Date
Marcelo Roberto Jimenez
7275c1ab6f Creating tag release-1.4.5.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/tags/release-1.4.5@169 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-28 19:38:27 +00:00
Marcelo Roberto Jimenez
a7ab0acfe8 Merge of trunk into branch-1.4.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@168 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-28 19:36:19 +00:00
Marcelo Roberto Jimenez
85a8da77f2 Merge of trunk into branch-1.4.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@156 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-17 04:06:11 +00:00
Marcelo Roberto Jimenez
25620c1967 Merge of trunk.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@148 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-03-06 10:48:50 +00:00
Marcelo Roberto Jimenez
8bc61b1a5c Merging trunk to release-1.4.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@145 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-03-06 10:22:07 +00:00
Marcelo Roberto Jimenez
aec58e6c9e Merge of trunk.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@133 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-13 13:53:24 +00:00
Marcelo Roberto Jimenez
4bcb9dd5e1 Merge of trunk into branch-1.4.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@130 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-13 01:40:10 +00:00
Marcelo Roberto Jimenez
8cfa0e488c Merge of trunk into branch-1.4.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@127 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-03 19:30:31 +00:00
Marcelo Roberto Jimenez
9e775e662e Changelog update and webpage update.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@111 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 23:32:05 +00:00
Marcelo Roberto Jimenez
03400550cd Merge of rev. 109.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@110 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 22:44:01 +00:00
Marcelo Roberto Jimenez
62a5d7c5ef Changelog update.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@108 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 21:37:20 +00:00
Marcelo Roberto Jimenez
df80fbae36 Merge of rev.105.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@106 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 21:31:17 +00:00
Marcelo Roberto Jimenez
9c6ea48583 Merge of rev.103.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@104 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 21:06:48 +00:00
Marcelo Roberto Jimenez
8da593fae3 Changelog update.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@102 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 20:38:00 +00:00
Marcelo Roberto Jimenez
b4816a33a9 Merge of rev.99.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@100 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 20:07:06 +00:00
Marcelo Roberto Jimenez
1b029e80af Merge of rev.97.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@98 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 19:57:16 +00:00
Oxy
907b103439 workaround for Linux-applications that do not catch SIGPIPE backported
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@76 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-07 05:49:19 +00:00
Oxy
ecd755d3f8 workaround added for applications that don't catch SIGEPIPE
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@75 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-04 05:46:06 +00:00
Marcelo Roberto Jimenez
b8cac59dd9 Merge of r61, r62, r63, r64.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@65 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-20 11:51:17 +00:00
Marcelo Roberto Jimenez
591e0d3e25 Merge of r58.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@59 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-20 02:48:14 +00:00
Oxy
bd3bf7ad0a email addresses modified to hide them from spambots (in SVNWeb)
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.4.x@57 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-18 06:39:45 +00:00
54 changed files with 1680 additions and 900 deletions

299
ChangeLog
View File

@@ -1,69 +1,282 @@
2006-07-07 Oxy <virtual_worlds@gmx.de>
*************************************************************************
Version 1.4.5
*************************************************************************
2007-04-19 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Case insensitive comparison in raw_find_str() (httpparser.c) as
suggested by Craig Nelson in SF Tracker [ 1689382 ] DLINK DIR-625
patch.
2007-04-07 Nektarios K. Papadopoulos <npapadop(at)inaccessnetworks.com>
* Fix for a bug in makeAction where va_arg was beeing called one
extra time.
2007-04-28 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Tracker [ 1703533 ] Patch to make it compile under FreeBSD
Submitted By: Timothy Redaelli - drittz
I made some patches to make it compile under FreeBSD using
gethostbyaddr_r when supported.
2007-04-28 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* [pupnp-devel] Type mixup on x86_64 causes UPNP_E_OUTOF_MEMORY
Submitted By: Glen Masgai
after an UpnpSendActionAsync() for example, i get UPNP_E_OUTOF_MEMORY
in the callback using 1.4.4 on a x86_64 system. This happens in
http_MakeMessage(), which in some cases get called with wrong types
(int instead of size_t) in combination with format "b" and "Q".
The attached patch should fix this.
*************************************************************************
Version 1.4.4
*************************************************************************
2007-04-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Tracker [ 1695399 ] Typo in util.h
Submitted By: Luke Kim - nereusuj
Unix sleep is in seconds but WIN32 Sleep is in milliseconds.
2007-04-17 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Tracker [ 1652827 ] UpnpRegisterRootDevice returned -104
Submitted By: Michael Andersen - miwer
Issue was found to be related to sizeof (size_t) != sizeof (int)
on AMD64 systems. Emil Ljungdahl's AMD64 patch has been applied along
with some other fixes. Original user report follows:
When I run upnpd I get the above mentioned error (UPNP_E_OUTOF_MEMORY).
I've tried with 1.4.1 and 1.4.2-RC3, it's the same. I don't understand why,
because I have plenty of RAM, and I even tried closing some applications,
but it didn't help.
$ upnpd eth1 br0
The following is logged in the /var/log/messages:
Feb 6 01:33:47 server upnpd[6933]: Error registering the root device with
descDocUrl: http://192.168.0.1:49152/gatedesc.xml
Feb 6 01:33:47 server upnpd[6933]: UpnpRegisterRootDevice returned -104
I tried enabling debugging and it looks like it cannot allocate memory
through the membuffer_append function. It's wierd because it's only a few
bytes.
Please note, that I enabled some extra debugging lines that were commented,
in order to get more information. See attached files.
*************************************************************************
Version 1.4.3
*************************************************************************
2007-03-13 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Tracker [ 1663004 ] Compile on Cygwin
Submitted By: Jon Foster - jongfoster
This patch gives basic support for building under Cygwin - it compiles,
links, and a simple UPnP device application can initialise. I'm not sure
if it actually works yet, but this is definitely a step in the right
direction.
Patch is against the 1.4.1 release. Changes are:
* threadutil/inc/ithread.h: Fix the ithread mutex support to use
documented, portable APIs (if present) rather than the Non-Portable (_NP)
ones it uses now. This is required because Cygwin implements only the
portable API.
* threadutil/src/ThreadPool.c: Fake SetPolicyType() to do nothing on Cygwin
because otherwise it fails. Should probably investigate why it fails and
add a proper implementation later.
* upnp/src/api/upnpapi.c: On Cygwin, zero out the GlobalHndMutex structure
before initialising it. Without this, the initialisation fails. This
appears to be a bug in Cygwin.
* upnp/src/genlib/net/uri/uri.c: Use gethostbyname() on Cygwin.
2007-03-05 Oxy <oxygenic(at)users.sourceforge.net>
* Code adapted and typedefs added to compile cleanly under Windows
with Borland C++ Builder and MS Visual C++
2007-03-03 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Fixed nasty segmentation fault bug on membuffer.c.
*************************************************************************
Version 1.4.2
*************************************************************************
2007-02-09 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* 32/64 bits portability issues on *printf.
Use %zd for size_t, and cast to (long long) for off_t.
2007-02-02 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Bumped the program version to 1.4.2 in config.ac.
* Now requires autoconf 2.60.
* Fixed docdir use.
* Does not install the documentation by default.
* Use dist-bzip2 to create a .bz2 distribution file.
2007-01-23 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Tracker [ 1634922 ] Support for large files (>= 2 GiB), part 2
Submitted By: Jonathan - no_dice
Summary: This patch hopefully fixes the remaining types and related
code to enable files >= 2 GiB to be streamed. Jonathan claims to have
tested this with a patched version of ushare-0.9.8 and a D-Link DSM-520.
2007-01-09 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Tracker [ 1628629 ] Multicast interface patch
Submitted By: Fredrik Svensson - svefredrik
This patch fixes two problems:
1) Specify the IP address for the interface when we do
setsockopt IP_ADD_MEMBERSHIP. This makes it possible to run
when no default router has been configured.
2) Explicitly set the multicast interface through setsockopt
IP_MULTICAST_IF. Avoids socket error -207 in some cases.
* SF Tracker [ 1628590 ] XML parsing segfault patch
Submitted By: Fredrik Svensson - svefredrik
This patch fixes a segmentation fault problem that occurrs
when parsing XML code than some routers produce.
2007-01-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Tracker [ 1628552 ] XML white space patch
Submitted By: Fredrik Svensson - svefredrik
* SF Tracker [ 1628562 ] Maximum total jobs patch
Submitted By: Fredrik Svensson - svefredrik
Also, I incremented the libray versions and included some
comments in the file configure.ac so that we do not bump
the library version excessively, only the necessary numbers
on the next release.
* SF Tracker [ 1628575 ] Linksys WRT54G patch
Submitted By: Fredrik Svensson - svefredrik
* SF Tracker [ 1628636 ] SSDP packet copy patch
Submitted By: Fredrik Svensson - svefredrik
Changed NUM_COPY to 1 since, according to section 9.2 of the
HTTPU/MU spec, we should never send more than one copy of a
reply to an SSDP request. Ref. section 9.2 of
http://www.upnp.org/download/draft-goland-http-udp-04.txt
2006-12-23 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Thorough revision of every call of http_MakeMessage() due to a
bug introduced in rev.79 "largefile patch added".
http_MakeMessage() has a worst than brain damaged "printf" like
interface. In rev.79, the "N" format parameter must be an off_t.
Every call of this function with an "N" format parameter and an
int passed on the stack would fail terribly.
* SF Bug tracker [ 1590469 ]
Typo in ixmlparser.c
Submitted By: Erik Johansson - erijo
* SF Bug Tracker [ 1590466 ] Invalid xml output
Submitted By: Erik Johansson - erijo
* SF Patch tracker [ 1581161 ] VStudio2005 patch
Submitted By: David Maass - darkservant
* SF Patch tracker [ 1587272 ] const-ified ixml
Submitted By: Erik Johansson
* Finished const-ifications as suggested by Erik Johansson in
SF Patch tracker [ 1587272 ].
2006-07-05 Nektarios K. Papadopoulos <npapadop(at)inaccessnetworks.com>
* [bug-id] 1580440
[submitted-by] Erik Johansson - erijo
[patched-by] Erik Johansson - erijo
The SOAP HTTP message that's generated on upnp errors
is missing a \r\n\ between header and body.
2006-07-07 Oxy <virtual_worlds(at)gmx.de>
* support for large files (>2 GBytes) added
*************************************************************************
Version 1.4.1
*************************************************************************
2006-07-07 Oxy <virtual_worlds(at)gmx.de>
* full support for Windows added, static library and DLL are fully
working, code compiles with Borland Builder C++ and MS Visual
C/C++
working, code compiles with Borland Builder C++ and MS Visual
C/C++
2006-07-05 Nektarios K. Papadopoulos <npapadop@inaccessnetworks.com>
2006-07-05 Nektarios K. Papadopoulos <npapadop(at)inaccessnetworks.com>
* Include prebuilt documentation (html,pdf), dropping doc++
dependancy.
2006-07-03 Marcelo Jimenez <mroberto@users.sourceforge.net>
2006-07-03 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Patch for FreeBSD, thanks to Markus Strobl.
2006-06-26 Marcelo Jimenez <mroberto@users.sourceforge.net>
2006-06-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Fix for missing "else" in httpreadwrite.c. Thanks to npapadop
for the patch.
2006-06-26 Marcelo Jimenez <mroberto@users.sourceforge.net>
2006-06-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Fix for va_list initialization in x86_64 architectures.
2006-06-08 Oxy <virtual_worlds@gmx.de>
2006-06-08 Oxy <virtual_worlds(at)gmx.de>
* Patch to fix memory leaks and reasons for crashes added (thanks
to loigu)
*************************************************************************
Release of version 1.4.0
Version 1.4.0
*************************************************************************
2006-05-26 Oxy <virtual_worlds@gmx.de>
2006-05-26 Oxy <virtual_worlds(at)gmx.de>
* defines in iasnprintf.h changed to work with GCC-version < 3
2006-05-22 Oxy <virtual_worlds@gmx.de>
2006-05-22 Oxy <virtual_worlds(at)gmx.de>
* BSD-patch added (not tested yet on an BSD system)
2006-05-19 Oxy <virtual_worlds@gmx.de>
2006-05-19 Oxy <virtual_worlds(at)gmx.de>
* Patch added for bug: ixml parser colapsed on empty args (arg="")
2006-05-18 Oxy <virtual_worlds@gmx.de>
2006-05-18 Oxy <virtual_worlds(at)gmx.de>
* DSM-320 patch added (fetched from project MediaTomb)
* httpGet additons atch added, Added proxy support by introducing
UpnpOpenHttpGetProxy. UpnpOpenHttpGet now just calls
UpnpOpenHttpGetProxy with the proxy url set to NULL.
* Bugfix for typo ("\0" / "0") in ixmlparser.c
* Bugfix for M-Search packet
*************************************************************************
FORK FROM DEAD libupnp
*************************************************************************
2006-04-29 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-04-29 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* THANKS: new file with list of contributors
* upnp/src/gena/gena_device.c (respond_ok): add 'Content-Length: 0'
in subscription response. Patch by Chaos (Bug # 1455367).
2006-04-08 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-04-08 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/doc/UPnP_Programming_Guide.pdf: replace this document with
the one in libupnp-doc-1.2.1 because current CVS version
@@ -74,20 +287,20 @@ FORK FROM DEAD libupnp
* changes applied to several files to work under Sparc Solaris, temporarily
requiring a define SPARC_SOLARIS
2006-04-03 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-04-03 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/Makefile.am: install upnp samples in $(docdir)/examples
2006-03-28 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-03-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* configure.ac: add --with-docdir option to choose where documentation
is installed (or -without-docdir to not install the documentation)
2006-03-27 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-03-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/test: add simple test suite for xml parser
2006-03-26 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-03-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/src/ixmlparser.c (Parser_processCDSect): fix bug which prevents
CDATA sections which contain a 0 (zero) to be parsed (instead the
@@ -98,18 +311,18 @@ FORK FROM DEAD libupnp
option, and move samples compilation from check_PROGRAMS to
noinst_PROGRAMS
2006-03-25 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-03-25 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/genlib/miniserver/miniserver.c (get_miniserver_sockets):
fix bug if new socket created has fd 0 (can only occur when stdin
has been closed). Patch by Oskar Liljeblad 2004-07-02 :
http://sourceforge.net/mailarchive/message.php?msg_id=8870528
2006-03-21 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-03-21 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/test/test_init.c: add some version checks and exit if failure
2006-03-05 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-03-05 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* libupnp version 1.3.1
@@ -124,11 +337,11 @@ FORK FROM DEAD libupnp
dependencies between upnp and ixml / threadutil, so that programs
linking against upnp only still work.
2006-03-04 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-03-04 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* libupnp version 1.3.0
2006-03-03 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-03-03 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/genlib/net/http/httpreadwrite.c (get_sdk_info): use
package version string from configure to set sdk info
@@ -136,7 +349,7 @@ FORK FROM DEAD libupnp
* upnp/Makefile.am: add sample/tvdevice/web/ files in EXTRA_DIST
+ do not distribute generated upnpconfig.h file.
2006-02-28 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-02-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/inc/config.h, configure.ac: use only new defines
UPNP_HAVE_xx instead of INCLUDE_yyy_APIS and INTERNAL_WEB_SERVER
@@ -145,7 +358,7 @@ FORK FROM DEAD libupnp
the librarie LDFLAGS in order to export only the symbols defined
in the API
2006-02-27 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-02-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* configure.ac: add libtool versions for the 3 libraries
@@ -153,7 +366,7 @@ FORK FROM DEAD libupnp
* threadutil/src/ThreadPool.c (SetSeed): add missing 'static'
2006-02-26 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-02-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* threadutil/inc/iasnprintf.h: add gcc __printf__ format attribute
to "iasnprintf"
@@ -174,11 +387,11 @@ FORK FROM DEAD libupnp
the configuration of the installed libraries (generates installed
file <upnp/upnpconfig.h>)
2006-02-22 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-02-22 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/ : add missing include of config.h in some .c files
2006-02-21 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-02-21 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/inc/upnp.h: move some definitions which should not be
exported into "upnp/src/inc/util.h"
@@ -186,12 +399,12 @@ FORK FROM DEAD libupnp
* import all modifications below from libupnp in djmount 0.51
into official libupnp
2006-01-17 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-01-17 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* threadutil/Makefile.am (libthreadutil_la_SOURCES): remove extraneous
file
2006-01-15 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-01-15 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* configure.ac: add checks for large-file support
@@ -211,53 +424,53 @@ FORK FROM DEAD libupnp
* ixml/src/node.c (ixmlNode_getNodeType): fix compilation warning
on const return type
2006-01-12 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-01-12 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/inc/readwrite.h : suppress unused C++ header file
2006-01-11 R<>mi Turboult <r3mi@users.sourceforge.net>
2006-01-11 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/inc/config.h, upnp/src/inc/upnpapi.h,
upnp/src/inc/httpreadwrite.h: remove internal configuration variable
MINIMUM_DELAY (no clear purpose)
2005-12-05 R<>mi Turboult <r3mi@users.sourceforge.net>
2005-12-05 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/inc/upnp.h: re-declare obsolete method UpnpSetContentLength,
for binary compatibility with previous libupnp version.
* upnp/src/api/upnpapi.c: correct type of g_maxContentLength to size_t
2005-11-01 R<>mi Turboult <r3mi@users.sourceforge.net>
2005-11-01 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* autoconfiscate library : replace all makefiles by Makefile.am
for automake support, + preliminary autoconf support
(generated config.h not yet used in source files)
2005-10-18 R<>mi Turboult <r3mi@users.sourceforge.net>
2005-10-18 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/makefile: fix location of DEBUG STATIC libupnp library
* upnp/sample/tvctrlpt/linux/Makefile,
upnp/sample/tvdevice/linux/Makefile: fix STATIC library support
2005-10-16 R<>mi Turboult <r3mi@users.sourceforge.net>
2005-10-16 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* threadutil/src/Makefile (clean): remove built library
2005-08-28 R<>mi Turboult <r3mi@users.sourceforge.net>
2005-08-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/src/ixml.h, ixml/src/ixml.c (ixmlRelaxParser) : new function
* ixml/src/ixmlparser.h, ixml/src/ixmlparser.c (Parser_setErrorChar) :
new function
2005-08-02 R<>mi Turboult <r3mi@users.sourceforge.net>
2005-08-02 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/src/Makefile: correct bug for static library being incorrectly
stripped when building non-debug
2005-06-09 R<>mi Turboult <r3mi@users.sourceforge.net>
2005-06-09 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/src/element.c (ixmlElement_removeAttributeNode):
remove some compilation warning
@@ -268,7 +481,7 @@ FORK FROM DEAD libupnp
* upnp/inc/upnptools.h, upnp/src/api/upnptools.c :
add missing const's in public API
2005-05-28 R<>mi Turboult <r3mi@users.sourceforge.net>
2005-05-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/inc/config.h: suppress HTTP_READ_BYTES (unused)
and replace by DEFAULT_SOAP_CONTENT_LENGTH (previously in upnpapi.h)
@@ -289,7 +502,7 @@ FORK FROM DEAD libupnp
* upnp/src/genlib/net/http/httpreadwrite.c : corrected an incorrect
sprintf format
2005-05-27 R<>mi Turboult <r3mi@users.sourceforge.net>
2005-05-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/makefile, upnp/src/makefile,
ixml/Makefile, ixml/src/Makefile,
@@ -297,7 +510,7 @@ FORK FROM DEAD libupnp
implement STATIC library support (from patch at
http://sourceforge.net/tracker/?group_id=7189&atid=307189 )
2005-05-26 R<>mi Turboult <r3mi@users.sourceforge.net>
2005-05-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/api/upnpapi.c, upnp/src/soap/soap_device.c,
upnp/src/soap/makefile :

View File

@@ -5,33 +5,39 @@
# Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
#
ACLOCAL_AMFLAGS = -I m4
ACLOCAL_AMFLAGS = -I m4
DISTCHECK_CONFIGURE_FLAGS = --enable-debug --enable-samples
SUBDIRS = ixml threadutil upnp docs/dist
SUBDIRS = ixml threadutil upnp docs/dist
EXTRA_DIST = libupnp.pc.in LICENSE THANKS libupnp.spec
EXTRA_DIST = \
libupnp.pc.in \
LICENSE \
THANKS \
libupnp.spec \
build/libupnp.bpf \
build/libupnp.bpr \
build/libupnp.dsp \
build/libupnp.dsw \
build/inc/autoconfig.h \
build/inc/config.h \
build/inc/upnpconfig.h
# This variable must have 'exec' in its name, in order to be installed
# by 'install-exec' target (instead of default 'install-data')
pkgconfigexecdir = $(libdir)/pkgconfig
pkgconfigexec_DATA = libupnp.pc
pkgconfigexecdir = $(libdir)/pkgconfig
pkgconfigexec_DATA = libupnp.pc
$(pkgconfigexec_DATA): config.status
if WITH_DOCDIR
docdir = @DOCDIR@
doc_DATA = LICENSE README NEWS TODO THANKS
if WITH_DOCUMENTATION
doc_DATA = LICENSE README NEWS TODO THANKS
endif
CLEANFILES = IUpnpErrFile.txt IUpnpInfoFile.txt
CLEANFILES = IUpnpErrFile.txt IUpnpInfoFile.txt

71
README
View File

@@ -1,4 +1,4 @@
Linux* SDK for UPnP* Devices (libupnp)
Portable SDK for UPnP* Devices (libupnp)
Copyright (c) 2000-2003 Intel Corporation - All Rights Reserved.
Copyright (c) 2005-2006 R<>mi Turboult <r3mi@users.sourceforge.net>
@@ -22,8 +22,8 @@ sections:
1) Release Contents
-------------------------------------------
The Linux SDK for UPnP Devices is an SDK for development of UPnP device
and control point applications for Linux. It consists of the core UPnP
The Portable SDK for UPnP Devices is an SDK for development of UPnP device
and control point applications. It consists of the core UPnP
protocols along with a UPnP-specific eXtensible Markup Language (XML) parser
supporting the Document Object Model (DOM) Level 2 API and an optional,
integrated mini web server for serving UPnP related documents.
@@ -32,7 +32,7 @@ integrated mini web server for serving UPnP related documents.
2) Package Contents
-------------------------------------------
The Linux SDK for UPnP Devices contains the following:
The SDK for UPnP Devices contains the following:
README This file. Contains the installation and build instructions.
LICENSE The licensing terms the SDK is distributed under.
@@ -55,11 +55,10 @@ upnp\sample A sample device and control point application, illustrating the
3) System Requirements
-------------------------------------------
The SDK for UPnP Devices is designed to compile and run under the
Linux operating system. It does, however, have dependencies on some
The SDK for UPnP Devices is designed to compile and run under several
operating systems. It does, however, have dependencies on some
packages that may not be installed by default. All packages that it
requires are listed below. The name of the package and where it can be
found is dependent on the distribution of Linux being used.
requires are listed below.
libpthread The header and library are installed as part of the glibc-devel
package (or equivalent).
@@ -83,7 +82,7 @@ ps2pdf The final step to making the PDF is converting the PostStript
into Portable Document Format. The ghostscript package provides
this tool.
For the UPnP library to function correctly, Linux networking must be configured
For the UPnP library to function correctly, networking must be configured
properly for multicasting. To do this:
route add -net 239.0.0.0 netmask 255.0.0.0 eth0
@@ -93,14 +92,6 @@ this addition, device advertisements and control point searches will not
function.
libupnp has been built and tested on the following configurations:
* MandrakeLinux 10.1 (kernel 2.6.8.1-12mdk, gcc 3.4.1, glibc-2.3.3)
* Ubuntu 5.10 "Breezy Badger" (Linux kernel 2.6.12-9-386, gcc 4.0.2 20050808
prerelease, libc6 2.3.5-1ubuntu12)
4) Build Instructions
-------------------------------------------
@@ -169,7 +160,7 @@ To build without:
% make
The SDK for Linux also contains some additional helper APIs, declared in
The SDK also contains some additional helper APIs, declared in
inc/tools/upnptools.h. If these additional tools are not required, they can
be compiled out:
@@ -249,6 +240,45 @@ sub-directory. Example :
% ../../upnp_tv_device
SOLARIS BUILD
The building process for the Solaris operating system is similar to the one
described above. Only the call to ./configure has to be done using an
additional parameter:
./configure CFLAGS="-mcpu=<cputype> -mtune=<cputype> -DSPARC_SOLARIS"
where <cputype> has to be replaced by the appropriate CPU tuning flag (e.g.
"supersparc"). Afterwards
make
make install
can be called as described above.
WINDOWS BUILD
In order to build libupnp under Windows the pthreads-w32 package is required.
You can download a self-extracting ZIP file from the following location:
ftp://sources.redhat.com/pub/pthreads-win32/pthreads-w32-2-7-0-release.exe
Execute the self-extracting archive and copy the Pre-build.2 folder to the
top level source folder.
Rename Pre-build.2 to pthreads.
Open the provided workspace build\libupnp.dsw with Visual C++ 6.0 and select
Build->Build libupnp.dll (F7)
For building a static library instead of a DLL and for using the static
pthreads-w32 library following switches need to be defined additionally:
UPNP_STATIC_LIB - for creating a statically linkable UPnP-library
PTW32_STATIC_LIB - for using the static pthreads32 library
5) Install/Uninstall Instructions
-------------------------------------------
@@ -290,9 +320,8 @@ See NEWS file.
8) Support and Contact Information
-------------------------------------------
Intel is not providing support for the Linux SDK for UPnP Devices. Two
mailing lists for the SDK are available on http://upnp.sourceforge.net/.
Questions and problems should be addressed on the appropriate mailing list.
Intel is not providing support for the SDK for UPnP Devices. Mailing lists
and discussion boards can be found at http://www.libupnp.org/.
If you find this SDK useful, please send an email to upnp@intel.com and let
us know.

22
THANKS
View File

@@ -7,15 +7,27 @@ Here is a list of these people. Help us keep it complete and
exempt of errors.
- Arno Willig
- Eric Tanguy
- Oskar Liljeblad
- Chaos
- John Dennis
- Craig Nelson
- David Maass
- Emil Ljungdahl
- Erik Johansson
- Eric Tanguy
- Erwan Velu
- Fredrik Svensson
- Glen Masgai
- Jiri Zouhar
- John Dennis
- Jonathan (no_dice)
- Leuk_He
- Loigu
- Marcelo Jimenez
- Luke Kim
- Marcelo Roberto Jimenez
- Markus Strobl
- Nektarios K. Papadopoulos
- Oxy
- Oskar Liljeblad
- Michael (Oxy)
- Paul Vixie
- Siva Chandran
- Timothy Redaelli

View File

@@ -13,7 +13,3 @@ autoreconf --force --install -Wall -Wno-obsolete $* || exit 1
echo "Now run ./configure and then make."
exit 0

View File

@@ -34,6 +34,7 @@
#include "autoconfig.h"
#define MAX_JOBS_TOTAL 10
/** @name Compile time configuration options
* The Linux SDK for UPnP Devices contains some compile-time parameters

View File

@@ -34,7 +34,7 @@
<RESFILES value=""/>
<DEFFILE value=""/>
<RESDEPEN value="$(RESFILES)"/>
<LIBFILES value="..\..\..\pthreads-w32-1-10-0-release\pthreadBC1.lib"/>
<LIBFILES value="D:\pthreads-w32-1-10-0-release\pthreadBC1.lib"/>
<LIBRARIES value=""/>
<SPARELIBS value=""/>
<PACKAGES value=""/>
@@ -45,11 +45,11 @@
<DEBUGLIBPATH value="$(BCB)\lib\debug"/>
<RELEASELIBPATH value="$(BCB)\lib\release"/>
<LINKER value="tlink32"/>
<USERDEFINES value="WIN32;LIBUPNP_EXPORTS"/>
<USERDEFINES value="WIN32;LIBUPNP_EXPORTS;UPNP_USE_BCBPP"/>
<SYSDEFINES value="NO_STRICT;_NO_VCL"/>
<MAINSOURCE value="libupnp.bpf"/>
<INCLUDEPATH value="..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc"/>
<LIBPATH value="..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib"/>
<INCLUDEPATH value="..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc;..\..\pthreads-w32-1-10-0-release"/>
<LIBPATH value="..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib;..\..\pthreads-w32-1-10-0-release"/>
<WARNINGS value="-w-par"/>
</MACROS>
<OPTIONS>
@@ -94,22 +94,27 @@ ProductVersion=1.0.0.0
Comments=
[HistoryLists\hlIncludePath]
Count=1
Item0=..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc
Count=3
Item0=..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc;..\..\pthreads-w32-1-10-0-release
Item1=..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc;D:\DEVELOP\pthreads-w32-1-10-0-release
Item2=..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc
[HistoryLists\hlLibraryPath]
Count=1
Item0=..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib
Count=3
Item0=..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib;..\..\pthreads-w32-1-10-0-release
Item1=..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib;D:\DEVELOP\pthreads-w32-1-10-0-release
Item2=..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib
[HistoryLists\hlDebugSourcePath]
Count=1
Item0=$(BCB)\source\vcl
[HistoryLists\hlConditionals]
Count=3
Item0=WIN32;LIBUPNP_EXPORTS
Item1=WIN32;EXPORT_SPEC
Item2=WIN32
Count=4
Item0=WIN32;LIBUPNP_EXPORTS;UPNP_USE_BCBPP
Item1=WIN32;LIBUPNP_EXPORTS
Item2=WIN32;EXPORT_SPEC
Item3=WIN32
[Debugging]
DebugSourceDirs=$(BCB)\source\vcl

View File

@@ -43,7 +43,7 @@ RSC=rc.exe
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I "E:\svnupnp\trunk\ixml\src\inc" /I "E:\svnupnp\trunk\ixml\inc" /I "E:\svnupnp\trunk\threadutil\inc" /I "E:\svnupnp\trunk\upnp\inc" /I "E:\svnupnp\trunk\upnp\src\inc" /I "E:\svnupnp\trunk\build\inc" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /FR /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\pthreads\include" /I "..\ixml\src\inc" /I "..\ixml\inc" /I "..\threadutil\inc" /I "..\upnp\inc" /I "..\upnp\src\inc" /I ".\inc" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /D "PTW32_STATIC_LIB" /D "UPNP_STATIC_LIB" /D "UPNP_USE_MSVCPP" /FR /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "NDEBUG"
@@ -53,7 +53,8 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib E:\svnupnp\trunk\libupnp\build\bin\pthreadvc2.lib ws2_32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib /nologo /dll /machine:I386
# SUBTRACT LINK32 /pdb:none
!ELSEIF "$(CFG)" == "libupnp - Win32 Debug"
@@ -69,7 +70,7 @@ LINK32=link.exe
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "E:\svnupnp\trunk\ixml\src\inc" /I "E:\svnupnp\trunk\ixml\inc" /I "E:\svnupnp\trunk\threadutil\inc" /I "E:\svnupnp\trunk\upnp\inc" /I "E:\svnupnp\trunk\upnp\src\inc" /I "E:\svnupnp\trunk\build\inc" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /FR /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\pthreads\include" /I "..\ixml\src\inc" /I "..\ixml\inc" /I "..\threadutil\inc" /I "..\upnp\inc" /I "..\upnp\src\inc" /I "..\build\inc" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /D "UPNP_USE_MSVCPP" /FR /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "_DEBUG"
@@ -79,7 +80,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib E:\svnupnp\trunk\libupnp\build\bin\pthreadvc2.lib ws2_32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
!ENDIF
@@ -274,6 +275,146 @@ SOURCE=..\upnp\src\win_dll.c
# Begin Group "Header-Dateien"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=..\upnp\src\inc\client_table.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\config.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\gena.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\gena_ctrlpt.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\gena_device.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\global.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\gmtdate.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\http_client.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\httpparser.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\httpreadwrite.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\inet_pton.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\md5.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\membuffer.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\miniserver.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\netall.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\parsetools.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\server.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\service_table.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\soaplib.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\sock.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\ssdplib.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\statcodes.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\statuscodes.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\strintmap.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\sysdep.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\unixutil.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\upnp_timeout.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\upnpapi.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\upnpclosesocket.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\uri.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\urlconfig.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\util.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\utilall.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\uuid.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\webserver.h
# End Source File
# End Group
# Begin Group "Ressourcendateien"

View File

@@ -8,9 +8,9 @@
# (C) Copyright 2005-2006 R<>mi Turboult <r3mi@users.sourceforge.net>
#
AC_PREREQ(2.59)
AC_PREREQ(2.60)
AC_INIT([libupnp], [1.4.1], [virtual_worlds@gmx.de])
AC_INIT([libupnp], [1.4.5], [mroberto@users.sourceforge.net])
# *Independently* of the above libupnp package version, the libtool version
# of the 3 libraries need to be updated whenever there is a change released :
# "current:revision:age" (this is NOT the same as the package version), where:
@@ -19,16 +19,39 @@ AC_INIT([libupnp], [1.4.1], [virtual_worlds@gmx.de])
# - interfaces added: age++
# - interfaces removed: age=0
# *please update only once, before a formal release, not for each change*
AC_SUBST([LT_VERSION_IXML], [2:2:0])
AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0])
AC_SUBST([LT_VERSION_UPNP], [2:2:0])
#
# For release 1.4.1, we had:
#AC_SUBST([LT_VERSION_IXML], [2:2:0])
#AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0])
#AC_SUBST([LT_VERSION_UPNP], [2:2:0])
#
# "current:revision:age"
#
# - Code has changed in ixml
# revision: 2 -> 3
# - Code has changed in threadutil
# revision: 2 -> 3
# - Interface added in threadutil
# current: 2 -> 3
# revisiion: 3 -> 0
# age: 0 -> 1
# - Code has changed in upnp (revision 2 -> 3)
# revision: 2 -> 3
AC_SUBST([LT_VERSION_IXML], [2:3:0])
AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1])
AC_SUBST([LT_VERSION_UPNP], [2:3:0])
AC_CONFIG_AUX_DIR(config.aux)
AC_CONFIG_MACRO_DIR(m4)
AC_CONFIG_SRCDIR(upnp/inc/upnp.h)
AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects])
AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects dist-bzip2])
#
# Get canonical host names in host and host_os
#
AC_CANONICAL_HOST
#
# There are 3 configuration files :
@@ -42,6 +65,7 @@ AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects])
# installed libraries.
#
AC_CONFIG_HEADERS([autoconfig.h upnp/inc/upnpconfig.h])
#AC_SYS_LARGEFILE_SENSITIVE
AC_REVISION([$Revision: 1.11 $])
@@ -106,19 +130,31 @@ RT_BOOL_ARG_ENABLE([samples], [yes], [compilation of upnp/sample/ code])
# doc installation
AC_MSG_CHECKING([documentation installation])
AC_ARG_WITH([docdir],
AC_HELP_STRING([--with-docdir=DIR],
[where documentation is installed
@<:@[DATADIR/doc/]AC_PACKAGE_NAME[-]AC_PACKAGE_VERSION@:>@])
AC_HELP_STRING([--without-docdir],
[do not install the documentation]),
[DOCDIR="$with_docdir"],
[DOCDIR="${datadir}/doc/${PACKAGE_NAME}-${PACKAGE_VERSION}"])
# autoconf >= 2.60 already defines ${docdir}, but we will not use its
# default value, which is ${datarootdir}/doc/${PACKAGE_TARNAME}.
# That would give us ${datarootdir}/doc/libupnp, and we want the package
# version on that.
docdir="${datadir}/doc/${PACKAGE_NAME}-${PACKAGE_VERSION}"
AC_MSG_CHECKING([for documentation directory])
AC_ARG_WITH(
[documentation],
AS_HELP_STRING(
[--with-documentation=directory_name],
[where documentation is installed
@<:@[DATADIR/doc/]AC_PACKAGE_NAME[-]AC_PACKAGE_VERSION@:>@])
AS_HELP_STRING(
[--without-documentation],
[do not install the documentation]),
[],
[with_documentation=no])
AM_CONDITIONAL(WITH_DOCDIR, test x"$with_docdir" != xno)
AC_SUBST(DOCDIR)
AC_MSG_RESULT($DOCDIR)
# If something has been entered after an equal sign, assume it is the directory
if test x"$with_documentation" != xyes -a x"$with_documentation" != xno; then
docdir="$with_documentation"
fi
AM_CONDITIONAL(WITH_DOCUMENTATION, test x"$with_documentation" != xno)
AC_SUBST(docdir)
AC_MSG_RESULT($docdir)
#
@@ -131,22 +167,40 @@ AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_PROG_EGREP
#
# Default compilation flags
#
if test x"$enable_debug" = xyes; then
# AC_PROG_CC already sets CFLAGS to "-g -O2" by default
:
else
# add optimise for size
AX_CFLAGS_GCC_OPTION([-Os])
fi
AX_CFLAGS_WARN_ALL
echo "--------------------- Default compilation flags -------------------------------"
echo host is $host
echo host_os is $host_os
case $host_os in
FreeBSD*)
echo "Using FreeBSD specific compiler settings"
# Put FreeBSD specific compiler flags here
;;
*)
echo "Using non-specific system compiler settings"
if test x"$enable_debug" = xyes; then
# AC_PROG_CC already sets CFLAGS to "-g -O2" by default
:
else
# add optimise for size
AX_CFLAGS_GCC_OPTION([-Os])
fi
;;
esac
# Arrange for large-file support (can be disabled with --disable-largefile).
# Define _FILE_OFFSET_BITS and _LARGE_FILES if necessary
AC_SYS_LARGEFILE
AX_CFLAGS_WARN_ALL
echo "-------------------------------------------------------------------------------"
#
# Lot's of stuff to ensure large file support
#
AC_TYPE_SIZE_T
AC_TYPE_OFF_T
AC_DEFINE([_LARGE_FILE_SOURCE], [], [Large files support])
AC_DEFINE([_FILE_OFFSET_BITS], [64], [File Offset size])
#
@@ -155,7 +209,24 @@ AC_SYS_LARGEFILE
AC_HEADER_STDC
# libupnp code doesn't use autoconf variables yet,
# so just abort if a header file is not found.
AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h netdb.h netinet/in.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h sys/timeb.h syslog.h unistd.h],[],[AC_MSG_ERROR([required header file missing])])
AC_CHECK_HEADERS(
[ \
arpa/inet.h \
fcntl.h \
limits.h \
netdb.h \
netinet/in.h \
stdlib.h \
string.h \
sys/ioctl.h \
sys/socket.h \
sys/time.h \
sys/timeb.h \
syslog.h \
unistd.h \
],
[],
[AC_MSG_ERROR([required header file missing])])
#
@@ -171,25 +242,28 @@ TYPE_SOCKLEN_T
#
AC_FUNC_VPRINTF
AC_FUNC_FSEEKO
AC_CHECK_FUNCS(ftime,, [AC_CHECK_LIB(compat, ftime)])
#
# Checks for POSIX Threads
#
ACX_PTHREAD([],[AC_MSG_ERROR([POSIX threads are required to build this program])])
ACX_PTHREAD(
[],
[AC_MSG_ERROR([POSIX threads are required to build this program])])
AC_CONFIG_FILES([
Makefile
ixml/Makefile
ixml/doc/Makefile
threadutil/Makefile
upnp/Makefile
upnp/doc/Makefile
docs/dist/Makefile
libupnp.pc
])
AC_CONFIG_FILES([Makefile
ixml/Makefile
ixml/doc/Makefile
threadutil/Makefile
upnp/Makefile
upnp/doc/Makefile
docs/dist/Makefile
libupnp.pc
])
AC_OUTPUT

13
docs/dist/Makefile.am vendored
View File

@@ -1,4 +1,7 @@
EXTRA_DIST = ./UPnP_Programming_Guide.pdf \
EXTRA_DIST = \
./UPnP_Programming_Guide.pdf \
./IXML_Programming_Guide.pdf \
./html/upnp/icon1.gif \
./html/upnp/icon2.gif \
@@ -251,9 +254,10 @@ EXTRA_DIST = ./UPnP_Programming_Guide.pdf \
./html/ixml/ixmlCloneDOMString.html \
./html/ixml/ixmlFreeDOMString.html
if WITH_DOCDIR
docsdir = @DOCDIR@
nobase_docs_DATA = ./UPnP_Programming_Guide.pdf \
if WITH_DOCUMENTATION
docsdir = @docdir@
nobase_docs_DATA = \
./UPnP_Programming_Guide.pdf \
./IXML_Programming_Guide.pdf \
./html/upnp/icon1.gif \
./html/upnp/icon2.gif \
@@ -506,3 +510,4 @@ if WITH_DOCDIR
./html/ixml/ixmlCloneDOMString.html \
./html/ixml/ixmlFreeDOMString.html
endif

View File

@@ -38,11 +38,15 @@
#include <assert.h>
#ifdef WIN32
#ifdef LIBUPNP_EXPORTS
// set up declspec for dll export to make functions visible to library users
#define EXPORT_SPEC __declspec(dllexport)
#ifndef UPNP_STATIC_LIB
#ifdef LIBUPNP_EXPORTS
// set up declspec for dll export to make functions visible to library users
#define EXPORT_SPEC __declspec(dllexport)
#else
#define EXPORT_SPEC __declspec(dllimport)
#endif
#else
#define EXPORT_SPEC __declspec(dllimport)
#define EXPORT_SPEC
#endif
#else
#define EXPORT_SPEC
@@ -256,7 +260,7 @@ ixmlNode_getNodeName(IXML_Node *nodeptr
* @return [DOMString] A {\bf DOMString} of the {\bf Node} value.
*/
EXPORT_SPEC DOMString
EXPORT_SPEC const DOMString
ixmlNode_getNodeValue(IXML_Node *nodeptr
/** Pointer to the {\bf Node} to retrieve the value. */
);
@@ -278,7 +282,7 @@ ixmlNode_getNodeValue(IXML_Node *nodeptr
EXPORT_SPEC int
ixmlNode_setNodeValue(IXML_Node *nodeptr,
/** The {\bf Node} to which to assign a new value. */
char *newNodeValue
const char *newNodeValue
/** The new value of the {\bf Node}. */
);
@@ -435,7 +439,7 @@ ixmlNode_getNamespaceURI(IXML_Node *nodeptr
* or {\tt NULL}.
*/
EXPORT_SPEC DOMString
EXPORT_SPEC const DOMString
ixmlNode_getPrefix(IXML_Node *nodeptr
/** The {\bf Node} from which to retrieve the prefix. */
);
@@ -616,7 +620,7 @@ ixmlNode_cloneNode(IXML_Node *nodeptr,
*/
EXPORT_SPEC BOOL
ixmlNode_hasAttributes(IXML_Node *node
ixmlNode_hasAttributes(IXML_Node *nodeptr
/** The {\bf Node} to query for attributes. */
);
@@ -626,7 +630,7 @@ ixmlNode_hasAttributes(IXML_Node *node
*/
EXPORT_SPEC void
ixmlNode_free(IXML_Node *IXML_Node
ixmlNode_free(IXML_Node *nodeptr
/** The {\bf Node} to free. */
);
@@ -863,7 +867,7 @@ EXPORT_SPEC int
ixmlDocument_createCDATASectionEx(IXML_Document *doc,
/** The owner {\bf Document} of the new
node. */
DOMString data,
const DOMString data,
/** The data to associate with the new
{\bf CDATASection} node. */
IXML_CDATASection** cdNode
@@ -882,7 +886,7 @@ EXPORT_SPEC IXML_CDATASection*
ixmlDocument_createCDATASection(IXML_Document *doc,
/** The owner {\bf Document} of the new
node. */
DOMString data
const DOMString data
/** The data to associate with the new {\bf
CDATASection} node. */
);
@@ -895,7 +899,7 @@ ixmlDocument_createCDATASection(IXML_Document *doc,
EXPORT_SPEC IXML_Attr*
ixmlDocument_createAttribute(IXML_Document *doc,
/** The owner {\bf Document} of the new node. */
char *name
const char *name
/** The name of the new attribute. */
);
@@ -920,7 +924,7 @@ EXPORT_SPEC int
ixmlDocument_createAttributeEx(IXML_Document *doc,
/** The owner {\bf Document} of the new
node. */
char *name,
const char *name,
/** The name of the new attribute. */
IXML_Attr** attrNode
/** A pointer to a {\bf Attr} where the new
@@ -939,7 +943,7 @@ ixmlDocument_createAttributeEx(IXML_Document *doc,
EXPORT_SPEC IXML_NodeList*
ixmlDocument_getElementsByTagName(IXML_Document *doc,
/** The {\bf Document} to search. */
DOMString tagName
const DOMString tagName
/** The tag name to find. */
);
@@ -966,10 +970,10 @@ EXPORT_SPEC int
ixmlDocument_createElementNSEx(IXML_Document *doc,
/** The owner {\bf Document} of the new
node. */
DOMString namespaceURI,
const DOMString namespaceURI,
/** The namespace URI for the new {\bf
Element}. */
DOMString qualifiedName,
const DOMString qualifiedName,
/** The qualified name of the new {\bf
Element}. */
IXML_Element** rtElement
@@ -988,10 +992,10 @@ ixmlDocument_createElementNSEx(IXML_Document *doc,
EXPORT_SPEC IXML_Element*
ixmlDocument_createElementNS(IXML_Document *doc,
/** The owner {\bf Document} of the new node. */
DOMString namespaceURI,
const DOMString namespaceURI,
/** The namespace URI for the new {\bf
Element}. */
DOMString qualifiedName
const DOMString qualifiedName
/** The qualified name of the new {\bf
Element}. */
);
@@ -1017,9 +1021,9 @@ EXPORT_SPEC int
ixmlDocument_createAttributeNSEx(IXML_Document *doc,
/** The owner {\bf Document} of the new
{\bf Attr}. */
DOMString namespaceURI,
const DOMString namespaceURI,
/** The namespace URI for the attribute. */
DOMString qualifiedName,
const DOMString qualifiedName,
/** The qualified name of the attribute. */
IXML_Attr** attrNode
/** A pointer to an {\bf Attr} where the
@@ -1036,9 +1040,9 @@ EXPORT_SPEC IXML_Attr*
ixmlDocument_createAttributeNS(IXML_Document *doc,
/** The owner {\bf Document} of the new
{\bf Attr}. */
DOMString namespaceURI,
const DOMString namespaceURI,
/** The namespace URI for the attribute. */
DOMString qualifiedName
const DOMString qualifiedName
/** The qualified name of the attribute. */
);
@@ -1055,11 +1059,11 @@ ixmlDocument_createAttributeNS(IXML_Document *doc,
EXPORT_SPEC IXML_NodeList*
ixmlDocument_getElementsByTagNameNS(IXML_Document* doc,
/** The {\bf Document} to search. */
DOMString namespaceURI,
const DOMString namespaceURI,
/** The namespace of the elements to
find or {\tt "*"} to match any
namespace. */
DOMString localName
const DOMString localName
/** The local name of the elements to
find or {\tt "*"} to match any local
name. */
@@ -1075,7 +1079,7 @@ EXPORT_SPEC IXML_Element*
ixmlDocument_getElementById(IXML_Document* doc,
/** The owner {\bf Document} of the {\bf
Element}. */
DOMString tagName
const DOMString tagName
/** The name of the {\bf Element}.*/
);
@@ -1170,11 +1174,11 @@ ixmlElement_getTagName(IXML_Element* element
* attribute.
*/
EXPORT_SPEC DOMString
EXPORT_SPEC const DOMString
ixmlElement_getAttribute(IXML_Element* element,
/** The {\bf Element} from which to retrieve the
attribute. */
DOMString name
const DOMString name
/** The name of the attribute to retrieve. */
);
@@ -1198,9 +1202,9 @@ EXPORT_SPEC int
ixmlElement_setAttribute(IXML_Element* element,
/** The {\bf Element} on which to set the
attribute. */
DOMString name,
const DOMString name,
/** The name of the attribute. */
DOMString value
const DOMString value
/** The value of the attribute. Note that this is
a non-parsed string and any markup must be
escaped. */
@@ -1220,7 +1224,7 @@ EXPORT_SPEC int
ixmlElement_removeAttribute(IXML_Element* element,
/** The {\bf Element} from which to remove the
attribute. */
DOMString name
const DOMString name
/** The name of the attribute to remove. */
);
@@ -1236,7 +1240,7 @@ EXPORT_SPEC IXML_Attr*
ixmlElement_getAttributeNode(IXML_Element* element,
/** The {\bf Element} from which to get the
attribute node. */
DOMString name
const DOMString name
/** The name of the attribute node to find. */
);
@@ -1305,7 +1309,7 @@ EXPORT_SPEC IXML_NodeList*
ixmlElement_getElementsByTagName(IXML_Element* element,
/** The {\bf Element} from which to start
the search. */
DOMString tagName
const DOMString tagName
/** The name of the tag for which to
search. */
);
@@ -1318,13 +1322,13 @@ ixmlElement_getElementsByTagName(IXML_Element* element,
* matching attribute.
*/
EXPORT_SPEC DOMString
EXPORT_SPEC const DOMString
ixmlElement_getAttributeNS(IXML_Element* element,
/** The {\bf Element} from which to get the
attribute value. */
DOMString namespaceURI,
const DOMString namespaceURI,
/** The namespace URI of the attribute. */
DOMString localname
const DOMString localname
/** The local name of the attribute. */
);
@@ -1354,11 +1358,11 @@ EXPORT_SPEC int
ixmlElement_setAttributeNS(IXML_Element* element,
/** The {\bf Element} on which to set the
attribute. */
DOMString namespaceURI,
const DOMString namespaceURI,
/** The namespace URI of the new attribute. */
DOMString qualifiedName,
const DOMString qualifiedName,
/** The qualified name of the attribute. */
DOMString value
const DOMString value
/** The new value for the attribute. */
);
@@ -1376,9 +1380,9 @@ EXPORT_SPEC int
ixmlElement_removeAttributeNS(IXML_Element* element,
/** The {\bf Element} from which to remove the
the attribute. */
DOMString namespaceURI,
const DOMString namespaceURI,
/** The namespace URI of the attribute. */
DOMString localName
const DOMString localName
/** The local name of the attribute.*/
);
@@ -1391,9 +1395,9 @@ EXPORT_SPEC IXML_Attr*
ixmlElement_getAttributeNodeNS(IXML_Element* element,
/** The {\bf Element} from which to get the
attribute. */
DOMString namespaceURI,
const DOMString namespaceURI,
/** The namespace URI of the attribute. */
DOMString localName
const DOMString localName
/** The local name of the attribute. */
);
@@ -1437,10 +1441,10 @@ EXPORT_SPEC IXML_NodeList*
ixmlElement_getElementsByTagNameNS(IXML_Element* element,
/** The {\bf Element} from which to start
the search. */
DOMString namespaceURI,
const DOMString namespaceURI,
/** The namespace URI of the {\bf
Element}s to find. */
DOMString localName
const DOMString localName
/** The local name of the {\bf Element}s
to find. */
);
@@ -1457,7 +1461,7 @@ EXPORT_SPEC BOOL
ixmlElement_hasAttribute(IXML_Element* element,
/** The {\bf Element} on which to check for an
attribute. */
DOMString name
const DOMString name
/** The name of the attribute for which to check. */
);
@@ -1473,9 +1477,9 @@ EXPORT_SPEC BOOL
ixmlElement_hasAttributeNS(IXML_Element* element,
/** The {\bf Element} on which to check for the
attribute. */
DOMString namespaceURI,
const DOMString namespaceURI,
/** The namespace URI of the attribute. */
DOMString localName
const DOMString localName
/** The local name of the attribute. */
);
@@ -1525,7 +1529,7 @@ ixmlNamedNodeMap_getLength(IXML_NamedNodeMap *nnMap
EXPORT_SPEC IXML_Node*
ixmlNamedNodeMap_getNamedItem(IXML_NamedNodeMap *nnMap,
/** The {\bf NamedNodeMap} to search. */
DOMString name
const DOMString name
/** The name of the {\bf Node} to find. */
);
@@ -1556,7 +1560,7 @@ EXPORT_SPEC IXML_Node*
ixmlNamedNodeMap_removeNamedItem(IXML_NamedNodeMap *nnMap,
/** The {\bf NamedNodeMap} from which to
remove the item. */
DOMString name
const DOMString name
/** The name of the item to remove. */
);
@@ -1588,10 +1592,10 @@ EXPORT_SPEC IXML_Node*
ixmlNamedNodeMap_getNamedItemNS(IXML_NamedNodeMap *nnMap,
/** The {\bf NamedNodeMap} from which to
remove the {\bf Node}. */
DOMString *namespaceURI,
const DOMString *namespaceURI,
/** The namespace URI of the {\bf Node} to
remove. */
DOMString localName
const DOMString localName
/** The local name of the {\bf Node} to
remove. */
);
@@ -1623,10 +1627,10 @@ EXPORT_SPEC IXML_Node*
ixmlNamedNodeMap_removeNamedItemNS(IXML_NamedNodeMap *nnMap,
/** The {\bf NamedNodeMap} from which to
remove the {\bf Node}. */
DOMString namespaceURI,
const DOMString namespaceURI,
/** The namespace URI of the {\bf Node}
to remove. */
DOMString localName
const DOMString localName
/** The local name of the {\bf Node} to
remove. */
);
@@ -1815,7 +1819,7 @@ ixmlRelaxParser(char errorChar);
* {\tt NULL} on an error.
*/
EXPORT_SPEC IXML_Document*
ixmlParseBuffer(char *buffer
ixmlParseBuffer(const char *buffer
/** The buffer that contains the XML text to convert to a
{\bf Document}. */
);
@@ -1838,7 +1842,7 @@ ixmlParseBuffer(char *buffer
*/
EXPORT_SPEC int
ixmlParseBufferEx(char *buffer,
ixmlParseBufferEx(const char *buffer,
/** The buffer that contains the XML text to convert to a
{\bf Document}. */
IXML_Document** doc
@@ -1853,7 +1857,7 @@ ixmlParseBufferEx(char *buffer,
*/
EXPORT_SPEC IXML_Document*
ixmlLoadDocument(char* xmlFile
ixmlLoadDocument(const char* xmlFile
/** The filename of the XML text to convert to a {\bf
Document}. */
);
@@ -1875,7 +1879,7 @@ ixmlLoadDocument(char* xmlFile
*/
EXPORT_SPEC int
ixmlLoadDocumentEx(char* xmlFile,
ixmlLoadDocumentEx(const char* xmlFile,
/** The filename of the XML text to convert to a {\bf
Document}. */
IXML_Document** doc

View File

@@ -373,7 +373,7 @@ ixmlDocument_createTextNode( IN IXML_Document * doc,
================================================================*/
int
ixmlDocument_createAttributeEx( IN IXML_Document * doc,
IN char *name,
IN const char *name,
OUT IXML_Attr ** rtAttr )
{
IXML_Attr *attrNode = NULL;
@@ -427,7 +427,7 @@ ixmlDocument_createAttributeEx( IN IXML_Document * doc,
================================================================*/
IXML_Attr *
ixmlDocument_createAttribute( IN IXML_Document * doc,
IN char *name )
IN const char *name )
{
IXML_Attr *attrNode = NULL;
@@ -451,8 +451,8 @@ ixmlDocument_createAttribute( IN IXML_Document * doc,
*=================================================================*/
int
ixmlDocument_createAttributeNSEx( IN IXML_Document * doc,
IN DOMString namespaceURI,
IN DOMString qualifiedName,
IN const DOMString namespaceURI,
IN const DOMString qualifiedName,
OUT IXML_Attr ** rtAttr )
{
IXML_Attr *attrNode = NULL;
@@ -507,8 +507,8 @@ ixmlDocument_createAttributeNSEx( IN IXML_Document * doc,
*=================================================================*/
IXML_Attr *
ixmlDocument_createAttributeNS( IN IXML_Document * doc,
IN DOMString namespaceURI,
IN DOMString qualifiedName )
IN const DOMString namespaceURI,
IN const DOMString qualifiedName )
{
IXML_Attr *attrNode = NULL;
@@ -531,7 +531,7 @@ ixmlDocument_createAttributeNS( IN IXML_Document * doc,
*=================================================================*/
int
ixmlDocument_createCDATASectionEx( IN IXML_Document * doc,
IN DOMString data,
IN const DOMString data,
OUT IXML_CDATASection ** rtCD )
{
int errCode = IXML_SUCCESS;
@@ -588,7 +588,7 @@ ixmlDocument_createCDATASectionEx( IN IXML_Document * doc,
*=================================================================*/
IXML_CDATASection *
ixmlDocument_createCDATASection( IN IXML_Document * doc,
IN DOMString data )
IN const DOMString data )
{
IXML_CDATASection *cDSectionNode = NULL;
@@ -613,8 +613,8 @@ ixmlDocument_createCDATASection( IN IXML_Document * doc,
*=================================================================*/
int
ixmlDocument_createElementNSEx( IN IXML_Document * doc,
IN DOMString namespaceURI,
IN DOMString qualifiedName,
IN const DOMString namespaceURI,
IN const DOMString qualifiedName,
OUT IXML_Element ** rtElement )
{
@@ -673,8 +673,8 @@ ixmlDocument_createElementNSEx( IN IXML_Document * doc,
*=================================================================*/
IXML_Element *
ixmlDocument_createElementNS( IN IXML_Document * doc,
IN DOMString namespaceURI,
IN DOMString qualifiedName )
IN const DOMString namespaceURI,
IN const DOMString qualifiedName )
{
IXML_Element *newElement = NULL;
@@ -698,7 +698,7 @@ ixmlDocument_createElementNS( IN IXML_Document * doc,
*=================================================================*/
IXML_NodeList *
ixmlDocument_getElementsByTagName( IN IXML_Document * doc,
IN char *tagName )
IN const char *tagName )
{
IXML_NodeList *returnNodeList = NULL;
@@ -728,8 +728,8 @@ ixmlDocument_getElementsByTagName( IN IXML_Document * doc,
*=================================================================*/
IXML_NodeList *
ixmlDocument_getElementsByTagNameNS( IN IXML_Document * doc,
IN DOMString namespaceURI,
IN DOMString localName )
IN const DOMString namespaceURI,
IN const DOMString localName )
{
IXML_NodeList *returnNodeList = NULL;
@@ -756,7 +756,7 @@ ixmlDocument_getElementsByTagNameNS( IN IXML_Document * doc,
*=================================================================*/
IXML_Element *
ixmlDocument_getElementById( IN IXML_Document * doc,
IN DOMString tagName )
IN const DOMString tagName )
{
IXML_Element *rtElement = NULL;
IXML_Node *nodeptr = ( IXML_Node * ) doc;

View File

@@ -71,7 +71,7 @@ ixmlElement_getTagName( IN IXML_Element * element )
*=================================================================*/
int
ixmlElement_setTagName( IN IXML_Element * element,
IN char *tagName )
IN const char *tagName )
{
int rc = IXML_SUCCESS;
@@ -104,9 +104,9 @@ ixmlElement_setTagName( IN IXML_Element * element,
* does not have a specified value.
*
*=================================================================*/
DOMString
const DOMString
ixmlElement_getAttribute( IN IXML_Element * element,
IN DOMString name )
IN const DOMString name )
{
IXML_Node *attrNode;
@@ -142,8 +142,8 @@ ixmlElement_getAttribute( IN IXML_Element * element,
*=================================================================*/
int
ixmlElement_setAttribute( IN IXML_Element * element,
IN char *name,
IN char *value )
IN const char *name,
IN const char *value )
{
IXML_Node *attrNode;
IXML_Attr *newAttrNode;
@@ -221,7 +221,7 @@ ixmlElement_setAttribute( IN IXML_Element * element,
*=================================================================*/
int
ixmlElement_removeAttribute( IN IXML_Element * element,
IN char *name )
IN const char *name )
{
IXML_Node *attrNode;
@@ -262,7 +262,7 @@ ixmlElement_removeAttribute( IN IXML_Element * element,
*=================================================================*/
IXML_Attr *
ixmlElement_getAttributeNode( IN IXML_Element * element,
IN char *name )
IN const char *name )
{
IXML_Node *attrNode;
@@ -483,7 +483,7 @@ ixmlElement_removeAttributeNode( IN IXML_Element * element,
*=================================================================*/
IXML_NodeList *
ixmlElement_getElementsByTagName( IN IXML_Element * element,
IN char *tagName )
IN const char *tagName )
{
IXML_NodeList *returnNodeList = NULL;
@@ -508,10 +508,10 @@ ixmlElement_getElementsByTagName( IN IXML_Element * element,
* not have the specified value.
*
*=================================================================*/
DOMString
const DOMString
ixmlElement_getAttributeNS( IN IXML_Element * element,
IN DOMString namespaceURI,
IN DOMString localName )
IN const DOMString namespaceURI,
IN const DOMString localName )
{
IXML_Node *attrNode;
@@ -553,9 +553,9 @@ ixmlElement_getAttributeNS( IN IXML_Element * element,
*=================================================================*/
int
ixmlElement_setAttributeNS( IN IXML_Element * element,
IN DOMString namespaceURI,
IN DOMString qualifiedName,
IN DOMString value )
IN const DOMString namespaceURI,
IN const DOMString qualifiedName,
IN const DOMString value )
{
IXML_Node *attrNode = NULL;
IXML_Node newAttrNode;
@@ -672,8 +672,8 @@ ixmlElement_setAttributeNS( IN IXML_Element * element,
*=================================================================*/
int
ixmlElement_removeAttributeNS( IN IXML_Element * element,
IN DOMString namespaceURI,
IN DOMString localName )
IN const DOMString namespaceURI,
IN const DOMString localName )
{
IXML_Node *attrNode;
@@ -719,8 +719,8 @@ ixmlElement_removeAttributeNS( IN IXML_Element * element,
*=================================================================*/
IXML_Attr *
ixmlElement_getAttributeNodeNS( IN IXML_Element * element,
IN DOMString namespaceURI,
IN DOMString localName )
IN const DOMString namespaceURI,
IN const DOMString localName )
{
IXML_Node *attrNode;
@@ -861,8 +861,8 @@ ixmlElement_setAttributeNodeNS( IN IXML_Element * element,
*=================================================================*/
IXML_NodeList *
ixmlElement_getElementsByTagNameNS( IN IXML_Element * element,
IN DOMString namespaceURI,
IN DOMString localName )
IN const DOMString namespaceURI,
IN const DOMString localName )
{
IXML_Node *node = ( IXML_Node * ) element;
IXML_NodeList *nodeList = NULL;
@@ -892,7 +892,7 @@ ixmlElement_getElementsByTagNameNS( IN IXML_Element * element,
*=================================================================*/
BOOL
ixmlElement_hasAttribute( IN IXML_Element * element,
IN DOMString name )
IN const DOMString name )
{
IXML_Node *attrNode;
@@ -930,8 +930,8 @@ ixmlElement_hasAttribute( IN IXML_Element * element,
*=================================================================*/
BOOL
ixmlElement_hasAttributeNS( IN IXML_Element * element,
IN DOMString namespaceURI,
IN DOMString localName )
IN const DOMString namespaceURI,
IN const DOMString localName )
{
IXML_Node *attrNode;

View File

@@ -88,8 +88,8 @@ typedef struct _Parser
int Parser_LoadDocument( IXML_Document **retDoc, char * xmlFile, BOOL file);
BOOL Parser_isValidXmlName( DOMString name);
int Parser_LoadDocument( IXML_Document **retDoc, const char * xmlFile, BOOL file);
BOOL Parser_isValidXmlName( const DOMString name);
int Parser_setNodePrefixAndLocalName(IXML_Node *newIXML_NodeIXML_Attr);
void Parser_freeNodeContent( IXML_Node *IXML_Nodeptr);
@@ -98,7 +98,7 @@ void Parser_setErrorChar( char c );
void ixmlAttr_free(IXML_Attr *attrNode);
void ixmlAttr_init(IXML_Attr *attrNode);
int ixmlElement_setTagName(IXML_Element *element, char *tagName);
int ixmlElement_setTagName(IXML_Element *element, const char *tagName);
void ixmlNamedNodeMap_init(IXML_NamedNodeMap *nnMap);
int ixmlNamedNodeMap_addToNamedNodeMap(IXML_NamedNodeMap **nnMap, IXML_Node *add);
@@ -106,12 +106,12 @@ int ixmlNamedNodeMap_addToNamedNodeMap(IXML_NamedNodeMap **nnMap, IXML_Node
void ixmlNode_init(IXML_Node *IXML_Nodeptr);
BOOL ixmlNode_compare(IXML_Node *srcIXML_Node, IXML_Node *destIXML_Node);
void ixmlNode_getElementsByTagName( IXML_Node *n, char *tagname, IXML_NodeList **list);
void ixmlNode_getElementsByTagNameNS( IXML_Node *IXML_Node, char *namespaceURI,
char *localName, IXML_NodeList **list);
void ixmlNode_getElementsByTagName( IXML_Node *n, const char *tagname, IXML_NodeList **list);
void ixmlNode_getElementsByTagNameNS( IXML_Node *IXML_Node, const char *namespaceURI,
const char *localName, IXML_NodeList **list);
int ixmlNode_setNodeProperties(IXML_Node* node, IXML_Node *src);
int ixmlNode_setNodeName( IXML_Node* node, DOMString qualifiedName);
int ixmlNode_setNodeName( IXML_Node* node, const DOMString qualifiedName);
void ixmlNodeList_init(IXML_NodeList *nList);
int ixmlNodeList_addToNodeList(IXML_NodeList **nList, IXML_Node *add);

View File

@@ -39,7 +39,7 @@
*=================================================================*/
static void
copy_with_escape( INOUT ixml_membuf * buf,
IN char *p )
IN const char *p )
{
int i;
int plen;
@@ -87,13 +87,13 @@ void
ixmlPrintDomTreeRecursive( IN IXML_Node * nodeptr,
IN ixml_membuf * buf )
{
char *nodeName = NULL;
char *nodeValue = NULL;
const char *nodeName = NULL;
const char *nodeValue = NULL;
IXML_Node *child = NULL,
*sibling = NULL;
if( nodeptr != NULL ) {
nodeName = ( char * )ixmlNode_getNodeName( nodeptr );
nodeName = ( const char * )ixmlNode_getNodeName( nodeptr );
nodeValue = ixmlNode_getNodeValue( nodeptr );
switch ( ixmlNode_getNodeType( nodeptr ) ) {
@@ -103,14 +103,16 @@ ixmlPrintDomTreeRecursive( IN IXML_Node * nodeptr,
break;
case eCDATA_SECTION_NODE:
ixml_membuf_append_str( buf, "<![CDATA[" );
ixml_membuf_append_str( buf, nodeValue );
ixml_membuf_append_str( buf, "]]>" );
break;
case ePROCESSING_INSTRUCTION_NODE:
ixml_membuf_append_str( buf, "<?" );
ixml_membuf_append_str( buf, nodeName );
ixml_membuf_append_str( buf, " " );
ixml_membuf_append_str( buf, nodeValue );
copy_with_escape( buf, nodeValue );
ixml_membuf_append_str( buf, "?>\n" );
break;
@@ -122,10 +124,9 @@ ixmlPrintDomTreeRecursive( IN IXML_Node * nodeptr,
case eATTRIBUTE_NODE:
ixml_membuf_append_str( buf, nodeName );
ixml_membuf_append_str( buf, "=\"" );
if( nodeValue != NULL ) {
ixml_membuf_append_str( buf, nodeValue );
}
copy_with_escape( buf, nodeValue );
ixml_membuf_append_str( buf, "\"" );
if( nodeptr->nextSibling != NULL ) {
ixml_membuf_append_str( buf, " " );
ixmlPrintDomTreeRecursive( nodeptr->nextSibling, buf );
@@ -145,7 +146,7 @@ ixmlPrintDomTreeRecursive( IN IXML_Node * nodeptr,
if( ( child != NULL )
&& ( ixmlNode_getNodeType( child ) ==
eELEMENT_NODE ) ) {
ixml_membuf_append_str( buf, ">\n" );
ixml_membuf_append_str( buf, ">\r\n" );
} else {
ixml_membuf_append_str( buf, ">" );
}
@@ -163,7 +164,7 @@ ixmlPrintDomTreeRecursive( IN IXML_Node * nodeptr,
&& ixmlNode_getNodeType( sibling ) == eTEXT_NODE ) {
ixml_membuf_append_str( buf, ">" );
} else {
ixml_membuf_append_str( buf, ">\n" );
ixml_membuf_append_str( buf, ">\r\n" );
}
ixmlPrintDomTreeRecursive( ixmlNode_getNextSibling
( nodeptr ), buf );
@@ -187,15 +188,15 @@ void
ixmlPrintDomTree( IN IXML_Node * nodeptr,
IN ixml_membuf * buf )
{
char *nodeName = NULL;
char *nodeValue = NULL;
const char *nodeName = NULL;
const char *nodeValue = NULL;
IXML_Node *child = NULL;
if( ( nodeptr == NULL ) || ( buf == NULL ) ) {
return;
}
nodeName = ( char * )ixmlNode_getNodeName( nodeptr );
nodeName = ( const char * )ixmlNode_getNodeName( nodeptr );
nodeValue = ixmlNode_getNodeValue( nodeptr );
switch ( ixmlNode_getNodeType( nodeptr ) ) {
@@ -210,7 +211,7 @@ ixmlPrintDomTree( IN IXML_Node * nodeptr,
case eATTRIBUTE_NODE:
ixml_membuf_append_str( buf, nodeName );
ixml_membuf_append_str( buf, "=\"" );
ixml_membuf_append_str( buf, nodeValue );
copy_with_escape( buf, nodeValue );
ixml_membuf_append_str( buf, "\"" );
break;
@@ -226,7 +227,7 @@ ixmlPrintDomTree( IN IXML_Node * nodeptr,
child = ixmlNode_getFirstChild( nodeptr );
if( ( child != NULL )
&& ( ixmlNode_getNodeType( child ) == eELEMENT_NODE ) ) {
ixml_membuf_append_str( buf, ">\n" );
ixml_membuf_append_str( buf, ">\r\n" );
} else {
ixml_membuf_append_str( buf, ">" );
}
@@ -238,7 +239,7 @@ ixmlPrintDomTree( IN IXML_Node * nodeptr,
// Done with children. Output the end tag.
ixml_membuf_append_str( buf, "</" );
ixml_membuf_append_str( buf, nodeName );
ixml_membuf_append_str( buf, ">\n" );
ixml_membuf_append_str( buf, ">\r\n" );
break;
default:
@@ -258,15 +259,15 @@ void
ixmlDomTreetoString( IN IXML_Node * nodeptr,
IN ixml_membuf * buf )
{
char *nodeName = NULL;
char *nodeValue = NULL;
const char *nodeName = NULL;
const char *nodeValue = NULL;
IXML_Node *child = NULL;
if( ( nodeptr == NULL ) || ( buf == NULL ) ) {
return;
}
nodeName = ( char * )ixmlNode_getNodeName( nodeptr );
nodeName = ( const char * )ixmlNode_getNodeName( nodeptr );
nodeValue = ixmlNode_getNodeValue( nodeptr );
switch ( ixmlNode_getNodeType( nodeptr ) ) {
@@ -281,7 +282,7 @@ ixmlDomTreetoString( IN IXML_Node * nodeptr,
case eATTRIBUTE_NODE:
ixml_membuf_append_str( buf, nodeName );
ixml_membuf_append_str( buf, "=\"" );
ixml_membuf_append_str( buf, nodeValue );
copy_with_escape( buf, nodeValue );
ixml_membuf_append_str( buf, "\"" );
break;
@@ -324,7 +325,7 @@ ixmlDomTreetoString( IN IXML_Node * nodeptr,
*
*=================================================================*/
int
ixmlLoadDocumentEx( IN char *xmlFile,
ixmlLoadDocumentEx( IN const char *xmlFile,
IXML_Document ** doc )
{
@@ -342,7 +343,7 @@ ixmlLoadDocumentEx( IN char *xmlFile,
*
*=================================================================*/
IXML_Document *
ixmlLoadDocument( IN char *xmlFile )
ixmlLoadDocument( IN const char *xmlFile )
{
IXML_Document *doc = NULL;
@@ -371,7 +372,7 @@ ixmlPrintDocument(IXML_Document *doc)
}
ixml_membuf_init( buf );
ixml_membuf_append_str( buf, "<?xml version=\"1.0\"?>\n" );
ixml_membuf_append_str( buf, "<?xml version=\"1.0\"?>\r\n" );
ixmlPrintDomTree( rootNode, buf );
return buf->buf;
@@ -420,7 +421,7 @@ ixmlDocumenttoString(IXML_Document *doc)
}
ixml_membuf_init( buf );
ixml_membuf_append_str( buf, "<?xml version=\"1.0\"?>\n" );
ixml_membuf_append_str( buf, "<?xml version=\"1.0\"?>\r\n" );
ixmlDomTreetoString( rootNode, buf );
return buf->buf;
@@ -469,7 +470,7 @@ ixmlRelaxParser(char errorChar)
*
*=================================================================*/
int
ixmlParseBufferEx( IN char *buffer,
ixmlParseBufferEx( IN const char *buffer,
IXML_Document ** retDoc )
{
@@ -477,7 +478,7 @@ ixmlParseBufferEx( IN char *buffer,
return IXML_INVALID_PARAMETER;
}
if( strlen( buffer ) == 0 ) {
if( buffer[0] == '\0' ) {
return IXML_INVALID_PARAMETER;
}
@@ -491,7 +492,7 @@ ixmlParseBufferEx( IN char *buffer,
*
*=================================================================*/
IXML_Document *
ixmlParseBuffer( IN char *buffer )
ixmlParseBuffer( IN const char *buffer )
{
IXML_Document *doc = NULL;

View File

@@ -232,15 +232,30 @@ static BOOL Parser_ElementPrefixDefined( Parser * myParser,
IXML_Node * newNode,
char **nsURI );
static int Parser_setElementNamespace( IXML_Element * newElement,
char *nsURI );
const char *nsURI );
static int Parser_parseDocument( IXML_Document ** retDoc,
Parser * domParser );
static BOOL Parser_hasDefaultNamespace( Parser * xmlParser,
IXML_Node * newNode,
char **nsURI );
static int Parser_getChar( IN char *src,
static int Parser_getChar( IN const char *src,
INOUT int *cLen );
/*==============================================================================*
* safe_strdup
* strdup that handles NULL input.
*
*===============================================================================*/
static char *
safe_strdup(const char *s)
{
assert(s != NULL);
if (s == NULL) {
return strdup("");
}
return strdup(s);
}
/*==============================================================================*
* Parser_isCharInTable
* will determine whether character c is in the table of tbl
@@ -312,9 +327,9 @@ Parser_isNameChar( IN int c,
*
*===============================================================================*/
BOOL
Parser_isValidXmlName( IN DOMString name )
Parser_isValidXmlName( IN const DOMString name )
{
char *pstr = NULL;
const char *pstr = NULL;
int i = 0,
nameLen = 0;
@@ -325,7 +340,7 @@ Parser_isValidXmlName( IN DOMString name )
pstr = name;
if( Parser_isNameChar( *pstr, FALSE ) == TRUE ) {
for( i = 1; i < nameLen; i++ ) {
if( Parser_isNameChar( *( pstr + 1 ), TRUE ) == FALSE ) { //illegal char
if( Parser_isNameChar( *( pstr + i ), TRUE ) == FALSE ) { //illegal char
return FALSE;
}
}
@@ -419,11 +434,11 @@ Parser_intToUTF8( IN int c,
*
*===============================================================================*/
static int
Parser_UTF8ToInt( IN char *ss,
Parser_UTF8ToInt( IN const char *ss,
OUT int *len )
{
unsigned char *s = ( unsigned char * )ss;
const unsigned char *s = ( const unsigned char * )ss;
int c = *s;
if( c <= 127 ) { // if c<=127, c is just the character.
@@ -525,14 +540,14 @@ Parser_pushElement( IN Parser * xmlParser,
memset( pNewStackElement, 0, sizeof( IXML_ElementStack ) );
// the element member includes both prefix and name
pNewStackElement->element = strdup( newElement->nodeName );
pNewStackElement->element = safe_strdup( newElement->nodeName );
if( pNewStackElement->element == NULL ) {
free( pNewStackElement );
return IXML_INSUFFICIENT_MEMORY;
}
if( newElement->prefix != 0 ) {
pNewStackElement->prefix = strdup( newElement->prefix );
pNewStackElement->prefix = safe_strdup( newElement->prefix );
if( pNewStackElement->prefix == NULL ) {
Parser_freeElementStackItem( pNewStackElement );
free( pNewStackElement );
@@ -542,7 +557,7 @@ Parser_pushElement( IN Parser * xmlParser,
if( newElement->namespaceURI != 0 ) {
pNewStackElement->namespaceUri =
strdup( newElement->namespaceURI );
safe_strdup( newElement->namespaceURI );
if( pNewStackElement->namespaceUri == NULL ) {
Parser_freeElementStackItem( pNewStackElement );
free( pNewStackElement );
@@ -602,7 +617,7 @@ Parser_popElement( IN Parser * xmlParser )
*=================================================================*/
static int
Parser_readFileOrBuffer( IN Parser * xmlParser,
IN char *xmlFileName,
IN const char *xmlFileName,
IN BOOL file )
{
int fileSize = 0;
@@ -634,7 +649,7 @@ Parser_readFileOrBuffer( IN Parser * xmlParser,
fclose( xmlFilePtr );
}
} else {
xmlParser->dataBuffer = strdup( xmlFileName );
xmlParser->dataBuffer = safe_strdup( xmlFileName );
if( xmlParser->dataBuffer == NULL ) {
return IXML_INSUFFICIENT_MEMORY;
}
@@ -651,7 +666,7 @@ Parser_readFileOrBuffer( IN Parser * xmlParser,
*=================================================================*/
int
Parser_LoadDocument( OUT IXML_Document ** retDoc,
IN char *xmlFileName,
IN const char *xmlFileName,
IN BOOL file )
{
int rc = IXML_SUCCESS;
@@ -1117,10 +1132,10 @@ Parser_skipWhiteSpaces( IN Parser * xmlParser )
*
*===============================================================================*/
static int
Parser_getChar( IN char *src,
Parser_getChar( IN const char *src,
INOUT int *cLen )
{
char *pnum;
const char *pnum;
int sum;
char c;
int i;
@@ -1213,13 +1228,13 @@ fail_entity:
*===============================================================================*/
static int
Parser_copyToken( IN Parser * xmlParser,
IN char *src,
IN const char *src,
IN int len )
{
int i,
c,
cl;
char *psrc,
const char *psrc,
*pend;
utf8char uch;
@@ -1563,7 +1578,7 @@ Parser_getNextToken( IN Parser * xmlParser )
*===============================================================================*/
static char *
Parser_getNameSpace( IN Parser * xmlParser,
IN char *prefix )
IN const char *prefix )
{
IXML_ElementStack *pCur;
IXML_NamespaceURI *pNsUri;
@@ -1597,7 +1612,7 @@ Parser_addNamespace( IN Parser * xmlParser )
{
IXML_Node *pNode;
IXML_ElementStack *pCur;
char *namespaceUri;
const char *namespaceUri;
pNode = xmlParser->pNeedPrefixNode;
pCur = xmlParser->pCurElement;
@@ -1610,7 +1625,7 @@ Parser_addNamespace( IN Parser * xmlParser )
// it would be wrong that pNode->namespace != NULL.
assert( pNode->namespaceURI == NULL );
pNode->namespaceURI = strdup( pCur->namespaceUri );
pNode->namespaceURI = safe_strdup( pCur->namespaceUri );
if( pNode->namespaceURI == NULL ) {
return IXML_INSUFFICIENT_MEMORY;
}
@@ -1626,7 +1641,7 @@ Parser_addNamespace( IN Parser * xmlParser )
namespaceUri = Parser_getNameSpace( xmlParser, pCur->prefix );
if( namespaceUri != NULL ) {
pNode->namespaceURI = strdup( namespaceUri );
pNode->namespaceURI = safe_strdup( namespaceUri );
if( pNode->namespaceURI == NULL ) {
return IXML_INSUFFICIENT_MEMORY;
}
@@ -1661,7 +1676,7 @@ Parser_setNodePrefixAndLocalName( IN IXML_Node * node )
pStrPrefix = strchr( node->nodeName, ':' );
if( pStrPrefix == NULL ) {
node->prefix = NULL;
node->localName = strdup( node->nodeName );
node->localName = safe_strdup( node->nodeName );
if( node->localName == NULL ) {
return IXML_INSUFFICIENT_MEMORY;
}
@@ -1678,7 +1693,7 @@ Parser_setNodePrefixAndLocalName( IN IXML_Node * node )
memset( node->prefix, 0, nPrefix + 1 );
strncpy( node->prefix, node->nodeName, nPrefix );
node->localName = strdup( pLocalName );
node->localName = safe_strdup( pLocalName );
if( node->localName == NULL ) {
free( node->prefix );
node->prefix = NULL; //no need to free really, main loop will frees it
@@ -1718,7 +1733,7 @@ Parser_xmlNamespace( IN Parser * xmlParser,
}
///here it goes to segfault on "" when not copying
if(newNode->nodeValue){
pCur->namespaceUri = strdup( newNode->nodeValue );
pCur->namespaceUri = safe_strdup( newNode->nodeValue );
if( pCur->namespaceUri == NULL ) {
return IXML_INSUFFICIENT_MEMORY;
}
@@ -1738,7 +1753,7 @@ Parser_xmlNamespace( IN Parser * xmlParser,
if( ( pCur->prefix != NULL )
&& ( strcmp( pCur->prefix, newNode->localName ) == 0 ) ) {
pCur->namespaceUri = strdup( newNode->nodeValue );
pCur->namespaceUri = safe_strdup( newNode->nodeValue );
if( pCur->namespaceUri == NULL ) {
return IXML_INSUFFICIENT_MEMORY;
}
@@ -1765,13 +1780,13 @@ Parser_xmlNamespace( IN Parser * xmlParser,
}
memset( pNewNs, 0, sizeof( IXML_NamespaceURI ) );
pNewNs->prefix = strdup( newNode->localName );
pNewNs->prefix = safe_strdup( newNode->localName );
if( pNewNs->prefix == NULL ) {
free( pNewNs );
return IXML_INSUFFICIENT_MEMORY;
}
pNewNs->nsURI = strdup( newNode->nodeValue );
pNewNs->nsURI = safe_strdup( newNode->nodeValue );
if( pNewNs->nsURI == NULL ) {
Parser_freeNsURI( pNewNs );
free( pNewNs );
@@ -1789,7 +1804,7 @@ Parser_xmlNamespace( IN Parser * xmlParser,
free( pNs->nsURI );
}
pNs->nsURI = strdup( newNode->nodeValue );
pNs->nsURI = safe_strdup( newNode->nodeValue );
if( pNs->nsURI == NULL ) {
return IXML_INSUFFICIENT_MEMORY;
}
@@ -1826,7 +1841,7 @@ Parser_processSTag( IN Parser * xmlParser,
pCurToken = ( xmlParser->tokenBuf ).buf;
if( pCurToken != NULL ) {
node->nodeName = strdup( pCurToken );
node->nodeName = safe_strdup( pCurToken );
if( node->nodeName == NULL ) {
return IXML_INSUFFICIENT_MEMORY;
}
@@ -1977,7 +1992,7 @@ Parser_processCDSect( IN char **pSrc,
strncpy( node->nodeValue, pCDataStart, tokenLength );
node->nodeValue[tokenLength] = '\0';
node->nodeName = strdup( CDATANODENAME );
node->nodeName = safe_strdup( CDATANODENAME );
if( node->nodeName == NULL ) {
// no need to free node->nodeValue at all, bacause node contents
// will be freed by the main loop.
@@ -2002,13 +2017,13 @@ Parser_processCDSect( IN char **pSrc,
*===============================================================================*/
static int
Parser_setElementNamespace( IN IXML_Element * newElement,
IN char *nsURI )
IN const char *nsURI )
{
if( newElement != NULL ) {
if( newElement->n.namespaceURI != NULL ) {
return IXML_SYNTAX_ERR;
} else {
( newElement->n ).namespaceURI = strdup( nsURI );
( newElement->n ).namespaceURI = safe_strdup( nsURI );
if( ( newElement->n ).namespaceURI == NULL ) {
return IXML_INSUFFICIENT_MEMORY;
}
@@ -2107,7 +2122,7 @@ Parser_processContent( IN Parser * xmlParser,
pCurToken = ( xmlParser->tokenBuf ).buf;
if( pCurToken != NULL ) {
node->nodeValue = strdup( pCurToken );
node->nodeValue = safe_strdup( pCurToken );
if( node->nodeValue == NULL ) {
return IXML_INSUFFICIENT_MEMORY;
}
@@ -2115,7 +2130,7 @@ Parser_processContent( IN Parser * xmlParser,
return IXML_SYNTAX_ERR;
}
node->nodeName = strdup( TEXTNODENAME );
node->nodeName = safe_strdup( TEXTNODENAME );
if( node->nodeName == NULL ) {
return IXML_SYNTAX_ERR;
}
@@ -2152,7 +2167,7 @@ Parser_processETag( IN Parser * xmlParser,
if( pCurToken == NULL ) {
return IXML_SYNTAX_ERR;
}
node->nodeName = strdup( pCurToken );
node->nodeName = safe_strdup( pCurToken );
if( node->nodeName == NULL ) {
return IXML_INSUFFICIENT_MEMORY;
}
@@ -2320,7 +2335,7 @@ Parser_processAttribute( IN Parser * xmlParser,
return IXML_SYNTAX_ERR;
}
// copy in the attribute name
node->nodeName = strdup( pCurToken );
node->nodeName = safe_strdup( pCurToken );
if( node->nodeName == NULL ) {
return IXML_INSUFFICIENT_MEMORY;
}
@@ -2373,7 +2388,7 @@ Parser_processAttribute( IN Parser * xmlParser,
pCurToken = ( xmlParser->tokenBuf ).buf;
if( pCurToken != NULL ) { // attribute has value, like a="c"
node->nodeValue = strdup( pCurToken );
node->nodeValue = safe_strdup( pCurToken );
if( node->nodeValue == NULL ) {
return IXML_INSUFFICIENT_MEMORY;
}
@@ -2456,7 +2471,7 @@ Parser_getNextNode( IN Parser * xmlParser,
goto ErrorHandler;
}
node->nodeName = strdup( lastElement );
node->nodeName = safe_strdup( lastElement );
if( node->nodeName == NULL ) {
return IXML_INSUFFICIENT_MEMORY;
}

View File

@@ -41,7 +41,7 @@
*=================================================================*/
unsigned long
ixmlNamedNodeMap_getItemNumber( IN IXML_NamedNodeMap * nnMap,
IN char *name )
IN const char *name )
{
IXML_Node *tempNode;
unsigned long returnItemNo = 0;
@@ -92,7 +92,7 @@ ixmlNamedNodeMap_init( IN IXML_NamedNodeMap * nnMap )
*=================================================================*/
IXML_Node *
ixmlNamedNodeMap_getNamedItem( IN IXML_NamedNodeMap * nnMap,
IN char *name )
IN const char *name )
{
long index;

View File

@@ -175,7 +175,7 @@ ixmlNode_getLocalName( IN IXML_Node * nodeptr )
*=================================================================*/
int
ixmlNode_setNamespaceURI( IN IXML_Node * nodeptr,
IN char *namespaceURI )
IN const char *namespaceURI )
{
if( nodeptr == NULL ) {
@@ -207,7 +207,7 @@ ixmlNode_setNamespaceURI( IN IXML_Node * nodeptr,
*=================================================================*/
int
ixmlNode_setPrefix( IN IXML_Node * nodeptr,
IN char *prefix )
IN const char *prefix )
{
if( nodeptr == NULL ) {
@@ -240,7 +240,7 @@ ixmlNode_setPrefix( IN IXML_Node * nodeptr,
*=================================================================*/
int
ixmlNode_setLocalName( IN IXML_Node * nodeptr,
IN char *localName )
IN const char *localName )
{
assert( nodeptr != NULL );
@@ -288,10 +288,10 @@ ixmlNode_getNamespaceURI( IN IXML_Node * nodeptr )
* the prefix of the node.
*
*=================================================================*/
DOMString
const DOMString
ixmlNode_getPrefix( IN IXML_Node * nodeptr )
{
DOMString prefix = NULL;
const DOMString prefix = NULL;
if( nodeptr != NULL ) {
prefix = nodeptr->prefix;
@@ -309,7 +309,7 @@ ixmlNode_getPrefix( IN IXML_Node * nodeptr )
* the nodeValue of the node.
*
*=================================================================*/
DOMString
const DOMString
ixmlNode_getNodeValue( IN IXML_Node * nodeptr )
{
@@ -330,7 +330,7 @@ ixmlNode_getNodeValue( IN IXML_Node * nodeptr )
*=================================================================*/
int
ixmlNode_setNodeValue( IN IXML_Node * nodeptr,
IN char *newNodeValue )
IN const char *newNodeValue )
{
int rc = IXML_SUCCESS;
@@ -1425,7 +1425,7 @@ ixmlNode_hasAttributes( IXML_Node * nodeptr )
*=================================================================*/
void
ixmlNode_getElementsByTagNameRecursive( IN IXML_Node * n,
IN char *tagname,
IN const char *tagname,
OUT IXML_NodeList ** list )
{
const char *name;
@@ -1457,7 +1457,7 @@ ixmlNode_getElementsByTagNameRecursive( IN IXML_Node * n,
*=================================================================*/
void
ixmlNode_getElementsByTagName( IN IXML_Node * n,
IN char *tagname,
IN const char *tagname,
OUT IXML_NodeList ** list )
{
const char *name;
@@ -1484,8 +1484,8 @@ ixmlNode_getElementsByTagName( IN IXML_Node * n,
*=================================================================*/
void
ixmlNode_getElementsByTagNameNSRecursive( IN IXML_Node * n,
IN char *namespaceURI,
IN char *localName,
IN const char *namespaceURI,
IN const char *localName,
OUT IXML_NodeList ** list )
{
const DOMString nsURI;
@@ -1525,8 +1525,8 @@ ixmlNode_getElementsByTagNameNSRecursive( IN IXML_Node * n,
*=================================================================*/
void
ixmlNode_getElementsByTagNameNS( IN IXML_Node * n,
IN char *namespaceURI,
IN char *localName,
IN const char *namespaceURI,
IN const char *localName,
OUT IXML_NodeList ** list )
{
const DOMString nsURI;
@@ -1560,7 +1560,7 @@ ixmlNode_getElementsByTagNameNS( IN IXML_Node * n,
*=================================================================*/
int
ixmlNode_setNodeName( IN IXML_Node * node,
IN DOMString qualifiedName )
IN const DOMString qualifiedName )
{
int rc = IXML_SUCCESS;

View File

@@ -1,15 +1,14 @@
Version: 1.4.1
Version: 1.4.2
Summary: Universal Plug and Play (UPnP) SDK
Name: libupnp
Release: 1%{?dist}
License: BSD
Group: System Environment/Libraries
URL: http://www.libupnp.org/
Source: http://puzzle.dl.sourceforge.net/sourceforge/pupnp/%{name}-%{version}.tar.gz
Source: http://puzzle.dl.sourceforge.net/sourceforge/pupnp/%{name}-%{version}.tar.bz2
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
%define docdir %{_docdir}/%{name}-%{version}-%{release}
%define docdeveldir %{_docdir}/%{name}-devel-%{version}-%{release}
%define docdeveldir %{_docdir}/%{name}-devel-%{version}
%description
The Universal Plug and Play (UPnP) SDK for Linux provides
@@ -29,7 +28,7 @@ the UPnP SDK libraries.
%setup -q
%build
%configure --with-docdir=%{docdir}/
%configure --with-documentation
make %{?_smp_mflags}
%install
@@ -78,6 +77,9 @@ make install DESTDIR=$RPM_BUILD_ROOT
rm -rf %{buildroot}
%changelog
* Fri Feb 02 2007 Eric Tanguy <eric.tanguy@univ-nantes.fr> - 1.4.2-1
- Update to version 1.4.2
* Wed Jul 05 2006 Eric Tanguy <eric.tanguy@univ-nantes.fr> - 1.4.1-1
- Update to version 1.4.1
@@ -117,3 +119,4 @@ rm -rf %{buildroot}
* Thu Dec 22 2005 Eric Tanguy 1.2.1a-1
- Modify spec file from
http://rpm.pbone.net/index.php3/stat/4/idpl/2378737/com/libupnp-1.2.1a_DSM320-3.i386.rpm.html

View File

@@ -61,32 +61,33 @@ typedef enum priority {LOW_PRIORITY,
#define DEFAULT_JOBS_PER_THREAD 10 //default jobs per thread used by TPAttrInit
#define DEFAULT_STARVATION_TIME 500 //default starvation time used by TPAttrInit
#define DEFAULT_IDLE_TIME 10 * 1000 //default idle time used by TPAttrInit
#define DEFAULT_FREE_ROUTINE NULL //default free routine used TPJobInit
#define DEFAULT_FREE_ROUTINE NULL //default free routine used TPJobInit
#define DEFAULT_MAX_JOBS_TOTAL 100 //default max jobs used TPAttrInit
#define STATS 1 //always include stats because code change is minimal
//Statistics
//Statistics
#ifdef WIN32 // todo: check why STATSONLY fails during compilation
#undef STATS
#endif
#ifdef STATS
#define STATSONLY(x) x
#define STATSONLY(x) x
#else
#define STATSONLY(x)
#define STATSONLY(x)
#endif
#ifdef _DEBUG
#define DEBUG 1
#define DEBUG 1
#endif
//DEBUGGING
#ifndef WIN32
#ifdef DEBUG
#define DBGONLY(x) x
#define DBGONLY(x) x
#else
#define DBGONLY(x)
#define DBGONLY(x)
#endif
#endif
@@ -97,7 +98,7 @@ typedef enum priority {LOW_PRIORITY,
#include "ithread.h"
#include <errno.h>
#include <sys/timeb.h>
#define EXPORT
#define EXPORT
typedef int PolicyType;
#define DEFAULT_POLICY SCHED_OTHER
#define DEFAULT_SCHED_PARAM 0 //default priority
@@ -114,28 +115,30 @@ typedef void (*free_routine)(void *arg);
* Name: ThreadPoolAttr
*
* Description:
* Attributes for thread pool. Used to set and change parameters of
* Attributes for thread pool. Used to set and change parameters of
* thread pool
*****************************************************************************/
typedef struct THREADPOOLATTR
{
int minThreads; //minThreads, ThreadPool will always maintain at least
//this many threads
int maxThreads; //maxThreads, ThreadPool will never have more than this
//number of threads
int maxIdleTime; //maxIdleTime (in milliseconds)
// this is the maximum time a thread will remain idle
// before dying
int minThreads; // minThreads, ThreadPool will always maintain at least
// this many threads
int jobsPerThread; //jobs per thread to maintain
int starvationTime; //the time a low priority or med priority
//job waits before getting bumped
//up a priority (in milliseconds)
PolicyType schedPolicy; //scheduling policy to use
int maxThreads; // maxThreads, ThreadPool will never have more than this
// number of threads
int maxIdleTime; // maxIdleTime (in milliseconds)
// this is the maximum time a thread will remain idle
// before dying
int jobsPerThread; // jobs per thread to maintain
int maxJobsTotal; // maximum number of jobs that can be queued totally.
int starvationTime; // the time a low priority or med priority
// job waits before getting bumped
// up a priority (in milliseconds)
PolicyType schedPolicy; // scheduling policy to use
} ThreadPoolAttr;
@@ -152,7 +155,7 @@ typedef struct THREADPOOLJOB
free_routine free_func; //free function
struct timeb requestTime; //time of request
int priority; //priority of request
int jobId; //id
int jobId; //id
} ThreadPoolJob;
/****************************************************************************
@@ -168,20 +171,20 @@ typedef struct TPOOLSTATS
{
double totalTimeHQ; //total time spent by all jobs in high priority Q
int totalJobsHQ; //total jobs in HQ run so far
double avgWaitHQ; //average wait in HQ
double avgWaitHQ; //average wait in HQ
double totalTimeMQ; //total time spent by all jobs in med priority Q
int totalJobsMQ; //total jobs in MQ run so far
double avgWaitMQ; //average wait in MQ
double totalTimeLQ; //total time spent by all jobs in low priority Q
int totalJobsLQ; //total jobs in LQ run so far
double avgWaitLQ; //average wait in LQ
double avgWaitLQ; //average wait in LQ
double totalWorkTime; //total time spent working for all threads
double totalIdleTime; //total time spent idle for all threads
int workerThreads; //number of current workerThreads
int idleThreads; //number of current idle threads
int persistentThreads; //number of persistent threads
int totalThreads; //total number of current threads
int maxThreads; //max threads so far
int maxThreads; //max threads so far
int currentJobsHQ; // current jobs in Q
int currentJobsLQ; //current jobs in Q
int currentJobsMQ; //current jobs in Q
@@ -521,6 +524,19 @@ int TPAttrSetStarvationTime(ThreadPoolAttr *attr, int starvationTime);
int TPAttrSetSchedPolicy(ThreadPoolAttr *attr, PolicyType schedPolicy);
/****************************************************************************
* Function: TPAttrSetMaxJobsTotal
*
* Description:
* Sets the maximum number jobs that can be qeued totally.
* Parameters:
* attr - must be valid thread pool attributes.
* maxJobsTotal - maximum number of jobs
* Returns:
* Always returns 0.
*****************************************************************************/
int TPAttrSetMaxJobsTotal(ThreadPoolAttr *attr, int maxJobsTotal);
/****************************************************************************
* Function: ThreadPoolGetStats
*

View File

@@ -47,11 +47,25 @@ extern "C" {
#include <unistd.h>
#endif
#ifdef __FreeBSD__
#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
#endif
#ifdef PTHREAD_MUTEX_RECURSIVE
/* This system has SuS2-compliant mutex attributes.
* E.g. on Cygwin, where we don't have the old nonportable (NP) symbols
*/
#define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_NORMAL
#define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK
#else
#define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_FAST_NP
#define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE_NP
#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK_NP
#endif
#define ITHREAD_CANCELED PTHREAD_CANCELED
/***************************************************************************
* Name: ithread_t
@@ -181,8 +195,11 @@ extern "C" {
* Returns EINVAL if the kind is not supported.
* See man page for pthread_mutexattr_setkind_np
*****************************************************************************/
#ifdef PTHREAD_MUTEX_RECURSIVE
#define ithread_mutexattr_setkind_np pthread_mutexattr_settype
#else
#define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np
#endif
/****************************************************************************
* Function: ithread_mutexattr_getkind_np
@@ -203,7 +220,11 @@ extern "C" {
* Always returns 0.
* See man page for pthread_mutexattr_getkind_np
*****************************************************************************/
#ifdef PTHREAD_MUTEX_RECURSIVE
#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype
#else
#define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np
#endif
/****************************************************************************
@@ -527,19 +548,25 @@ extern "C" {
#define imillisleep(x) usleep(1000*x)
#ifdef WIN32
#ifdef LIBUPNP_EXPORTS
// set up declspec for dll export to make functions visible to library users
#define EXPORT_SPEC __declspec(dllexport)
#ifndef UPNP_STATIC_LIB
#ifdef LIBUPNP_EXPORTS
// set up declspec for dll export to make functions visible to library users
#define EXPORT_SPEC __declspec(dllexport)
#else
#define EXPORT_SPEC __declspec(dllimport)
#endif
#else
#define EXPORT_SPEC __declspec(dllimport)
#define EXPORT_SPEC
#endif
#else
#define EXPORT_SPEC
#endif
#ifndef PTHREAD_MUTEX_RECURSIVE
//NK: Added for satisfying the gcc compiler
EXPORT_SPEC int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind);
#endif
#ifdef __cplusplus
}

View File

@@ -34,9 +34,7 @@
#include <assert.h>
#include <stdlib.h>
#ifdef STATS
#include <stdio.h>
#endif
/****************************************************************************
* Function: CmpThreadPoolJob
@@ -92,6 +90,10 @@ FreeThreadPoolJob( ThreadPool * tp,
static int
SetPolicyType( PolicyType in )
{
#ifdef __CYGWIN__
/* TODO not currently working... */
return 0;
#else
#ifdef WIN32
return sched_setscheduler( 0, in);
#else
@@ -101,6 +103,7 @@ SetPolicyType( PolicyType in )
current.sched_priority = DEFAULT_SCHED_PARAM;
return sched_setscheduler( 0, in, &current );
#endif
#endif
}
/****************************************************************************
@@ -289,7 +292,8 @@ SetRelTimeout( struct timespec *time,
* Parameters:
* ThreadPoolStats *stats must be valid non null stats structure
*****************************************************************************/
STATSONLY( static void StatsInit( ThreadPoolStats * stats ) {
#ifdef STATS
static void StatsInit( ThreadPoolStats * stats ) {
assert( stats != NULL ); stats->totalIdleTime = 0; stats->totalJobsHQ = 0; stats->totalJobsLQ = 0; stats->totalJobsMQ = 0; stats->totalTimeHQ = 0; stats->totalTimeMQ = 0; stats->totalTimeLQ = 0; stats->totalWorkTime = 0; stats->totalIdleTime = 0; stats->avgWaitHQ = 0; //average wait in HQ
stats->avgWaitMQ = 0; //average wait in MQ
stats->avgWaitLQ = 0;
@@ -297,7 +301,7 @@ STATSONLY( static void StatsInit( ThreadPoolStats * stats ) {
stats->idleThreads = 0;
stats->persistentThreads = 0;
stats->maxThreads = 0; stats->totalThreads = 0;}
)
#endif
/****************************************************************************
* Function: CalcWaitTime
@@ -313,7 +317,8 @@ STATSONLY( static void StatsInit( ThreadPoolStats * stats ) {
* ThreadPriority p
* ThreadPoolJob *job
*****************************************************************************/
STATSONLY( static void CalcWaitTime( ThreadPool * tp,
#ifdef STATS
static void CalcWaitTime( ThreadPool * tp,
ThreadPriority p,
ThreadPoolJob * job ) {
struct timeb now;
@@ -329,7 +334,7 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
assert( 0 );}
}
)
#endif
/****************************************************************************
* Function: SetSeed
@@ -380,6 +385,12 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
int retCode = 0;
int persistent = -1;
ThreadPool *tp = ( ThreadPool * ) arg;
//leuk_he allow static linking
#ifdef WIN32
#ifdef PTW32_STATIC_LIB
pthread_win32_thread_attach_np();
#endif
#endif
assert( tp != NULL );
@@ -447,7 +458,12 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
tp->totalThreads--;
ithread_cond_broadcast( &tp->start_and_shutdown );
ithread_mutex_unlock( &tp->mutex );
//leuk_he
#ifdef WIN32
#ifdef PTW32_STATIC_LIB
pthread_win32_thread_detach_np ();
#endif
#endif
return NULL;
}
@@ -476,6 +492,12 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
ithread_cond_broadcast( &tp->start_and_shutdown );
ithread_mutex_unlock( &tp->mutex );
//leuk_he
#ifdef WIN32
#ifdef PTW32_STATIC_LIB
pthread_win32_thread_detach_np ();
#endif
#endif
return NULL;
} else {
@@ -703,6 +725,12 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
if( tp == NULL ) {
return EINVAL;
}
//leuk_he
#ifdef WIN32
#ifdef PTW32_STATIC_LIB
pthread_win32_process_attach_np();
#endif
#endif
retCode += ithread_mutex_init( &tp->mutex, NULL );
assert( retCode == 0 );
@@ -881,6 +909,7 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
int rc = EOUTOFMEM;
int tempId = -1;
int totalJobs;
ThreadPoolJob *temp = NULL;
@@ -897,6 +926,13 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
|| ( job->priority == MED_PRIORITY )
|| ( job->priority == HIGH_PRIORITY ) );
totalJobs = tp->highJobQ.size + tp->lowJobQ.size + tp->medJobQ.size;
if (totalJobs >= tp->attr.maxJobsTotal) {
fprintf(stderr, "total jobs = %d, too many jobs", totalJobs);
ithread_mutex_unlock( &tp->mutex );
return rc;
}
if( jobId == NULL )
jobId = &tempId;
@@ -1242,6 +1278,7 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
attr->minThreads = DEFAULT_MIN_THREADS;
attr->schedPolicy = DEFAULT_POLICY;
attr->starvationTime = DEFAULT_STARVATION_TIME;
attr->maxJobsTotal = DEFAULT_MAX_JOBS_TOTAL;
return 0;
}
@@ -1461,7 +1498,8 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
return 0;
}
STATSONLY( void ThreadPoolPrintStats( ThreadPoolStats * stats ) {
#ifdef STATS
void ThreadPoolPrintStats( ThreadPoolStats * stats ) {
assert( stats != NULL ); if( stats == NULL ) {
return;}
@@ -1471,13 +1509,13 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
printf( "ThreadPoolStats at Time: %ld\n", time( NULL ) );
#endif
printf
( "Average Wait in High Priority Q in milliseconds: %lf\n",
( "Average Wait in High Priority Q in milliseconds: %f\n",
stats->avgWaitHQ );
printf
( "Average Wait in Med Priority Q in milliseconds: %lf\n",
( "Average Wait in Med Priority Q in milliseconds: %f\n",
stats->avgWaitMQ );
printf
( "Averate Wait in Low Priority Q in milliseconds: %lf\n",
( "Averate Wait in Low Priority Q in milliseconds: %f\n",
stats->avgWaitLQ );
printf( "Max Threads Active: %d\n", stats->maxThreads );
printf( "Current Worker Threads: %d\n",
@@ -1486,11 +1524,34 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
stats->persistentThreads );
printf( "Current Idle Threads: %d\n", stats->idleThreads );
printf( "Total Threads : %d\n", stats->totalThreads );
printf( "Total Time spent Working in seconds: %lf\n",
printf( "Total Time spent Working in seconds: %f\n",
stats->totalWorkTime );
printf( "Total Time spent Idle in seconds : %lf\n",
printf( "Total Time spent Idle in seconds : %f\n",
stats->totalIdleTime );}
)
#endif
/****************************************************************************
* Function: TPAttrSetMaxJobsTotal
*
* Description:
* Sets the maximum number jobs that can be qeued totally.
* Parameters:
* attr - must be valid thread pool attributes.
* maxJobsTotal - maximum number of jobs
* Returns:
* Always returns 0.
*****************************************************************************/
int TPAttrSetMaxJobsTotal( ThreadPoolAttr * attr,
int maxJobsTotal ) {
assert( attr != NULL );
if( attr == NULL ) {
return EINVAL;
}
attr->maxJobsTotal = maxJobsTotal;
return 0;
}
/****************************************************************************
* Function: ThreadPoolGetStats
@@ -1505,7 +1566,8 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
* Returns:
* Always returns 0.
*****************************************************************************/
STATSONLY( int
#ifdef STATS
int
ThreadPoolGetStats( ThreadPool * tp,
ThreadPoolStats * stats ) {
@@ -1542,4 +1604,4 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
return 0;}
)
#endif

View File

@@ -132,8 +132,7 @@ upnp_tv_ctrlpt_SOURCES = \
sample/tvctrlpt/upnp_tv_ctrlpt.h \
sample/tvctrlpt/linux/upnp_tv_ctrlpt_main.c
if WITH_DOCDIR
docdir = @DOCDIR@
if WITH_DOCUMENTATION
examplesdir = $(docdir)/examples
examples_DATA = $(upnp_tv_ctrlpt_SOURCES) $(upnp_tv_device_SOURCES)
endif
@@ -150,7 +149,10 @@ EXTRA_DIST = LICENSE \
sample/tvdevice/web/tvcontrolSCPD.xml \
sample/tvdevice/web/tvdevicedesc.xml \
sample/tvdevice/web/tvdevicepres.html \
sample/tvdevice/web/tvpictureSCPD.xml
sample/tvdevice/web/tvpictureSCPD.xml \
src/inc/inet_pton.h \
src/inet_pton.c \
src/win_dll.c

View File

@@ -36,6 +36,14 @@
//@{
#if defined MYLIB_LARGEFILE_SENSITIVE && _FILE_OFFSET_BITS+0 != 64
#if defined __GNUC__
#warning libupnp requires largefile mode - use AC_SYS_LARGEFILE
#else
#error libupnp requires largefile mode - use AC_SYS_LARGEFILE
#endif
#endif
#include <stdio.h>
#ifdef __FreeBSD__
#include <time.h>
@@ -47,11 +55,21 @@
#endif
#ifdef WIN32
#ifdef LIBUPNP_EXPORTS
// set up declspec for dll export to make functions visible to library users
#define EXPORT_SPEC __declspec(dllexport)
#ifndef UPNP_STATIC_LIB
#ifdef LIBUPNP_EXPORTS
// set up declspec for dll export to make functions visible to library users
#define EXPORT_SPEC __declspec(dllexport)
#else
#define EXPORT_SPEC __declspec(dllimport)
#endif
#else
#define EXPORT_SPEC __declspec(dllimport)
#define EXPORT_SPEC
#endif
#ifdef UPNP_USE_MSVCPP // define some things the M$ VC++ doesn't knows
typedef __int64 int64_t;
#endif
#ifdef UPNP_USE_BCBPP // define some things Borland Builder doesn't knows
typedef __int64 int64_t;
#endif
#else
#define EXPORT_SPEC
@@ -61,6 +79,7 @@
#define UpnpCloseSocket close
#else
#define UpnpCloseSocket closesocket
#define fseeko fseek
#endif
#define UPNP_SOCKETERROR -1
#define UPNP_INVALID_SOCKET -1
@@ -75,6 +94,8 @@
#include <time.h>
#endif
#include <sys/types.h>
#define NUM_HANDLE 200
#define LINE_SIZE 180
#define NAME_SIZE 256
@@ -871,7 +892,7 @@ struct File_Info
/** The length of the file. A length less than 0 indicates the size
* is unknown, and data will be sent until 0 bytes are returned from
* a read call. */
int file_length;
off_t file_length;
/** The time at which the contents of the file was modified;
* The time system is always local (not GMT). */
@@ -965,7 +986,7 @@ struct UpnpVirtualDirCallbacks
int (*seek) (
IN UpnpWebFileHandle fileHnd, /** The handle of the file to move the
file pointer. */
IN long offset, /** The number of bytes to move in the
IN off_t offset, /** The number of bytes to move in the
file. Positive values move foward and
negative values move backward. Note
that this must be positive if the
@@ -2703,4 +2724,3 @@ EXPORT_SPEC void UpnpFree(
//@} The API
#endif

View File

@@ -1974,9 +1974,7 @@ TvDeviceStart( char *ip_address,
ip_address = UpnpGetServerIpAddress( );
}
if( port == 0 ) {
port = UpnpGetServerPort( );
}
SampleUtil_Print( "UPnP Initialized\n \t ipaddress= %s port = %d\n",
ip_address, port );

View File

@@ -207,6 +207,11 @@ int UpnpInit( IN const char *HostIP,
( UPNP_INFO, API, __FILE__, __LINE__, "Inside UpnpInit \n" );
)
//initialize mutex
#ifdef __CYGWIN__
/* On Cygwin, pthread_mutex_init() fails without this memset. */
/* TODO: Fix Cygwin so we don't need this memset(). */
memset(&GlobalHndMutex, 0, sizeof(GlobalHndMutex));
#endif
if( ithread_mutex_init( &GlobalHndMutex, NULL ) != 0 ) {
return UPNP_E_INIT_FAILED;
}
@@ -244,6 +249,7 @@ int UpnpInit( IN const char *HostIP,
TPAttrSetMinThreads( &attr, MIN_THREADS );
TPAttrSetJobsPerThread( &attr, JOBS_PER_THREAD );
TPAttrSetIdleTime( &attr, THREAD_IDLE_TIME );
TPAttrSetMaxJobsTotal( &attr, MAX_JOBS_TOTAL );
if( ThreadPoolInit( &gSendThreadPool, &attr ) != UPNP_E_SUCCESS ) {
UpnpSdkInit = 0;
@@ -415,6 +421,13 @@ UpnpFinish( )
// remove all virtual dirs
UpnpRemoveAllVirtualDirs( );
//leuk_he allow static linking:
#ifdef WIN32
#ifdef PTW32_STATIC_LIB
pthread_win32_thread_detach_np ();
#endif
#endif
UpnpSdkInit = 0;
@@ -948,7 +961,7 @@ GetDescDocumentAndURL( IN Upnp_DescType descriptionType,
char aliasStr[LINE_SIZE];
char *temp_str = NULL;
FILE *fp = NULL;
unsigned fileLen;
off_t fileLen;
unsigned num_read;
time_t last_modified;
struct stat file_info;
@@ -3332,19 +3345,20 @@ UpnpDownloadXmlDoc( const char *url,
return ret_code;
}
/* TODO: MoNKi: Do not check this?? Some routers (Linksys WRT54GS) sends
"CONTENT-TYPE: application/octet-stream". If the data sended is not
an xml file, ixmlParseBufferEx will fail and the function will return
UPNP_E_INVALID_DESC too.*/
if( strncasecmp( content_type, "text/xml", strlen( "text/xml" ) ) ) {
DBGONLY(
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, "Not text/xml\n" );
)
// Linksys WRT54G router returns
// "CONTENT-TYPE: application/octet-stream".
// Let's be nice to Linksys and try to parse document anyway.
// If the data sended is not a xml file, ixmlParseBufferEx
// will fail and the function will return UPNP_E_INVALID_DESC too.
#if 0
free( xml_buf );
DBGONLY( UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
"Not text/xml\n" );
)
return UPNP_E_INVALID_DESC;
return UPNP_E_INVALID_DESC;
#endif
}
// end of TODO Do not check this
ret_code = ixmlParseBufferEx( xml_buf, xmlDoc );
free( xml_buf );
@@ -3704,8 +3718,6 @@ FreeHandle( int Upnp_Handle )
} /****************** End of FreeHandle *********************/
// **DBG****************************************************
DBGONLY(
/**************************************************************************
* Function: PrintHandleInfo
@@ -3719,56 +3731,61 @@ DBGONLY(
* Return Values: int
* UPNP_E_SUCCESS if successful else return appropriate error
***************************************************************************/
int PrintHandleInfo( IN UpnpClient_Handle Hnd ) {
struct Handle_Info * HndInfo; if( HandleTable[Hnd] != NULL ) {
HndInfo = HandleTable[Hnd];
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Printing information for Handle_%d\n",
Hnd );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"HType_%d\n", HndInfo->HType );
DEVICEONLY(
if( HndInfo->HType !=
HND_CLIENT ) UpnpPrintf( UPNP_ALL, API, __FILE__,
__LINE__, "DescURL_%s\n",
HndInfo->DescURL ); )
)
}
else
{
return UPNP_E_INVALID_HANDLE;}
int PrintHandleInfo( IN UpnpClient_Handle Hnd )
{
struct Handle_Info * HndInfo;
if (HandleTable[Hnd] != NULL) {
HndInfo = HandleTable[Hnd];
DBGONLY(
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
"Printing information for Handle_%d\n", Hnd);
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
"HType_%d\n", HndInfo->HType);
DEVICEONLY(
if(HndInfo->HType != HND_CLIENT)
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"DescURL_%s\n", HndInfo->DescURL );
)
)
} else {
return UPNP_E_INVALID_HANDLE;
}
return UPNP_E_SUCCESS;
}
return UPNP_E_SUCCESS;}
/****************** End of PrintHandleInfo *********************/
void printNodes( IXML_Node * tmpRoot, int depth ) {
int i;
IXML_NodeList * NodeList1;
IXML_Node * ChildNode1;
unsigned short NodeType;
DOMString NodeValue;
const DOMString NodeName;
NodeList1 = ixmlNode_getChildNodes( tmpRoot );
for( i = 0; i < 100; i++ ) {
ChildNode1 = ixmlNodeList_item( NodeList1, i );
if( ChildNode1 == NULL ) {
break;}
void printNodes( IXML_Node * tmpRoot, int depth )
{
int i;
IXML_NodeList *NodeList1;
IXML_Node *ChildNode1;
unsigned short NodeType;
const DOMString NodeValue;
const DOMString NodeName;
NodeList1 = ixmlNode_getChildNodes(tmpRoot);
for (i = 0; i < 100; ++i) {
ChildNode1 = ixmlNodeList_item(NodeList1, i);
if (ChildNode1 == NULL) {
break;
}
printNodes(ChildNode1, depth+1);
NodeType = ixmlNode_getNodeType(ChildNode1);
NodeValue = ixmlNode_getNodeValue(ChildNode1);
NodeName = ixmlNode_getNodeName(ChildNode1);
DBGONLY(
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
"DEPTH-%2d-IXML_Node Type %d, "
"IXML_Node Name: %s, IXML_Node Value: %s\n",
depth, NodeType, NodeName, NodeValue);
)
}
}
printNodes( ChildNode1, depth + 1 );
NodeType = ixmlNode_getNodeType( ChildNode1 );
NodeValue = ixmlNode_getNodeValue( ChildNode1 );
NodeName = ixmlNode_getNodeName( ChildNode1 );
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"DEPTH-%2d-IXML_Node Type %d, "
"IXML_Node Name: %s, IXML_Node Value: %s\n",
depth, NodeType, NodeName, NodeValue ); )
}
}
/****************** End of printNodes *********************/
) // dbgonly
//********************************************************
//* Name: getlocalhostname
//* Description: Function to get local IP address

View File

@@ -196,11 +196,12 @@ addToAction( IN int response,
if( response ) {
sprintf( ActBuff,
"<u:%sResponse xmlns:u=\"%s\"></u:%sResponse>",
ActionName, ServType, ActionName );
"<u:%sResponse xmlns:u=\"%s\">\r\n</u:%sResponse>",
ActionName, ServType, ActionName );
} else {
sprintf( ActBuff, "<u:%s xmlns:u=\"%s\"></u:%s>",
ActionName, ServType, ActionName );
sprintf( ActBuff,
"<u:%s xmlns:u=\"%s\">\r\n</u:%s>",
ActionName, ServType, ActionName );
}
rc = ixmlParseBufferEx( ActBuff, ActionDoc );
@@ -255,8 +256,8 @@ makeAction( IN int response,
IN const char *Arg,
IN va_list ArgList )
{
const char *ArgName,
*ArgValue;
const char *ArgName;
const char *ArgValue;
char *ActBuff;
int Idx = 0;
IXML_Document *ActionDoc;
@@ -274,11 +275,13 @@ makeAction( IN int response,
}
if( response ) {
sprintf( ActBuff, "<u:%sResponse xmlns:u=\"%s\"></u:%sResponse>",
ActionName, ServType, ActionName );
sprintf( ActBuff,
"<u:%sResponse xmlns:u=\"%s\">\r\n</u:%sResponse>",
ActionName, ServType, ActionName );
} else {
sprintf( ActBuff, "<u:%s xmlns:u=\"%s\"></u:%s>",
ActionName, ServType, ActionName );
sprintf( ActBuff,
"<u:%s xmlns:u=\"%s\">\r\n</u:%s>",
ActionName, ServType, ActionName );
}
if( ixmlParseBufferEx( ActBuff, &ActionDoc ) != IXML_SUCCESS ) {
@@ -295,7 +298,7 @@ makeAction( IN int response,
if( NumArg > 0 ) {
//va_start(ArgList, Arg);
ArgName = Arg;
while( Idx++ != NumArg ) {
for ( ; ; ) {
ArgValue = va_arg( ArgList, const char * );
if( ArgName != NULL ) {
@@ -310,7 +313,11 @@ makeAction( IN int response,
ixmlNode_appendChild( node, ( IXML_Node * ) Ele );
}
ArgName = va_arg( ArgList, const char * );
if (++Idx < NumArg) {
ArgName = va_arg( ArgList, const char * );
} else {
break;
}
}
//va_end(ArgList);
}
@@ -348,14 +355,9 @@ UpnpMakeAction( const char *ActionName,
va_list ArgList;
IXML_Document *out = NULL;
if( NumArg > 0 ) {
va_start( ArgList, Arg );
}
va_start( ArgList, Arg );
out = makeAction( 0, ActionName, ServType, NumArg, Arg, ArgList );
if( NumArg > 0 ) {
va_end( ArgList );
}
va_end( ArgList );
return out;
}
@@ -390,14 +392,9 @@ UpnpMakeActionResponse( const char *ActionName,
va_list ArgList;
IXML_Document *out = NULL;
if( NumArg > 0 ) {
va_start( ArgList, Arg );
}
va_start( ArgList, Arg );
out = makeAction( 1, ActionName, ServType, NumArg, Arg, ArgList );
if( NumArg > 0 ) {
va_end( ArgList );
}
va_end( ArgList );
return out;
}

View File

@@ -219,10 +219,11 @@ gena_unsubscribe( IN char *url,
// make request msg
membuffer_init( &request );
request.size_inc = 30;
return_code = http_MakeMessage( &request, 1, 1,
"q" "ssc" "U" "c",
HTTPMETHOD_UNSUBSCRIBE, &dest_url,
"SID: ", sid );
return_code = http_MakeMessage(
&request, 1, 1,
"q" "ssc" "Uc",
HTTPMETHOD_UNSUBSCRIBE, &dest_url,
"SID: ", sid );
//Not able to make the message so destroy the existing buffer
if( return_code != 0 ) {
@@ -305,20 +306,21 @@ gena_subscribe( IN char *url,
request.size_inc = 30;
if( renewal_sid ) {
// renew subscription
return_code = http_MakeMessage( &request, 1, 1,
"q" "ssc" "ssc" "c",
HTTPMETHOD_SUBSCRIBE, &dest_url,
"SID: ", renewal_sid,
"TIMEOUT: Second-", timeout_str );
return_code = http_MakeMessage(
&request, 1, 1,
"q" "ssc" "sscc",
HTTPMETHOD_SUBSCRIBE, &dest_url,
"SID: ", renewal_sid,
"TIMEOUT: Second-", timeout_str );
} else {
// subscribe
return_code = http_MakeMessage( &request, 1, 1,
"q" "sssdsscc",
HTTPMETHOD_SUBSCRIBE, &dest_url,
"CALLBACK: <http://", LOCAL_HOST,
":", LOCAL_PORT,
"/>\r\n" "NT: upnp:event\r\n"
"TIMEOUT: Second-", timeout_str );
return_code = http_MakeMessage(
&request, 1, 1,
"q" "sssdsc" "sc" "sscc",
HTTPMETHOD_SUBSCRIBE, &dest_url,
"CALLBACK: <http://", LOCAL_HOST, ":", LOCAL_PORT, "/>",
"NT: upnp:event",
"TIMEOUT: Second-", timeout_str );
}
if( return_code != 0 ) {
return return_code;

View File

@@ -41,6 +41,7 @@
#include "statcodes.h"
#include "httpparser.h"
#include "httpreadwrite.h"
#include "ssdplib.h"
#include "unixutil.h"
@@ -218,9 +219,11 @@ notify_send_and_recv( IN uri_type * destination_url,
}
// make start line and HOST header
membuffer_init( &start_msg );
if( http_MakeMessage( &start_msg, 1, 1,
"q" "s",
HTTPMETHOD_NOTIFY, &url, mid_msg->buf ) != 0 ) {
if (http_MakeMessage(
&start_msg, 1, 1,
"q" "s",
HTTPMETHOD_NOTIFY, &url,
mid_msg->buf ) != 0 ) {
membuffer_destroy( &start_msg );
sock_destroy( &info, SD_BOTH );
return UPNP_E_OUTOF_MEMORY;
@@ -295,11 +298,12 @@ genaNotify( IN char *headers,
// make 'end' msg (the part that won't vary with the destination)
endmsg.size_inc = 30;
if( http_MakeMessage( &mid_msg, 1, 1,
"s" "ssc" "sdcc",
headers,
"SID: ", sub->sid,
"SEQ: ", sub->ToSendEventKey ) != 0 ) {
if( http_MakeMessage(
&mid_msg, 1, 1,
"s" "ssc" "sdcc",
headers,
"SID: ", sub->sid,
"SEQ: ", sub->ToSendEventKey ) != 0 ) {
membuffer_destroy( &mid_msg );
return UPNP_E_OUTOF_MEMORY;
}
@@ -570,7 +574,7 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
}
sprintf( headers, "CONTENT-TYPE: text/xml\r\nCONTENT-LENGTH: "
"%d\r\nNT: upnp:event\r\nNTS: upnp:propchange\r\n",
"%zd\r\nNT: upnp:event\r\nNTS: upnp:propchange\r\n",
strlen( propertySet ) + 1 );
//schedule thread for initial notification
@@ -755,8 +759,8 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
}
sprintf( headers, "CONTENT-TYPE: text/xml\r\nCONTENT-LENGTH: "
"%d\r\nNT: upnp:event\r\nNTS: upnp:propchange\r\n",
strlen( propertySet ) + 1 );
"%ld\r\nNT: upnp:event\r\nNTS: upnp:propchange\r\n",
(long) strlen( propertySet ) + 1 );
//schedule thread for initial notification
@@ -892,8 +896,8 @@ genaNotifyAllExt( IN UpnpDevice_Handle device_handle,
//changed to add null terminator at end of content
//content length = (length in bytes of property set) + null char
sprintf( headers, "CONTENT-TYPE: text/xml\r\nCONTENT-LENGTH: "
"%d\r\nNT: upnp:event\r\nNTS: upnp:propchange\r\n",
strlen( propertySet ) + 1 );
"%ld\r\nNT: upnp:event\r\nNTS: upnp:propchange\r\n",
(long) strlen( propertySet ) + 1 );
HandleLock( );
@@ -1053,9 +1057,9 @@ genaNotifyAll( IN UpnpDevice_Handle device_handle,
}
//changed to add null terminator at end of content
//content length = (length in bytes of property set) + null char
sprintf( headers, "CONTENT-TYPE: text/xml\r\nCONTENT-LENGTH: %d\r\nNT:"
sprintf( headers, "CONTENT-TYPE: text/xml\r\nCONTENT-LENGTH: %ld\r\nNT:"
" upnp:event\r\nNTS: upnp:propchange\r\n",
strlen( propertySet ) + 1 );
(long) strlen( propertySet ) + 1 );
HandleLock( );
@@ -1164,10 +1168,14 @@ respond_ok( IN SOCKINFO * info,
membuffer_init( &response );
response.size_inc = 30;
if( http_MakeMessage( &response, major, minor,
"R" "D" "S" "N" "Xc" "ssc" "sc" "c",
HTTP_OK, 0,
"SID: ", sub->sid, timeout_str ) != 0 ) {
if( http_MakeMessage(
&response, major, minor,
"R" "D" "S" "N" "Xc" "ssc" "scc",
HTTP_OK,
(off_t)0,
X_USER_AGENT,
"SID: ", sub->sid,
timeout_str ) != 0 ) {
membuffer_destroy( &response );
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
return UPNP_E_OUTOF_MEMORY;

View File

@@ -45,7 +45,7 @@
#else
#include <winsock2.h>
#define socklen_t int
typedef int socklen_t;
#define EAFNOSUPPORT 97
#endif
#include "unixutil.h"
@@ -651,6 +651,11 @@ get_miniserver_sockets( MiniServerSockArray * out,
sizeof( struct sockaddr_in )
);
if( sockError == UPNP_SOCKETERROR ) {
#ifdef WIN32
errCode = WSAGetLastError();
#else
errCode = errno;
#endif
if( errno == EADDRINUSE )
errCode = 1;
} else

View File

@@ -34,6 +34,7 @@
* messages.
************************************************************************/
#define _GNU_SOURCE // For strcasestr() in string.h
#include "config.h"
#include <assert.h>
#include <string.h>
@@ -868,11 +869,11 @@ match_int( INOUT scanner_t * scanner,
OUT int *value )
{
memptr token;
token_type_t tok_type;
token_type_t tok_type;
parse_status_t status;
int num;
char *end_ptr;
size_t save_pos;
long num;
char *end_ptr;
size_t save_pos;
save_pos = scanner->cursor;
@@ -2391,7 +2392,7 @@ int
raw_to_int( IN memptr * raw_value,
IN int base )
{
int num;
long num;
char *end_ptr;
if( raw_value->length == 0 ) {
@@ -2434,7 +2435,8 @@ raw_find_str( IN memptr * raw_value,
c = raw_value->buf[raw_value->length]; // save
raw_value->buf[raw_value->length] = 0; // null-terminate
ptr = strstr( raw_value->buf, str );
// Use strcasestr because the string may not always be exact case
ptr = strcasestr( raw_value->buf, str );
raw_value->buf[raw_value->length] = c; // restore

View File

@@ -39,9 +39,16 @@
#include <assert.h>
#include <stdarg.h>
#ifndef UPNP_USE_BCBPP
#ifndef UPNP_USE_MSVCPP
#include <inttypes.h>
#include <stdint.h>
#endif
#endif
#ifndef WIN32
#include <arpa/inet.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
@@ -49,7 +56,6 @@
#include <sys/wait.h>
#include <unistd.h>
#include <sys/utsname.h>
#include <fcntl.h>
#else
#include <winsock2.h>
#include <malloc.h>
@@ -225,10 +231,10 @@ http_RecvMessage( IN SOCKINFO * info,
"<<< (RECVD) <<<\n%s\n-----------------\n",
parser->msg.msg.buf );
//print_http_headers( &parser->msg );
)
)
if( parser->content_length >
( unsigned int )g_maxContentLength ) {
if( parser->content_length >
( unsigned int )g_maxContentLength ) {
*http_error_code = HTTP_REQ_ENTITY_TOO_LARGE;
return UPNP_E_OUTOF_BOUNDS;
}
@@ -306,8 +312,8 @@ http_SendMessage( IN SOCKINFO * info,
char *filename = NULL;
FILE *Fp;
int num_read,
num_written,
amount_to_be_read = 0;
num_written;
off_t amount_to_be_read = 0;
va_list argp;
char *file_buf = NULL,
*ChunkBuf = NULL;
@@ -367,7 +373,7 @@ http_SendMessage( IN SOCKINFO * info,
return UPNP_E_FILE_READ_ERROR;
}
} else if( Instr && Instr->IsRangeActive ) {
if( fseek( Fp, Instr->RangeOffset, SEEK_CUR ) != 0 ) {
if( fseeko( Fp, Instr->RangeOffset, SEEK_CUR ) != 0 ) {
free( ChunkBuf );
return UPNP_E_FILE_READ_ERROR;
}
@@ -600,8 +606,8 @@ http_Download( IN const char *url_str,
*hoststr,
*temp;
http_parser_t response;
size_t msg_length,
hostlen;
size_t msg_length;
size_t hostlen;
memptr ctype;
size_t copy_len;
membuffer request;
@@ -637,13 +643,15 @@ http_Download( IN const char *url_str,
*temp = '/';
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %d\n", hoststr, hostlen );
"HOSTNAME : %s Length : %zu\n", hoststr, hostlen );
)
ret_code = http_MakeMessage( &request, 1, 1, "QsbcDCUc",
HTTPMETHOD_GET, url.pathquery.buff,
url.pathquery.size, "HOST: ", hoststr,
hostlen );
ret_code = http_MakeMessage(
&request, 1, 1,
"Q" "s" "bcDCUc",
HTTPMETHOD_GET, url.pathquery.buff, url.pathquery.size,
"HOST: ",
hoststr, hostlen );
if( ret_code != 0 ) {
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
@@ -707,7 +715,7 @@ http_Download( IN const char *url_str,
// save mem for body only
*document = realloc( msg_start, *doc_length + 1 ); //LEAK_FIX_MK
//*document = Realloc( msg_start,msg_length, *doc_length + 1 );//LEAK_FIX_MK
// *document = Realloc( msg_start,msg_length, *doc_length + 1 );//LEAK_FIX_MK
// shrink can't fail
assert( ( int )msg_length > *doc_length );
@@ -759,7 +767,7 @@ MakePostMessage( const char *url_str,
{
int ret_code = 0;
char *urlPath = alloca( strlen( url_str ) + 1 );
int hostlen = 0;
size_t hostlen = 0;
char *hoststr,
*temp;
@@ -792,25 +800,34 @@ MakePostMessage( const char *url_str,
hostlen = strlen( hoststr );
*temp = '/';
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %d\n", hoststr, hostlen );
"HOSTNAME : %s Length : %zd\n", hoststr, hostlen );
)
if( contentLength >= 0 ) {
ret_code = http_MakeMessage( request, 1, 1, "QsbcDCUTNc",
HTTPMETHOD_POST, url->pathquery.buff,
url->pathquery.size, "HOST: ",
hoststr, hostlen, contentType,
contentLength );
if( contentLength >= 0 ) {
ret_code = http_MakeMessage(
request, 1, 1,
"Q" "s" "bcDCU" "T" "Nc",
HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size,
"HOST: ",
hoststr, hostlen,
contentType,
(off_t)contentLength );
} else if( contentLength == UPNP_USING_CHUNKED ) {
ret_code = http_MakeMessage( request, 1, 1, "QsbcDCUTKc",
HTTPMETHOD_POST, url->pathquery.buff,
url->pathquery.size, "HOST: ",
hoststr, hostlen, contentType );
ret_code = http_MakeMessage(
request, 1, 1,
"Q" "s" "bcDCU" "TKc",
HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size,
"HOST: ",
hoststr, hostlen,
contentType );
} else if( contentLength == UPNP_UNTIL_CLOSE ) {
ret_code = http_MakeMessage( request, 1, 1, "QsbcDCUTc",
HTTPMETHOD_POST, url->pathquery.buff,
url->pathquery.size, "HOST: ",
hoststr, hostlen, contentType );
ret_code = http_MakeMessage(
request, 1, 1,
"Q" "s" "bcDCU" "Tc",
HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size,
"HOST: ",
hoststr, hostlen,
contentType );
} else {
ret_code = UPNP_E_INVALID_PARAM;
}
@@ -1085,9 +1102,9 @@ MakeGetMessage( const char *url_str,
{
int ret_code;
char *urlPath = alloca( strlen( url_str ) + 1 );
int querylen = 0;
size_t querylen = 0;
const char *querystr;
int hostlen = 0;
size_t hostlen = 0;
char *hoststr,
*temp;
@@ -1120,7 +1137,7 @@ MakeGetMessage( const char *url_str,
hostlen = strlen( hoststr );
*temp = '/';
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %d\n", hoststr, hostlen );
"HOSTNAME : %s Length : %zd\n", hoststr, hostlen );
)
if( proxy_str ) {
@@ -1131,9 +1148,12 @@ MakeGetMessage( const char *url_str,
querylen = url->pathquery.size;
}
ret_code = http_MakeMessage( request, 1, 1, "QsbcDCUc",
HTTPMETHOD_GET, querystr, querylen,
"HOST: ", hoststr, hostlen );
ret_code = http_MakeMessage(
request, 1, 1,
"Q" "s" "bcDCUc",
HTTPMETHOD_GET, querystr, querylen,
"HOST: ",
hoststr, hostlen );
if( ret_code != 0 ) {
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
@@ -1729,8 +1749,11 @@ http_SendStatusResponse( IN SOCKINFO * info,
membuffer_init( &membuf );
membuf.size_inc = 70;
ret = http_MakeMessage( &membuf, response_major, response_minor, "RSCB", http_status_code, // response start line
http_status_code ); // body
ret = http_MakeMessage(
&membuf, response_major, response_minor,
"RSCB",
http_status_code, // response start line
http_status_code ); // body
if( ret == 0 ) {
timeout = HTTP_DEFAULT_TIMEOUT;
ret = http_SendMessage( info, &timeout, "b",
@@ -1757,28 +1780,32 @@ http_SendStatusResponse( IN SOCKINFO * info,
* specified in the input parameters.
*
* fmt types:
* 's': arg = const char* C_string
* 'b': arg1 = const char* buf; arg2 = size_t buf_length
* memory ptr
* 'c': (no args) appends CRLF "\r\n"
* 'd': arg = int number // appends decimal number
* 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt
* 'D': (no args) appends HTTP DATE: header
* 'S': (no args) appends HTTP SERVER: header
* 'U': (no args) appends HTTP USER-AGENT: header
* 'C': (no args) appends a HTTP CONNECTION: close header
* depending on major,minor version
* 'N': arg1 = int content_length // content-length header
* 'Q': arg1 = http_method_t; arg2 = char* url;
* arg3 = int url_length // start line of request
* 'R': arg = int status_code // adds a response start line
* 'B': arg = int status_code
* appends content-length, content-type and HTML body for given code
* 'T': arg = char * content_type; format e.g: "text/html";
* content-type header
* --- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld@users.sourceforge.net>
* 'X': arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent
* --- PATCH END ---
* 'b': arg1 = const char* buf;
* arg2 = size_t buf_length memory ptr
* 'C': (no args) appends a HTTP CONNECTION: close header
* depending on major,minor version
* 'c': (no args) appends CRLF "\r\n"
* 'D': (no args) appends HTTP DATE: header
* 'd': arg = int number // appends decimal number
* 'G': arg = range information // add range header
* 'h': arg = off_t number // appends off_t number
* 'K': (no args) // add chunky header
* 'N': arg1 = off_t content_length // content-length header
* 'q': arg1 = http_method_t // request start line and HOST header
* arg2 = (uri_type *)
* 'Q': arg1 = http_method_t; // start line of request
* arg2 = char* url;
* arg3 = size_t url_length
* 'R': arg = int status_code // adds a response start line
* 'S': (no args) appends HTTP SERVER: header
* 's': arg = const char* C_string
* 'T': arg = char * content_type; format
* e.g: "text/html"; content-type header
* 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt
* 'U': (no args) appends HTTP USER-AGENT: header
* 'X': arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent
*
* Return : int;
* 0 - On Success
@@ -1796,7 +1823,8 @@ http_MakeMessage( INOUT membuffer * buf,
{
char c;
char *s = NULL;
int num;
size_t num;
off_t bignum;
size_t length;
time_t *loc_time;
time_t curr_time;
@@ -1878,7 +1906,17 @@ http_MakeMessage( INOUT membuffer * buf,
{
num = ( int )va_arg( argp, int );
sprintf( tempbuf, "%d", num );
sprintf( tempbuf, "%zu", num );
if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) {
goto error_handler;
}
}
else if( c == 'h' ) // off_t
{
bignum = ( off_t )va_arg( argp, off_t );
sprintf( tempbuf, "%"PRId64, (int64_t)bignum );
if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) {
goto error_handler;
}
@@ -1925,12 +1963,13 @@ http_MakeMessage( INOUT membuffer * buf,
else if( c == 'N' ) {
// content-length header
num = ( int )va_arg( argp, int );
bignum = ( off_t )va_arg( argp, off_t );
assert( num >= 0 );
if( http_MakeMessage
( buf, http_major_version, http_minor_version, "sdc",
"CONTENT-LENGTH: ", num ) != 0 ) {
assert( bignum >= 0 );
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"shc",
"CONTENT-LENGTH: ", bignum ) != 0 ) {
goto error_handler;
}
}
@@ -1940,14 +1979,14 @@ http_MakeMessage( INOUT membuffer * buf,
temp_str = ( c == 'S' ) ? "SERVER: " : "USER-AGENT: ";
get_sdk_info( tempbuf );
if( http_MakeMessage
( buf, http_major_version, http_minor_version, "ss",
temp_str, tempbuf ) != 0 ) {
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"ss",
temp_str, tempbuf ) != 0 ) {
goto error_handler;
}
}
/* --- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld@users.sourceforge.net> */
else if( c == 'X' ) // C string
{
s = ( char * )va_arg( argp, char * );
@@ -1962,9 +2001,6 @@ http_MakeMessage( INOUT membuffer * buf,
}
}
/* --- PATCH END --- */
else if( c == 'R' ) {
// response start line
// e.g.: 'HTTP/1.1 200 OK'
@@ -1979,9 +2015,11 @@ http_MakeMessage( INOUT membuffer * buf,
// str
status_msg = http_get_code_text( status_code );
if( http_MakeMessage
( buf, http_major_version, http_minor_version, "ssc",
tempbuf, status_msg ) != 0 ) {
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"ssc",
tempbuf,
status_msg ) != 0 ) {
goto error_handler;
}
}
@@ -1996,11 +2034,14 @@ http_MakeMessage( INOUT membuffer * buf,
"<html><body><h1>",
status_code, http_get_code_text( status_code ),
"</h1></body></html>" );
num = strlen( tempbuf );
bignum = strlen( tempbuf );
if( http_MakeMessage( buf, http_major_version, http_minor_version, "NTcs", num, // content-length
"text/html", // content-type
tempbuf ) != 0 ) // body
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"NTcs",
bignum, // content-length
"text/html", // content-type
tempbuf ) != 0 ) // body
{
goto error_handler;
}
@@ -2009,17 +2050,18 @@ http_MakeMessage( INOUT membuffer * buf,
else if( c == 'Q' ) {
// request start line
// GET /foo/bar.html HTTP/1.1\r\n
//
method = ( http_method_t ) va_arg( argp, http_method_t );
method_str = method_to_str( method );
url_str = ( const char * )va_arg( argp, const char * );
num = ( int )va_arg( argp, int ); // length of url_str
num = ( size_t )va_arg( argp, size_t ); // length of url_str
if( http_MakeMessage( buf, http_major_version, http_minor_version, "ssbsdsdc", method_str, // method
" ", url_str, num, // url
" HTTP/", http_major_version, ".",
http_minor_version ) != 0 ) {
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"ssbsdsdc",
method_str, // method
" ", url_str, num, // url
" HTTP/", http_major_version, ".", http_minor_version ) != 0 ) {
goto error_handler;
}
}
@@ -2036,10 +2078,11 @@ http_MakeMessage( INOUT membuffer * buf,
goto error_handler;
}
if( http_MakeMessage
( buf, http_major_version, http_minor_version, "Q" "sbc",
method, url.pathquery.buff, url.pathquery.size, "HOST: ",
url.hostport.text.buff, url.hostport.text.size ) != 0 ) {
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"Q" "sbc",
method, url.pathquery.buff, url.pathquery.size,
"HOST: ", url.hostport.text.buff, url.hostport.text.size ) != 0 ) {
goto error_handler;
}
}
@@ -2048,9 +2091,10 @@ http_MakeMessage( INOUT membuffer * buf,
// content type header
temp_str = ( const char * )va_arg( argp, const char * ); // type/subtype format
if( http_MakeMessage
( buf, http_major_version, http_minor_version, "ssc",
"CONTENT-TYPE: ", temp_str ) != 0 ) {
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"ssc",
"CONTENT-TYPE: ", temp_str ) != 0 ) {
goto error_handler;
}
}
@@ -2125,7 +2169,7 @@ MakeGetMessageEx( const char *url_str,
{
int errCode = UPNP_E_SUCCESS;
char *urlPath = NULL;
int hostlen = 0;
size_t hostlen = 0;
char *hoststr,
*temp;
@@ -2170,20 +2214,17 @@ MakeGetMessageEx( const char *url_str,
*temp = '/';
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %d\n", hoststr,
hostlen );
"HOSTNAME : %s Length : %zd\n",
hoststr, hostlen );
)
errCode = http_MakeMessage( request,
1,
1,
"QsbcGDCUc",
HTTPMETHOD_GET,
url->pathquery.buff,
url->pathquery.size,
"HOST: ",
hoststr,
hostlen, pRangeSpecifier );
errCode = http_MakeMessage(
request, 1, 1,
"Q" "s" "bc" "GDCUc",
HTTPMETHOD_GET, url->pathquery.buff, url->pathquery.size,
"HOST: ",
hoststr, hostlen,
pRangeSpecifier );
if( errCode != 0 ) {
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,

View File

@@ -37,6 +37,12 @@
#include "config.h"
#include <assert.h>
#include <fcntl.h>
#ifndef UPNP_USE_BCBPP
#ifndef UPNP_USE_MSVCPP
#include <inttypes.h>
#include <stdint.h>
#endif
#endif
#include "util.h"
#include "strintmap.h"
#include "membuffer.h"
@@ -49,7 +55,7 @@
#include "ssdplib.h"
#ifndef WIN32
#include <unistd.h>
#include <unistd.h>
#endif
#include <sys/stat.h>
#include "ithread.h"
@@ -632,8 +638,8 @@ get_file_info( IN const char *filename,
rc = get_content_type( filename, &info->content_type );
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"file info: %s, length: %d, last_mod=%s readable=%d\n",
filename, info->file_length,
"file info: %s, length: %lld, last_mod=%s readable=%d\n",
filename, (long long)info->file_length,
asctime( gmtime( &info->last_modified ) ),
info->is_readable ); )
@@ -871,8 +877,8 @@ StrTok( char **Src,
************************************************************************/
int
GetNextRange( char **SrcRangeStr,
int *FirstByte,
int *LastByte )
off_t *FirstByte,
off_t *LastByte )
{
char *Ptr,
*Tok;
@@ -936,11 +942,11 @@ GetNextRange( char **SrcRangeStr,
************************************************************************/
int
CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
long FileLength,
off_t FileLength,
OUT struct SendInstruction *Instr )
{
int FirstByte,
off_t FirstByte,
LastByte;
char *RangeInput,
*Ptr;
@@ -984,28 +990,36 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
Instr->RangeOffset = FirstByte;
Instr->ReadSendSize = LastByte - FirstByte + 1;
sprintf( Instr->RangeHeader, "CONTENT-RANGE: bytes %d-%d/%ld\r\n", FirstByte, LastByte, FileLength ); //Data between two range.
sprintf( Instr->RangeHeader,
"CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n",
(int64_t)FirstByte,
(int64_t)LastByte,
(int64_t)FileLength ); //Data between two range.
} else if( FirstByte >= 0 && LastByte == -1
&& FirstByte < FileLength ) {
Instr->RangeOffset = FirstByte;
Instr->ReadSendSize = FileLength - FirstByte;
sprintf( Instr->RangeHeader,
"CONTENT-RANGE: bytes %d-%ld/%ld\r\n", FirstByte,
FileLength - 1, FileLength );
"CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n",
(int64_t)FirstByte,
(int64_t)(FileLength - 1),
(int64_t)FileLength );
} else if( FirstByte == -1 && LastByte > 0 ) {
if( LastByte >= FileLength ) {
Instr->RangeOffset = 0;
Instr->ReadSendSize = FileLength;
sprintf( Instr->RangeHeader,
"CONTENT-RANGE: bytes 0-%ld/%ld\r\n",
FileLength - 1, FileLength );
"CONTENT-RANGE: bytes 0-%"PRId64"/%"PRId64"\r\n",
(int64_t)(FileLength - 1),
(int64_t)FileLength );
} else {
Instr->RangeOffset = FileLength - LastByte;
Instr->ReadSendSize = LastByte;
sprintf( Instr->RangeHeader,
"CONTENT-RANGE: bytes %ld-%ld/%ld\r\n",
FileLength - LastByte + 1, FileLength,
FileLength );
"CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n",
(int64_t)(FileLength - LastByte + 1),
(int64_t)FileLength,
(int64_t)FileLength );
}
} else {
free( RangeInput );
@@ -1042,7 +1056,7 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
int
CheckOtherHTTPHeaders( IN http_message_t * Req,
OUT struct SendInstruction *RespInstr,
int FileSize )
off_t FileSize )
{
http_header_t *header;
ListNode *node;
@@ -1184,7 +1198,6 @@ process_request( IN http_message_t * req,
int code;
int err_code;
//membuffer content_type;
char *request_doc;
struct File_Info finfo;
xboolean using_alias;
@@ -1194,7 +1207,7 @@ process_request( IN http_message_t * req,
int resp_major,
resp_minor;
xboolean alias_grabbed;
int dummy;
size_t dummy;
struct UpnpVirtualDirCallbacks *pVirtualDirCallback;
print_http_headers( req );
@@ -1208,7 +1221,6 @@ process_request( IN http_message_t * req,
// init
request_doc = NULL;
finfo.content_type = NULL;
//membuffer_init( &content_type );
alias_grabbed = FALSE;
err_code = HTTP_INTERNAL_SERVER_ERROR; // default error
using_virtual_dir = FALSE;
@@ -1362,7 +1374,7 @@ process_request( IN http_message_t * req,
RespInstr->ReadSendSize = finfo.file_length;
//Check other header field.
// Check other header field.
if( ( err_code =
CheckOtherHTTPHeaders( req, RespInstr,
finfo.file_length ) ) != HTTP_OK ) {
@@ -1376,85 +1388,80 @@ process_request( IN http_message_t * req,
}
if( RespInstr->IsRangeActive && RespInstr->IsChunkActive ) {
/* - PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net>
* added X-User-Agent header
*/
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
//Transfer-Encoding: chunked
// K means add chunky header ang G means range header.
if( http_MakeMessage( headers, resp_major, resp_minor, "RTGKDstcSXcCc", HTTP_PARTIAL_CONTENT, // status code
// RespInstr->ReadSendSize,// content length
finfo.content_type,
// content_type.buf, // content type
RespInstr, // Range
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
// Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
// Transfer-Encoding: chunked
if (http_MakeMessage(
headers, resp_major, resp_minor,
"R" "T" "GKD" "s" "tcS" "XcCc",
HTTP_PARTIAL_CONTENT, // status code
finfo.content_type, // content type
RespInstr, // range info
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
goto error_handler;
}
} else if( RespInstr->IsRangeActive && !RespInstr->IsChunkActive ) {
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
//Transfer-Encoding: chunked
// K means add chunky header ang G means range header.
if( http_MakeMessage( headers, resp_major, resp_minor, "RNTGDstcSXcCc", HTTP_PARTIAL_CONTENT, // status code
RespInstr->ReadSendSize, // content length
finfo.content_type,
//content_type.buf, // content type
RespInstr, //Range Info
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
// Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
// Transfer-Encoding: chunked
if (http_MakeMessage(
headers, resp_major, resp_minor,
"R" "N" "T" "GD" "s" "tcS" "XcCc",
HTTP_PARTIAL_CONTENT, // status code
RespInstr->ReadSendSize, // content length
finfo.content_type, // content type
RespInstr, // range info
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
goto error_handler;
}
} else if( !RespInstr->IsRangeActive && RespInstr->IsChunkActive ) {
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
//Transfer-Encoding: chunked
// K means add chunky header ang G means range header.
if( http_MakeMessage( headers, resp_major, resp_minor, "RKTDstcSXcCc", HTTP_OK, // status code
//RespInstr->ReadSendSize,// content length
finfo.content_type,
// content_type.buf, // content type
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
// Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
// Transfer-Encoding: chunked
if (http_MakeMessage(
headers, resp_major, resp_minor,
"RK" "TD" "s" "tcS" "XcCc",
HTTP_OK, // status code
finfo.content_type, // content type
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
goto error_handler;
}
} else {
if( RespInstr->ReadSendSize >= 0 ) {
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
//Transfer-Encoding: chunked
// K means add chunky header ang G means range header.
if( http_MakeMessage( headers, resp_major, resp_minor, "RNTDstcSXcCc", HTTP_OK, // status code
RespInstr->ReadSendSize, // content length
finfo.content_type,
//content_type.buf, // content type
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
} else { // !RespInstr->IsRangeActive && !RespInstr->IsChunkActive
if (RespInstr->ReadSendSize >= 0) {
// Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
// Transfer-Encoding: chunked
if (http_MakeMessage(
headers, resp_major, resp_minor,
"R" "N" "TD" "s" "tcS" "XcCc",
HTTP_OK, // status code
RespInstr->ReadSendSize, // content length
finfo.content_type, // content type
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
goto error_handler;
}
} else {
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
//Transfer-Encoding: chunked
// K means add chunky header ang G means range header.
if( http_MakeMessage( headers, resp_major, resp_minor, "RTDstcSXcCc", HTTP_OK, // status code
//RespInstr->ReadSendSize,// content length
finfo.content_type,
//content_type.buf, // content type
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
// Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
// Transfer-Encoding: chunked
if (http_MakeMessage(
headers, resp_major, resp_minor,
"R" "TD" "s" "tcS" "XcCc",
HTTP_OK, // status code
finfo.content_type, // content type
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
goto error_handler;
}
}
}
/* -- PATCH END -- */
if( req->method == HTTPMETHOD_HEAD ) {
*rtype = RESP_HEADERS;
@@ -1468,8 +1475,8 @@ process_request( IN http_message_t * req,
*rtype = RESP_FILEDOC;
}
//simple get http 0.9 as specified in http 1.0
//don't send headers
// simple get http 0.9 as specified in http 1.0
// don't send headers
if( req->method == HTTPMETHOD_SIMPLEGET ) {
membuffer_destroy( headers );
}
@@ -1479,7 +1486,6 @@ process_request( IN http_message_t * req,
error_handler:
free( request_doc );
ixmlFreeDOMString( finfo.content_type );
// membuffer_destroy( &content_type );
if( err_code != UPNP_E_SUCCESS && alias_grabbed ) {
alias_release( alias );
}
@@ -1738,12 +1744,12 @@ web_server_callback( IN http_parser_t * parser,
&RespInstr );
//Send response.
/* - PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net>
* added X-User-Agent header
*/
http_MakeMessage( &headers, 1, 1, "RTDSXcCc", ret,
"text/html", X_USER_AGENT );
/* - PATCH END --- */
http_MakeMessage(
&headers, 1, 1,
"RTDSXcCc",
ret,
"text/html",
X_USER_AGENT );
http_SendMessage( info, &timeout, "b", headers.buf,
headers.length );

View File

@@ -53,6 +53,10 @@
#endif
#include "unixutil.h"
#ifndef MSG_NOSIGNAL
#define MSG_NOSIGNAL 0
#endif
/************************************************************************
* Function : sock_init
*
@@ -229,7 +233,7 @@ sock_read_write( IN SOCKINFO * info,
if( bRead ) {
// read data
numBytes = recv( sockfd, buffer, bufsize,0); // MSG_NOSIGNAL is not a good idea in portable code, here SIGPIPE/SIGEPIPE has to be used instead
numBytes = recv( sockfd, buffer, bufsize,MSG_NOSIGNAL);
} else {
byte_left = bufsize;
bytes_sent = 0;
@@ -237,7 +241,7 @@ sock_read_write( IN SOCKINFO * info,
// write data
num_written =
send( sockfd, buffer + bytes_sent, byte_left,
MSG_DONTROUTE); // | MSG_NOSIGNAL is not a good idea in portable code, here SIGPIPE/SIGEPIPE has to be used instead
MSG_DONTROUTE|MSG_NOSIGNAL);
if( num_written == -1 ) {
return num_written;
}

View File

@@ -34,8 +34,11 @@
************************************************************************/
#ifdef __FreeBSD__
#include <osreldate.h>
#if __FreeBSD_version < 601103
#include <lwres/netdb.h>
#endif
#endif
#include "config.h"
#include "uri.h"
@@ -125,7 +128,7 @@ is_unreserved( char in )
* Note :
************************************************************************/
int
is_escaped( char *in )
is_escaped( const char *in )
{
if( ( in[0] == '%' ) && ( isxdigit( in[1] ) ) && isxdigit( in[2] ) ) {
@@ -157,7 +160,7 @@ is_escaped( char *in )
int
replace_escaped( char *in,
int index,
int *max )
size_t *max )
{
int tempInt = 0;
char tempChar = 0;
@@ -204,7 +207,7 @@ replace_escaped( char *in,
* Note :
************************************************************************/
int
parse_uric( char *in,
parse_uric( const char *in,
int max,
token * out )
{
@@ -496,12 +499,12 @@ token_cmp( token * in1,
************************************************************************/
int
parse_port( int max,
char *port,
const char *port,
unsigned short *out )
{
char *finger = port;
char *max_ptr = finger + max;
const char *finger = port;
const char *max_ptr = finger + max;
unsigned short temp = 0;
while( ( finger < max_ptr ) && ( isdigit( *finger ) ) ) {
@@ -533,7 +536,7 @@ parse_port( int max,
* Note :
************************************************************************/
int
parse_hostport( char *in,
parse_hostport( const char *in,
int max,
hostport_type * out )
{
@@ -611,14 +614,16 @@ parse_hostport( char *in,
int errCode = 0;
//call gethostbyname_r (reentrant form of gethostbyname)
#if defined(WIN32)
// TODO: Use autoconf to discover this rather than the
// platform-specific stuff below
#if defined(WIN32) || defined(__CYGWIN__)
h=gethostbyname(temp_host_name);
#elif defined(SPARC_SOLARIS)
errCode = gethostbyname_r( temp_host_name,
&h,
temp_hostbyname_buff,
BUFFER_SIZE, &errcode );
#elif defined(__FreeBSD__)
#elif defined(__FreeBSD__) && __FreeBSD_version < 601103
h = lwres_gethostbyname_r( temp_host_name,
&h_buf,
temp_hostbyname_buff,
@@ -681,7 +686,7 @@ parse_hostport( char *in,
* Note :
************************************************************************/
int
parse_scheme( char *in,
parse_scheme( const char *in,
int max,
token * out )
{
@@ -731,7 +736,7 @@ parse_scheme( char *in,
************************************************************************/
int
remove_escaped_chars( INOUT char *in,
INOUT int *size )
INOUT size_t *size )
{
int i = 0;
@@ -994,7 +999,7 @@ resolve_rel_url( char *base_url,
* Note :
************************************************************************/
int
parse_uri( char *in,
parse_uri( const char *in,
int max,
uri_type * out )
{
@@ -1067,15 +1072,15 @@ parse_uri( char *in,
int
parse_uri_and_unescape( char *in,
int max,
uri_type * out )
uri_type *out )
{
int ret;
if( ( ret = parse_uri( in, max, out ) ) != HTTP_SUCCESS )
return ret;
if( out->pathquery.size > 0 )
remove_escaped_chars( out->pathquery.buff, &out->pathquery.size );
remove_escaped_chars( (char *)out->pathquery.buff, &out->pathquery.size );
if( out->fragment.size > 0 )
remove_escaped_chars( out->fragment.buff, &out->fragment.size );
remove_escaped_chars( (char *)out->fragment.buff, &out->fragment.size );
return HTTP_SUCCESS;
}

View File

@@ -398,7 +398,7 @@ FindServiceEventURLPath( service_table * table,
************************************************************************/
service_info *
FindServiceControlURLPath( service_table * table,
char *controlURLPath )
const char *controlURLPath )
{
service_info *finger = NULL;
uri_type parsed_url;
@@ -664,7 +664,7 @@ DOMString
getElementValue( IXML_Node * node )
{
IXML_Node *child = ( IXML_Node * ) ixmlNode_getFirstChild( node );
DOMString temp = NULL;
const DOMString temp = NULL;
if( ( child != 0 ) && ( ixmlNode_getNodeType( child ) == eTEXT_NODE ) ) {
temp = ixmlNode_getNodeValue( child );

View File

@@ -331,9 +331,10 @@ membuffer_assign( INOUT membuffer * m,
return return_code;
}
// copy
memcpy( m->buf, buf, buf_len );
m->buf[buf_len] = 0; // null-terminate
if( buf_len ) {
memcpy( m->buf, buf, buf_len );
m->buf[buf_len] = 0; // null-terminate
}
m->length = buf_len;
return 0;

View File

@@ -95,6 +95,17 @@
#define MAX_THREADS 12
//@}
/** @name MAX_JOBS_TOTAL
* The {\tt MAX_JOBS_TOTAL} constant determines the maximum number of jobs
* that can be queued. If this limit is reached further jobs will be thrown
* to avoid memory exhaustion. The default value 100.
* (Added by Axis.)
*/
//@{
#define MAX_JOBS_TOTAL 100
//@}
/** @name DEFAULT_SOAP_CONTENT_LENGTH
* SOAP messages will read at most {\tt DEFAULT_SOAP_CONTENT_LENGTH} bytes.
* This prevents devices that have a misbehaving web server to send

View File

@@ -96,7 +96,7 @@ typedef struct SOCKET_BUFFER{
//holds a pointer into a larger array
typedef struct TOKEN {
char * buff;
int size;
size_t size;
} token;

View File

@@ -475,6 +475,7 @@ int http_SendStatusResponse( IN SOCKINFO *info, IN int http_status_code,
* memory ptr
* 'c': (no args) appends CRLF "\r\n"
* 'd': arg = int number // appends decimal number
* 'h': arg = off_t number // appends off_t number
* 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt
* 'D': (no args) appends HTTP DATE: header
* 'S': (no args) appends HTTP SERVER: header

View File

@@ -7,7 +7,7 @@
#include <errno.h>
#include <stdio.h>
#include <string.h>
#define socklen_t int
typedef int socklen_t;
#define EAFNOSUPPORT 97
/*

View File

@@ -51,8 +51,7 @@ typedef struct // memptr
// note: Total length/capacity should not exceed MAX_INT
typedef struct // membuffer
{
char *buf; // mem buffer; must not write
// beyond buf[length-1] (read/write)
char *buf; // mem buffer; must not write beyond buf[length-1] (read/write)
size_t length; // length of buffer (read-only)
size_t capacity; // total allocated memory (read-only)
size_t size_inc; // used to increase size; MUST be > 0; (read/write)
@@ -148,8 +147,7 @@ int memptr_cmp_nocase( IN memptr* m, IN const char* s );
*
* Note :
************************************************************************/
int membuffer_set_size( INOUT membuffer* m,
IN size_t new_length );
int membuffer_set_size( INOUT membuffer* m, IN size_t new_length );
/************************************************************************
* Function : membuffer_init
@@ -200,8 +198,7 @@ void membuffer_destroy( INOUT membuffer* m );
*
* Note :
************************************************************************/
int membuffer_assign( INOUT membuffer* m, IN const void* buf,
IN size_t buf_len );
int membuffer_assign( INOUT membuffer* m, IN const void* buf, IN size_t buf_len );
/************************************************************************
* Function : membuffer_assign_str
@@ -237,8 +234,7 @@ int membuffer_assign_str( INOUT membuffer* m, IN const char* c_str );
*
* Note :
************************************************************************/
int membuffer_append( INOUT membuffer* m, IN const void* buf,
IN size_t buf_len );
int membuffer_append( INOUT membuffer* m, IN const void* buf, IN size_t buf_len );
/************************************************************************
* Function : membuffer_append_str
@@ -276,8 +272,7 @@ int membuffer_append_str( INOUT membuffer* m, IN const char* c_str );
*
* Note :
************************************************************************/
int membuffer_insert( INOUT membuffer* m, IN const void* buf,
IN size_t buf_len, int index );
int membuffer_insert( INOUT membuffer* m, IN const void* buf, IN size_t buf_len, int index );
/************************************************************************
@@ -298,8 +293,7 @@ int membuffer_insert( INOUT membuffer* m, IN const void* buf,
*
* Note :
************************************************************************/
void membuffer_delete( INOUT membuffer* m, IN int index,
IN size_t num_bytes );
void membuffer_delete( INOUT membuffer* m, IN int index, IN size_t num_bytes );
/************************************************************************
@@ -336,8 +330,7 @@ char* membuffer_detach( INOUT membuffer* m );
* Note : 'new_buf' must be allocted using malloc or realloc so
* that it can be freed using free()
************************************************************************/
void membuffer_attach( INOUT membuffer* m, IN char* new_buf,
IN size_t buf_len );
void membuffer_attach( INOUT membuffer* m, IN char* new_buf, IN size_t buf_len );
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus

View File

@@ -246,7 +246,7 @@ service_info * FindServiceEventURLPath( service_table *table,
* Note :
************************************************************************/
service_info * FindServiceControlURLPath( service_table *table,
char * controlURLPath);
const char * controlURLPath);
/************************************************************************
* Function : printService

View File

@@ -80,7 +80,7 @@ typedef enum SsdpCmdType{SSDP_ERROR=-1,
#define SSDP_IP "239.255.255.250"
#define SSDP_PORT 1900
#define NUM_TRY 3
#define NUM_COPY 2
#define NUM_COPY 1
#define THREAD_LIMIT 50
#define COMMAND_LEN 300

View File

@@ -40,7 +40,7 @@
#else
#define XINLINE
#define socklen_t int
typedef int socklen_t;
#define EAFNOSUPPORT 97
#endif

View File

@@ -86,8 +86,8 @@ enum uriType { absolute, relative };
/* Buffer used in parsinghttp messages, urls, etc. generally this simply
* holds a pointer into a larger array */
typedef struct TOKEN {
char * buff;
int size;
const char *buff;
size_t size;
} token;
@@ -124,7 +124,7 @@ typedef struct URL_LIST {
* Parameters :
* char * in ; string of characters
* int index ; index at which to start checking the characters
* int *max ;
* size_t *max ;
*
* Description : Replaces an escaped sequence with its unescaped version
* as in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs)
@@ -137,7 +137,7 @@ typedef struct URL_LIST {
* string are shifted over, and NULL characters are placed at the
* end of the string.
************************************************************************/
int replace_escaped(char * in, int index, int *max);
int replace_escaped(char * in, int index, size_t *max);
/************************************************************************
* Function : copy_URL_list
@@ -276,7 +276,7 @@ int token_cmp( token *in1, token *in2);
*
* Note :
************************************************************************/
int parse_port(int max, char * port, unsigned short int * out);
int parse_port(int max, const char *port, unsigned short int *out);
/************************************************************************
* Function : parse_hostport
@@ -296,14 +296,14 @@ int parse_port(int max, char * port, unsigned short int * out);
*
* Note :
************************************************************************/
int parse_hostport( char* in, int max, hostport_type *out );
int parse_hostport(const char *in, int max, hostport_type *out );
/************************************************************************
* Function : remove_escaped_chars
*
* Parameters :
* INOUT char *in ; string of characters to be modified
* INOUT int *size ; size limit for the number of characters
* INOUT size_t *size ; size limit for the number of characters
*
* Description : removes http escaped characters such as: "%20" and
* replaces them with their character representation. i.e.
@@ -315,7 +315,7 @@ int parse_hostport( char* in, int max, hostport_type *out );
*
* Note :
************************************************************************/
int remove_escaped_chars(char *in,int *size);
int remove_escaped_chars(char *in, size_t *size);
/************************************************************************
* Function : remove_dots
@@ -391,7 +391,7 @@ char * resolve_rel_url( char * base_url, char * rel_url);
*
* Note :
************************************************************************/
int parse_uri( char * in, int max, uri_type * out);
int parse_uri(const char * in, int max, uri_type * out);
/************************************************************************
* Function : parse_uri_and_unescape

View File

@@ -163,7 +163,7 @@ void linecopylen( OUT char dest[LINE_SIZE], IN const char* src, IN size_t srclen
#define strcasecmp stricmp
#define strncasecmp strnicmp
#define sleep Sleep
#define sleep(a) Sleep((a)*1000)
#define usleep(a) Sleep((a)/1000)
#endif

View File

@@ -48,8 +48,8 @@ struct SendInstruction
int IsRangeActive;
int IsTrailers;
char RangeHeader[200];
long RangeOffset;
long ReadSendSize; // Read from local source and send on the network.
off_t RangeOffset;
off_t ReadSendSize; // Read from local source and send on the network.
long RecvWriteSize; // Recv from the network and write into local file.
//Later few more member could be added depending on the requirement.

View File

@@ -28,7 +28,7 @@
#include <errno.h>
#include <stdio.h>
#include <string.h>
#define socklen_t int
typedef int socklen_t;
#define EAFNOSUPPORT 97
/*
* WARNING: Don't even consider trying to compile this on a system where

View File

@@ -212,11 +212,11 @@ dom_find_deep_node( IN char *names[],
*
* Note :The given node must have a text node as its first child
****************************************************************************/
static DOMString
static const DOMString
get_node_value( IN IXML_Node * node )
{
IXML_Node *text_node = NULL;
DOMString text_value = NULL;
const DOMString text_value = NULL;
text_node = ixmlNode_getFirstChild( node );
if( text_node == NULL ) {
@@ -246,18 +246,19 @@ get_node_value( IN IXML_Node * node )
****************************************************************************/
static XINLINE int
get_host_and_path( IN char *ctrl_url,
OUT memptr * host,
OUT memptr * path,
OUT const memptr *host,
OUT const memptr *path,
OUT uri_type * url )
{
if( parse_uri( ctrl_url, strlen( ctrl_url ), url ) != HTTP_SUCCESS ) {
return -1;
}
host->buf = url->hostport.text.buff;
host->length = url->hostport.text.size;
// This is done to ensure that the buffer is kept const
((memptr *)host)->buf = (char *)url->hostport.text.buff;
((memptr *)host)->length = url->hostport.text.size;
path->buf = url->pathquery.buff;
path->length = url->pathquery.size;
((memptr *)path)->buf = (char *)url->pathquery.buff;
((memptr *)path)->length = url->pathquery.size;
return 0;
}
@@ -414,12 +415,12 @@ get_response_value( IN http_message_t * hmsg,
IXML_Node *error_node = NULL;
IXML_Document *doc = NULL;
char *node_str = NULL;
char *temp_str = NULL;
const char *temp_str = NULL;
DOMString error_node_str = NULL;
int err_code;
xboolean done = FALSE;
char *names[5];
DOMString nodeValue;
const DOMString nodeValue;
err_code = UPNP_E_BAD_RESPONSE; // default error
@@ -601,15 +602,18 @@ SoapSendAction( IN char *action_url,
char *upnp_error_str;
xboolean got_response = FALSE;
off_t content_length;
char *xml_start =
// "<?xml version=\"1.0\"?>\n" required??
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n"
"<s:Envelope "
"xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n"
"<s:Body>";
char *xml_end = "</s:Body>\n" "</s:Envelope>\n";
int xml_start_len;
int xml_end_len;
int action_str_len;
char *xml_end =
"</s:Body>\r\n"
"</s:Envelope>\r\n\r\n";
size_t xml_start_len;
size_t xml_end_len;
size_t action_str_len;
*response_node = NULL; // init
@@ -644,18 +648,23 @@ SoapSendAction( IN char *action_url,
url.hostport.text.size,
url.hostport.text.buff ); )
xml_start_len = strlen( xml_start );
xml_start_len = strlen( xml_start );
xml_end_len = strlen( xml_end );
action_str_len = strlen( action_str );
// make request msg
request.size_inc = 50;
if( http_MakeMessage( &request, 1, 1, "q" "N" "s" "sssbs" "U" "c" "bbb", SOAPMETHOD_POST, &url, xml_start_len + action_str_len + xml_end_len, // content-length
ContentTypeHeader,
"SOAPACTION: \"", service_type, "#", name.buf,
name.length, "\"\r\n", xml_start, xml_start_len,
action_str, action_str_len, xml_end,
xml_end_len ) != 0 ) {
content_length = xml_start_len + action_str_len + xml_end_len;
if (http_MakeMessage(
&request, 1, 1,
"q" "N" "s" "sssbsc" "Uc" "b" "b" "b",
SOAPMETHOD_POST, &url,
content_length,
ContentTypeHeader,
"SOAPACTION: \"", service_type, "#", name.buf, name.length, "\"",
xml_start, xml_start_len,
action_str, action_str_len,
xml_end, xml_end_len ) != 0 ) {
goto error_handler;
}
@@ -684,7 +693,7 @@ SoapSendAction( IN char *action_url,
err_code = ret_code;
}
error_handler:
error_handler:
ixmlFreeDOMString( action_str );
membuffer_destroy( &request );
membuffer_destroy( &responsename );
@@ -736,20 +745,26 @@ SoapSendActionEx( IN char *action_url,
xboolean got_response = FALSE;
char *xml_start =
// "<?xml version=\"1.0\"?>\n" required??
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n";
char *xml_body_start = "<s:Body>";
char *xml_end = "</s:Body>\n" "</s:Envelope>\n";
int xml_start_len;
int xml_end_len;
char *xml_header_start = "<s:Header>\n";
char *xml_header_end = "</s:Header>\n";
int xml_header_start_len;
int xml_header_end_len;
int xml_header_str_len;
int action_str_len;
int xml_body_start_len;
"<s:Envelope "
"xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n";
char *xml_header_start =
"<s:Header>\r\n";
char *xml_header_end =
"</s:Header>\r\n";
char *xml_body_start =
"<s:Body>";
char *xml_end =
"</s:Body>\r\n"
"</s:Envelope>\r\n";
size_t xml_start_len;
size_t xml_header_start_len;
size_t xml_header_str_len;
size_t xml_header_end_len;
size_t xml_body_start_len;
size_t action_str_len;
size_t xml_end_len;
off_t content_length;
*response_node = NULL; // init
@@ -789,7 +804,7 @@ SoapSendActionEx( IN char *action_url,
url.hostport.text.size,
url.hostport.text.buff ); )
xml_start_len = strlen( xml_start );
xml_start_len = strlen( xml_start );
xml_body_start_len = strlen( xml_body_start );
xml_end_len = strlen( xml_end );
action_str_len = strlen( action_str );
@@ -800,17 +815,24 @@ SoapSendActionEx( IN char *action_url,
// make request msg
request.size_inc = 50;
if( http_MakeMessage( &request, 1, 1, "q" "N" "s" "sssbs" "U" "c" "bbbbbbb", SOAPMETHOD_POST, &url, xml_start_len + xml_header_start_len + xml_header_str_len + xml_header_end_len + xml_body_start_len + action_str_len + xml_end_len, // content-length
ContentTypeHeader,
"SOAPACTION: \"", service_type, "#", name.buf,
name.length, "\"\r\n",
xml_start, xml_start_len,
xml_header_start, xml_header_start_len,
xml_header_str, xml_header_str_len,
xml_header_end, xml_header_end_len,
xml_body_start, xml_body_start_len,
action_str, action_str_len,
xml_end, xml_end_len ) != 0 ) {
content_length =
xml_start_len +
xml_header_start_len + xml_header_str_len + xml_header_end_len +
xml_body_start_len + action_str_len + xml_end_len;
if (http_MakeMessage(
&request, 1, 1,
"q" "N" "s" "sssbsc" "Uc" "b" "b" "b" "b" "b" "b" "b",
SOAPMETHOD_POST, &url,
content_length,
ContentTypeHeader,
"SOAPACTION: \"", service_type, "#", name.buf, name.length, "\"",
xml_start, xml_start_len,
xml_header_start, xml_header_start_len,
xml_header_str, xml_header_str_len,
xml_header_end, xml_header_end_len,
xml_body_start, xml_body_start_len,
action_str, action_str_len,
xml_end, xml_end_len ) != 0 ) {
goto error_handler;
}
@@ -873,24 +895,28 @@ SoapGetServiceVarStatus( IN char *action_url,
IN char *var_name,
OUT char **var_value )
{
memptr host; // value for HOST header
memptr path; // ctrl path in first line in msg
const memptr host; // value for HOST header
const memptr path; // ctrl path in first line in msg
uri_type url;
membuffer request;
int ret_code;
http_parser_t response;
int upnp_error_code;
off_t content_length;
char *xml_start =
// "<?xml version=\"1.0\"?>\n" required??
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n"
"<s:Body>\n"
"<u:QueryStateVariable xmlns:u=\"urn:schemas-upnp-org:control-1-0\">\n"
"<s:Envelope "
"xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n"
"<s:Body>\r\n"
"<u:QueryStateVariable xmlns:u=\"urn:schemas-upnp-org:control-1-0\">\r\n"
"<u:varName>";
char *xml_end = "</u:varName>\n"
"</u:QueryStateVariable>\n" "</s:Body>\n" "</s:Envelope>\n";
char *xml_end =
"</u:varName>\r\n"
"</u:QueryStateVariable>\r\n"
"</s:Body>\r\n"
"</s:Envelope>\r\n";
*var_value = NULL; // return NULL in case of an error
@@ -902,11 +928,16 @@ SoapGetServiceVarStatus( IN char *action_url,
}
// make headers
request.size_inc = 50;
if( http_MakeMessage( &request, 1, 1, "Q" "sbc" "N" "s" "s" "U" "c" "sss", SOAPMETHOD_POST, path.buf, path.length, "HOST: ", host.buf, host.length, strlen( xml_start ) + strlen( var_name ) + strlen( xml_end ), // content-length
ContentTypeHeader,
"SOAPACTION: \"urn:schemas"
"-upnp-org:control-1-0#QueryStateVariable\"\r\n",
xml_start, var_name, xml_end ) != 0 ) {
content_length = strlen( xml_start ) + strlen( var_name ) + strlen( xml_end );
if (http_MakeMessage(
&request, 1, 1,
"Q" "sbc" "N" "s" "s" "Ucc" "sss",
SOAPMETHOD_POST, path.buf, path.length,
"HOST: ", host.buf, host.length,
content_length,
ContentTypeHeader,
"SOAPACTION: \"urn:schemas-upnp-org:control-1-0#QueryStateVariable\"",
xml_start, var_name, xml_end ) != 0 ) {
return UPNP_E_OUTOF_MEMORY;
}
// send msg and get reply

View File

@@ -189,7 +189,7 @@ send_error_response( IN SOCKINFO * info,
IN const char *err_msg,
IN http_message_t * hmsg )
{
int content_length;
off_t content_length;
int timeout_secs = SOAP_TIMEOUT;
int major,
minor;
@@ -228,20 +228,19 @@ send_error_response( IN SOCKINFO * info,
// make headers
membuffer_init( &headers );
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */
if( http_MakeMessage( &headers, major, minor,
"RNsDsSXc" "sssss",
500,
content_length,
ContentTypeHeader,
"EXT:\r\n",
X_USER_AGENT,
start_body, err_code_str, mid_body, err_msg,
end_body ) != 0 ) {
if (http_MakeMessage(
&headers, major, minor,
"RNsDsSXcc" "sssss",
500,
content_length,
ContentTypeHeader,
"EXT:\r\n",
X_USER_AGENT,
start_body, err_code_str, mid_body, err_msg,
end_body ) != 0 ) {
membuffer_destroy( &headers );
return; // out of mem
}
/*-- PATCH END - */
// send err msg
http_SendMessage( info, &timeout_secs, "b",
headers.buf, headers.length );
@@ -268,12 +267,11 @@ send_var_query_response( IN SOCKINFO * info,
IN const char *var_value,
IN http_message_t * hmsg )
{
int content_length;
off_t content_length;
int timeout_secs = SOAP_TIMEOUT;
int major,
minor;
int major;
int minor;
const char *start_body =
// "<?xml version=\"1.0\"?>\n" required??
"<s:Envelope "
"xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n"
@@ -297,19 +295,18 @@ send_var_query_response( IN SOCKINFO * info,
// make headers
membuffer_init( &response );
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */
if( http_MakeMessage( &response, major, minor,
"RNsDsSXcc" "sss",
HTTP_OK,
content_length,
ContentTypeHeader,
"EXT:\r\n",
X_USER_AGENT,
start_body, var_value, end_body ) != 0 ) {
if (http_MakeMessage(
&response, major, minor,
"RNsDsSXcc" "sss",
HTTP_OK,
content_length,
ContentTypeHeader,
"EXT:\r\n",
X_USER_AGENT,
start_body, var_value, end_body ) != 0 ) {
membuffer_destroy( &response );
return; // out of mem
}
/* -- PATCH END - */
// send msg
http_SendMessage( info, &timeout_secs, "b",
@@ -603,13 +600,13 @@ get_device_info( IN http_message_t * request,
service_info *serv_info;
char save_char;
int ret_code = -1; // error by default
char *control_url;
const char *control_url;
char *actionName = NULL;
// null-terminate pathquery of url
control_url = request->uri.pathquery.buff;
save_char = control_url[request->uri.pathquery.size];
control_url[request->uri.pathquery.size] = '\0';
((char *)control_url)[request->uri.pathquery.size] = '\0';
HandleLock( );
@@ -666,7 +663,7 @@ get_device_info( IN http_message_t * request,
ret_code = 0;
error_handler:
control_url[request->uri.pathquery.size] = save_char; // restore
((char *)control_url)[request->uri.pathquery.size] = save_char; // restore
HandleUnlock( );
return ret_code;
}
@@ -695,7 +692,7 @@ send_action_response( IN SOCKINFO * info,
int major,
minor;
int err_code;
int content_length;
off_t content_length;
int ret_code;
int timeout_secs = SOAP_TIMEOUT;
static char *start_body =
@@ -717,17 +714,22 @@ send_action_response( IN SOCKINFO * info,
goto error_handler;
}
content_length = strlen( start_body ) + strlen( xml_response ) +
content_length =
strlen( start_body ) +
strlen( xml_response ) +
strlen( end_body );
// make headers
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */
if( http_MakeMessage( &headers, major, minor, "RNsDsSXcc", HTTP_OK, // status code
content_length, ContentTypeHeader, "EXT:\r\n", X_USER_AGENT // EXT header
) != 0 ) {
if (http_MakeMessage(
&headers, major, minor,
"RNsDsSXcc",
HTTP_OK, // status code
content_length,
ContentTypeHeader,
"EXT:\r\n",
X_USER_AGENT) != 0 ) {
goto error_handler;
}
/* -- PATCH END - */
// send whole msg
ret_code = http_SendMessage( info, &timeout_secs, "bbbb",
@@ -778,7 +780,7 @@ get_var_name( IN IXML_Document * TempDoc,
IXML_Node *VarNameNode = NULL;
IXML_Node *VarNode = NULL;
const DOMString StNodeName = NULL;
DOMString Temp = NULL;
const DOMString Temp = NULL;
int ret_val = -1;
// Got the Envelop node here

View File

@@ -234,7 +234,17 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr,
for( Index = 0; Index < NumPacket; Index++ ) {
int rc;
// The reason to keep this loop is purely historical/documentation,
// according to section 9.2 of HTTPU spec:
//
// "If a multicast resource would send a response(s) to any copy of the
// request, it SHOULD send its response(s) to each copy of the request
// it receives. It MUST NOT repeat its response(s) per copy of the
// reuqest."
//
// http://www.upnp.org/download/draft-goland-http-udp-04.txt
//
// So, NUM_COPY has been changed from 2 to 1.
NumCopy = 0;
while( NumCopy < NUM_COPY ) {
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
@@ -295,16 +305,16 @@ CreateServicePacket( IN int msg_type,
*packet = NULL;
if( msg_type == MSGTYPE_REPLY ) {
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */
ret_code = http_MakeMessage( &buf, 1, 1,
"R" "sdc" "D" "s" "ssc" "S" "Xc" "ssc"
"ssc" "c", HTTP_OK,
"CACHE-CONTROL: max-age=", duration,
"EXT:\r\n", "LOCATION: ", location,
X_USER_AGENT,
"ST: ", nt, "USN: ", usn );
/* -- PATCH END - */
ret_code = http_MakeMessage(
&buf, 1, 1,
"R" "sdc" "D" "sc" "ssc" "S" "Xc" "ssc" "sscc",
HTTP_OK,
"CACHE-CONTROL: max-age=", duration,
"EXT:",
"LOCATION: ", location,
X_USER_AGENT,
"ST: ", nt,
"USN: ", usn);
if( ret_code != 0 ) {
return;
}
@@ -320,15 +330,17 @@ CreateServicePacket( IN int msg_type,
// NOTE: The CACHE-CONTROL and LOCATION headers are not present in
// a shutdown msg, but are present here for MS WinMe interop.
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */
ret_code = http_MakeMessage( &buf, 1, 1,
"Q" "sssdc" "sdc" "ssc" "ssc" "ssc"
"S" "Xc" "ssc" "c", HTTPMETHOD_NOTIFY, "*",
1, "HOST: ", SSDP_IP, ":", SSDP_PORT,
"CACHE-CONTROL: max-age=", duration,
"LOCATION: ", location, "NT: ", nt,
"NTS: ", nts, X_USER_AGENT, "USN: ", usn );
/* -- PATCH END - */
ret_code = http_MakeMessage(
&buf, 1, 1,
"Q" "sssdc" "sdc" "ssc" "ssc" "ssc" "S" "Xc" "sscc",
HTTPMETHOD_NOTIFY, "*",
1, "HOST: ", SSDP_IP, ":", SSDP_PORT,
"CACHE-CONTROL: max-age=", duration,
"LOCATION: ", location,
"NT: ", nt,
"NTS: ", nts,
X_USER_AGENT,
"USN: ", usn );
if( ret_code != 0 ) {
return;
}

View File

@@ -112,7 +112,7 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
IXML_Node *tmpNode = NULL;
IXML_Node *tmpNode2 = NULL;
IXML_Node *textNode = NULL;
DOMString tmpStr;
const DOMString tmpStr;
char SERVER[200];
DBGONLY( const DOMString dbgStr;
@@ -922,6 +922,7 @@ get_ssdp_sockets( MiniServerSockArray * out )
struct ip_mreq ssdpMcastAddr;
struct sockaddr_in ssdpAddr;
int option = 1;
struct in_addr addr;
CLIENTONLY( if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) )
== UPNP_INVALID_SOCKET ) {
@@ -997,7 +998,7 @@ get_ssdp_sockets( MiniServerSockArray * out )
}
memset( ( void * )&ssdpMcastAddr, 0, sizeof( struct ip_mreq ) );
ssdpMcastAddr.imr_interface.s_addr = htonl( INADDR_ANY );
ssdpMcastAddr.imr_interface.s_addr = inet_addr( LOCAL_HOST );
ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP );
if( setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
( char * )&ssdpMcastAddr,
@@ -1012,6 +1013,17 @@ get_ssdp_sockets( MiniServerSockArray * out )
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
return UPNP_E_SOCKET_ERROR;
}
/* Set multicast interface. */
memset( ( void * )&addr, 0, sizeof( struct in_addr ));
addr.s_addr = inet_addr(LOCAL_HOST);
if (setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF,
(char *)&addr, sizeof addr) != 0) {
DBGONLY(UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"Couldn't set multicast interface.\n" ));
/* This is probably not a critical error, so let's continue. */
}
// result is not checked becuase it will fail in WinMe and Win9x.
setsockopt( ssdpSock, IPPROTO_IP,
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );

View File

@@ -213,7 +213,7 @@ config_description_doc( INOUT IXML_Document * doc,
IXML_Node *rootNode = NULL;
IXML_Node *urlbase_node = NULL;
char *urlBaseStr = "URLBase";
DOMString domStr = NULL;
const DOMString domStr = NULL;
uri_type uri;
int err_code;
int len;