Compare commits
7 Commits
release-1.
...
release-1.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
34b38a27d5 | ||
![]() |
84f3b920a5 | ||
![]() |
f6dd5062fe | ||
![]() |
7d4a610b93 | ||
![]() |
0a074d1989 | ||
![]() |
0475a46680 | ||
![]() |
2a76749682 |
56
ChangeLog
56
ChangeLog
@@ -1,3 +1,53 @@
|
||||
*******************************************************************************
|
||||
Version 1.6.3
|
||||
*******************************************************************************
|
||||
|
||||
2007-12-25 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* Using pthread flags for the whole project, not just at the places
|
||||
individually indicated by several Makefile.am files spread all over
|
||||
the directories. That was too much error prone.
|
||||
|
||||
2007-12-24 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* Added a configure test to check if pthread_rwlock_t is available.
|
||||
Define _GNU_SOURCE if needed. The fallback behaviou will only be
|
||||
implemented if _GNU_SOURCE prooves to be insufficient on some
|
||||
platforms. Thanks to Jonathan Casiot (no_dice) and Robert Gingher
|
||||
(robsbox).
|
||||
|
||||
2007-12-17 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* Removed unused iasnprintf.{c,h} files.
|
||||
|
||||
2007-12-17 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* Removed STATSONLY() macro from ThreadPool.{c,h}.
|
||||
* Removed time() usage from ThreadPool.c.
|
||||
* Fixed STATS = 0 compilation.
|
||||
|
||||
2007-12-16 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* Library was not compiling on FreeBSD 7. Code now no longer uses
|
||||
ftime(), using gettimeofday() instead. Thanks to Josh Carroll.
|
||||
|
||||
|
||||
*******************************************************************************
|
||||
Version 1.6.2
|
||||
*******************************************************************************
|
||||
|
||||
2007-12-10 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* Fixed a compilation error due to a missing #ifdef in
|
||||
upnp/src/genlib/miniserver/miniserver.c. Thanks to Eugene Christensen.
|
||||
|
||||
2007-11-12 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* "make check" was failing because ixml/test/test_document.sh did not
|
||||
have the executable flag set. Thanks to Steve Bresson.
|
||||
|
||||
2007-11-12 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* Fixed a memory leak in upnpapi.c to delete gMiniServerThreadPool in
|
||||
the call to UpnpFinish(). Thanks to Fabrice Fontaine.
|
||||
|
||||
2007-11-09 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* Added a isleep() call to the error handler of select() in
|
||||
RunMiniServer(), so that it does not take 100% cpu in case select()
|
||||
fails repeatedly.
|
||||
|
||||
*******************************************************************************
|
||||
Version 1.6.1
|
||||
*******************************************************************************
|
||||
@@ -116,6 +166,10 @@ Version 1.6.0
|
||||
an interface change in the library and the minor library version was
|
||||
bumped. Also, the libtool library numbers were changed accordingly.
|
||||
|
||||
*******************************************************************************
|
||||
Version 1.4.7
|
||||
*******************************************************************************
|
||||
|
||||
2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* Added support for the Basic Device
|
||||
(http://www.upnp.org/standardizeddcps/basic.asp) as suggested by
|
||||
@@ -333,7 +387,7 @@ Version 1.4.2
|
||||
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
|
||||
Submitted By: Jonathan Casiot - 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.
|
||||
|
11
THANKS
11
THANKS
@@ -16,24 +16,29 @@ exempt of errors.
|
||||
- Erik Johansson
|
||||
- Eric Tanguy
|
||||
- Erwan Velu
|
||||
- Eugene Christensen
|
||||
- Fabrice Fontaine
|
||||
- Fredrik Svensson
|
||||
- Glen Masgai
|
||||
- Jiri Zouhar
|
||||
- John Dennis
|
||||
- Jonathan (no_dice)
|
||||
- Jonathan Casiot (no_dice)
|
||||
- Josh Carroll
|
||||
- Keith Brindley
|
||||
- Leuk_He
|
||||
- Loigu
|
||||
- Luke Kim
|
||||
- Marcelo Roberto Jimenez (mroberto)
|
||||
- Markus Strobl
|
||||
- Nektarios K. Papadopoulos
|
||||
- Nektarios K. Papadopoulos (npapadop)
|
||||
- Oskar Liljeblad
|
||||
- Michael (Oxy)
|
||||
- Michael (oxygenic)
|
||||
- Paul Vixie
|
||||
- Rene Hexel
|
||||
- Robert Gingher (robsbox)
|
||||
- Siva Chandran
|
||||
- Stéphane Corthésy
|
||||
- Steve Bresson
|
||||
- Timothy Redaelli
|
||||
- Titus Winters
|
||||
|
||||
|
233
configure.ac
233
configure.ac
@@ -9,92 +9,115 @@
|
||||
|
||||
AC_PREREQ(2.60)
|
||||
|
||||
AC_INIT([libupnp], [1.6.1], [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:
|
||||
# - library code modified: revision++
|
||||
# - interfaces changed/added/removed: current++ and revision=0
|
||||
# - interfaces added: age++
|
||||
# - interfaces removed: age=0
|
||||
# *please update only once, before a formal release, not for each change*
|
||||
#
|
||||
###############################################################################
|
||||
# Release 1.4.1:
|
||||
#AC_SUBST([LT_VERSION_IXML], [2:2:0])
|
||||
#AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0])
|
||||
#AC_SUBST([LT_VERSION_UPNP], [2:2:0])
|
||||
#
|
||||
###############################################################################
|
||||
# Release 1.4.6:
|
||||
# "current:revision:age"
|
||||
#
|
||||
# - Code has changed in ixml
|
||||
# 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
|
||||
#
|
||||
#AC_SUBST([LT_VERSION_IXML], [2:3:0])
|
||||
#AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1])
|
||||
#AC_SUBST([LT_VERSION_UPNP], [2:3:0])
|
||||
#
|
||||
###############################################################################
|
||||
# Release 1.6.0:
|
||||
# "current:revision:age"
|
||||
#
|
||||
# - Code has changed in ixml
|
||||
# revision: 3 -> 4
|
||||
# - Code has changed in threadutil
|
||||
# revision: 0 -> 1
|
||||
# - Code has changed in upnp
|
||||
# revision: 3 -> 4
|
||||
# - Interface changed in upnp
|
||||
# current: 2 -> 3
|
||||
# revision: 4 -> 0
|
||||
# - Interface removed in upnp
|
||||
# age: 0 -> 0
|
||||
#
|
||||
#AC_SUBST([LT_VERSION_IXML], [2:4:0])
|
||||
#AC_SUBST([LT_VERSION_THREADUTIL], [3:1:1])
|
||||
#AC_SUBST([LT_VERSION_UPNP], [3:0:0])
|
||||
#
|
||||
###############################################################################
|
||||
# Release 1.6.1:
|
||||
# "current:revision:age"
|
||||
#
|
||||
# - Code has changed in threadutil
|
||||
# revision: 1 -> 2
|
||||
# - Interface added in threadutil
|
||||
# current: 3 -> 4
|
||||
# revision: 2 -> 0
|
||||
# - Interface added in threadutil
|
||||
# age: 1 -> 2
|
||||
# - Code has changed in upnp
|
||||
# revision: 0 -> 1
|
||||
#
|
||||
#AC_SUBST([LT_VERSION_IXML], [2:4:0])
|
||||
#AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2])
|
||||
#AC_SUBST([LT_VERSION_UPNP], [3:1:0])
|
||||
#
|
||||
###############################################################################
|
||||
AC_INIT([libupnp], [1.6.3], [mroberto@users.sourceforge.net])
|
||||
dnl ############################################################################
|
||||
dnl # *Independently* of the above libupnp package version, the libtool version
|
||||
dnl # of the 3 libraries need to be updated whenever there is a change released:
|
||||
dnl # "current:revision:age" (this is NOT the same as the package version),
|
||||
dnl # where:
|
||||
dnl # - library code modified: revision++
|
||||
dnl # - interfaces changed/added/removed: current++ and revision=0
|
||||
dnl # - interfaces added: age++
|
||||
dnl # - interfaces removed: age=0
|
||||
dnl # *please update only once, before a formal release, not for each change*
|
||||
dnl #
|
||||
dnl ############################################################################
|
||||
dnl # Release 1.4.1:
|
||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:2:0])
|
||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [2:2:0])
|
||||
dnl #
|
||||
dnl ############################################################################
|
||||
dnl # Release 1.4.6:
|
||||
dnl # "current:revision:age"
|
||||
dnl #
|
||||
dnl # - Code has changed in ixml
|
||||
dnl # revision: 2 -> 3
|
||||
dnl # - Code has changed in threadutil
|
||||
dnl # revision: 2 -> 3
|
||||
dnl # - Interface added in threadutil
|
||||
dnl # current: 2 -> 3
|
||||
dnl # revisiion: 3 -> 0
|
||||
dnl # age: 0 -> 1
|
||||
dnl # - Code has changed in upnp
|
||||
dnl # revision: 2 -> 3
|
||||
dnl #
|
||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:3:0])
|
||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [2:3:0])
|
||||
dnl #
|
||||
dnl ############################################################################
|
||||
dnl # Release 1.6.0:
|
||||
dnl # "current:revision:age"
|
||||
dnl #
|
||||
dnl # - Code has changed in ixml
|
||||
dnl # revision: 3 -> 4
|
||||
dnl # - Code has changed in threadutil
|
||||
dnl # revision: 0 -> 1
|
||||
dnl # - Code has changed in upnp
|
||||
dnl # revision: 3 -> 4
|
||||
dnl # - Interface changed in upnp
|
||||
dnl # current: 2 -> 3
|
||||
dnl # revision: 4 -> 0
|
||||
dnl # - Interface removed in upnp
|
||||
dnl # age: 0 -> 0
|
||||
dnl #
|
||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0])
|
||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [3:1:1])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [3:0:0])
|
||||
dnl #
|
||||
dnl ############################################################################
|
||||
dnl # Release 1.6.1:
|
||||
dnl # "current:revision:age"
|
||||
dnl #
|
||||
dnl # - Code has changed in threadutil
|
||||
dnl # revision: 1 -> 2
|
||||
dnl # - Interface added in threadutil
|
||||
dnl # current: 3 -> 4
|
||||
dnl # revision: 2 -> 0
|
||||
dnl # - Interface added in threadutil
|
||||
dnl # age: 1 -> 2
|
||||
dnl # - Code has changed in upnp
|
||||
dnl # revision: 0 -> 1
|
||||
dnl #
|
||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0])
|
||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [3:1:0])
|
||||
dnl #
|
||||
dnl ############################################################################
|
||||
dnl # Release 1.6.2:
|
||||
dnl # "current:revision:age"
|
||||
dnl #
|
||||
dnl # - Code has changed in upnp
|
||||
dnl # revision: 1 -> 2
|
||||
dnl #
|
||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0])
|
||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [3:2:0])
|
||||
dnl #
|
||||
dnl ############################################################################
|
||||
dnl # Release 1.6.3:
|
||||
dnl # "current:revision:age"
|
||||
dnl #
|
||||
dnl # - Code has changed in threadutil
|
||||
dnl # revision: 0 -> 1
|
||||
dnl #
|
||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0])
|
||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:1:2])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [3:2:0])
|
||||
dnl #
|
||||
dnl ############################################################################
|
||||
AC_SUBST([LT_VERSION_IXML], [2:4:0])
|
||||
AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2])
|
||||
AC_SUBST([LT_VERSION_UPNP], [3:1:0])
|
||||
###############################################################################
|
||||
# Repeating the algorithm so that it is closer to the modificatin place:
|
||||
# - library code modified: revision++
|
||||
# - interfaces changed/added/removed: current++ and revision=0
|
||||
# - interfaces added: age++
|
||||
# - interfaces removed: age=0
|
||||
# *please update only once, before a formal release, not for each change*
|
||||
###############################################################################
|
||||
AC_SUBST([LT_VERSION_THREADUTIL], [4:1:2])
|
||||
AC_SUBST([LT_VERSION_UPNP], [3:2:0])
|
||||
dnl ############################################################################
|
||||
dnl # Repeating the algorithm to place it closer to the modificatin place:
|
||||
dnl # - library code modified: revision++
|
||||
dnl # - interfaces changed/added/removed: current++ and revision=0
|
||||
dnl # - interfaces added: age++
|
||||
dnl # - interfaces removed: age=0
|
||||
dnl # *please update only once, before a formal release, not for each change*
|
||||
dnl ############################################################################
|
||||
|
||||
|
||||
AC_CONFIG_AUX_DIR(config.aux)
|
||||
@@ -129,8 +152,7 @@ AC_REVISION([$Revision: 1.11 $])
|
||||
upnpmaj=`echo "$PACKAGE_VERSION" | sed 's/\..*//' `
|
||||
upnpmin=[`echo "$PACKAGE_VERSION" | sed 's/^[^.]\.// ; s/[^0-9].*$//' `]
|
||||
upnppatch=[`echo "$PACKAGE_VERSION" | sed 's/^[^.]\.[^.]\.// ; s/[^0-9].*$//' `]
|
||||
AC_DEFINE_UNQUOTED([UPNP_VERSION_STRING], "$PACKAGE_VERSION",
|
||||
[see upnpconfig.h])
|
||||
AC_DEFINE_UNQUOTED([UPNP_VERSION_STRING], "$PACKAGE_VERSION", [see upnpconfig.h])
|
||||
AC_DEFINE_UNQUOTED([UPNP_VERSION_MAJOR], $upnpmaj, [see upnpconfig.h])
|
||||
AC_DEFINE_UNQUOTED([UPNP_VERSION_MINOR], $upnpmin, [see upnpconfig.h])
|
||||
AC_DEFINE_UNQUOTED([UPNP_VERSION_PATCH], $upnppatch, [see upnpconfig.h])
|
||||
@@ -152,7 +174,6 @@ fi
|
||||
#
|
||||
# Check for libupnp subsets
|
||||
#
|
||||
|
||||
RT_BOOL_ARG_ENABLE([client], [yes], [control point code (client)])
|
||||
if test "x$enable_client" = xyes ; then
|
||||
AC_DEFINE(UPNP_HAVE_CLIENT, 1, [see upnpconfig.h])
|
||||
@@ -186,11 +207,13 @@ fi
|
||||
RT_BOOL_ARG_ENABLE([samples], [yes], [compilation of upnp/sample/ code])
|
||||
|
||||
|
||||
#
|
||||
# doc installation
|
||||
# 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(
|
||||
@@ -205,7 +228,9 @@ AS_HELP_STRING(
|
||||
[],
|
||||
[with_documentation=no])
|
||||
|
||||
#
|
||||
# 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
|
||||
@@ -291,7 +316,6 @@ AC_CHECK_HEADERS(
|
||||
# Checks for typedefs, structures, and compiler characteristics
|
||||
#
|
||||
AC_C_CONST
|
||||
AC_TYPE_SIZE_T
|
||||
TYPE_SOCKLEN_T
|
||||
|
||||
|
||||
@@ -306,9 +330,40 @@ AC_CHECK_FUNCS(ftime,, [AC_CHECK_LIB(compat, ftime)])
|
||||
#
|
||||
# Checks for POSIX Threads
|
||||
#
|
||||
echo "--------------------------- pthread stuff -------------------------------------"
|
||||
ACX_PTHREAD(
|
||||
[],
|
||||
[AC_MSG_ERROR([POSIX threads are required to build this program])])
|
||||
#
|
||||
# Update environment variables for pthreads
|
||||
#
|
||||
CC="$PTHREAD_CC"
|
||||
CFLAGS="$PTHREAD_CFLAGS $CFLAGS"
|
||||
LIBS="$PTHREAD_LIBS $LIBS"
|
||||
#
|
||||
# Determine if pthread_rwlock_t is available
|
||||
#
|
||||
echo "----------------------- pthread_rwlock_t stuff --------------------------------"
|
||||
AC_MSG_CHECKING([if pthread_rwlock_t is available])
|
||||
AC_LANG([C])
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[#include <pthread.h>],
|
||||
[pthread_rwlock_t *x;])],
|
||||
[AC_DEFINE([UPNP_USE_RWLOCK], [1], [Use pthread_rwlock_t])
|
||||
AC_MSG_RESULT([yes, supported without any options])],
|
||||
[AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[#define _GNU_SOURCE
|
||||
#include <pthread.h>],
|
||||
[pthread_rwlock_t *x;])],
|
||||
[AC_DEFINE([UPNP_USE_RWLOCK], [1], [Use pthread_rwlock_t])
|
||||
CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
|
||||
AC_MSG_RESULT([yes, definition of _GNU_SOURCE required])],
|
||||
[AC_DEFINE([UPNP_USE_RWLOCK], [0], [Do not use pthread_rwlock_t])
|
||||
AC_MSG_RESULT([no, needs to fallback to pthread_mutex])
|
||||
AC_MSG_ERROR([pthread_rwlock_t not available])])])
|
||||
echo "-------------------------------------------------------------------------------"
|
||||
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
|
@@ -38,10 +38,6 @@
|
||||
#define MINVAL( a, b ) ( (a) < (b) ? (a) : (b) )
|
||||
#define MAXVAL( a, b ) ( (a) > (b) ? (a) : (b) )
|
||||
|
||||
#ifndef WIN32
|
||||
#define UPNP_INLINE inline
|
||||
#endif
|
||||
|
||||
#define MEMBUF_DEF_SIZE_INC 20
|
||||
|
||||
|
||||
|
@@ -504,14 +504,19 @@ Parser_init( )
|
||||
* Parser_isValidEndElement
|
||||
* check if a new node->nodeName matches top of element stack.
|
||||
* Internal to parser only.
|
||||
*
|
||||
*=================================================================*/
|
||||
static int
|
||||
Parser_isValidEndElement( IN Parser * xmlParser,
|
||||
Parser_isValidEndElement(
|
||||
IN Parser * xmlParser,
|
||||
IN IXML_Node * newNode )
|
||||
{
|
||||
return ( strcmp( xmlParser->pCurElement->element, newNode->nodeName )
|
||||
== 0 );
|
||||
assert( xmlParser );
|
||||
assert( xmlParser->pCurElement );
|
||||
assert( xmlParser->pCurElement->element );
|
||||
assert( newNode );
|
||||
assert( newNode->nodeName );
|
||||
|
||||
return strcmp( xmlParser->pCurElement->element, newNode->nodeName ) == 0;
|
||||
}
|
||||
|
||||
/*===============================================================
|
||||
@@ -921,6 +926,8 @@ Parser_parseDocument( OUT IXML_Document ** retDoc,
|
||||
int rc = IXML_SUCCESS;
|
||||
IXML_CDATASection *cdataSecNode = NULL;
|
||||
|
||||
// It is important that the node gets initialized here, otherwise things
|
||||
// can go wrong on the error handler.
|
||||
ixmlNode_init( &newNode );
|
||||
|
||||
rc = ixmlDocument_createDocumentEx( &gRootDoc );
|
||||
@@ -936,7 +943,9 @@ Parser_parseDocument( OUT IXML_Document ** retDoc,
|
||||
}
|
||||
|
||||
while( bETag == FALSE ) {
|
||||
// clear the newNode contents
|
||||
// clear the newNode contents. Redundant on the first iteration,
|
||||
// but nonetheless, necessary due to the possible calls to
|
||||
// ErrorHandler above. Currently, this is just a memset to zero.
|
||||
ixmlNode_init( &newNode );
|
||||
|
||||
if( Parser_getNextNode( xmlParser, &newNode, &bETag ) ==
|
||||
@@ -2497,3 +2506,4 @@ Parser_getNextNode( IN Parser * xmlParser,
|
||||
return IXML_SYNTAX_ERR;
|
||||
|
||||
}
|
||||
|
||||
|
0
ixml/test/test_document.sh
Normal file → Executable file
0
ixml/test/test_document.sh
Normal file → Executable file
@@ -1,4 +1,4 @@
|
||||
Version: 1.4.2
|
||||
Version: 1.6.2
|
||||
Summary: Universal Plug and Play (UPnP) SDK
|
||||
Name: libupnp
|
||||
Release: 1%{?dist}
|
||||
@@ -77,6 +77,12 @@ make install DESTDIR=$RPM_BUILD_ROOT
|
||||
rm -rf %{buildroot}
|
||||
|
||||
%changelog
|
||||
* Mon Nov 19 2007 Marcelo Jimenez <mroberto@users.sourceforge.net> - 1.6.2-1
|
||||
- Update to version 1.6.2
|
||||
|
||||
* Mon Nov 19 2007 Marcelo Jimenez <mroberto@users.sourceforge.net> - 1.4.7-1
|
||||
- Update to version 1.4.7
|
||||
|
||||
* Fri Feb 02 2007 Eric Tanguy <eric.tanguy@univ-nantes.fr> - 1.4.2-1
|
||||
- Update to version 1.4.2
|
||||
|
||||
|
@@ -6,7 +6,6 @@
|
||||
#
|
||||
|
||||
AM_CPPFLAGS = -I$(srcdir)/inc -I$(srcdir)/src/inc
|
||||
AM_CFLAGS = $(PTHREAD_CFLAGS)
|
||||
|
||||
if ENABLE_DEBUG
|
||||
AM_CPPFLAGS += -DDEBUG -DSTATS
|
||||
@@ -21,12 +20,11 @@ libthreadutil_la_LDFLAGS = -version-info $(LT_VERSION_THREADUTIL)
|
||||
|
||||
libthreadutil_la_SOURCES = \
|
||||
src/FreeList.c src/LinkedList.c \
|
||||
src/ThreadPool.c src/TimerThread.c \
|
||||
src/iasnprintf.c
|
||||
src/ThreadPool.c src/TimerThread.c
|
||||
|
||||
upnpincludedir = $(includedir)/upnp
|
||||
upnpinclude_HEADERS = \
|
||||
inc/FreeList.h inc/LinkedList.h \
|
||||
inc/ThreadPool.h inc/TimerThread.h \
|
||||
inc/iasnprintf.h inc/ithread.h
|
||||
inc/ithread.h
|
||||
|
||||
|
@@ -32,6 +32,12 @@
|
||||
#ifndef THREADPOOL_H
|
||||
#define THREADPOOL_H
|
||||
|
||||
#ifdef UPNP_USE_MSVCPP
|
||||
#define UPNP_INLINE
|
||||
#else
|
||||
#define UPNP_INLINE inline
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -64,32 +70,23 @@ typedef enum priority {LOW_PRIORITY,
|
||||
#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 */
|
||||
#ifdef WIN32 /* TODO: check why STATSONLY fails during compilation */
|
||||
#undef STATS
|
||||
#endif
|
||||
|
||||
#ifdef STATS
|
||||
#define STATSONLY(x) x
|
||||
#else
|
||||
#define STATSONLY(x)
|
||||
#endif
|
||||
/* always include stats because code change is minimal */
|
||||
#define STATS 1
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define DEBUG 1
|
||||
#endif
|
||||
|
||||
#include "LinkedList.h"
|
||||
#include <sys/timeb.h>
|
||||
#include <sys/time.h> /* for gettimeofday() */
|
||||
#include "FreeList.h"
|
||||
|
||||
#include "ithread.h"
|
||||
#include <errno.h>
|
||||
#include <sys/timeb.h>
|
||||
|
||||
#define EXPORT
|
||||
|
||||
typedef int PolicyType;
|
||||
#define DEFAULT_POLICY SCHED_OTHER
|
||||
#define DEFAULT_SCHED_PARAM 0 /* default priority */
|
||||
@@ -111,26 +108,28 @@ typedef void (*free_routine)(void *arg);
|
||||
*****************************************************************************/
|
||||
typedef struct THREADPOOLATTR
|
||||
{
|
||||
int minThreads; /* minThreads, ThreadPool will always maintain at least
|
||||
this many threads */
|
||||
/* minThreads, ThreadPool will always maintain at least this many threads */
|
||||
int minThreads;
|
||||
|
||||
int maxThreads; /* maxThreads, ThreadPool will never have more than this
|
||||
number of threads */
|
||||
/* maxThreads, ThreadPool will never have more than this number of threads */
|
||||
int maxThreads;
|
||||
|
||||
int maxIdleTime; /* maxIdleTime (in milliseconds)
|
||||
this is the maximum time a thread will remain idle
|
||||
before dying */
|
||||
/* maxIdleTime (in milliseconds) this is the maximum time a thread will
|
||||
* remain idle before dying */
|
||||
int maxIdleTime;
|
||||
|
||||
int jobsPerThread; /* jobs per thread to maintain */
|
||||
/* jobs per thread to maintain */
|
||||
int jobsPerThread;
|
||||
|
||||
int maxJobsTotal; /* maximum number of jobs that can be queued totally. */
|
||||
/* maximum number of jobs that can be queued totally. */
|
||||
int maxJobsTotal;
|
||||
|
||||
int starvationTime; /* the time a low priority or med priority
|
||||
job waits before getting bumped
|
||||
up a priority (in milliseconds) */
|
||||
|
||||
PolicyType schedPolicy; /* scheduling policy to use */
|
||||
/* the time a low priority or med priority job waits before getting bumped
|
||||
* up a priority (in milliseconds) */
|
||||
int starvationTime;
|
||||
|
||||
/* scheduling policy to use */
|
||||
PolicyType schedPolicy;
|
||||
} ThreadPoolAttr;
|
||||
|
||||
/****************************************************************************
|
||||
@@ -144,7 +143,7 @@ typedef struct THREADPOOLJOB
|
||||
start_routine func;
|
||||
void *arg;
|
||||
free_routine free_func;
|
||||
struct timeb requestTime;
|
||||
struct timeval requestTime;
|
||||
int priority;
|
||||
int jobId;
|
||||
} ThreadPoolJob;
|
||||
@@ -156,8 +155,6 @@ typedef struct THREADPOOLJOB
|
||||
* Structure to hold statistics
|
||||
*****************************************************************************/
|
||||
|
||||
#ifdef STATS
|
||||
|
||||
typedef struct TPOOLSTATS
|
||||
{
|
||||
double totalTimeHQ;
|
||||
@@ -181,8 +178,6 @@ typedef struct TPOOLSTATS
|
||||
int currentJobsMQ;
|
||||
} ThreadPoolStats;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ThreadPool
|
||||
@@ -222,11 +217,8 @@ typedef struct THREADPOOL
|
||||
|
||||
ThreadPoolAttr attr; /* thread pool attributes */
|
||||
|
||||
#ifdef STATS
|
||||
/* statistics */
|
||||
ThreadPoolStats stats;
|
||||
#endif
|
||||
|
||||
} ThreadPool;
|
||||
|
||||
|
||||
@@ -267,8 +259,7 @@ typedef struct THREADPOOL
|
||||
* INVALID_POLICY if schedPolicy can't be set
|
||||
* EMAXTHREADS if minimum threads is greater than maximum threads
|
||||
*****************************************************************************/
|
||||
int ThreadPoolInit(ThreadPool *tp,
|
||||
ThreadPoolAttr *attr);
|
||||
int ThreadPoolInit(ThreadPool *tp, ThreadPoolAttr *attr);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolAddPersistent
|
||||
@@ -290,9 +281,7 @@ int ThreadPoolInit(ThreadPool *tp,
|
||||
* EOUTOFMEM not enough memory to add job.
|
||||
* EMAXTHREADS not enough threads to add persistent job.
|
||||
*****************************************************************************/
|
||||
int ThreadPoolAddPersistent (ThreadPool*tp,
|
||||
ThreadPoolJob *job,
|
||||
int *jobId);
|
||||
int ThreadPoolAddPersistent(ThreadPool*tp, ThreadPoolJob *job, int *jobId);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolGetAttr
|
||||
@@ -307,8 +296,7 @@ int ThreadPoolAddPersistent (ThreadPool*tp,
|
||||
* 0 on success, nonzero on failure
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int ThreadPoolGetAttr(ThreadPool *tp,
|
||||
ThreadPoolAttr *out);
|
||||
int ThreadPoolGetAttr(ThreadPool *tp, ThreadPoolAttr *out);
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolSetAttr
|
||||
*
|
||||
@@ -322,8 +310,7 @@ int ThreadPoolGetAttr(ThreadPool *tp,
|
||||
* 0 on success, nonzero on failure
|
||||
* Returns INVALID_POLICY if policy can not be set.
|
||||
*****************************************************************************/
|
||||
int ThreadPoolSetAttr(ThreadPool *tp,
|
||||
ThreadPoolAttr *attr);
|
||||
int ThreadPoolSetAttr(ThreadPool *tp, ThreadPoolAttr *attr);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolAdd
|
||||
@@ -342,9 +329,7 @@ int ThreadPoolSetAttr(ThreadPool *tp,
|
||||
* 0 on success, nonzero on failure
|
||||
* EOUTOFMEM if not enough memory to add job.
|
||||
*****************************************************************************/
|
||||
int ThreadPoolAdd (ThreadPool*tp,
|
||||
ThreadPoolJob *job,
|
||||
int *jobId);
|
||||
int ThreadPoolAdd (ThreadPool*tp, ThreadPoolJob *job, int *jobId);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolRemove
|
||||
@@ -361,8 +346,7 @@ int ThreadPoolAdd (ThreadPool*tp,
|
||||
* 0 on success, nonzero on failure.
|
||||
* INVALID_JOB_ID if job not found.
|
||||
*****************************************************************************/
|
||||
int ThreadPoolRemove(ThreadPool *tp,
|
||||
int jobId, ThreadPoolJob *out);
|
||||
int ThreadPoolRemove(ThreadPool *tp, int jobId, ThreadPoolJob *out);
|
||||
|
||||
|
||||
|
||||
@@ -425,7 +409,6 @@ int TPJobSetPriority(ThreadPoolJob *job, ThreadPriority priority);
|
||||
*****************************************************************************/
|
||||
int TPJobSetFreeFunction(ThreadPoolJob *job, free_routine func);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrInit
|
||||
*
|
||||
|
@@ -1,66 +0,0 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* * Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#define EXPORT
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Allocates enough memory for the
|
||||
* Formatted string, up to max
|
||||
* specified.
|
||||
* With max set to -1, allocates
|
||||
* as much size as needed.
|
||||
* Memory must be freed using free.
|
||||
*/
|
||||
|
||||
EXPORT int iasnprintf(char **ret,
|
||||
int incr,
|
||||
int max,
|
||||
const char * fmt, ...)
|
||||
#ifndef SPARC_SOLARIS
|
||||
#if (__GNUC__ >= 3)
|
||||
__attribute__((format (__printf__, 4, 5)));
|
||||
#else
|
||||
;
|
||||
#endif
|
||||
EXPORT void iasnprintfFree(char *);
|
||||
#else
|
||||
;
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@@ -1,153 +0,0 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <assert.h>
|
||||
#include <sys/param.h>
|
||||
#if (defined(BSD) && BSD >= 199306) || defined(__OSX__)
|
||||
#include <stdlib.h>
|
||||
#else
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include "iasnprintf.h"
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
#define vsnprintf _vsnprintf
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Allocates enough memory for the
|
||||
* Formatted string, up to max
|
||||
* specified.
|
||||
* With max set to -1, it allocates as
|
||||
* much size as needed.
|
||||
* Memory must be freed using free.
|
||||
*/
|
||||
|
||||
int
|
||||
iasnprintf( char **ret,
|
||||
int incr,
|
||||
int max,
|
||||
const char *fmt,
|
||||
... )
|
||||
{
|
||||
int size = incr;
|
||||
int retc = 0;
|
||||
va_list ap;
|
||||
char *temp = NULL;
|
||||
|
||||
assert( ret );
|
||||
assert( fmt );
|
||||
( *ret ) = ( char * )malloc( incr );
|
||||
|
||||
if( ( *ret ) == NULL ) return -1;
|
||||
|
||||
while( 1 ) {
|
||||
va_start( ap, fmt );
|
||||
retc = vsnprintf( ( *ret ), size, fmt, ap );
|
||||
va_end( ap );
|
||||
|
||||
if( retc < 0 ) {
|
||||
//size not big enough
|
||||
//and vsnprintf does NOT return the
|
||||
//necessary number of bytes
|
||||
if( ( max != -1 ) && ( size == max ) ) //max reached
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
incr *= 2; //increase increment
|
||||
//increase size and try again
|
||||
if( ( max != -1 ) && ( ( size + incr ) > max ) ) {
|
||||
incr = ( max - size );
|
||||
}
|
||||
|
||||
temp = ( char * )realloc( ( *ret ), size + incr );
|
||||
if( temp == NULL ) {
|
||||
break;
|
||||
}
|
||||
size += incr;
|
||||
( *ret ) = temp;
|
||||
|
||||
} else {
|
||||
if( ( retc + 1 ) > size ) {
|
||||
//size not big enough
|
||||
//and vsnprintf
|
||||
//returns the necessary
|
||||
//number of bytes
|
||||
if( ( max != -1 ) && ( retc + 1 > max ) ) {
|
||||
retc = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
temp = ( char * )realloc( ( *ret ), retc + 1 );
|
||||
if( temp == NULL ) {
|
||||
retc = -1;
|
||||
break;
|
||||
}
|
||||
size = retc + 1;
|
||||
( *ret ) = temp; //size increased try again
|
||||
} else if( ( retc + 1 ) < size ) {
|
||||
//size is bigger than needed
|
||||
//try and reallocate smaller
|
||||
|
||||
temp = ( char * )realloc( ( *ret ), retc + 1 );
|
||||
if( temp != NULL ) {
|
||||
( *ret ) = temp;
|
||||
}
|
||||
break;
|
||||
} else //size is just right, exit
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if( retc < 0 ) {
|
||||
free( ( *ret ) );
|
||||
( *ret ) = NULL;
|
||||
}
|
||||
|
||||
return retc;
|
||||
}
|
||||
|
||||
void
|
||||
iasnprintfFree( char *fChar )
|
||||
{
|
||||
free( fChar );
|
||||
fChar = NULL;
|
||||
}
|
@@ -11,10 +11,6 @@ AM_CPPFLAGS = \
|
||||
-I$(top_srcdir)/threadutil/inc \
|
||||
-I$(top_srcdir)/ixml/inc
|
||||
|
||||
AM_CFLAGS = $(PTHREAD_CFLAGS)
|
||||
|
||||
AM_LDFLAGS = $(PTHREAD_LIBS)
|
||||
|
||||
LDADD = \
|
||||
libupnp.la \
|
||||
$(top_builddir)/threadutil/libthreadutil.la \
|
||||
|
@@ -9,10 +9,6 @@ AM_CPPFLAGS = \
|
||||
-I$(top_srcdir)/threadutil/inc \
|
||||
-I$(top_srcdir)/ixml/inc
|
||||
|
||||
AM_CFLAGS = $(PTHREAD_CFLAGS)
|
||||
|
||||
AM_LDFLAGS = $(PTHREAD_LIBS)
|
||||
|
||||
LDADD = \
|
||||
$(top_builddir)/upnp/libupnp.la \
|
||||
$(top_builddir)/threadutil/libthreadutil.la \
|
||||
|
@@ -92,10 +92,8 @@ CLIENTONLY( ithread_mutex_t GlobalClientSubscribeMutex; )
|
||||
|
||||
TimerThread gTimerThread;
|
||||
|
||||
ThreadPool gRecvThreadPool;
|
||||
|
||||
ThreadPool gSendThreadPool;
|
||||
|
||||
ThreadPool gRecvThreadPool;
|
||||
ThreadPool gMiniServerThreadPool;
|
||||
|
||||
//Flag to indicate the state of web server
|
||||
@@ -410,14 +408,15 @@ UpnpFinish()
|
||||
}
|
||||
|
||||
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"Inside UpnpFinish : UpnpSdkInit is :%d:\n",
|
||||
UpnpSdkInit );
|
||||
"Inside UpnpFinish : UpnpSdkInit is :%d:\n", UpnpSdkInit );
|
||||
if( UpnpSdkInit == 1 ) {
|
||||
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"UpnpFinish : UpnpSdkInit is ONE\n" );
|
||||
}
|
||||
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
|
||||
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool");
|
||||
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
|
||||
PrintThreadPoolStats(&gMiniServerThreadPool, __FILE__, __LINE__, "MiniServer Thread Pool");
|
||||
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
if( GetDeviceHandleInfo( &device_handle, &temp ) == HND_DEVICE )
|
||||
UpnpUnRegisterRootDevice( device_handle );
|
||||
@@ -429,20 +428,19 @@ UpnpFinish()
|
||||
#endif
|
||||
|
||||
TimerThreadShutdown( &gTimerThread );
|
||||
|
||||
StopMiniServer();
|
||||
|
||||
#if EXCLUDE_WEB_SERVER == 0
|
||||
web_server_destroy();
|
||||
#endif
|
||||
|
||||
ThreadPoolShutdown(&gSendThreadPool);
|
||||
ThreadPoolShutdown(&gMiniServerThreadPool);
|
||||
ThreadPoolShutdown(&gRecvThreadPool);
|
||||
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"Exiting UpnpFinish : UpnpSdkInit is :%d:\n", UpnpSdkInit);
|
||||
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
|
||||
ThreadPoolShutdown(&gSendThreadPool);
|
||||
|
||||
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool");
|
||||
UpnpCloseLog();
|
||||
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
|
||||
PrintThreadPoolStats(&gMiniServerThreadPool, __FILE__, __LINE__, "MiniServer Thread Pool");
|
||||
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
ithread_mutex_destroy(&GlobalClientSubscribeMutex);
|
||||
@@ -461,6 +459,9 @@ UpnpFinish()
|
||||
#endif
|
||||
|
||||
UpnpSdkInit = 0;
|
||||
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"Exiting UpnpFinish : UpnpSdkInit is :%d:\n", UpnpSdkInit);
|
||||
UpnpCloseLog();
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
|
||||
|
@@ -42,12 +42,12 @@
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/time.h>
|
||||
#else
|
||||
#else /* WIN32 */
|
||||
#include <winsock2.h>
|
||||
|
||||
typedef int socklen_t;
|
||||
#define EAFNOSUPPORT 97
|
||||
#endif
|
||||
#endif /* WIN32 */
|
||||
#include "unixutil.h"
|
||||
#include "ithread.h"
|
||||
|
||||
@@ -91,13 +91,12 @@ static MiniServerState gMServState = MSERV_IDLE;
|
||||
* Function: SetHTTPGetCallback
|
||||
*
|
||||
* Parameters :
|
||||
* MiniServerCallback callback ; - HTTP Callback to be invoked
|
||||
* MiniServerCallback callback - HTTP Callback to be invoked
|
||||
*
|
||||
* Description : Set HTTP Get Callback
|
||||
* Description:
|
||||
* Set HTTP Get Callback
|
||||
*
|
||||
* Return: void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void
|
||||
SetHTTPGetCallback( MiniServerCallback callback )
|
||||
@@ -109,31 +108,31 @@ SetHTTPGetCallback( MiniServerCallback callback )
|
||||
* Function: SetSoapCallback
|
||||
*
|
||||
* Parameters:
|
||||
* MiniServerCallback callback ; - SOAP Callback to be invoked
|
||||
* MiniServerCallback callback - SOAP Callback to be invoked
|
||||
*
|
||||
* Description : Set SOAP Callback
|
||||
* Description:
|
||||
* Set SOAP Callback
|
||||
*
|
||||
* Return: void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
void
|
||||
SetSoapCallback( MiniServerCallback callback )
|
||||
{
|
||||
gSoapCallback = callback;
|
||||
}
|
||||
#endif /* INCLUDE_DEVICE_APIS */
|
||||
|
||||
/************************************************************************
|
||||
* Function: SetGenaCallback
|
||||
*
|
||||
* Parameters:
|
||||
* MiniServerCallback callback ; - GENA Callback to be invoked
|
||||
* MiniServerCallback callback - GENA Callback to be invoked
|
||||
*
|
||||
* Description : Set GENA Callback
|
||||
* Description:
|
||||
* Set GENA Callback
|
||||
*
|
||||
* Return: void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void
|
||||
SetGenaCallback( MiniServerCallback callback )
|
||||
@@ -145,17 +144,15 @@ SetGenaCallback( MiniServerCallback callback )
|
||||
* Function : dispatch_request
|
||||
*
|
||||
* Parameters :
|
||||
* IN SOCKINFO *info ; Socket Information object.
|
||||
* http_parser_t* hparser ; HTTP parser object.
|
||||
* IN SOCKINFO *info - Socket Information object.
|
||||
* http_parser_t* hparser - HTTP parser object.
|
||||
*
|
||||
* Description : Based on the type pf message, appropriate callback
|
||||
* is issued
|
||||
* Description :
|
||||
* Based on the type pf message, appropriate callback is issued
|
||||
*
|
||||
* Return : int ;
|
||||
* Return: int
|
||||
* 0 - On Success
|
||||
* HTTP_INTERNAL_SERVER_ERROR - Callback is NULL
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static int
|
||||
dispatch_request( IN SOCKINFO * info,
|
||||
@@ -203,17 +200,15 @@ dispatch_request( IN SOCKINFO * info,
|
||||
* Function: handle_error
|
||||
*
|
||||
* Parameters:
|
||||
* IN SOCKINFO *info - Socket Inforamtion Object
|
||||
* int http_error_code - HTTP Error Code
|
||||
* int major - Major Version Number
|
||||
* int minor - Minor Version Number
|
||||
*
|
||||
* IN SOCKINFO *info ; Socket Inforamtion Object
|
||||
* int http_error_code ; HTTP Error Code
|
||||
* int major ; Major Version Number
|
||||
* int minor ; Minor Version Number
|
||||
* Description:
|
||||
* Send Error Message
|
||||
*
|
||||
* Description : Send Error Message
|
||||
*
|
||||
* Return : void;
|
||||
*
|
||||
* Note :
|
||||
* Return: void
|
||||
************************************************************************/
|
||||
static UPNP_INLINE void
|
||||
handle_error( IN SOCKINFO * info,
|
||||
@@ -230,12 +225,11 @@ handle_error( IN SOCKINFO * info,
|
||||
* Parameters:
|
||||
* void *args ; Request Message to be freed
|
||||
*
|
||||
* Description : Free memory assigned for handling request and unitial-
|
||||
* -ize socket functionality
|
||||
* Description:
|
||||
* Free memory assigned for handling request and unitialize socket
|
||||
* functionality
|
||||
*
|
||||
* Return: void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static void
|
||||
free_handle_request_arg( void *args )
|
||||
@@ -251,13 +245,12 @@ free_handle_request_arg( void *args )
|
||||
* Function: handle_request
|
||||
*
|
||||
* Parameters:
|
||||
* void *args ; Request Message to be handled
|
||||
* void *args - Request Message to be handled
|
||||
*
|
||||
* Description : Receive the request and dispatch it for handling
|
||||
* Description:
|
||||
* Receive the request and dispatch it for handling
|
||||
*
|
||||
* Return: void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static void
|
||||
handle_request( void *args )
|
||||
@@ -322,16 +315,14 @@ handle_request( void *args )
|
||||
* Function: schedule_request_job
|
||||
*
|
||||
* Parameters:
|
||||
* IN int connfd ; Socket Descriptor on which connection is accepted
|
||||
* IN struct sockaddr_in* clientAddr ; Clients Address information
|
||||
* IN int connfd - Socket Descriptor on which connection is accepted
|
||||
* IN struct sockaddr_in* clientAddr - Clients Address information
|
||||
*
|
||||
* Description : Initilize the thread pool to handle a request.
|
||||
* Description:
|
||||
* Initilize the thread pool to handle a request.
|
||||
* Sets priority for the job and adds the job to the thread pool
|
||||
*
|
||||
*
|
||||
* Return: void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static UPNP_INLINE void
|
||||
schedule_request_job( IN int connfd,
|
||||
@@ -374,29 +365,28 @@ schedule_request_job( IN int connfd,
|
||||
* Function: RunMiniServer
|
||||
*
|
||||
* Parameters:
|
||||
* MiniServerSockArray *miniSock ; Socket Array
|
||||
* MiniServerSockArray *miniSock - Socket Array
|
||||
*
|
||||
* Description : Function runs the miniserver. The MiniServer accepts a
|
||||
* Description:
|
||||
* Function runs the miniserver. The MiniServer accepts a
|
||||
* new request and schedules a thread to handle the new request.
|
||||
* Checks for socket state and invokes appropriate read and shutdown
|
||||
* actions for the Miniserver and SSDP sockets
|
||||
*
|
||||
* Return: void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static void
|
||||
RunMiniServer( MiniServerSockArray * miniSock )
|
||||
{
|
||||
struct sockaddr_in clientAddr;
|
||||
socklen_t clientLen;
|
||||
SOCKET miniServSock,
|
||||
connectHnd;
|
||||
SOCKET miniServStopSock;
|
||||
SOCKET ssdpSock;
|
||||
|
||||
CLIENTONLY( SOCKET ssdpReqSock;
|
||||
)
|
||||
SOCKET connectHnd;
|
||||
SOCKET miniServSock = miniSock->miniServerSock;
|
||||
SOCKET miniServStopSock = miniSock->miniServerStopSock;
|
||||
SOCKET ssdpSock = miniSock->ssdpSock;
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
SOCKET ssdpReqSock = miniSock->ssdpReqSock;
|
||||
#endif
|
||||
|
||||
fd_set expSet;
|
||||
fd_set rdSet;
|
||||
@@ -404,66 +394,55 @@ RunMiniServer( MiniServerSockArray * miniSock )
|
||||
int byteReceived;
|
||||
char requestBuf[256];
|
||||
|
||||
miniServSock = miniSock->miniServerSock;
|
||||
miniServStopSock = miniSock->miniServerStopSock;
|
||||
|
||||
ssdpSock = miniSock->ssdpSock;
|
||||
|
||||
CLIENTONLY( ssdpReqSock = miniSock->ssdpReqSock;
|
||||
);
|
||||
|
||||
gMServState = MSERV_RUNNING;
|
||||
maxMiniSock = max( miniServSock, miniServStopSock) ;
|
||||
maxMiniSock = max( maxMiniSock, (SOCKET)(ssdpSock) );
|
||||
|
||||
CLIENTONLY( maxMiniSock =
|
||||
max( maxMiniSock, ( SOCKET ) ( ssdpReqSock ) ) );
|
||||
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
maxMiniSock = max( maxMiniSock, (SOCKET)(ssdpReqSock) );
|
||||
#endif
|
||||
++maxMiniSock;
|
||||
|
||||
gMServState = MSERV_RUNNING;
|
||||
while( TRUE ) {
|
||||
FD_ZERO( &rdSet );
|
||||
FD_ZERO( &expSet );
|
||||
|
||||
FD_SET( miniServStopSock, &expSet );
|
||||
|
||||
FD_SET( miniServSock, &rdSet );
|
||||
FD_SET( miniServStopSock, &rdSet );
|
||||
FD_SET( ssdpSock, &rdSet );
|
||||
CLIENTONLY( FD_SET( ssdpReqSock, &rdSet ) );
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
FD_SET( ssdpReqSock, &rdSet );
|
||||
#endif
|
||||
|
||||
if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) ==
|
||||
UPNP_SOCKETERROR ) {
|
||||
UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
|
||||
"Error in select call !!!\n" );
|
||||
"Error in select call!\n" );
|
||||
/* Avoid 100% CPU in case of repeated error in select() */
|
||||
isleep( 1 );
|
||||
continue;
|
||||
} else {
|
||||
|
||||
if( FD_ISSET( miniServSock, &rdSet ) ) {
|
||||
clientLen = sizeof( struct sockaddr_in );
|
||||
connectHnd = accept( miniServSock,
|
||||
( struct sockaddr * )&clientAddr,
|
||||
&clientLen );
|
||||
( struct sockaddr * )&clientAddr, &clientLen );
|
||||
if( connectHnd == UPNP_INVALID_SOCKET ) {
|
||||
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
|
||||
"miniserver: Error"
|
||||
" in accepting connection\n" );
|
||||
"miniserver: Error in accepting connection\n" );
|
||||
continue;
|
||||
}
|
||||
schedule_request_job( connectHnd, &clientAddr );
|
||||
}
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
// ssdp
|
||||
CLIENTONLY( if( FD_ISSET( ssdpReqSock, &rdSet ) ) {
|
||||
|
||||
readFromSSDPSocket( ssdpReqSock );}
|
||||
)
|
||||
|
||||
if( FD_ISSET( ssdpReqSock, &rdSet ) ) {
|
||||
readFromSSDPSocket( ssdpReqSock );
|
||||
}
|
||||
#endif
|
||||
if( FD_ISSET( ssdpSock, &rdSet ) ) {
|
||||
readFromSSDPSocket( ssdpSock );
|
||||
}
|
||||
|
||||
if( FD_ISSET( miniServStopSock, &rdSet ) ) {
|
||||
|
||||
clientLen = sizeof( struct sockaddr_in );
|
||||
memset( ( char * )&clientAddr, 0,
|
||||
sizeof( struct sockaddr_in ) );
|
||||
@@ -479,7 +458,6 @@ RunMiniServer( MiniServerSockArray * miniSock )
|
||||
UpnpPrintf( UPNP_PACKET, MSERV, __FILE__, __LINE__,
|
||||
"Received multicast packet: \n %s\n",
|
||||
requestBuf );
|
||||
|
||||
if( NULL != strstr( requestBuf, "ShutDown" ) ) {
|
||||
break;
|
||||
}
|
||||
@@ -494,30 +472,29 @@ RunMiniServer( MiniServerSockArray * miniSock )
|
||||
UpnpCloseSocket( miniServStopSock );
|
||||
shutdown( ssdpSock, SD_BOTH );
|
||||
UpnpCloseSocket( ssdpSock );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
shutdown( ssdpReqSock, SD_BOTH );
|
||||
UpnpCloseSocket( ssdpReqSock );
|
||||
#endif
|
||||
|
||||
free( miniSock );
|
||||
|
||||
gMServState = MSERV_IDLE;
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: get_port
|
||||
*
|
||||
* Parameters:
|
||||
* int sockfd ; Socket Descriptor
|
||||
* int sockfd - Socket Descriptor
|
||||
*
|
||||
* Description : Returns port to which socket, sockfd, is bound.
|
||||
* Description:
|
||||
* Returns port to which socket, sockfd, is bound.
|
||||
*
|
||||
* Return : int,
|
||||
* Return: int
|
||||
* -1 on error; check errno
|
||||
* > 0 means port number
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static int
|
||||
get_port( int sockfd )
|
||||
@@ -544,24 +521,24 @@ get_port( int sockfd )
|
||||
* Function: get_miniserver_sockets
|
||||
*
|
||||
* Parameters:
|
||||
* MiniServerSockArray *out ; Socket Array
|
||||
* unsigned short listen_port ; port on which the server is listening
|
||||
* for incoming connections
|
||||
* MiniServerSockArray *out - Socket Array
|
||||
* unsigned short listen_port - port on which the server is
|
||||
* listening for incoming connections
|
||||
*
|
||||
* Description:
|
||||
* Creates a STREAM socket, binds to INADDR_ANY and listens for
|
||||
* incoming connecttions. Returns the actual port which the sockets
|
||||
* sub-system returned.
|
||||
*
|
||||
* Description : Creates a STREAM socket, binds to INADDR_ANY and
|
||||
* listens for incoming connecttions. Returns the actual port which
|
||||
* the sockets sub-system returned.
|
||||
* Also creates a DGRAM socket, binds to the loop back address and
|
||||
* returns the port allocated by the socket sub-system.
|
||||
*
|
||||
* Return : int :
|
||||
* Return: int
|
||||
* UPNP_E_OUTOF_SOCKET - Failed to create a socket
|
||||
* UPNP_E_SOCKET_BIND - Bind() failed
|
||||
* UPNP_E_LISTEN - Listen() failed
|
||||
* UPNP_E_INTERNAL_ERROR - Port returned by the socket layer is < 0
|
||||
* UPNP_E_SUCCESS - Success
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
get_miniserver_sockets( MiniServerSockArray * out,
|
||||
@@ -692,8 +669,8 @@ get_miniserver_sockets( MiniServerSockArray * out,
|
||||
miniStopSockPort = get_port( miniServerStopSock );
|
||||
if( miniStopSockPort <= 0 ) {
|
||||
shutdown( miniServerStopSock, SD_BOTH );
|
||||
shutdown( listenfd, SD_BOTH );
|
||||
UpnpCloseSocket( miniServerStopSock );
|
||||
shutdown( listenfd, SD_BOTH );
|
||||
UpnpCloseSocket( listenfd );
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
@@ -711,10 +688,11 @@ get_miniserver_sockets( MiniServerSockArray * out,
|
||||
* Function: StartMiniServer
|
||||
*
|
||||
* Parameters :
|
||||
* unsigned short listen_port ; Port on which the server listens for
|
||||
* unsigned short listen_port - Port on which the server listens for
|
||||
* incoming connections
|
||||
*
|
||||
* Description : Initialize the sockets functionality for the
|
||||
* Description:
|
||||
* Initialize the sockets functionality for the
|
||||
* Miniserver. Initialize a thread pool job to run the MiniServer
|
||||
* and the job to the thread pool. If listen port is 0, port is
|
||||
* dynamically picked
|
||||
@@ -722,17 +700,14 @@ get_miniserver_sockets( MiniServerSockArray * out,
|
||||
* Use timer mechanism to start the MiniServer, failure to meet the
|
||||
* allowed delay aborts the attempt to launch the MiniServer.
|
||||
*
|
||||
* Return : int ;
|
||||
* Actual port socket is bound to - On Success:
|
||||
* Return: int
|
||||
* Actual port socket is bound to - On Success
|
||||
* A negative number UPNP_E_XXX - On Error
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
StartMiniServer( unsigned short listen_port )
|
||||
{
|
||||
|
||||
int success;
|
||||
|
||||
int count;
|
||||
int max_count = 10000;
|
||||
|
||||
@@ -755,12 +730,10 @@ StartMiniServer( unsigned short listen_port )
|
||||
}
|
||||
|
||||
if( ( success = get_ssdp_sockets( miniSocket ) ) != UPNP_E_SUCCESS ) {
|
||||
|
||||
shutdown( miniSocket->miniServerSock, SD_BOTH );
|
||||
UpnpCloseSocket( miniSocket->miniServerSock );
|
||||
shutdown( miniSocket->miniServerStopSock, SD_BOTH );
|
||||
UpnpCloseSocket( miniSocket->miniServerStopSock );
|
||||
|
||||
free( miniSocket );
|
||||
|
||||
return success;
|
||||
@@ -776,14 +749,15 @@ StartMiniServer( unsigned short listen_port )
|
||||
|
||||
if( success < 0 ) {
|
||||
shutdown( miniSocket->miniServerSock, SD_BOTH );
|
||||
shutdown( miniSocket->miniServerStopSock, SD_BOTH );
|
||||
shutdown( miniSocket->ssdpSock, SD_BOTH );
|
||||
CLIENTONLY( shutdown( miniSocket->ssdpReqSock, SD_BOTH ) );
|
||||
UpnpCloseSocket( miniSocket->miniServerSock );
|
||||
shutdown( miniSocket->miniServerStopSock, SD_BOTH );
|
||||
UpnpCloseSocket( miniSocket->miniServerStopSock );
|
||||
shutdown( miniSocket->ssdpSock, SD_BOTH );
|
||||
UpnpCloseSocket( miniSocket->ssdpSock );
|
||||
|
||||
CLIENTONLY( UpnpCloseSocket( miniSocket->ssdpReqSock ) );
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
shutdown( miniSocket->ssdpReqSock, SD_BOTH );
|
||||
UpnpCloseSocket( miniSocket->ssdpReqSock );
|
||||
#endif
|
||||
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
@@ -796,16 +770,16 @@ StartMiniServer( unsigned short listen_port )
|
||||
|
||||
// taking too long to start that thread
|
||||
if( count >= max_count ) {
|
||||
|
||||
shutdown( miniSocket->miniServerSock, SD_BOTH );
|
||||
shutdown( miniSocket->miniServerStopSock, SD_BOTH );
|
||||
shutdown( miniSocket->ssdpSock, SD_BOTH );
|
||||
CLIENTONLY( shutdown( miniSocket->ssdpReqSock, SD_BOTH ) );
|
||||
|
||||
UpnpCloseSocket( miniSocket->miniServerSock );
|
||||
shutdown( miniSocket->miniServerStopSock, SD_BOTH );
|
||||
UpnpCloseSocket( miniSocket->miniServerStopSock );
|
||||
shutdown( miniSocket->ssdpSock, SD_BOTH );
|
||||
UpnpCloseSocket( miniSocket->ssdpSock );
|
||||
CLIENTONLY( UpnpCloseSocket( miniSocket->ssdpReqSock ) );
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
shutdown( miniSocket->ssdpReqSock, SD_BOTH );
|
||||
UpnpCloseSocket( miniSocket->ssdpReqSock );
|
||||
#endif
|
||||
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
@@ -817,30 +791,30 @@ StartMiniServer( unsigned short listen_port )
|
||||
* Function: StopMiniServer
|
||||
*
|
||||
* Parameters:
|
||||
* void ;
|
||||
* void
|
||||
*
|
||||
* Description : Stop and Shutdown the MiniServer and free socket
|
||||
* Description:
|
||||
* Stop and Shutdown the MiniServer and free socket
|
||||
* resources.
|
||||
*
|
||||
* Return : int ;
|
||||
* Return: int
|
||||
* Always returns 0
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
StopMiniServer( void )
|
||||
{
|
||||
|
||||
int socklen = sizeof( struct sockaddr_in ),
|
||||
sock;
|
||||
int socklen = sizeof( struct sockaddr_in );
|
||||
int sock;
|
||||
struct sockaddr_in ssdpAddr;
|
||||
char buf[256] = "ShutDown";
|
||||
int bufLen = strlen( buf );
|
||||
|
||||
if( gMServState == MSERV_RUNNING )
|
||||
if( gMServState == MSERV_RUNNING ) {
|
||||
gMServState = MSERV_STOPPING;
|
||||
else
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
sock = socket( AF_INET, SOCK_DGRAM, 0 );
|
||||
if( sock == UPNP_INVALID_SOCKET ) {
|
||||
@@ -864,3 +838,4 @@ StopMiniServer( void )
|
||||
UpnpCloseSocket( sock );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -70,8 +70,10 @@
|
||||
#include "sock.h"
|
||||
#include "webserver.h"
|
||||
|
||||
#define DOSOCKET_READ 1
|
||||
#define DOSOCKET_WRITE 0
|
||||
|
||||
const int CHUNK_HEADER_SIZE = 10;
|
||||
const int CHUNK_TAIL_SIZE = 10;
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_FixUrl
|
||||
@@ -80,7 +82,8 @@
|
||||
* IN uri_type* url; URL to be validated and fixed
|
||||
* OUT uri_type* fixed_url; URL after being fixed.
|
||||
*
|
||||
* Description: Validates URL
|
||||
* Description:
|
||||
* Validates URL
|
||||
*
|
||||
* Returns:
|
||||
* UPNP_E_INVALID_URL
|
||||
@@ -110,6 +113,7 @@ http_FixUrl( IN uri_type * url,
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_FixStrUrl
|
||||
*
|
||||
@@ -118,7 +122,8 @@ http_FixUrl( IN uri_type * url,
|
||||
* IN int urlstrlen ; Length of the character string
|
||||
* OUT uri_type* fixed_url ; Fixed and corrected URL
|
||||
*
|
||||
* Description: Parses URL and then validates URL
|
||||
* Description:
|
||||
* Parses URL and then validates URL
|
||||
*
|
||||
* Returns:
|
||||
* UPNP_E_INVALID_URL
|
||||
@@ -138,6 +143,7 @@ http_FixStrUrl( IN char *urlstr,
|
||||
return http_FixUrl( &url, fixed_url );
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_Connect
|
||||
*
|
||||
@@ -145,8 +151,8 @@ http_FixStrUrl( IN char *urlstr,
|
||||
* IN uri_type* destination_url; URL containing destination information
|
||||
* OUT uri_type *url; Fixed and corrected URL
|
||||
*
|
||||
* Description: Gets destination address from URL and then connects to the
|
||||
* remote end
|
||||
* Description:
|
||||
* Gets destination address from URL and then connects to the remote end
|
||||
*
|
||||
* Returns:
|
||||
* socket descriptor on sucess
|
||||
@@ -180,19 +186,21 @@ http_Connect( IN uri_type * destination_url,
|
||||
return connfd;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_RecvMessage
|
||||
*
|
||||
* Parameters:
|
||||
* IN SOCKINFO *info; Socket information object
|
||||
* OUT http_parser_t* parser, HTTP parser object
|
||||
* OUT http_parser_t* parser; HTTP parser object
|
||||
* IN http_method_t request_method; HTTP request method
|
||||
* IN OUT int* timeout_secs; time out
|
||||
* OUT int* http_error_code; HTTP error code returned
|
||||
*
|
||||
* Description: Get the data on the socket and take actions based on the
|
||||
* read data to modify the parser objects buffer. If an error is reported
|
||||
* while parsing the data, the error code is passed in the http_errr_code
|
||||
* Description:
|
||||
* Get the data on the socket and take actions based on the read data
|
||||
* to modify the parser objects buffer. If an error is reported while
|
||||
* parsing the data, the error code is passed in the http_errr_code
|
||||
* parameter
|
||||
*
|
||||
* Returns:
|
||||
@@ -266,6 +274,7 @@ http_RecvMessage( IN SOCKINFO * info,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_SendMessage
|
||||
*
|
||||
@@ -274,7 +283,8 @@ http_RecvMessage( IN SOCKINFO * info,
|
||||
* IN OUT int * TimeOut ; time out value
|
||||
* IN const char* fmt, ... Pattern format to take actions upon
|
||||
*
|
||||
* Description: Sends a message to the destination based on the
|
||||
* Description:
|
||||
* Sends a message to the destination based on the
|
||||
* IN const char* fmt parameter
|
||||
* fmt types:
|
||||
* 'f': arg = const char * file name
|
||||
@@ -297,22 +307,19 @@ http_SendMessage( IN SOCKINFO * info,
|
||||
IN const char *fmt,
|
||||
... )
|
||||
{
|
||||
#define CHUNK_HEADER_SIZE 10
|
||||
#define CHUNK_TAIL_SIZE 10
|
||||
|
||||
char c;
|
||||
char *buf = NULL;
|
||||
size_t buf_length;
|
||||
char *filename = NULL;
|
||||
FILE *Fp;
|
||||
int num_read,
|
||||
num_written;
|
||||
int num_read;
|
||||
int num_written;
|
||||
off_t amount_to_be_read = 0;
|
||||
va_list argp;
|
||||
char *file_buf = NULL,
|
||||
*ChunkBuf = NULL;
|
||||
char *file_buf = NULL;
|
||||
char *ChunkBuf = NULL;
|
||||
struct SendInstruction *Instr = NULL;
|
||||
char Chunk_Header[10];
|
||||
char Chunk_Header[CHUNK_HEADER_SIZE];
|
||||
int RetVal = 0;
|
||||
|
||||
// 10 byte allocated for chunk header.
|
||||
@@ -322,44 +329,40 @@ http_SendMessage( IN SOCKINFO * info,
|
||||
|
||||
while( ( c = *fmt++ ) != 0 ) {
|
||||
if( c == 'I' ) {
|
||||
Instr = ( struct SendInstruction * )
|
||||
va_arg( argp, struct SendInstruction * );
|
||||
Instr = va_arg(argp, struct SendInstruction *);
|
||||
|
||||
assert( Instr );
|
||||
|
||||
if( Instr->ReadSendSize >= 0 )
|
||||
if( Instr->ReadSendSize >= 0 ) {
|
||||
amount_to_be_read = Instr->ReadSendSize;
|
||||
else
|
||||
} else {
|
||||
amount_to_be_read = Data_Buf_Size;
|
||||
|
||||
if( amount_to_be_read < WEB_SERVER_BUF_SIZE )
|
||||
Data_Buf_Size = amount_to_be_read;
|
||||
|
||||
ChunkBuf = ( char * )malloc( Data_Buf_Size +
|
||||
CHUNK_HEADER_SIZE +
|
||||
CHUNK_TAIL_SIZE );
|
||||
if( !ChunkBuf )
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
|
||||
file_buf = ChunkBuf + 10;
|
||||
}
|
||||
|
||||
if( c == 'f' ) { // file name
|
||||
if( amount_to_be_read < WEB_SERVER_BUF_SIZE ) {
|
||||
Data_Buf_Size = amount_to_be_read;
|
||||
}
|
||||
|
||||
filename = ( char * )va_arg( argp, char * );
|
||||
ChunkBuf = (char *)malloc(
|
||||
Data_Buf_Size + CHUNK_HEADER_SIZE + CHUNK_TAIL_SIZE);
|
||||
if( !ChunkBuf ) {
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
|
||||
if( Instr && Instr->IsVirtualFile )
|
||||
file_buf = ChunkBuf + CHUNK_HEADER_SIZE;
|
||||
} else if( c == 'f' ) {
|
||||
// file name
|
||||
filename = va_arg(argp, char *);
|
||||
if( Instr && Instr->IsVirtualFile ) {
|
||||
Fp = (virtualDirCallback.open)( filename, UPNP_READ );
|
||||
else
|
||||
} else {
|
||||
Fp = fopen( filename, "rb" );
|
||||
|
||||
}
|
||||
if( Fp == NULL ) {
|
||||
free( ChunkBuf );
|
||||
return UPNP_E_FILE_READ_ERROR;
|
||||
}
|
||||
|
||||
assert( Fp );
|
||||
|
||||
if( Instr && Instr->IsRangeActive && Instr->IsVirtualFile ) {
|
||||
if( virtualDirCallback.seek( Fp, Instr->RangeOffset,
|
||||
SEEK_CUR ) != 0 ) {
|
||||
@@ -375,26 +378,14 @@ http_SendMessage( IN SOCKINFO * info,
|
||||
|
||||
while( amount_to_be_read ) {
|
||||
if( Instr ) {
|
||||
if( amount_to_be_read >= Data_Buf_Size ) {
|
||||
if( Instr->IsVirtualFile )
|
||||
num_read = virtualDirCallback.read( Fp,
|
||||
file_buf,
|
||||
Data_Buf_Size );
|
||||
else
|
||||
num_read = fread( file_buf, 1, Data_Buf_Size,
|
||||
Fp );
|
||||
int n = (amount_to_be_read >= Data_Buf_Size) ?
|
||||
Data_Buf_Size : amount_to_be_read;
|
||||
if( Instr->IsVirtualFile ) {
|
||||
num_read = virtualDirCallback.read( Fp, file_buf, n );
|
||||
} else {
|
||||
if( Instr->IsVirtualFile )
|
||||
num_read = virtualDirCallback.read( Fp,
|
||||
file_buf,
|
||||
amount_to_be_read );
|
||||
else
|
||||
num_read = fread( file_buf, 1,
|
||||
amount_to_be_read, Fp );
|
||||
num_read = fread( file_buf, 1, n, Fp );
|
||||
}
|
||||
|
||||
amount_to_be_read = amount_to_be_read - num_read;
|
||||
|
||||
if( Instr->ReadSendSize < 0 ) {
|
||||
// read until close
|
||||
amount_to_be_read = Data_Buf_Size;
|
||||
@@ -403,12 +394,11 @@ http_SendMessage( IN SOCKINFO * info,
|
||||
num_read = fread( file_buf, 1, Data_Buf_Size, Fp );
|
||||
}
|
||||
|
||||
if( num_read == 0 ) // EOF so no more to send.
|
||||
{
|
||||
if( num_read == 0 ) {
|
||||
// EOF so no more to send.
|
||||
if( Instr && Instr->IsChunkActive ) {
|
||||
num_written = sock_write( info, "0\r\n\r\n",
|
||||
strlen( "0\r\n\r\n" ),
|
||||
TimeOut );
|
||||
char *str = "0\r\n\r\n";
|
||||
num_written = sock_write(info, str, strlen(str), TimeOut);
|
||||
} else {
|
||||
RetVal = UPNP_E_FILE_READ_ERROR;
|
||||
}
|
||||
@@ -432,47 +422,41 @@ http_SendMessage( IN SOCKINFO * info,
|
||||
// on the top of the buffer.
|
||||
//file_buf[num_read+strlen(Chunk_Header)] = NULL;
|
||||
//printf("Sending %s\n",file_buf-strlen(Chunk_Header));
|
||||
num_written = sock_write( info,
|
||||
file_buf -
|
||||
strlen( Chunk_Header ),
|
||||
num_read +
|
||||
strlen( Chunk_Header ) + 2,
|
||||
TimeOut );
|
||||
num_written = sock_write(
|
||||
info, file_buf - strlen( Chunk_Header ),
|
||||
num_read + strlen( Chunk_Header ) + 2, TimeOut );
|
||||
|
||||
if( num_written !=
|
||||
num_read + ( int )strlen( Chunk_Header )
|
||||
+ 2 ) {
|
||||
goto Cleanup_File; //Send error nothing we can do.
|
||||
num_read + ( int )strlen( Chunk_Header ) + 2 ) {
|
||||
// Send error nothing we can do.
|
||||
goto Cleanup_File;
|
||||
}
|
||||
} else {
|
||||
// write data
|
||||
num_written = sock_write( info, file_buf, num_read,
|
||||
TimeOut );
|
||||
|
||||
num_written = sock_write( info, file_buf, num_read, TimeOut );
|
||||
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
|
||||
">>> (SENT) >>>\n%.*s\n------------\n",
|
||||
( int )num_written, file_buf );
|
||||
|
||||
// Send error nothing we can do
|
||||
if( num_written != num_read ) {
|
||||
goto Cleanup_File;
|
||||
}
|
||||
}
|
||||
} //While
|
||||
} // while
|
||||
Cleanup_File:
|
||||
va_end( argp );
|
||||
if( Instr && Instr->IsVirtualFile )
|
||||
if( Instr && Instr->IsVirtualFile ) {
|
||||
virtualDirCallback.close( Fp );
|
||||
else
|
||||
} else {
|
||||
fclose( Fp );
|
||||
}
|
||||
free( ChunkBuf );
|
||||
return RetVal;
|
||||
|
||||
} else if( c == 'b' ) { // memory buffer
|
||||
|
||||
buf = ( char * )va_arg( argp, char * );
|
||||
|
||||
buf_length = ( size_t ) va_arg( argp, size_t );
|
||||
} else if( c == 'b' ) {
|
||||
// memory buffer
|
||||
buf = va_arg(argp, char *);
|
||||
buf_length = va_arg(argp, size_t);
|
||||
if( buf_length > 0 ) {
|
||||
num_written = sock_write( info, buf, buf_length, TimeOut );
|
||||
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
|
||||
@@ -480,11 +464,12 @@ http_SendMessage( IN SOCKINFO * info,
|
||||
"%.*s\nbuf_length=%d, num_written=%d\n"
|
||||
"------------\n",
|
||||
(int)buf_length, buf, (int)buf_length, num_written );
|
||||
if( ( size_t ) num_written != buf_length )
|
||||
if( (size_t)num_written != buf_length ) {
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
va_end( argp );
|
||||
@@ -492,6 +477,7 @@ http_SendMessage( IN SOCKINFO * info,
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_RequestAndResponse
|
||||
*
|
||||
@@ -504,7 +490,8 @@ http_SendMessage( IN SOCKINFO * info,
|
||||
* IN int timeout_secs; time out value
|
||||
* OUT http_parser_t* response; Parser object to receive the repsonse
|
||||
*
|
||||
* Description: Initiates socket, connects to the destination, sends a
|
||||
* Description:
|
||||
* Initiates socket, connects to the destination, sends a
|
||||
* request and waits for the response from the remote end
|
||||
*
|
||||
* Returns:
|
||||
@@ -564,25 +551,25 @@ http_RequestAndResponse( IN uri_type * destination,
|
||||
return ret_code;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_Download
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* url_str: String as a URL
|
||||
* IN int timeout_secs: time out value
|
||||
* OUT char** document: buffer to store the document extracted
|
||||
* IN const char* url_str; String as a URL
|
||||
* IN int timeout_secs; time out value
|
||||
* OUT char** document; buffer to store the document extracted
|
||||
* from the donloaded message.
|
||||
* OUT int* doc_length: length of the extracted document
|
||||
* OUT char* content_type: Type of content
|
||||
* OUT int* doc_length; length of the extracted document
|
||||
* OUT char* content_type; Type of content
|
||||
*
|
||||
* Description : Download the document message and extract the document
|
||||
* Description:
|
||||
* Download the document message and extract the document
|
||||
* from the message.
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS;
|
||||
* UPNP_E_INVALID_URL;
|
||||
*
|
||||
* Note :
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS
|
||||
* UPNP_E_INVALID_URL
|
||||
************************************************************************/
|
||||
int
|
||||
http_Download( IN const char *url_str,
|
||||
@@ -684,8 +671,8 @@ http_Download( IN const char *url_str,
|
||||
if( ( *doc_length = ( int )response.msg.entity.length ) == 0 ) {
|
||||
// 0-length msg
|
||||
*document = NULL;
|
||||
} else if( response.msg.status_code == HTTP_OK ) //LEAK_FIX_MK
|
||||
{
|
||||
} else if( response.msg.status_code == HTTP_OK ) {
|
||||
//LEAK_FIX_MK
|
||||
// copy entity
|
||||
entity_start = response.msg.entity.buf; // what we want
|
||||
msg_length = response.msg.msg.length; // save for posterity
|
||||
@@ -727,12 +714,13 @@ typedef struct HTTPPOSTHANDLE {
|
||||
* Parameters:
|
||||
* const char *url_str; String as a URL
|
||||
* membuffer *request; Buffer containing the request
|
||||
* uri_type *url ; URI object containing the scheme, path
|
||||
* query token, etc.
|
||||
* uri_type *url; URI object containing the scheme,
|
||||
* path query token, etc.
|
||||
* int contentLength; length of content
|
||||
* const char *contentType; Type of content
|
||||
*
|
||||
* Description: Makes the message for the HTTP POST message
|
||||
* Description:
|
||||
* Makes the message for the HTTP POST message
|
||||
*
|
||||
* Returns:
|
||||
* UPNP_E_INVALID_URL
|
||||
@@ -834,15 +822,14 @@ MakePostMessage( const char *url_str,
|
||||
* IN unsigned int *size: Size of the data to be sent.
|
||||
* IN int timeout: time out value
|
||||
*
|
||||
* Description : Formats data if format used is UPNP_USING_CHUNKED.
|
||||
* Description:
|
||||
* Formats data if format used is UPNP_USING_CHUNKED.
|
||||
* Writes data on the socket connected to the peer.
|
||||
*
|
||||
* Return : int ;
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
* -1 - On Socket Error.
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
http_WriteHttpPost( IN void *Handle,
|
||||
@@ -864,17 +851,18 @@ http_WriteHttpPost( IN void *Handle,
|
||||
if( handle->contentLength == UPNP_USING_CHUNKED ) {
|
||||
if( ( *size ) ) {
|
||||
int tempSize = 0;
|
||||
tempbuf = ( char * )malloc(
|
||||
*size + CHUNK_HEADER_SIZE + CHUNK_TAIL_SIZE );
|
||||
if ( tempbuf == NULL) {
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
|
||||
tempbuf =
|
||||
( char * )malloc( ( *size ) + CHUNK_HEADER_SIZE +
|
||||
CHUNK_TAIL_SIZE );
|
||||
|
||||
if ( tempbuf == NULL) return UPNP_E_OUTOF_MEMORY;
|
||||
|
||||
sprintf( tempbuf, "%x\r\n", ( *size ) ); //begin chunk
|
||||
// begin chunk
|
||||
sprintf( tempbuf, "%x\r\n", ( *size ) );
|
||||
tempSize = strlen( tempbuf );
|
||||
memcpy( tempbuf + tempSize, buf, ( *size ) );
|
||||
memcpy( tempbuf + tempSize + ( *size ), "\r\n", 2 ); //end of chunk
|
||||
memcpy( tempbuf + tempSize + ( *size ), "\r\n", 2 );
|
||||
// end of chunk
|
||||
tempbufSize = tempSize + ( *size ) + 2;
|
||||
freeTempbuf = 1;
|
||||
}
|
||||
@@ -903,20 +891,19 @@ http_WriteHttpPost( IN void *Handle,
|
||||
* Function: http_CloseHttpPost
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *Handle : Handle to the http post object
|
||||
* IN OUT int *httpStatus : HTTP status returned on receiving a
|
||||
* IN void *Handle; Handle to the http post object
|
||||
* IN OUT int *httpStatus; HTTP status returned on receiving a
|
||||
* response message
|
||||
* IN int timeout : time out value
|
||||
* IN int timeout; time out value
|
||||
*
|
||||
* Description : Sends remaining data if using UPNP_USING_CHUNKED
|
||||
* Description:
|
||||
* Sends remaining data if using UPNP_USING_CHUNKED
|
||||
* format. Receives any more messages. Destroys socket and any socket
|
||||
* associated memory. Frees handle associated with the HTTP POST msg.
|
||||
*
|
||||
* Return : int ;
|
||||
* UPNP_E_SUCCESS - On Sucess ;
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter;
|
||||
*
|
||||
* Note :
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Sucess
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
************************************************************************/
|
||||
int
|
||||
http_CloseHttpPost( IN void *Handle,
|
||||
@@ -957,25 +944,24 @@ http_CloseHttpPost( IN void *Handle,
|
||||
* Function: http_OpenHttpPost
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char *url_str : String as a URL
|
||||
* IN OUT void **Handle : Pointer to buffer to store HTTP
|
||||
* IN const char *url_str; String as a URL
|
||||
* IN OUT void **Handle; Pointer to buffer to store HTTP
|
||||
* post handle
|
||||
* IN const char *contentType : Type of content
|
||||
* IN int contentLength : length of content
|
||||
* IN int timeout : time out value
|
||||
* IN const char *contentType; Type of content
|
||||
* IN int contentLength; length of content
|
||||
* IN int timeout; time out value
|
||||
*
|
||||
* Description : Makes the HTTP POST message, connects to the peer,
|
||||
* Description:
|
||||
* Makes the HTTP POST message, connects to the peer,
|
||||
* sends the HTTP POST request. Adds the post handle to buffer of
|
||||
* such handles
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS - On Sucess ;
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramter ;
|
||||
* UPNP_E_OUTOF_MEMORY ;
|
||||
* UPNP_E_SOCKET_ERROR ;
|
||||
* UPNP_E_SOCKET_CONNECT ;
|
||||
*
|
||||
* Note :
|
||||
* UPNP_E_SUCCESS - On Sucess
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
* UPNP_E_SOCKET_CONNECT
|
||||
************************************************************************/
|
||||
int
|
||||
http_OpenHttpPost( IN const char *url_str,
|
||||
@@ -1063,7 +1049,8 @@ typedef struct HTTPGETHANDLE {
|
||||
* uri_type *url ; URI object containing the scheme, path
|
||||
* query token, etc.
|
||||
*
|
||||
* Description: Makes the message for the HTTP GET method
|
||||
* Description:
|
||||
* Makes the message for the HTTP GET method
|
||||
*
|
||||
* Returns:
|
||||
* UPNP_E_INVALID_URL
|
||||
@@ -1153,16 +1140,15 @@ MakeGetMessage( const char *url_str,
|
||||
* IN OUT int *timeout_secs; time out value
|
||||
* IN OUT int *http_error_code; HTTP errror code returned
|
||||
*
|
||||
* Description : Parses already exiting data. If not complete reads more
|
||||
* Description:
|
||||
* Parses already exiting data. If not complete reads more
|
||||
* data on the connected socket. The read data is then parsed. The
|
||||
* same methid is carried out for headers.
|
||||
*
|
||||
* Return : int ;
|
||||
* Return: int
|
||||
* PARSE_OK - On Success
|
||||
* PARSE_FAILURE - Failure to parse data correctly
|
||||
* UPNP_E_BAD_HTTPMSG - Socker read() returns an error
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
ReadResponseLineAndHeaders( IN SOCKINFO * info,
|
||||
@@ -1273,22 +1259,21 @@ ReadResponseLineAndHeaders( IN SOCKINFO * info,
|
||||
* Function: http_ReadHttpGet
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *Handle : Handle to the HTTP get object
|
||||
* IN OUT char *buf : Buffer to get the read and parsed data
|
||||
* IN OUT unsigned int *size : Size of the buffer passed
|
||||
* IN int timeout : time out value
|
||||
* IN void *Handle; Handle to the HTTP get object
|
||||
* IN OUT char *buf; Buffer to get the read and parsed data
|
||||
* IN OUT unsigned int *size; Size of the buffer passed
|
||||
* IN int timeout; time out value
|
||||
*
|
||||
* Description : Parses already existing data, then gets new data.
|
||||
* Description:
|
||||
* Parses already existing data, then gets new data.
|
||||
* Parses and extracts information from the new data.
|
||||
*
|
||||
* Return : int ;
|
||||
* UPNP_E_SUCCESS - On Sucess ;
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter;
|
||||
* UPNP_E_BAD_RESPONSE ;
|
||||
* UPNP_E_BAD_HTTPMSG ;
|
||||
* UPNP_E_CANCELED ;
|
||||
*
|
||||
* Note :
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Sucess
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
* UPNP_E_BAD_RESPONSE
|
||||
* UPNP_E_BAD_HTTPMSG
|
||||
* UPNP_E_CANCELED
|
||||
************************************************************************/
|
||||
int
|
||||
http_ReadHttpGet( IN void *Handle,
|
||||
@@ -1398,18 +1383,16 @@ http_ReadHttpGet( IN void *Handle,
|
||||
* Function: http_HttpGetProgress
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *Handle : Handle to the HTTP get object
|
||||
* OUT unsigned int *length : Buffer to get the read and parsed data
|
||||
* OUT unsigned int *total : Size of tge buffer passed
|
||||
* IN void *Handle; Handle to the HTTP get object
|
||||
* OUT unsigned int *length; Buffer to get the read and parsed data
|
||||
* OUT unsigned int *total; Size of tge buffer passed
|
||||
*
|
||||
* Description : Extracts information from the Handle to the HTTP get
|
||||
* object.
|
||||
* Description:
|
||||
* Extracts information from the Handle to the HTTP get object.
|
||||
*
|
||||
* Return : int ;
|
||||
* UPNP_E_SUCCESS - On Sucess ;
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter;
|
||||
*
|
||||
* Note :
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Sucess
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
************************************************************************/
|
||||
int http_HttpGetProgress( IN void *Handle,
|
||||
OUT unsigned int *length,
|
||||
@@ -1431,13 +1414,12 @@ int http_HttpGetProgress( IN void *Handle,
|
||||
* Parameters:
|
||||
* IN void *Handle; Handle to HTTP get object
|
||||
*
|
||||
* Description : Set the cancel flag of the HttpGet handle
|
||||
* Description:
|
||||
* Set the cancel flag of the HttpGet handle
|
||||
*
|
||||
* Return : int ;
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
http_CancelHttpGet( IN void *Handle )
|
||||
@@ -1460,14 +1442,13 @@ http_CancelHttpGet( IN void *Handle )
|
||||
* Parameters:
|
||||
* IN void *Handle; Handle to HTTP get object
|
||||
*
|
||||
* Description : Clears the handle allocated for the HTTP GET operation
|
||||
* Description:
|
||||
* Clears the handle allocated for the HTTP GET operation
|
||||
* Clears socket states and memory allocated for socket operations.
|
||||
*
|
||||
* Return : int ;
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
http_CloseHttpGet( IN void *Handle )
|
||||
@@ -1498,19 +1479,17 @@ http_CloseHttpGet( IN void *Handle )
|
||||
* response message
|
||||
* IN int timeout: time out value
|
||||
*
|
||||
* Description : Makes the HTTP GET message, connects to the peer,
|
||||
* Description:
|
||||
* Makes the HTTP GET message, connects to the peer,
|
||||
* sends the HTTP GET request, gets the response and parses the
|
||||
* response.
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS - On Success ;
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramters ;
|
||||
* UPNP_E_OUTOF_MEMORY ;
|
||||
* UPNP_E_SOCKET_ERROR ;
|
||||
* UPNP_E_BAD_RESPONSE ;
|
||||
*
|
||||
* Note :
|
||||
*
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramters
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
* UPNP_E_BAD_RESPONSE
|
||||
************************************************************************/
|
||||
int
|
||||
http_OpenHttpGet( IN const char *url_str,
|
||||
@@ -1527,30 +1506,27 @@ http_OpenHttpGet( IN const char *url_str,
|
||||
* Function: http_OpenHttpGetProxy
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char *url_str : String as a URL
|
||||
* IN const char *proxy_str : String as a URL
|
||||
* IN OUT void **Handle : Pointer to buffer to store HTTP
|
||||
* IN const char *url_str; String as a URL
|
||||
* IN const char *proxy_str; String as a URL
|
||||
* IN OUT void **Handle; Pointer to buffer to store HTTP
|
||||
* post handle
|
||||
* IN OUT char **contentType : Type of content
|
||||
* OUT int *contentLength : length of content
|
||||
* OUT int *httpStatus : HTTP status returned on receiving a
|
||||
* IN OUT char **contentType; Type of content
|
||||
* OUT int *contentLength; length of content
|
||||
* OUT int *httpStatus; HTTP status returned on receiving a
|
||||
* response message
|
||||
* IN int timeout: time out value
|
||||
*
|
||||
* Description : Makes the HTTP GET message, connects to the peer,
|
||||
* sends the HTTP GET request, gets the response and parses the
|
||||
* response.
|
||||
* Description:
|
||||
* Makes the HTTP GET message, connects to the peer,
|
||||
* sends the HTTP GET request, gets the response and parses the response.
|
||||
* If a proxy URL is defined then the connection is made there.
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS - On Success ;
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramters ;
|
||||
* UPNP_E_OUTOF_MEMORY ;
|
||||
* UPNP_E_SOCKET_ERROR ;
|
||||
* UPNP_E_BAD_RESPONSE ;
|
||||
*
|
||||
* Note :
|
||||
*
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramters
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
* UPNP_E_BAD_RESPONSE
|
||||
************************************************************************/
|
||||
int
|
||||
http_OpenHttpGetProxy( IN const char *url_str,
|
||||
@@ -1685,22 +1661,21 @@ http_OpenHttpGetProxy( IN const char *url_str,
|
||||
* Function: http_SendStatusResponse
|
||||
*
|
||||
* Parameters:
|
||||
* IN SOCKINFO *info : Socket information object
|
||||
* IN int http_status_code : error code returned while making
|
||||
* IN SOCKINFO *info; Socket information object
|
||||
* IN int http_status_code; error code returned while making
|
||||
* or sending the response message
|
||||
* IN int request_major_version : request major version
|
||||
* IN int request_minor_version : request minor version
|
||||
* IN int request_major_version; request major version
|
||||
* IN int request_minor_version; request minor version
|
||||
*
|
||||
* Description : Generate a response message for the status query and
|
||||
* send the status response.
|
||||
* Description:
|
||||
* Generate a response message for the status query and send the
|
||||
* status response.
|
||||
*
|
||||
* Return : int;
|
||||
* Return: int
|
||||
* 0 -- success
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_WRITE
|
||||
* UPNP_E_TIMEDOUT
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
http_SendStatusResponse( IN SOCKINFO * info,
|
||||
@@ -1736,23 +1711,26 @@ http_SendStatusResponse( IN SOCKINFO * info,
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_MakeMessage
|
||||
*
|
||||
* Parameters:
|
||||
* INOUT membuffer* buf : buffer with the contents of the
|
||||
* INOUT membuffer* buf; buffer with the contents of the
|
||||
* message
|
||||
* IN int http_major_version : HTTP major version
|
||||
* IN int http_minor_version : HTTP minor version
|
||||
* IN const char* fmt : Pattern format
|
||||
* ... :
|
||||
* IN int http_major_version; HTTP major version
|
||||
* IN int http_minor_version; HTTP minor version
|
||||
* IN const char* fmt; Pattern format
|
||||
* ...;
|
||||
*
|
||||
* Description : Generate an HTTP message based on the format that is
|
||||
* specified in the input parameters.
|
||||
* Description:
|
||||
* Generate an HTTP message based on the format that is specified
|
||||
* in the input parameters.
|
||||
*
|
||||
* fmt types:
|
||||
* 'B': arg = int status_code
|
||||
* appends content-length, content-type and HTML body for given code
|
||||
* appends content-length, content-type and HTML body
|
||||
* for given code
|
||||
* 'b': arg1 = const char* buf;
|
||||
* arg2 = size_t buf_length memory ptr
|
||||
* 'C': (no args) appends a HTTP CONNECTION: close header
|
||||
@@ -1778,12 +1756,10 @@ http_SendStatusResponse( IN SOCKINFO * info,
|
||||
* 'U': (no args) appends HTTP USER-AGENT: header
|
||||
* 'X': arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent
|
||||
*
|
||||
* Return : int;
|
||||
* Return: int
|
||||
* 0 - On Success
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_INVALID_URL;
|
||||
*
|
||||
* Note :
|
||||
* UPNP_E_INVALID_URL
|
||||
************************************************************************/
|
||||
int
|
||||
http_MakeMessage( INOUT membuffer * buf,
|
||||
@@ -2038,21 +2014,20 @@ error_handler:
|
||||
return error_code;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_CalcResponseVersion
|
||||
*
|
||||
* Parameters:
|
||||
* IN int request_major_vers : Request major version
|
||||
* IN int request_minor_vers : Request minor version
|
||||
* OUT int* response_major_vers : Response mojor version
|
||||
* OUT int* response_minor_vers : Response minor version
|
||||
* IN int request_major_vers; Request major version
|
||||
* IN int request_minor_vers; Request minor version
|
||||
* OUT int* response_major_vers; Response mojor version
|
||||
* OUT int* response_minor_vers; Response minor version
|
||||
*
|
||||
* Description : Calculate HTTP response versions based on the request
|
||||
* versions.
|
||||
* Description:
|
||||
* Calculate HTTP response versions based on the request versions.
|
||||
*
|
||||
* Return: void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void
|
||||
http_CalcResponseVersion( IN int request_major_vers,
|
||||
@@ -2080,7 +2055,8 @@ http_CalcResponseVersion( IN int request_major_vers,
|
||||
* uri_type *url; URI object containing the scheme, path
|
||||
* query token, etc.
|
||||
*
|
||||
* Description: Makes the message for the HTTP GET method
|
||||
* Description:
|
||||
* Makes the message for the HTTP GET method
|
||||
*
|
||||
* Returns:
|
||||
* UPNP_E_INVALID_URL
|
||||
@@ -2167,28 +2143,26 @@ MakeGetMessageEx( const char *url_str,
|
||||
* Function: http_OpenHttpGetEx
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char *url_str : String as a URL
|
||||
* IN OUT void **Handle : Pointer to buffer to store HTTP
|
||||
* IN const char *url_str; String as a URL
|
||||
* IN OUT void **Handle; Pointer to buffer to store HTTP
|
||||
* post handle
|
||||
* IN OUT char **contentType : Type of content
|
||||
* OUT int *contentLength : length of content
|
||||
* OUT int *httpStatus : HTTP status returned on receiving a
|
||||
* IN OUT char **contentType; Type of content
|
||||
* OUT int *contentLength; length of content
|
||||
* OUT int *httpStatus; HTTP status returned on receiving a
|
||||
* response message
|
||||
* IN int timeout : time out value
|
||||
* IN int timeout; time out value
|
||||
*
|
||||
* Description : Makes the HTTP GET message, connects to the peer,
|
||||
* Description:
|
||||
* Makes the HTTP GET message, connects to the peer,
|
||||
* sends the HTTP GET request, gets the response and parses the
|
||||
* response.
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS - On Success ;
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramters ;
|
||||
* UPNP_E_OUTOF_MEMORY ;
|
||||
* UPNP_E_SOCKET_ERROR ;
|
||||
* UPNP_E_BAD_RESPONSE ;
|
||||
*
|
||||
* Note :
|
||||
*
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramters
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
* UPNP_E_BAD_RESPONSE
|
||||
************************************************************************/
|
||||
int
|
||||
http_OpenHttpGetEx( IN const char *url_str,
|
||||
@@ -2335,19 +2309,18 @@ http_OpenHttpGetEx( IN const char *url_str,
|
||||
return errCode;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: get_sdk_info
|
||||
*
|
||||
* Parameters:
|
||||
* OUT char *info : buffer to store the operating system
|
||||
* information
|
||||
* OUT char *info; buffer to store the operating system information
|
||||
*
|
||||
* Description : Returns the server information for the operating
|
||||
* system
|
||||
* Description:
|
||||
* Returns the server information for the operating system
|
||||
*
|
||||
* Return : UPNP_INLINE void
|
||||
*
|
||||
* Note :
|
||||
* Return:
|
||||
* UPNP_INLINE void
|
||||
************************************************************************/
|
||||
// 'info' should have a size of at least 100 bytes
|
||||
void
|
||||
@@ -2356,11 +2329,18 @@ get_sdk_info( OUT char *info )
|
||||
#ifdef WIN32
|
||||
OSVERSIONINFO versioninfo;
|
||||
versioninfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
||||
if (GetVersionEx(&versioninfo)!=0)
|
||||
sprintf( info, "%d.%d.%d %d/%s, UPnP/1.0, Portable SDK for UPnP devices/"PACKAGE_VERSION"\r\n",
|
||||
versioninfo.dwMajorVersion, versioninfo.dwMinorVersion, versioninfo.dwBuildNumber, versioninfo.dwPlatformId, versioninfo.szCSDVersion );
|
||||
else
|
||||
|
||||
if (GetVersionEx(&versioninfo)!=0) {
|
||||
sprintf( info,
|
||||
"%d.%d.%d %d/%s, UPnP/1.0, Portable SDK for UPnP devices/"PACKAGE_VERSION"\r\n",
|
||||
versioninfo.dwMajorVersion,
|
||||
versioninfo.dwMinorVersion,
|
||||
versioninfo.dwBuildNumber,
|
||||
versioninfo.dwPlatformId,
|
||||
versioninfo.szCSDVersion );
|
||||
} else {
|
||||
*info = '\0';
|
||||
}
|
||||
#else
|
||||
int ret_code;
|
||||
struct utsname sys_info;
|
||||
@@ -2369,9 +2349,10 @@ get_sdk_info( OUT char *info )
|
||||
if( ret_code == -1 ) {
|
||||
*info = '\0';
|
||||
}
|
||||
|
||||
sprintf( info, "%s/%s, UPnP/1.0, Portable SDK for UPnP devices/"
|
||||
PACKAGE_VERSION "\r\n",
|
||||
sys_info.sysname, sys_info.release );
|
||||
sprintf( info,
|
||||
"%s/%s, UPnP/1.0, Portable SDK for UPnP devices/"PACKAGE_VERSION "\r\n",
|
||||
sys_info.sysname,
|
||||
sys_info.release );
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -29,10 +29,10 @@
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/************************************************************************
|
||||
/******************************************************************************
|
||||
* Purpose: This file defines the Web Server and has functions to carry out
|
||||
* operations of the Web Server.
|
||||
************************************************************************/
|
||||
******************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
#include <assert.h>
|
||||
@@ -64,7 +64,11 @@
|
||||
/*
|
||||
Response Types
|
||||
*/
|
||||
enum resp_type { RESP_FILEDOC, RESP_XMLDOC, RESP_HEADERS, RESP_WEBDOC,
|
||||
enum resp_type {
|
||||
RESP_FILEDOC,
|
||||
RESP_XMLDOC,
|
||||
RESP_HEADERS,
|
||||
RESP_WEBDOC,
|
||||
RESP_POST };
|
||||
|
||||
// mapping of file extension to content-type of document
|
||||
@@ -182,12 +186,9 @@ static const char *gEncodedMediaTypes =
|
||||
"zip\0" APPLICATION_STR "zip\0" "\0";
|
||||
// *** end ***
|
||||
|
||||
/***********************************************************************/
|
||||
/*
|
||||
/************************************************************************
|
||||
module variables - Globals, static and externs
|
||||
*/
|
||||
|
||||
/***********************************************************************/
|
||||
************************************************************************/
|
||||
static struct document_type_t gMediaTypeList[NUM_MEDIA_TYPES];
|
||||
membuffer gDocumentRootDir; // a local dir which serves as webserver root
|
||||
static struct xml_alias_t gAliasDoc; // XML document
|
||||
@@ -589,10 +590,9 @@ web_server_destroy( void )
|
||||
* Parameters:
|
||||
* IN const char* filename ; Filename having the description document
|
||||
* OUT struct File_Info * info ; File information object having file
|
||||
* attributes such as filelength, when was
|
||||
* the file last modified, whether a file
|
||||
* or a directory and whether the file or
|
||||
* directory is readable.
|
||||
* attributes such as filelength, when was the file last
|
||||
* modified, whether a file or a directory and whether the
|
||||
* file or directory is readable.
|
||||
*
|
||||
* Description: Release memory allocated for the global web server root
|
||||
* directory and the global XML document
|
||||
@@ -689,8 +689,7 @@ web_server_set_root_dir( IN const char *root_dir )
|
||||
* OUT struct xml_alias_t* alias ; xml alias object which has a file name
|
||||
* stored
|
||||
* OUT struct File_Info * info ; File information object which will be
|
||||
* filled up if the file comparison
|
||||
* succeeds
|
||||
* filled up if the file comparison succeeds
|
||||
*
|
||||
* Description: Compare the files names between the one on the XML alias
|
||||
* the one passed in as the input parameter. If equal extract file
|
||||
@@ -870,7 +869,7 @@ StrTok( char **Src,
|
||||
* OUT int * FirstByte ; gets the first byte of the token
|
||||
* OUT int * LastByte ; gets the last byte of the token
|
||||
*
|
||||
* Description: Returns a range of integers from a sring
|
||||
* Description: Returns a range of integers from a string
|
||||
*
|
||||
* Returns: int ;
|
||||
* always returns 1;
|
||||
@@ -929,8 +928,8 @@ GetNextRange( char **SrcRangeStr,
|
||||
* Parameters:
|
||||
* char * ByteRangeSpecifier ; String containing the range
|
||||
* long FileLength ; Length of the file
|
||||
* OUT struct SendInstruction * Instr ; SendInstruction object where the
|
||||
* range operations will be stored
|
||||
* OUT struct SendInstruction * Instr ; SendInstruction object
|
||||
* where the range operations will be stored
|
||||
*
|
||||
* Description: Fills in the Offset, read size and contents to send out
|
||||
* as an HTTP Range Response
|
||||
@@ -1764,3 +1763,4 @@ web_server_callback( IN http_parser_t * parser,
|
||||
membuffer_destroy( &headers );
|
||||
membuffer_destroy( &filename );
|
||||
}
|
||||
|
||||
|
@@ -56,7 +56,8 @@ http_CancelHttpGet( IN void *Handle );
|
||||
* IN uri_type* url; URL to be validated and fixed
|
||||
* OUT uri_type* fixed_url; URL after being fixed.
|
||||
*
|
||||
* Description: Validates URL
|
||||
* Description:
|
||||
* Validates URL
|
||||
*
|
||||
* Returns:
|
||||
* UPNP_E_INVALID_URL
|
||||
@@ -64,6 +65,7 @@ http_CancelHttpGet( IN void *Handle );
|
||||
************************************************************************/
|
||||
int http_FixUrl( IN uri_type* url, OUT uri_type* fixed_url );
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_FixStrUrl
|
||||
*
|
||||
@@ -72,7 +74,8 @@ int http_FixUrl( IN uri_type* url, OUT uri_type* fixed_url );
|
||||
* IN int urlstrlen ; Length of the character string
|
||||
* OUT uri_type* fixed_url ; Fixed and corrected URL
|
||||
*
|
||||
* Description: Parses URL and then validates URL
|
||||
* Description:
|
||||
* Parses URL and then validates URL
|
||||
*
|
||||
* Returns:
|
||||
* UPNP_E_INVALID_URL
|
||||
@@ -88,8 +91,8 @@ int http_FixStrUrl( IN char* urlstr, IN int urlstrlen, OUT uri_type* fixed_url )
|
||||
* IN uri_type* destination_url; URL containing destination information
|
||||
* OUT uri_type *url; Fixed and corrected URL
|
||||
*
|
||||
* Description: Gets destination address from URL and then connects to the
|
||||
* remote end
|
||||
* Description:
|
||||
* Gets destination address from URL and then connects to the remote end
|
||||
*
|
||||
* Returns:
|
||||
* socket descriptor on sucess
|
||||
@@ -98,19 +101,21 @@ int http_FixStrUrl( IN char* urlstr, IN int urlstrlen, OUT uri_type* fixed_url )
|
||||
************************************************************************/
|
||||
int http_Connect( IN uri_type* destination_url, OUT uri_type *url );
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_RecvMessage
|
||||
*
|
||||
* Parameters:
|
||||
* IN SOCKINFO *info; Socket information object
|
||||
* OUT http_parser_t* parser, HTTP parser object
|
||||
* OUT http_parser_t* parser; HTTP parser object
|
||||
* IN http_method_t request_method; HTTP request method
|
||||
* IN OUT int* timeout_secs; time out
|
||||
* OUT int* http_error_code; HTTP error code returned
|
||||
*
|
||||
* Description: Get the data on the socket and take actions based on the
|
||||
* read data to modify the parser objects buffer. If an error is reported
|
||||
* while parsing the data, the error code is passed in the http_errr_code
|
||||
* Description:
|
||||
* Get the data on the socket and take actions based on the read data
|
||||
* to modify the parser objects buffer. If an error is reported while
|
||||
* parsing the data, the error code is passed in the http_errr_code
|
||||
* parameter
|
||||
*
|
||||
* Returns:
|
||||
@@ -131,7 +136,8 @@ int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t* parser,
|
||||
* IN OUT int * TimeOut ; time out value
|
||||
* IN const char* fmt, ... Pattern format to take actions upon
|
||||
*
|
||||
* Description: Sends a message to the destination based on the
|
||||
* Description:
|
||||
* Sends a message to the destination based on the
|
||||
* IN const char* fmt parameter
|
||||
* fmt types:
|
||||
* 'f': arg = const char * file name
|
||||
@@ -148,9 +154,12 @@ int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t* parser,
|
||||
* UPNP_E_FILE_READ_ERROR
|
||||
* UPNP_E_SUCCESS
|
||||
************************************************************************/
|
||||
int http_SendMessage( IN SOCKINFO *info, IN OUT int* timeout_secs,
|
||||
int http_SendMessage(
|
||||
IN SOCKINFO *info,
|
||||
IN OUT int* timeout_secs,
|
||||
IN const char* fmt, ... );
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_RequestAndResponse
|
||||
*
|
||||
@@ -163,7 +172,8 @@ int http_SendMessage( IN SOCKINFO *info, IN OUT int* timeout_secs,
|
||||
* IN int timeout_secs; time out value
|
||||
* OUT http_parser_t* response; Parser object to receive the repsonse
|
||||
*
|
||||
* Description: Initiates socket, connects to the destination, sends a
|
||||
* Description:
|
||||
* Initiates socket, connects to the destination, sends a
|
||||
* request and waits for the response from the remote end
|
||||
*
|
||||
* Returns:
|
||||
@@ -172,12 +182,15 @@ int http_SendMessage( IN SOCKINFO *info, IN OUT int* timeout_secs,
|
||||
* Error Codes returned by http_SendMessage
|
||||
* Error Codes returned by http_RecvMessage
|
||||
************************************************************************/
|
||||
int http_RequestAndResponse( IN uri_type* destination,
|
||||
IN const char* request, IN size_t request_length,
|
||||
int http_RequestAndResponse(
|
||||
IN uri_type* destination,
|
||||
IN const char* request,
|
||||
IN size_t request_length,
|
||||
IN http_method_t req_method,
|
||||
IN int timeout_secs,
|
||||
OUT http_parser_t* response );
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* return codes:
|
||||
* 0 -- success
|
||||
@@ -190,30 +203,31 @@ int http_RequestAndResponse( IN uri_type* destination,
|
||||
* UPNP_E_SOCKET_WRITE
|
||||
************************************************************************/
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_Download
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* url_str : String as a URL
|
||||
* IN int timeout_secs : time out value
|
||||
* OUT char** document : buffer to store the document extracted
|
||||
* IN const char* url_str; String as a URL
|
||||
* IN int timeout_secs; time out value
|
||||
* OUT char** document; buffer to store the document extracted
|
||||
* from the donloaded message.
|
||||
* OUT int* doc_length : length of the extracted document
|
||||
* OUT char* content_type : Type of content
|
||||
* OUT int* doc_length; length of the extracted document
|
||||
* OUT char* content_type; Type of content
|
||||
*
|
||||
* Description : Download the document message and extract the document
|
||||
* Description:
|
||||
* Download the document message and extract the document
|
||||
* from the message.
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS;
|
||||
* UPNP_E_INVALID_URL;
|
||||
*
|
||||
*
|
||||
* Note :
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS
|
||||
* UPNP_E_INVALID_URL
|
||||
************************************************************************/
|
||||
int http_Download( IN const char* url,
|
||||
int http_Download(
|
||||
IN const char* url,
|
||||
IN int timeout_secs,
|
||||
OUT char** document, OUT int* doc_length,
|
||||
OUT char** document,
|
||||
OUT int* doc_length,
|
||||
OUT char* content_type );
|
||||
|
||||
|
||||
@@ -227,67 +241,66 @@ int http_Download( IN const char* url,
|
||||
* IN unsigned int *size: Size of the data to be sent.
|
||||
* IN int timeout: time out value
|
||||
*
|
||||
* Description : Formats data if format used is UPNP_USING_CHUNKED.
|
||||
* Description:
|
||||
* Formats data if format used is UPNP_USING_CHUNKED.
|
||||
* Writes data on the socket connected to the peer.
|
||||
*
|
||||
* Return : int ;
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
* -1 - On Socket Error.
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int http_WriteHttpPost(IN void *Handle,
|
||||
IN char *buf,
|
||||
IN unsigned int *size,
|
||||
IN int timeout);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_CloseHttpPost
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *Handle : Handle to the http post object
|
||||
* IN OUT int *httpStatus : HTTP status returned on receiving a
|
||||
* IN void *Handle; Handle to the http post object
|
||||
* IN OUT int *httpStatus; HTTP status returned on receiving a
|
||||
* response message
|
||||
* IN int timeout : time out value
|
||||
* IN int timeout; time out value
|
||||
*
|
||||
* Description : Sends remaining data if using UPNP_USING_CHUNKED
|
||||
* Description:
|
||||
* Sends remaining data if using UPNP_USING_CHUNKED
|
||||
* format. Receives any more messages. Destroys socket and any socket
|
||||
* associated memory. Frees handle associated with the HTTP POST msg.
|
||||
*
|
||||
* Return : int ;
|
||||
* UPNP_E_SUCCESS - On Sucess ;
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter;
|
||||
*
|
||||
* Note :
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Sucess
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
************************************************************************/
|
||||
int http_CloseHttpPost(IN void *Handle,
|
||||
IN OUT int *httpStatus,
|
||||
IN int timeout);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_OpenHttpPost
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char *url_str : String as a URL
|
||||
* IN OUT void **Handle : Pointer to buffer to store HTTP
|
||||
* IN const char *url_str; String as a URL
|
||||
* IN OUT void **Handle; Pointer to buffer to store HTTP
|
||||
* post handle
|
||||
* IN const char *contentType : Type of content
|
||||
* IN int contentLength : length of content
|
||||
* IN int timeout : time out value
|
||||
* IN const char *contentType; Type of content
|
||||
* IN int contentLength; length of content
|
||||
* IN int timeout; time out value
|
||||
*
|
||||
* Description : Makes the HTTP POST message, connects to the peer,
|
||||
* Description:
|
||||
* Makes the HTTP POST message, connects to the peer,
|
||||
* sends the HTTP POST request. Adds the post handle to buffer of
|
||||
* such handles
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS - On Sucess ;
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramter ;
|
||||
* UPNP_E_OUTOF_MEMORY ;
|
||||
* UPNP_E_SOCKET_ERROR ;
|
||||
* UPNP_E_SOCKET_CONNECT ;
|
||||
*
|
||||
* Note :
|
||||
* UPNP_E_SUCCESS - On Sucess
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
* UPNP_E_SOCKET_CONNECT
|
||||
************************************************************************/
|
||||
int http_OpenHttpPost(IN const char *url_str,
|
||||
IN OUT void **Handle,
|
||||
@@ -295,69 +308,72 @@ int http_OpenHttpPost(IN const char *url_str,
|
||||
IN int contentLength,
|
||||
IN int timeout);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_ReadHttpGet
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *Handle : Handle to the HTTP get object
|
||||
* IN OUT char *buf : Buffer to get the read and parsed data
|
||||
* IN OUT unsigned int *size : Size of tge buffer passed
|
||||
* IN int timeout : time out value
|
||||
* IN void *Handle; Handle to the HTTP get object
|
||||
* IN OUT char *buf; Buffer to get the read and parsed data
|
||||
* IN OUT unsigned int *size; Size of the buffer passed
|
||||
* IN int timeout; time out value
|
||||
*
|
||||
* Description : Parses already existing data, then gets new data.
|
||||
* Description:
|
||||
* Parses already existing data, then gets new data.
|
||||
* Parses and extracts information from the new data.
|
||||
*
|
||||
* Return : int ;
|
||||
* UPNP_E_SUCCESS - On Sucess ;
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter;
|
||||
* UPNP_E_BAD_RESPONSE ;
|
||||
* UPNP_E_BAD_HTTPMSG ;
|
||||
*
|
||||
* Note :
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Sucess
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
* UPNP_E_BAD_RESPONSE
|
||||
* UPNP_E_BAD_HTTPMSG
|
||||
* UPNP_E_CANCELED
|
||||
************************************************************************/
|
||||
int http_ReadHttpGet(IN void *Handle,
|
||||
int http_ReadHttpGet(
|
||||
IN void *Handle,
|
||||
IN OUT char *buf,
|
||||
IN OUT unsigned int *size,
|
||||
IN int timeout);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_HttpGetProgress
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *Handle : Handle to the HTTP get object
|
||||
* OUT unsigned int *length : Buffer to get the read and parsed data
|
||||
* OUT unsigned int *total : Size of tge buffer passed
|
||||
* IN void *Handle; Handle to the HTTP get object
|
||||
* OUT unsigned int *length; Buffer to get the read and parsed data
|
||||
* OUT unsigned int *total; Size of tge buffer passed
|
||||
*
|
||||
* Description : Extracts information from the Handle to the HTTP get
|
||||
* object.
|
||||
* Description:
|
||||
* Extracts information from the Handle to the HTTP get object.
|
||||
*
|
||||
* Return : int ;
|
||||
* UPNP_E_SUCCESS - On Sucess ;
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter;
|
||||
*
|
||||
* Note :
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Sucess
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
************************************************************************/
|
||||
int http_HttpGetProgress(IN void *Handle,
|
||||
int http_HttpGetProgress(
|
||||
IN void *Handle,
|
||||
OUT unsigned int *length,
|
||||
OUT unsigned int *total );
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_CloseHttpGet
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *Handle; Handle to HTTP get object
|
||||
*
|
||||
* Description : Clears the handle allocated for the HTTP GET operation
|
||||
* Description:
|
||||
* Clears the handle allocated for the HTTP GET operation
|
||||
* Clears socket states and memory allocated for socket operations.
|
||||
*
|
||||
* Return : int ;
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int http_CloseHttpGet(IN void *Handle);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_OpenHttpGet
|
||||
*
|
||||
@@ -371,54 +387,52 @@ int http_CloseHttpGet(IN void *Handle);
|
||||
* response message
|
||||
* IN int timeout: time out value
|
||||
*
|
||||
* Description : Makes the HTTP GET message, connects to the peer,
|
||||
* Description:
|
||||
* Makes the HTTP GET message, connects to the peer,
|
||||
* sends the HTTP GET request, gets the response and parses the
|
||||
* response.
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS - On Success ;
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramters ;
|
||||
* UPNP_E_OUTOF_MEMORY ;
|
||||
* UPNP_E_SOCKET_ERROR ;
|
||||
* UPNP_E_BAD_RESPONSE ;
|
||||
*
|
||||
* Note :
|
||||
*
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramters
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
* UPNP_E_BAD_RESPONSE
|
||||
************************************************************************/
|
||||
int http_OpenHttpGet(IN const char *url_str,
|
||||
int http_OpenHttpGet(
|
||||
IN const char *url_str,
|
||||
IN OUT void **Handle,
|
||||
IN OUT char **contentType,
|
||||
OUT int *contentLength,
|
||||
OUT int *httpStatus,
|
||||
IN int timeout);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_OpenHttpGetProxy
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char *url_str : String as a URL
|
||||
* IN const char *proxy_str : String as a URL to the proxy
|
||||
* IN OUT void **Handle : Pointer to buffer to store HTTP
|
||||
* IN const char *url_str; String as a URL
|
||||
* IN const char *proxy_str; String as a URL
|
||||
* IN OUT void **Handle; Pointer to buffer to store HTTP
|
||||
* post handle
|
||||
* IN OUT char **contentType : Type of content
|
||||
* OUT int *contentLength : length of content
|
||||
* OUT int *httpStatus : HTTP status returned on receiving a
|
||||
* IN OUT char **contentType; Type of content
|
||||
* OUT int *contentLength; length of content
|
||||
* OUT int *httpStatus; HTTP status returned on receiving a
|
||||
* response message
|
||||
* IN int timeout: time out value
|
||||
*
|
||||
* Description : Makes the HTTP GET message, connects to the peer,
|
||||
* sends the HTTP GET request, gets the response and parses the
|
||||
* response.
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS - On Success ;
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramters ;
|
||||
* UPNP_E_OUTOF_MEMORY ;
|
||||
* UPNP_E_SOCKET_ERROR ;
|
||||
* UPNP_E_BAD_RESPONSE ;
|
||||
*
|
||||
* Note :
|
||||
* Description:
|
||||
* Makes the HTTP GET message, connects to the peer,
|
||||
* sends the HTTP GET request, gets the response and parses the response.
|
||||
* If a proxy URL is defined then the connection is made there.
|
||||
*
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramters
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
* UPNP_E_BAD_RESPONSE
|
||||
************************************************************************/
|
||||
int http_OpenHttpGetProxy(IN const char *url_str,
|
||||
IN const char *proxy_str,
|
||||
@@ -433,24 +447,25 @@ int http_OpenHttpGetProxy(IN const char *url_str,
|
||||
* Function: http_SendStatusResponse
|
||||
*
|
||||
* Parameters:
|
||||
* IN SOCKINFO *info : Socket information object
|
||||
* IN int http_status_code : error code returned while making
|
||||
* IN SOCKINFO *info; Socket information object
|
||||
* IN int http_status_code; error code returned while making
|
||||
* or sending the response message
|
||||
* IN int request_major_version : request major version
|
||||
* IN int request_minor_version : request minor version
|
||||
* IN int request_major_version; request major version
|
||||
* IN int request_minor_version; request minor version
|
||||
*
|
||||
* Description : Generate a response message for the status query and
|
||||
* send the status response.
|
||||
* Description:
|
||||
* Generate a response message for the status query and send the
|
||||
* status response.
|
||||
*
|
||||
* Return : int;
|
||||
* Return: int
|
||||
* 0 -- success
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_WRITE
|
||||
* UPNP_E_TIMEDOUT
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int http_SendStatusResponse( IN SOCKINFO *info, IN int http_status_code,
|
||||
int http_SendStatusResponse(
|
||||
IN SOCKINFO *info,
|
||||
IN int http_status_code,
|
||||
IN int request_major_version,
|
||||
IN int request_minor_version );
|
||||
|
||||
@@ -459,96 +474,103 @@ int http_SendStatusResponse( IN SOCKINFO *info, IN int http_status_code,
|
||||
* Function: http_MakeMessage
|
||||
*
|
||||
* Parameters:
|
||||
* INOUT membuffer* buf : buffer with the contents of the
|
||||
* INOUT membuffer* buf; buffer with the contents of the
|
||||
* message
|
||||
* IN int http_major_version : HTTP major version
|
||||
* IN int http_minor_version : HTTP minor version
|
||||
* IN const char* fmt : Pattern format
|
||||
* ... :
|
||||
* IN int http_major_version; HTTP major version
|
||||
* IN int http_minor_version; HTTP minor version
|
||||
* IN const char* fmt; Pattern format
|
||||
* ...;
|
||||
*
|
||||
* Description : Generate an HTTP message based on the format that is
|
||||
* specified in the input parameters.
|
||||
* Description:
|
||||
* Generate an HTTP message based on the format that is 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
|
||||
* 'h': arg = off_t number // appends off_t number
|
||||
* 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt
|
||||
* 'D': (no args) appends HTTP DATE: header
|
||||
* 'S': (no args) appends HTTP SERVER: header
|
||||
* 'U': (no args) appends HTTP USER-AGENT: header
|
||||
* 'B': arg = int status_code
|
||||
* appends content-length, content-type and HTML body
|
||||
* for given code
|
||||
* '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
|
||||
* 'N': arg1 = int content_length // content-length header
|
||||
* 'Q': arg1 = http_method_t; arg2 = char* url;
|
||||
* arg3 = int url_length // start line of request
|
||||
* '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
|
||||
* '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
|
||||
* '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;
|
||||
* Return: int
|
||||
* 0 - On Success
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_INVALID_URL;
|
||||
*
|
||||
* Note :
|
||||
* UPNP_E_INVALID_URL
|
||||
************************************************************************/
|
||||
int http_MakeMessage( INOUT membuffer* buf,
|
||||
int http_MakeMessage(
|
||||
INOUT membuffer* buf,
|
||||
IN int http_major_version,
|
||||
IN int http_minor_version,
|
||||
IN const char* fmt, ... );
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_CalcResponseVersion
|
||||
*
|
||||
* Parameters:
|
||||
* IN int request_major_vers : Request major version
|
||||
* IN int request_minor_vers : Request minor version
|
||||
* OUT int* response_major_vers : Response mojor version
|
||||
* OUT int* response_minor_vers : Response minor version
|
||||
* IN int request_major_vers; Request major version
|
||||
* IN int request_minor_vers; Request minor version
|
||||
* OUT int* response_major_vers; Response mojor version
|
||||
* OUT int* response_minor_vers; Response minor version
|
||||
*
|
||||
* Description : Calculate HTTP response versions based on the request
|
||||
* versions.
|
||||
* Description:
|
||||
* Calculate HTTP response versions based on the request versions.
|
||||
*
|
||||
* Return: void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void http_CalcResponseVersion(
|
||||
IN int request_major_vers, IN int request_minor_vers,
|
||||
OUT int* response_major_vers, OUT int* response_minor_vers );
|
||||
IN int request_major_vers,
|
||||
IN int request_minor_vers,
|
||||
OUT int* response_major_vers,
|
||||
OUT int* response_minor_vers );
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_OpenHttpGetEx
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char *url_str : String as a URL
|
||||
* IN OUT void **Handle : Pointer to buffer to store HTTP
|
||||
* IN const char *url_str; String as a URL
|
||||
* IN OUT void **Handle; Pointer to buffer to store HTTP
|
||||
* post handle
|
||||
* IN OUT char **contentType : Type of content
|
||||
* OUT int *contentLength : length of content
|
||||
* OUT int *httpStatus : HTTP status returned on receiving a
|
||||
* IN OUT char **contentType; Type of content
|
||||
* OUT int *contentLength; length of content
|
||||
* OUT int *httpStatus; HTTP status returned on receiving a
|
||||
* response message
|
||||
* IN int timeout : time out value
|
||||
* IN int timeout; time out value
|
||||
*
|
||||
* Description : Makes the HTTP GET message, connects to the peer,
|
||||
* Description:
|
||||
* Makes the HTTP GET message, connects to the peer,
|
||||
* sends the HTTP GET request, gets the response and parses the
|
||||
* response.
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS - On Success ;
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramters ;
|
||||
* UPNP_E_OUTOF_MEMORY ;
|
||||
* UPNP_E_SOCKET_ERROR ;
|
||||
* UPNP_E_BAD_RESPONSE ;
|
||||
*
|
||||
* Note :
|
||||
*
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramters
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
* UPNP_E_BAD_RESPONSE
|
||||
************************************************************************/
|
||||
int http_OpenHttpGetEx(IN const char *url_str,
|
||||
IN OUT void **Handle,
|
||||
@@ -559,18 +581,18 @@ int http_OpenHttpGetEx(IN const char *url_str,
|
||||
IN int highRange,
|
||||
IN int timeout);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: get_sdk_info
|
||||
*
|
||||
* Parameters:
|
||||
* OUT char *info ;
|
||||
* OUT char *info; buffer to store the operating system information
|
||||
*
|
||||
* Description : Returns the server information for the operating
|
||||
* system
|
||||
* Description:
|
||||
* Returns the server information for the operating system
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
* Return:
|
||||
* UPNP_INLINE void
|
||||
************************************************************************/
|
||||
void get_sdk_info( OUT char *info );
|
||||
|
||||
@@ -580,3 +602,4 @@ void get_sdk_info( OUT char *info );
|
||||
|
||||
|
||||
#endif // GENLIB_NET_HTTP_HTTPREADWRITE_H
|
||||
|
||||
|
@@ -1,63 +1,67 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
#ifndef MINISERVER_H
|
||||
#define MINISERVER_H
|
||||
|
||||
|
||||
#include "sock.h"
|
||||
#include "httpparser.h"
|
||||
|
||||
|
||||
extern SOCKET gMiniServerStopSock;
|
||||
|
||||
|
||||
typedef struct MServerSockArray {
|
||||
int miniServerSock; //socket for listening for miniserver
|
||||
//requests
|
||||
int miniServerStopSock; //socket for stopping miniserver
|
||||
int ssdpSock; //socket for incoming advertisments and search requests
|
||||
/* socket for listening for miniserver requests */
|
||||
int miniServerSock;
|
||||
/* socket for stopping miniserver */
|
||||
int miniServerStopSock;
|
||||
/* socket for incoming advertisments and search requests */
|
||||
int ssdpSock;
|
||||
|
||||
int stopPort;
|
||||
int miniServerPort;
|
||||
|
||||
CLIENTONLY(int ssdpReqSock;) //socket for sending search
|
||||
//requests and receiving
|
||||
// search replies
|
||||
|
||||
/* socket for sending search requests and receiving search replies */
|
||||
CLIENTONLY(int ssdpReqSock;)
|
||||
} MiniServerSockArray;
|
||||
|
||||
//typedef void (*MiniServerCallback) ( const char* document, int sockfd );
|
||||
|
||||
typedef void (*MiniServerCallback) ( IN http_parser_t *parser,
|
||||
typedef void (*MiniServerCallback)(
|
||||
IN http_parser_t *parser,
|
||||
IN http_message_t* request,
|
||||
IN SOCKINFO *info );
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -71,8 +75,6 @@ extern "C" {
|
||||
* Description: Set HTTP Get Callback
|
||||
*
|
||||
* Return: void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void SetHTTPGetCallback( MiniServerCallback callback );
|
||||
|
||||
@@ -85,14 +87,12 @@ void SetHTTPGetCallback( MiniServerCallback callback );
|
||||
* Description: Set SOAP Callback
|
||||
*
|
||||
* Return: void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
void SetSoapCallback( MiniServerCallback callback );
|
||||
#else
|
||||
#else /* INCLUDE_DEVICE_APIS */
|
||||
static inline void SetSoapCallback( MiniServerCallback callback ) {}
|
||||
#endif
|
||||
#endif /* INCLUDE_DEVICE_APIS */
|
||||
|
||||
/************************************************************************
|
||||
* Function: SetGenaCallback
|
||||
@@ -100,11 +100,9 @@ static inline void SetSoapCallback( MiniServerCallback callback ) {}
|
||||
* Parameters:
|
||||
* MiniServerCallback callback; - GENA Callback to be invoked
|
||||
*
|
||||
* Description : Set GENA Callback
|
||||
* D6escription: Set GENA Callback
|
||||
*
|
||||
* Return: void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void SetGenaCallback( MiniServerCallback callback );
|
||||
|
||||
@@ -126,7 +124,6 @@ void SetGenaCallback( MiniServerCallback callback );
|
||||
* Return: int;
|
||||
* Actual port socket is bound to - On Success:
|
||||
* A negative number UPNP_E_XXX - On Error
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int StartMiniServer( unsigned short listen_port );
|
||||
|
||||
@@ -136,19 +133,18 @@ int StartMiniServer( unsigned short listen_port );
|
||||
* Parameters:
|
||||
* void;
|
||||
*
|
||||
* Description : Stop and Shutdown the MiniServer and free socket
|
||||
* resources.
|
||||
* Description: Stop and Shutdown the MiniServer and free socket resources.
|
||||
*
|
||||
* Return : int;
|
||||
* Always returns 0
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int StopMiniServer( void );
|
||||
int StopMiniServer();
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern C */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* MINISERVER_H */
|
||||
|
||||
|
@@ -50,8 +50,7 @@
|
||||
|
||||
#define MAX_TIME_TOREAD 45
|
||||
|
||||
CLIENTONLY( SOCKET gSsdpReqSocket = 0;
|
||||
)
|
||||
CLIENTONLY( SOCKET gSsdpReqSocket = 0; )
|
||||
|
||||
void RequestHandler();
|
||||
Event ErrotEvt;
|
||||
@@ -61,11 +60,10 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
|
||||
unsigned short ssdpStopPort;
|
||||
|
||||
struct SSDPSockArray {
|
||||
int ssdpSock; //socket for incoming advertisments and search requests
|
||||
CLIENTONLY( int ssdpReqSock;
|
||||
) //socket for sending search
|
||||
//requests and receiving
|
||||
// search replies
|
||||
// socket for incoming advertisments and search requests
|
||||
int ssdpSock;
|
||||
// socket for sending search requests and receiving search replies
|
||||
CLIENTONLY( int ssdpReqSock; )
|
||||
};
|
||||
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
@@ -129,7 +127,6 @@ int AdvertiseAndReply( IN int AdFlag,
|
||||
return UPNP_E_INVALID_HANDLE;
|
||||
}
|
||||
defaultExp = SInfo->MaxAge;
|
||||
nodeList = NULL;
|
||||
|
||||
//get server info
|
||||
|
||||
@@ -398,8 +395,8 @@ int AdvertiseAndReply( IN int AdFlag,
|
||||
|
||||
} /****************** End of AdvertiseAndReply *********************/
|
||||
|
||||
#endif
|
||||
#endif
|
||||
#endif /* EXCLUDE_SSDP == 0 */
|
||||
#endif /* INCLUDE_DEVICE_APIS */
|
||||
|
||||
/************************************************************************
|
||||
* Function : Make_Socket_NoBlocking
|
||||
@@ -737,8 +734,7 @@ ssdp_event_handler_thread( void *the_data )
|
||||
// send msg to device or ctrlpt
|
||||
if( ( hmsg->method == HTTPMETHOD_NOTIFY ) ||
|
||||
( hmsg->request_method == HTTPMETHOD_MSEARCH ) ) {
|
||||
CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, &data->dest_addr,
|
||||
FALSE, NULL ););
|
||||
CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, &data->dest_addr, FALSE, NULL );)
|
||||
} else {
|
||||
ssdp_handle_device_request( hmsg, &data->dest_addr );
|
||||
}
|
||||
@@ -860,17 +856,16 @@ readFromSSDPSocket( SOCKET socket )
|
||||
int
|
||||
get_ssdp_sockets( MiniServerSockArray * out )
|
||||
{
|
||||
SOCKET ssdpSock;
|
||||
|
||||
CLIENTONLY( SOCKET ssdpReqSock; )
|
||||
int onOff = 1;
|
||||
u_char ttl = 4;
|
||||
struct ip_mreq ssdpMcastAddr;
|
||||
struct sockaddr_in ssdpAddr;
|
||||
int option = 1;
|
||||
struct in_addr addr;
|
||||
SOCKET ssdpSock;
|
||||
#if INCLUDE_CLIENT_APIS
|
||||
SOCKET ssdpReqSock;
|
||||
|
||||
CLIENTONLY(
|
||||
if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) {
|
||||
UpnpPrintf( UPNP_CRITICAL,
|
||||
SSDP, __FILE__, __LINE__,
|
||||
@@ -880,15 +875,15 @@ CLIENTONLY(
|
||||
setsockopt( ssdpReqSock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
|
||||
// just do it, regardless if fails or not.
|
||||
Make_Socket_NoBlocking( ssdpReqSock );
|
||||
gSsdpReqSocket = ssdpReqSock; )
|
||||
// END CLIENTONLY
|
||||
gSsdpReqSocket = ssdpReqSock;
|
||||
#endif /* INCLUDE_CLIENT_APIS */
|
||||
|
||||
if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) {
|
||||
UpnpPrintf( UPNP_CRITICAL,
|
||||
SSDP, __FILE__, __LINE__,
|
||||
"Error in socket operation !!!\n" );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
|
||||
return UPNP_E_OUTOF_SOCKET;
|
||||
}
|
||||
|
||||
@@ -898,8 +893,8 @@ CLIENTONLY(
|
||||
UpnpPrintf( UPNP_CRITICAL,
|
||||
SSDP, __FILE__, __LINE__,
|
||||
"Error in set reuse addr !!!\n" );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
|
||||
shutdown( ssdpSock, SD_BOTH );
|
||||
UpnpCloseSocket( ssdpSock );
|
||||
return UPNP_E_SOCKET_ERROR;
|
||||
@@ -911,13 +906,13 @@ CLIENTONLY(
|
||||
UpnpPrintf( UPNP_CRITICAL,
|
||||
SSDP, __FILE__, __LINE__,
|
||||
"Error in set reuse port !!!\n" );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
|
||||
shutdown( ssdpSock, SD_BOTH );
|
||||
UpnpCloseSocket( ssdpSock );
|
||||
return UPNP_E_SOCKET_ERROR;
|
||||
}
|
||||
#endif
|
||||
#endif /* __FreeBSD__ */
|
||||
|
||||
memset( ( void * )&ssdpAddr, 0, sizeof( struct sockaddr_in ) );
|
||||
ssdpAddr.sin_family = AF_INET;
|
||||
@@ -931,8 +926,8 @@ CLIENTONLY(
|
||||
"Error in binding !!!\n" );
|
||||
shutdown( ssdpSock, SD_BOTH );
|
||||
UpnpCloseSocket( ssdpSock );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
|
||||
return UPNP_E_SOCKET_BIND;
|
||||
}
|
||||
|
||||
@@ -945,9 +940,9 @@ CLIENTONLY(
|
||||
SSDP, __FILE__, __LINE__,
|
||||
"Error in joining" " multicast group !!!\n" );
|
||||
shutdown( ssdpSock, SD_BOTH );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
|
||||
UpnpCloseSocket( ssdpSock );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
|
||||
return UPNP_E_SOCKET_ERROR;
|
||||
}
|
||||
|
||||
@@ -961,7 +956,7 @@ CLIENTONLY(
|
||||
/* This is probably not a critical error, so let's continue. */
|
||||
}
|
||||
|
||||
// result is not checked becuase it will fail in WinMe and Win9x.
|
||||
/* result is not checked becuase it will fail in WinMe and Win9x. */
|
||||
setsockopt( ssdpSock, IPPROTO_IP,
|
||||
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
|
||||
if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST,
|
||||
@@ -970,16 +965,16 @@ CLIENTONLY(
|
||||
SSDP, __FILE__, __LINE__,
|
||||
"Error in setting broadcast !!!\n" );
|
||||
shutdown( ssdpSock, SD_BOTH );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
|
||||
UpnpCloseSocket( ssdpSock );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
|
||||
return UPNP_E_NETWORK_ERROR;
|
||||
}
|
||||
|
||||
CLIENTONLY( out->ssdpReqSock = ssdpReqSock; );
|
||||
CLIENTONLY( out->ssdpReqSock = ssdpReqSock; )
|
||||
out->ssdpSock = ssdpSock;
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
#endif // EXCLUDE_SSDP
|
||||
#endif /* EXCLUDE_SSDP */
|
||||
|
||||
|
Reference in New Issue
Block a user