- Fixed a bug in UpnpPrintf, function could call va_start() and return

befor calling va_end().

- Removed all uses of the DBGONLY(x) macro. A static inline empty
function now is used and the compiler takes care of optimizing it out.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@185 119443c7-1b9e-41f8-b6fc-b9c35fce742c
This commit is contained in:
Marcelo Roberto Jimenez 2007-05-18 13:31:21 +00:00
parent 4ceb6c67d1
commit 2c1dba2942
31 changed files with 2329 additions and 2378 deletions

View File

@ -1,6 +1,14 @@
*************************************************************************
*******************************************************************************
Version 1.4.7
*************************************************************************
*******************************************************************************
2007-05-17 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Removed all uses of the DBGONLY(x) macro. A static inline empty
function now is used and the compiler takes care of optimizing it out.
2007-05-17 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Fixed a bug in UpnpPrintf, function could call va_start() and return
befor calling va_end().
2007-05-15 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* EXPORT_SPEC missing on some declarations in ixml/inc/ixml.h.
@ -31,16 +39,16 @@ Version 1.4.7
tarball and executes upnp_tv_device from its creation directory,
there will be no error -108 for not finding directory web.
*************************************************************************
*******************************************************************************
Version 1.4.6
*************************************************************************
*******************************************************************************
2007-04-19 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Fix for freebsd host_os in configure.ac.
*************************************************************************
*******************************************************************************
Version 1.4.5
*************************************************************************
*******************************************************************************
2007-04-19 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Case insensitive comparison in raw_find_str() (httpparser.c) as
@ -66,9 +74,9 @@ Version 1.4.5
(int instead of size_t) in combination with format "b" and "Q".
The attached patch should fix this.
*************************************************************************
*******************************************************************************
Version 1.4.4
*************************************************************************
*******************************************************************************
2007-04-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Tracker [ 1695399 ] Typo in util.h
@ -103,9 +111,9 @@ Version 1.4.4
Please note, that I enabled some extra debugging lines that were commented,
in order to get more information. See attached files.
*************************************************************************
*******************************************************************************
Version 1.4.3
*************************************************************************
*******************************************************************************
2007-03-13 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Tracker [ 1663004 ] Compile on Cygwin
@ -140,9 +148,9 @@ Version 1.4.3
* Fixed nasty segmentation fault bug on membuffer.c.
*************************************************************************
*******************************************************************************
Version 1.4.2
*************************************************************************
*******************************************************************************
2007-02-09 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
@ -244,9 +252,9 @@ Version 1.4.2
* support for large files (>2 GBytes) added
*************************************************************************
*******************************************************************************
Version 1.4.1
*************************************************************************
*******************************************************************************
2006-07-07 Oxy <virtual_worlds(at)gmx.de>
@ -277,9 +285,9 @@ Version 1.4.1
* Patch to fix memory leaks and reasons for crashes added (thanks
to loigu)
*************************************************************************
*******************************************************************************
Version 1.4.0
*************************************************************************
*******************************************************************************
2006-05-26 Oxy <virtual_worlds(at)gmx.de>
@ -305,9 +313,9 @@ Version 1.4.0
* Bugfix for M-Search packet
*************************************************************************
*******************************************************************************
FORK FROM DEAD libupnp
*************************************************************************
*******************************************************************************
2006-04-29 Rémi Turboult <r3mi(at)users.sourceforge.net>

View File

@ -1,4 +1,4 @@
/* autoconfig.h. Generated by configure. */
/* autoconfig.h. Generated from autoconfig.h.in by configure. */
/* autoconfig.h.in. Generated from configure.ac by autoheader. */
/* Define to 1 to compile debug code */
@ -19,15 +19,18 @@
/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
#define HAVE_FSEEKO 1
/* Define to 1 if you have the `ftime' function. */
#define HAVE_FTIME 1
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the `compat' library (-lcompat). */
/* #undef HAVE_LIBCOMPAT */
/* Define to 1 if you have the <limits.h> header file. */
#define HAVE_LIMITS_H 1
/* Define to 1 if you have the <malloc.h> header file. */
#define HAVE_MALLOC_H 1
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
@ -92,19 +95,19 @@
#define PACKAGE "libupnp"
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "virtual_worlds@gmx.de"
#define PACKAGE_BUGREPORT "mroberto@users.sourceforge.net"
/* Define to the full name of this package. */
#define PACKAGE_NAME "libupnp"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "libupnp 1.4.0"
#define PACKAGE_STRING "libupnp 1.4.7"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "libupnp"
/* Define to the version of this package. */
#define PACKAGE_VERSION "1.4.0"
#define PACKAGE_VERSION "1.4.7"
/* Define to necessary symbol if this constant uses a non-standard name on
your system. */
@ -135,27 +138,30 @@
#define UPNP_VERSION_MINOR 4
/* see upnpconfig.h */
#define UPNP_VERSION_PATCH 0
#define UPNP_VERSION_PATCH 7
/* see upnpconfig.h */
#define UPNP_VERSION_STRING "1.4.0"
#define UPNP_VERSION_STRING "1.4.7"
/* Version number of package */
#define VERSION "1.4.0"
#define VERSION "1.4.7"
/* Number of bits in a file offset, on hosts where this is settable. */
/* File Offset size */
#define _FILE_OFFSET_BITS 64
/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
/* #undef _LARGEFILE_SOURCE */
/* Define for large files, on AIX-style hosts. */
/* #undef _LARGE_FILES */
/* Large files support */
#define _LARGE_FILE_SOURCE
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
/* Define to `unsigned' if <sys/types.h> does not define. */
/* Define to `long int' if <sys/types.h> does not define. */
/* #undef off_t */
/* Define to `unsigned int' if <sys/types.h> does not define. */
/* #undef size_t */
/* Substitute for socklen_t */

View File

@ -34,7 +34,6 @@
#include "autoconfig.h"
#define MAX_JOBS_TOTAL 10
/** @name Compile time configuration options
* The Linux SDK for UPnP Devices contains some compile-time parameters
@ -96,6 +95,17 @@
#define MAX_THREADS 12
//@}
/** @name MAX_JOBS_TOTAL
* The {\tt MAX_JOBS_TOTAL} constant determines the maximum number of jobs
* that can be queued. If this limit is reached further jobs will be thrown
* to avoid memory exhaustion. The default value 100.
* (Added by Axis.)
*/
//@{
#define MAX_JOBS_TOTAL 100
//@}
/** @name DEFAULT_SOAP_CONTENT_LENGTH
* SOAP messages will read at most {\tt DEFAULT_SOAP_CONTENT_LENGTH} bytes.
* This prevents devices that have a misbehaving web server to send
@ -294,68 +304,46 @@
/** @name DBGONLY
The {\bf DBGONLY} macro allows code to be marked so that it
is only included in the DEBUG build and not the release. To
use this macro, put the code inside of the parentheses:
{\tt DBGONLY(int i;)}
This will cause a declaration of the integer {\tt i} only
in the debug build.
*/
//@{
#ifdef DEBUG
#define DBGONLY(x) x
#else
#define DBGONLY(x)
#endif
//@}
#undef EXCLUDE_WEB_SERVER
#undef EXCLUDE_MINISERVER
#undef EXCLUDE_WEB_SERVER
#undef EXCLUDE_MINISERVER
#ifdef INTERNAL_WEB_SERVER
#define EXCLUDE_WEB_SERVER 0
#define EXCLUDE_MINISERVER 0
# define EXCLUDE_WEB_SERVER 0
# define EXCLUDE_MINISERVER 0
#else
#define EXCLUDE_WEB_SERVER 1
#define EXCLUDE_MINISERVER 1
# define EXCLUDE_WEB_SERVER 1
# define EXCLUDE_MINISERVER 1
#endif
#if EXCLUDE_GENA == 1 && EXCLUDE_SOAP == 1 && EXCLUDE_WEB_SERVER == 1
#undef EXCLUDE_MINISERVER
#define EXCLUDE_MINISERVER 1
#if INTERNAL_WEB_SERVER
# error "conflicting settings: use configure --disable-webserver"
#endif
# undef EXCLUDE_MINISERVER
# define EXCLUDE_MINISERVER 1
# if INTERNAL_WEB_SERVER
# error "conflicting settings: use configure --disable-webserver"
# endif
#endif
#if EXCLUDE_GENA == 0 || EXCLUDE_SOAP == 0 || EXCLUDE_WEB_SERVER == 0
#undef EXCLUDE_MINISERVER
#define EXCLUDE_MINISERVER 0
#if EXCLUDE_WEB_SERVER == 0 && !defined INTERNAL_WEB_SERVER
#error "conflicting settings : use configure --enable-webserver"
#endif
# undef EXCLUDE_MINISERVER
# define EXCLUDE_MINISERVER 0
# if EXCLUDE_WEB_SERVER == 0 && !defined INTERNAL_WEB_SERVER
# error "conflicting settings : use configure --enable-webserver"
# endif
#endif
#ifdef INCLUDE_CLIENT_APIS
#define CLIENTONLY(x) x
#else
#define CLIENTONLY(x)
# define CLIENTONLY(x) x
#else
# define CLIENTONLY(x)
#endif
#ifdef INCLUDE_DEVICE_APIS
#define DEVICEONLY(x) x
#else
#define DEVICEONLY(x)
# define DEVICEONLY(x) x
#else
# define DEVICEONLY(x)
#endif
//@}
#endif

View File

@ -1,46 +1,46 @@
/* upnp/inc/upnpconfig.h. Generated by configure. */
/* upnp/inc/upnpconfig.h. Generated from upnpconfig.h.in by configure. */
// -*- C -*-
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2006 Rémi Turboult <r3mi@users.sourceforge.net>
// All rights reserved.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#ifndef UPNP_CONFIG_H
#define UPNP_CONFIG_H
#define UPNP_CONFIG_H
/***************************************************************************
* Library version
***************************************************************************/
* Library version
***************************************************************************/
/** The library version (string) e.g. "1.3.0" */
#define UPNP_VERSION_STRING "1.4.0"
#define UPNP_VERSION_STRING "1.4.7"
/** Major version of the library */
#define UPNP_VERSION_MAJOR 1
@ -49,7 +49,7 @@
#define UPNP_VERSION_MINOR 4
/** Patch version of the library */
#define UPNP_VERSION_PATCH 0
#define UPNP_VERSION_PATCH 7
/** The library version (numeric) e.g. 10300 means version 1.3.0 */
#define UPNP_VERSION \
@ -59,25 +59,25 @@
/***************************************************************************
* Library optional features
***************************************************************************/
***************************************************************************/
/*
* The following defines can be tested in order to know which
* The following defines can be tested in order to know which
* optional features have been included in the installed library.
*/
/** Defined to 1 if the library has been compiled with DEBUG enabled
/** Defined to 1 if the library has been compiled with DEBUG enabled
* (i.e. configure --enable-debug) : <upnp/upnpdebug.h> file is available */
#undef UPNP_HAVE_DEBUG
/* #undef UPNP_HAVE_DEBUG */
/** Defined to 1 if the library has been compiled with client API enabled
/** Defined to 1 if the library has been compiled with client API enabled
* (i.e. configure --enable-client) */
#define UPNP_HAVE_CLIENT 1
/** Defined to 1 if the library has been compiled with device API enabled
/** Defined to 1 if the library has been compiled with device API enabled
* (i.e. configure --enable-device) */
#define UPNP_HAVE_DEVICE 1

View File

@ -82,15 +82,6 @@ typedef enum priority {LOW_PRIORITY,
#define DEBUG 1
#endif
//DEBUGGING
#ifndef WIN32
#ifdef DEBUG
#define DBGONLY(x) x
#else
#define DBGONLY(x)
#endif
#endif
#include "LinkedList.h"
#include <sys/timeb.h>
#include "FreeList.h"

View File

@ -52,9 +52,6 @@
#endif
#include "ixml.h"
#include "upnpconfig.h"
#if UPNP_HAVE_DEBUG
#include "upnpdebug.h"
#endif
#ifdef WIN32
@ -489,6 +486,8 @@
#define INOUT
#endif
#include "upnpdebug.h"
enum UpnpOpenFileMode{UPNP_READ, UPNP_WRITE};
/// @name Constants, Structures, and Types

View File

@ -33,11 +33,9 @@
#ifndef UPNP_DEBUG_H
#define UPNP_DEBUG_H
#include "upnp.h"
#include "upnpconfig.h"
// Function declarations only if debug compiled into the library
#if UPNP_HAVE_DEBUG
#include <stdio.h>
#ifdef __cplusplus
@ -70,7 +68,17 @@ extern "C" {
* \end{itemize}
*/
typedef enum Upnp_Module {SSDP,SOAP,GENA,TPOOL,MSERV,DOM,API, HTTP} Dbg_Module;
typedef enum Upnp_Module {
SSDP,
SOAP,
GENA,
TPOOL,
MSERV,
DOM,
API,
HTTP
} Dbg_Module;
//@{
typedef enum Upnp_LogLevel_e {
UPNP_CRITICAL,
@ -81,7 +89,7 @@ typedef enum Upnp_LogLevel_e {
//@}
// for backward compatibility
#define Dbg_Level Upnp_LogLevel
#define Dbg_Level Upnp_LogLevel
/**
@ -102,22 +110,30 @@ typedef enum Upnp_LogLevel_e {
* -1 : If fails
* UPNP_E_SUCCESS : if success
***************************************************************************/
#ifdef DEBUG
int UpnpInitLog();
#else
static inline int UpnpInitLog() { return UPNP_E_SUCCESS; }
#endif
// for backward compatibility
#define InitLog UpnpInitLog
#define InitLog UpnpInitLog
/***************************************************************************
* Function : UpnpSetLogLevel
*
* Parameters: void
* Parameters: Upnp_LogLevel log_level
*
* Description:
* This functions set the log level (see {\tt Upnp_LogLevel}
* Returns: void
***************************************************************************/
void UpnpSetLogLevel (Upnp_LogLevel);
#ifdef DEBUG
void UpnpSetLogLevel(Upnp_LogLevel log_level);
#else
static inline void UpnpSetLogLevel(Upnp_LogLevel log_level) {}
#endif
/***************************************************************************
@ -129,7 +145,11 @@ void UpnpSetLogLevel (Upnp_LogLevel);
* This functions closes the log files
* Returns: void
***************************************************************************/
#ifdef DEBUG
void UpnpCloseLog();
#else
static inline void UpnpCloseLog() {}
#endif
// for backward compatibility
#define CloseLog UpnpCloseLog
@ -149,7 +169,15 @@ void UpnpCloseLog();
* per the requested banner
* Returns: void
***************************************************************************/
void UpnpSetLogFileNames (const char* ErrFileName, const char* InfoFileName);
#ifdef DEBUG
void UpnpSetLogFileNames(
const char *ErrFileName,
const char *InfoFileName);
#else
static inline void UpnpSetLogFileNames(
const char *ErrFileName,
const char *InfoFileName) {}
#endif
// for backward compatibility
#define SetLogFileNames UpnpSetLogFileNames
@ -171,12 +199,45 @@ void UpnpSetLogFileNames (const char* ErrFileName, const char* InfoFileName);
* NULL : if the module is turn off for debug
* else returns the right file descriptor
***************************************************************************/
FILE* UpnpGetDebugFile (Upnp_LogLevel level, Dbg_Module module);
#ifdef DEBUG
FILE *UpnpGetDebugFile(Upnp_LogLevel level, Dbg_Module module);
#else
static inline FILE *UpnpGetDebugFile(Upnp_LogLevel level, Dbg_Module module)
{
return NULL;
}
#endif
// for backward compatibility
#define GetDebugFile UpnpGetDebugFile
/***************************************************************************
* Function : DebugAtThisLevel
*
* Parameters:
* IN Dbg_Level DLevel: The level of the debug logging. It will decide
* whether debug statement will go to standard output,
* or any of the log files.
* IN Dbg_Module Module: debug will go in the name of this module
*
* Description:
* This functions returns true if debug output should be done in this
* module.
*
* Returns: int
***************************************************************************/
#ifdef DEBUG
int DebugAtThisLevel(
IN Upnp_LogLevel DLevel,
IN Dbg_Module Module);
#else
static inline int DebugAtThisLevel(
IN Upnp_LogLevel DLevel,
IN Dbg_Module Module) { return 0; }
#endif
/***************************************************************************
* Function : UpnpPrintf
*
@ -198,6 +259,7 @@ FILE* UpnpGetDebugFile (Upnp_LogLevel level, Dbg_Module module);
* debug statement is coming
* Returns: void
***************************************************************************/
#ifdef DEBUG
void UpnpPrintf (Upnp_LogLevel DLevel, Dbg_Module Module,
const char* DbgFileName, int DbgLineNo,
const char* FmtStr,
@ -206,6 +268,15 @@ void UpnpPrintf (Upnp_LogLevel DLevel, Dbg_Module Module,
__attribute__((format (__printf__, 5, 6)))
#endif
;
#else
static inline void UpnpPrintf(
Upnp_LogLevel DLevel,
Dbg_Module Module,
const char* DbgFileName,
int DbgLineNo,
const char* FmtStr,
...) {}
#endif
/***************************************************************************
@ -222,8 +293,19 @@ void UpnpPrintf (Upnp_LogLevel DLevel, Dbg_Module Module,
* per the requested banner
* Returns: void
***************************************************************************/
void UpnpDisplayBanner (FILE *fd,
const char** lines, size_t size, int starlength);
#ifdef DEBUG
void UpnpDisplayBanner(
FILE *fd,
const char **lines,
size_t size,
int starlength);
#else
static inline void UpnpDisplayBanner(
FILE *fd,
const char **lines,
size_t size,
int starlength) {}
#endif
/***************************************************************************
@ -240,19 +322,23 @@ void UpnpDisplayBanner (FILE *fd,
* debug statement is coming to the log file
* Returns: void
***************************************************************************/
void UpnpDisplayFileAndLine (FILE *fd, const char *DbgFileName, int DbgLineNo);
#ifdef DEBUG
void UpnpDisplayFileAndLine(
FILE *fd,
const char *DbgFileName,
int DbgLineNo);
#else
static inline void UpnpDisplayFileAndLine(
FILE *fd,
const char *DbgFileName,
int DbgLineNo) {}
#endif
//@}
#ifdef __cplusplus
}
#endif
#endif // UPNP_HAVE_DEBUG
#endif // UPNP_DEBUG_H

File diff suppressed because it is too large Load Diff

View File

@ -116,7 +116,7 @@ UpnpInitLog( )
/***************************************************************************
* Function : UpnpSetLogLevel
*
* Parameters: void
* Parameters: Upnp_LogLevel log_level
*
* Description:
* This functions set the log level (see {\tt Upnp_LogLevel}
@ -152,6 +152,42 @@ UpnpCloseLog( )
}
/***************************************************************************
* Function : DebugAtThisLevel
*
* Parameters:
* IN Dbg_Level DLevel: The level of the debug logging. It will decide
* whether debug statement will go to standard output,
* or any of the log files.
* IN Dbg_Module Module: debug will go in the name of this module
*
* Description:
* This functions returns true if debug output should be done in this
* module.
*
* Returns: int
***************************************************************************/
#ifdef DEBUG
int DebugAtThisLevel(
IN Upnp_LogLevel DLevel,
IN Dbg_Module Module)
{
int ret = g_log_level >= DLevel;
ret &=
DEBUG_ALL ||
(Module == SSDP && DEBUG_SSDP ) ||
(Module == SOAP && DEBUG_SOAP ) ||
(Module == GENA && DEBUG_GENA ) ||
(Module == TPOOL && DEBUG_TPOOL) ||
(Module == MSERV && DEBUG_MSERV) ||
(Module == DOM && DEBUG_DOM ) ||
(Module == HTTP && DEBUG_HTTP );
return ret;
}
#endif
/***************************************************************************
* Function : UpnpPrintf
*
@ -173,64 +209,46 @@ UpnpCloseLog( )
* statement is coming
* Returns: void
***************************************************************************/
DBGONLY( void UpnpPrintf( IN Upnp_LogLevel DLevel,
IN Dbg_Module Module,
IN const char *DbgFileName,
IN int DbgLineNo,
IN const char *FmtStr,
... ) {
va_list ArgList;
va_start( ArgList, FmtStr );
if( g_log_level < DLevel ) return; if( DEBUG_ALL == 0 ) {
switch ( Module ) {
case SSDP:
if( DEBUG_SSDP == 1 ) break;
else
return; case SOAP:
if( DEBUG_SOAP == 1 ) break;
else
return; case GENA:
if( DEBUG_GENA == 1 ) break;
else
return; case TPOOL:
if( DEBUG_TPOOL == 1 ) break;
else
return; case MSERV:
if( DEBUG_MSERV == 1 ) break;
else
return; case DOM:
if( DEBUG_DOM == 1 ) break;
else
return; case HTTP:
if( DEBUG_HTTP == 1 ) break;
else
return; case API:
if( DEBUG_API == 1 ) break;
else
return; default:
return;}
}
ithread_mutex_lock( &GlobalDebugMutex ); if( DEBUG_TARGET == 0 ) {
if( DbgFileName ) {
UpnpDisplayFileAndLine( stdout, DbgFileName, DbgLineNo );}
vfprintf( stdout, FmtStr, ArgList ); fflush( stdout );}
else
{
if( DLevel == 0 ) {
if( DbgFileName ) {
UpnpDisplayFileAndLine( ErrFileHnd, DbgFileName, DbgLineNo );}
vfprintf( ErrFileHnd, FmtStr, ArgList ); fflush( ErrFileHnd );}
else
{
if( DbgFileName ) {
UpnpDisplayFileAndLine( InfoFileHnd, DbgFileName, DbgLineNo );}
vfprintf( InfoFileHnd, FmtStr, ArgList ); fflush( InfoFileHnd );}
}
va_end( ArgList ); ithread_mutex_unlock( &GlobalDebugMutex );}
)
#ifdef DEBUG
void UpnpPrintf(
IN Upnp_LogLevel DLevel,
IN Dbg_Module Module,
IN const char *DbgFileName,
IN int DbgLineNo,
IN const char *FmtStr,
... )
{
va_list ArgList;
if (!DebugAtThisLevel(DLevel, Module)) {
return;
}
ithread_mutex_lock(&GlobalDebugMutex);
va_start(ArgList, FmtStr);
if (!DEBUG_TARGET) {
if( DbgFileName ) {
UpnpDisplayFileAndLine(stdout, DbgFileName, DbgLineNo);
}
vfprintf(stdout, FmtStr, ArgList);
fflush(stdout);
} else if (DLevel == 0) {
if (DbgFileName) {
UpnpDisplayFileAndLine(ErrFileHnd, DbgFileName, DbgLineNo);
}
vfprintf(ErrFileHnd, FmtStr, ArgList);
fflush(ErrFileHnd);
} else {
if (DbgFileName) {
UpnpDisplayFileAndLine(InfoFileHnd, DbgFileName, DbgLineNo);
}
vfprintf(InfoFileHnd, FmtStr, ArgList);
fflush(InfoFileHnd);
}
va_end(ArgList);
ithread_mutex_unlock(&GlobalDebugMutex);
}
#endif
/***************************************************************************
@ -249,46 +267,26 @@ return; default:
* NULL : if the module is turn off for debug
* else returns the right file descriptor
***************************************************************************/
DBGONLY( FILE * GetDebugFile( Upnp_LogLevel DLevel, Dbg_Module Module ) {
if( g_log_level < DLevel ) return NULL; if( DEBUG_ALL == 0 ) {
switch ( Module ) {
case SSDP:
if( DEBUG_SSDP == 1 ) break;
else
return NULL; case SOAP:
if( DEBUG_SOAP == 1 ) break;
else
return NULL; case GENA:
if( DEBUG_GENA == 1 ) break;
else
return NULL; case TPOOL:
if( DEBUG_TPOOL == 1 ) break;
else
return NULL; case MSERV:
if( DEBUG_MSERV == 1 ) break;
else
return NULL; case DOM:
if( DEBUG_DOM == 1 ) break;
else
return NULL; case API:
if( DEBUG_API == 1 ) break;
else
return NULL; default:
return NULL;}
}
#ifdef DEBUG
FILE *GetDebugFile( Upnp_LogLevel DLevel, Dbg_Module Module )
{
FILE *ret;
if( DEBUG_TARGET == 0 ) {
return stdout;}
else
{
if( DLevel == 0 ) {
return ErrFileHnd;}
else
{
return InfoFileHnd;}
}
}
)
if (!DebugAtThisLevel(DLevel, Module)) {
ret = NULL;
}
if (!DEBUG_TARGET) {
ret = stdout;
} else if (DLevel == 0) {
ret = ErrFileHnd;
} else {
ret = InfoFileHnd;
}
return ret;
}
#endif
/***************************************************************************
@ -305,17 +303,26 @@ return NULL; default:
* debug statement is coming to the log file
* Returns: void
***************************************************************************/
DBGONLY( void UpnpDisplayFileAndLine( IN FILE * fd,
IN const char *DbgFileName,
IN int DbgLineNo ) {
int starlength = 66;
const char *lines[2];
char FileAndLine[500]; lines[0] = "DEBUG"; if( DbgFileName ) {
sprintf( FileAndLine, "FILE: %s, LINE: %d", DbgFileName,
DbgLineNo ); lines[1] = FileAndLine;}
UpnpDisplayBanner( fd, lines, 2, starlength ); fflush( fd );}
)
#ifdef DEBUG
void UpnpDisplayFileAndLine(
IN FILE * fd,
IN const char *DbgFileName,
IN int DbgLineNo)
{
int starlength = 66;
const char *lines[2];
char FileAndLine[500];
lines[0] = "DEBUG";
if (DbgFileName) {
sprintf(FileAndLine,
"FILE: %s, LINE: %d",
DbgFileName, DbgLineNo);
lines[1] = FileAndLine;
}
UpnpDisplayBanner(fd, lines, 2, starlength);
fflush(fd);
}
#endif
/***************************************************************************
@ -332,47 +339,58 @@ return NULL; default:
* per the requested banner
* Returns: void
***************************************************************************/
DBGONLY( void UpnpDisplayBanner( IN FILE * fd,
IN const char **lines,
IN size_t size,
IN int starLength ) {
char *stars = ( char * )malloc( starLength + 1 );
const char *line = NULL;
int leftMarginLength = starLength / 2 + 1;
int rightMarginLength = starLength / 2 + 1;
char *leftMargin = ( char * )malloc( leftMarginLength );
char *rightMargin = ( char * )malloc( rightMarginLength );
int i = 0;
int LineSize = 0;
char *currentLine = ( char * )malloc( starLength + 1 );
memset( stars, '*', starLength );
stars[starLength] = 0;
memset( leftMargin, 0, leftMarginLength );
memset( rightMargin, 0, rightMarginLength );
fprintf( fd, "\n%s\n", stars ); for( i = 0; i < size; i++ ) {
LineSize = strlen( lines[i] );
line = lines[i]; while( LineSize > ( starLength - 2 ) ) {
memcpy( currentLine, line, ( starLength - 2 ) );
currentLine[( starLength - 2 )] = 0;
fprintf( fd, "*%s*\n", currentLine );
LineSize -= ( starLength - 2 ); line += ( starLength - 2 );}
#ifdef DEBUG
void UpnpDisplayBanner(
IN FILE * fd,
IN const char **lines,
IN size_t size,
IN int starLength)
{
int leftMarginLength = starLength / 2 + 1;
int rightMarginLength = starLength / 2 + 1;
int i = 0;
int LineSize = 0;
int starLengthMinus2 = starLength - 2;
if( LineSize % 2 == 0 ) {
leftMarginLength = rightMarginLength =
( ( starLength - 2 ) - LineSize ) / 2;}
else
{
leftMarginLength = ( ( starLength - 2 ) - LineSize ) / 2;
rightMarginLength =
( ( starLength - 2 ) - LineSize ) / 2 + 1;}
char *leftMargin = ( char * )malloc( leftMarginLength );
char *rightMargin = ( char * )malloc( rightMarginLength );
char *stars = ( char * )malloc( starLength + 1 );
char *currentLine = ( char * )malloc( starLength + 1 );
const char *line = NULL;
memset( leftMargin, ' ', leftMarginLength );
memset( rightMargin, ' ', rightMarginLength );
leftMargin[leftMarginLength] = 0;
rightMargin[rightMarginLength] = 0;
fprintf( fd, "*%s%s%s*\n", leftMargin, line, rightMargin );}
memset( stars, '*', starLength );
stars[starLength] = 0;
memset( leftMargin, 0, leftMarginLength );
memset( rightMargin, 0, rightMarginLength );
fprintf( fd, "\n%s\n", stars );
for( i = 0; i < size; i++ ) {
LineSize = strlen( lines[i] );
line = lines[i];
while( LineSize > starLengthMinus2 ) {
memcpy( currentLine, line, starLengthMinus2 );
currentLine[starLengthMinus2] = 0;
fprintf( fd, "*%s*\n", currentLine );
LineSize -= starLengthMinus2;
line += starLengthMinus2;
}
leftMarginLength = (starLengthMinus2 - LineSize)/2;
if( LineSize % 2 == 0 ) {
rightMarginLength = leftMarginLength;
} else {
rightMarginLength = leftMarginLength + 1;
}
memset( leftMargin, ' ', leftMarginLength );
memset( rightMargin, ' ', rightMarginLength );
leftMargin[leftMarginLength] = 0;
rightMargin[rightMarginLength] = 0;
fprintf( fd, "*%s%s%s*\n", leftMargin, line, rightMargin );
}
fprintf( fd, "%s\n\n", stars );
fprintf( fd, "%s\n\n", stars );
free( leftMargin );
free( rightMargin ); free( stars ); free( currentLine );}
)
free( currentLine );
free( stars );
free( rightMargin );
free( leftMargin );
}
#endif

View File

@ -104,9 +104,8 @@ genaCallback( IN http_parser_t * parser,
// subscribe
gena_process_subscription_request( info, request );}
DBGONLY( UpnpPrintf
( UPNP_ALL, GENA, __FILE__, __LINE__,
"got subscription request\n" ); )
UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__,
"got subscription request\n" );
)
}
else

View File

@ -72,14 +72,14 @@ GenaAutoRenewSubscription( IN void *input )
int eventType = 0;
if( AUTO_RENEW_TIME == 0 ) {
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA SUB EXPIRED" ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA SUB EXPIRED" );
sub_struct->ErrCode = UPNP_E_SUCCESS;
send_callback = 1;
eventType = UPNP_EVENT_SUBSCRIPTION_EXPIRED;
} else {
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA AUTO RENEW" ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA AUTO RENEW" );
if( ( ( sub_struct->ErrCode = genaRenewSubscription( event->handle,
sub_struct->
Sid,
@ -93,17 +93,17 @@ GenaAutoRenewSubscription( IN void *input )
}
}
if( send_callback ) {
HandleLock( );
HandleLock();
if( GetHandleInfo( event->handle, &handle_info ) != HND_CLIENT ) {
HandleUnlock( );
HandleUnlock();
free_upnp_timeout( event );
return;
}
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"HANDLE IS VALID" ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"HANDLE IS VALID" );
callback_fun = handle_info->Callback;
cookie = handle_info->Cookie;
HandleUnlock( );
HandleUnlock();
//make callback
callback_fun( eventType, event->Event, cookie );
@ -397,9 +397,9 @@ genaUnregisterClient( IN UpnpClient_Handle client_handle )
http_parser_t response;
while( TRUE ) {
HandleLock( );
HandleLock();
if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_HANDLE;
}
@ -417,7 +417,7 @@ genaUnregisterClient( IN UpnpClient_Handle client_handle )
RemoveClientSubClientSID( &handle_info->ClientSubList,
sub_copy.sid );
HandleUnlock( );
HandleUnlock();
return_code = gena_unsubscribe( sub_copy.EventURL,
sub_copy.ActualSID, &response );
@ -429,7 +429,7 @@ genaUnregisterClient( IN UpnpClient_Handle client_handle )
}
freeClientSubList( handle_info->ClientSubList );
HandleUnlock( );
HandleUnlock();
return return_code;
}
@ -459,25 +459,25 @@ genaUnSubscribe( IN UpnpClient_Handle client_handle,
client_subscription sub_copy;
http_parser_t response;
HandleLock( );
HandleLock();
// validate handle and sid
if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_HANDLE;
}
if( ( sub =
GetClientSubClientSID( handle_info->ClientSubList, in_sid ) )
== NULL ) {
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_SID;
}
return_code = copy_client_subscription( sub, &sub_copy );
HandleUnlock( );
HandleUnlock();
return_code = gena_unsubscribe( sub_copy.EventURL, sub_copy.ActualSID,
&response );
@ -488,16 +488,16 @@ genaUnSubscribe( IN UpnpClient_Handle client_handle,
free_client_subscription( &sub_copy );
HandleLock( );
HandleLock();
if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_HANDLE;
}
RemoveClientSubClientSID( &handle_info->ClientSubList, in_sid );
HandleUnlock( );
HandleUnlock();
return return_code;
}
@ -538,28 +538,28 @@ genaSubscribe( IN UpnpClient_Handle client_handle,
struct Handle_Info *handle_info;
char *EventURL = NULL;
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA SUBSCRIBE BEGIN" ) );
HandleLock( );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA SUBSCRIBE BEGIN" );
HandleLock();
memset( out_sid, 0, sizeof( Upnp_SID ) );
// validate handle
if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_HANDLE;
}
HandleUnlock( );
HandleUnlock();
// subscribe
SubscribeLock( );
SubscribeLock();
return_code =
gena_subscribe( PublisherURL, TimeOut, NULL, &ActualSID );
HandleLock( );
HandleLock();
if( return_code != UPNP_E_SUCCESS ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__,
"SUBSCRIBE FAILED in transfer error code: %d returned\n",
return_code ) );
UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__,
"SUBSCRIBE FAILED in transfer error code: %d returned\n",
return_code );
goto error_handler;
}
@ -605,8 +605,8 @@ genaSubscribe( IN UpnpClient_Handle client_handle,
free( EventURL );
free( newSubscription );
}
HandleUnlock( );
SubscribeUnlock( );
HandleUnlock();
SubscribeUnlock();
return return_code;
}
@ -643,17 +643,17 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
char *ActualSID;
ThreadPoolJob tempJob;
HandleLock( );
HandleLock();
// validate handle and sid
if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_HANDLE;
}
if( ( sub = GetClientSubClientSID( handle_info->ClientSubList,
in_sid ) ) == NULL ) {
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_SID;
}
// remove old events
@ -663,13 +663,13 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
free_upnp_timeout( ( upnp_timeout * ) tempJob.arg );
}
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"REMOVED AUTO RENEW EVENT" ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"REMOVED AUTO RENEW EVENT" );
sub->RenewEventId = -1;
return_code = copy_client_subscription( sub, &sub_copy );
HandleUnlock( );
HandleUnlock();
if( return_code != HTTP_SUCCESS ) {
return return_code;
@ -677,10 +677,10 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
return_code = gena_subscribe( sub_copy.EventURL, TimeOut,
sub_copy.ActualSID, &ActualSID );
HandleLock( );
HandleLock();
if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {
HandleUnlock( );
HandleUnlock();
if( return_code == UPNP_E_SUCCESS ) {
free( ActualSID );
}
@ -693,7 +693,7 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
// network failure (remove client sub)
RemoveClientSubClientSID( &handle_info->ClientSubList, in_sid );
free_client_subscription( &sub_copy );
HandleUnlock( );
HandleUnlock();
return return_code;
}
// get subscription
@ -701,7 +701,7 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
in_sid ) ) == NULL ) {
free( ActualSID );
free_client_subscription( &sub_copy );
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_SID;
}
// store actual sid
@ -714,7 +714,7 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
RemoveClientSubClientSID( &handle_info->ClientSubList, sub->sid );
}
free_client_subscription( &sub_copy );
HandleUnlock( );
HandleUnlock();
return return_code;
}
@ -795,12 +795,12 @@ gena_process_notification_event( IN SOCKINFO * info,
return;
}
HandleLock( );
HandleLock();
// get client info
if( GetClientHandleInfo( &client_handle, &handle_info ) != HND_CLIENT ) {
error_respond( info, HTTP_PRECONDITION_FAILED, event );
HandleUnlock( );
HandleUnlock();
ixmlDocument_free( ChangedVars );
return;
@ -813,20 +813,20 @@ gena_process_notification_event( IN SOCKINFO * info,
// (if we are in the middle)
// this is to avoid mistakenly rejecting the first event if we
// receive it before the subscription response
HandleUnlock( );
HandleUnlock();
// try and get Subscription Lock
// (in case we are in the process of subscribing)
SubscribeLock( );
SubscribeLock();
// get HandleLock again
HandleLock( );
HandleLock();
if( GetClientHandleInfo( &client_handle, &handle_info )
!= HND_CLIENT ) {
error_respond( info, HTTP_PRECONDITION_FAILED, event );
SubscribeUnlock( );
HandleUnlock( );
SubscribeUnlock();
HandleUnlock();
ixmlDocument_free( ChangedVars );
return;
@ -836,17 +836,17 @@ gena_process_notification_event( IN SOCKINFO * info,
GetClientSubActualSID( handle_info->ClientSubList,
&sid ) ) == NULL ) {
error_respond( info, HTTP_PRECONDITION_FAILED, event );
SubscribeUnlock( );
HandleUnlock( );
SubscribeUnlock();
HandleUnlock();
ixmlDocument_free( ChangedVars );
return;
}
SubscribeUnlock( );
SubscribeUnlock();
} else {
error_respond( info, HTTP_PRECONDITION_FAILED, event );
HandleUnlock( );
HandleUnlock();
ixmlDocument_free( ChangedVars );
return;
@ -864,7 +864,7 @@ gena_process_notification_event( IN SOCKINFO * info,
callback = handle_info->Callback;
cookie = handle_info->Cookie;
HandleUnlock( );
HandleUnlock();
// make callback with event struct
// In future, should find a way of mainting

View File

@ -62,19 +62,19 @@ genaUnregisterDevice( IN UpnpDevice_Handle device_handle )
{
struct Handle_Info *handle_info;
HandleLock( );
HandleLock();
if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__,
"genaUnregisterDevice : BAD Handle : %d\n",
device_handle ) );
UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__,
"genaUnregisterDevice : BAD Handle : %d\n",
device_handle );
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_HANDLE;
}
freeServiceTable( &handle_info->ServiceTable );
HandleUnlock( );
HandleUnlock();
return UPNP_E_SUCCESS;
}
@ -203,12 +203,12 @@ notify_send_and_recv( IN uri_type * destination_url,
SOCKINFO info;
// connect
DBGONLY( UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__,
"gena notify to: %.*s\n",
(int)destination_url->hostport.text.size,
destination_url->hostport.text.buff ); )
UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__,
"gena notify to: %.*s\n",
(int)destination_url->hostport.text.size,
destination_url->hostport.text.buff );
conn_fd = http_Connect( destination_url, &url );
conn_fd = http_Connect( destination_url, &url );
if( conn_fd < 0 ) {
return conn_fd; // return UPNP error
}
@ -365,12 +365,12 @@ genaNotifyThread( IN void *input )
struct Handle_Info *handle_info;
ThreadPoolJob job;
HandleLock( );
HandleLock();
//validate context
if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) {
free_notify_struct( in );
HandleUnlock( );
HandleUnlock();
return;
}
@ -380,7 +380,7 @@ genaNotifyThread( IN void *input )
|| ( ( sub = GetSubscriptionSID( in->sid, service ) ) == NULL )
|| ( ( copy_subscription( sub, &sub_copy ) != HTTP_SUCCESS ) ) ) {
free_notify_struct( in );
HandleUnlock( );
HandleUnlock();
return;
}
//If the event is out of order push it back to the job queue
@ -392,22 +392,22 @@ genaNotifyThread( IN void *input )
ThreadPoolAdd( &gSendThreadPool, &job, NULL );
freeSubscription( &sub_copy );
HandleUnlock( );
HandleUnlock();
return;
}
HandleUnlock( );
HandleUnlock();
//send the notify
return_code = genaNotify( in->headers, in->propertySet, &sub_copy );
freeSubscription( &sub_copy );
HandleLock( );
HandleLock();
if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) {
free_notify_struct( in );
HandleUnlock( );
HandleUnlock();
return;
}
//validate context
@ -416,7 +416,7 @@ genaNotifyThread( IN void *input )
|| ( !service->active )
|| ( ( sub = GetSubscriptionSID( in->sid, service ) ) == NULL ) ) {
free_notify_struct( in );
HandleUnlock( );
HandleUnlock();
return;
}
@ -430,7 +430,7 @@ genaNotifyThread( IN void *input )
}
free_notify_struct( in );
HandleUnlock( );
HandleUnlock();
}
/****************************************************************************
@ -477,8 +477,8 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
notify_thread_struct *thread_struct = NULL;
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA BEGIN INITIAL NOTIFY " ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA BEGIN INITIAL NOTIFY " );
reference_count = ( int * )malloc( sizeof( int ) );
@ -504,13 +504,13 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
strcpy( UDN_copy, UDN );
strcpy( servId_copy, servId );
HandleLock( );
HandleLock();
if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) {
free( UDN_copy );
free( reference_count );
free( servId_copy );
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_HANDLE;
}
@ -519,26 +519,25 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
free( UDN_copy );
free( reference_count );
free( servId_copy );
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_SERVICE;
}
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SERVICE IN INIT NOTFY: UDN %s, ServID: %s ",
UDN, servId ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SERVICE IN INIT NOTFY: UDN %s, ServID: %s ",
UDN, servId );
if( ( ( sub = GetSubscriptionSID( sid, service ) ) == NULL ) ||
( sub->active ) ) {
free( UDN_copy );
free( reference_count );
free( servId_copy );
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_SID;
}
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SUBSCRIPTION IN INIT NOTIFY: SID %s ",
sid ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SUBSCRIPTION IN INIT NOTIFY: SID %s ", sid );
sub->active = 1;
@ -549,13 +548,13 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
free( UDN_copy );
free( reference_count );
free( servId_copy );
HandleUnlock( );
HandleUnlock();
return return_code;
}
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENERATED PROPERY SET IN INIT NOTIFY: \n'%s'\n",
propertySet ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENERATED PROPERY SET IN INIT NOTIFY: \n'%s'\n",
propertySet );
headers_size = strlen( "CONTENT-TYPE text/xml\r\n" ) +
strlen( "CONTENT-LENGTH: \r\n" ) + MAX_CONTENT_LENGTH +
@ -569,7 +568,7 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
free( UDN_copy );
free( servId_copy );
free( reference_count );
HandleUnlock( );
HandleUnlock();
return UPNP_E_OUTOF_MEMORY;
}
@ -621,7 +620,7 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
free( headers );
}
HandleUnlock( );
HandleUnlock();
return return_code;
}
@ -668,8 +667,8 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
notify_thread_struct *thread_struct = NULL;
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA BEGIN INITIAL NOTIFY EXT" ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA BEGIN INITIAL NOTIFY EXT" );
reference_count = ( int * )malloc( sizeof( int ) );
if( reference_count == NULL ) {
@ -694,13 +693,13 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
strcpy( UDN_copy, UDN );
strcpy( servId_copy, servId );
HandleLock( );
HandleLock();
if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) {
free( UDN_copy );
free( reference_count );
free( servId_copy );
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_HANDLE;
}
@ -709,24 +708,23 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
free( UDN_copy );
free( reference_count );
free( servId_copy );
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_SERVICE;
}
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SERVICE IN INIT NOTFY EXT: UDN %s, ServID: %s\n",
UDN, servId ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SERVICE IN INIT NOTFY EXT: UDN %s, ServID: %s\n",
UDN, servId );
if( ( ( sub = GetSubscriptionSID( sid, service ) ) == NULL ) ||
( sub->active ) ) {
free( UDN_copy );
free( reference_count );
free( servId_copy );
HandleUnlock( );
HandleUnlock();
return GENA_E_BAD_SID;
}
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SUBSCRIPTION IN INIT NOTIFY EXT: SID %s",
sid ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SUBSCRIPTION IN INIT NOTIFY EXT: SID %s", sid );
sub->active = 1;
@ -735,13 +733,13 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
free( UDN_copy );
free( reference_count );
free( servId_copy );
HandleUnlock( );
HandleUnlock();
return UPNP_E_INVALID_PARAM;
}
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENERATED PROPERY SET IN INIT EXT NOTIFY: %s",
propertySet ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENERATED PROPERY SET IN INIT EXT NOTIFY: %s",
propertySet );
headers_size = strlen( "CONTENT-TYPE text/xml\r\n" ) +
strlen( "CONTENT-LENGTH: \r\n" ) + MAX_CONTENT_LENGTH +
@ -754,7 +752,7 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
free( servId_copy );
free( reference_count );
ixmlFreeDOMString( propertySet );
HandleUnlock( );
HandleUnlock();
return UPNP_E_OUTOF_MEMORY;
}
@ -804,7 +802,7 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
free( thread_struct );
free( headers );
}
HandleUnlock( );
HandleUnlock();
return return_code;
}
@ -899,7 +897,7 @@ genaNotifyAllExt( IN UpnpDevice_Handle device_handle,
"%ld\r\nNT: upnp:event\r\nNTS: upnp:propchange\r\n",
(long) strlen( propertySet ) + 1 );
HandleLock( );
HandleLock();
if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE )
return_code = GENA_E_BAD_HANDLE;
@ -959,7 +957,7 @@ genaNotifyAllExt( IN UpnpDevice_Handle device_handle,
free( servId_copy );
}
HandleUnlock( );
HandleUnlock();
return return_code;
}
@ -1061,7 +1059,7 @@ genaNotifyAll( IN UpnpDevice_Handle device_handle,
" upnp:event\r\nNTS: upnp:propchange\r\n",
(long) strlen( propertySet ) + 1 );
HandleLock( );
HandleLock();
if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) {
return_code = GENA_E_BAD_HANDLE;
@ -1123,7 +1121,7 @@ genaNotifyAll( IN UpnpDevice_Handle device_handle,
free( UDN_copy );
free( servId_copy );
}
HandleUnlock( );
HandleUnlock();
return return_code;
}
@ -1317,8 +1315,8 @@ gena_process_subscription_request( IN SOCKINFO * info,
memptr callback_hdr;
memptr timeout_hdr;
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"Subscription Request Received:\n" ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"Subscription Request Received:\n" );
if( httpmsg_find_hdr( request, HDR_NT, &nt_hdr ) == NULL ) {
error_respond( info, HTTP_BAD_REQUEST, request );
@ -1347,18 +1345,17 @@ gena_process_subscription_request( IN SOCKINFO * info,
return;
}
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"SubscriptionRequest for event URL path: %s\n",
event_url_path );
)
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"SubscriptionRequest for event URL path: %s\n",
event_url_path );
HandleLock( );
HandleLock();
// CURRENTLY, ONLY ONE DEVICE
if( GetDeviceHandleInfo( &device_handle, &handle_info ) != HND_DEVICE ) {
free( event_url_path );
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
HandleUnlock( );
HandleUnlock();
return;
}
service = FindServiceEventURLPath( &handle_info->ServiceTable,
@ -1367,28 +1364,28 @@ gena_process_subscription_request( IN SOCKINFO * info,
if( service == NULL || !service->active ) {
error_respond( info, HTTP_NOT_FOUND, request );
HandleUnlock( );
HandleUnlock();
return;
}
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"Subscription Request: Number of Subscriptions already %d\n "
"Max Subscriptions allowed: %d\n",
service->TotalSubscriptions,
handle_info->MaxSubscriptions ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"Subscription Request: Number of Subscriptions already %d\n "
"Max Subscriptions allowed: %d\n",
service->TotalSubscriptions,
handle_info->MaxSubscriptions );
// too many subscriptions
if( handle_info->MaxSubscriptions != -1 &&
service->TotalSubscriptions >= handle_info->MaxSubscriptions ) {
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
HandleUnlock( );
HandleUnlock();
return;
}
// generate new subscription
sub = ( subscription * ) malloc( sizeof( subscription ) );
if( sub == NULL ) {
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
HandleUnlock( );
HandleUnlock();
return;
}
sub->eventKey = 0;
@ -1405,13 +1402,13 @@ gena_process_subscription_request( IN SOCKINFO * info,
&sub->DeliveryURLs ) ) == 0 ) {
error_respond( info, HTTP_PRECONDITION_FAILED, request );
freeSubscriptionList( sub );
HandleUnlock( );
HandleUnlock();
return;
}
if( return_code == UPNP_E_OUTOF_MEMORY ) {
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
freeSubscriptionList( sub );
HandleUnlock( );
HandleUnlock();
return;
}
// set the timeout
@ -1447,7 +1444,7 @@ gena_process_subscription_request( IN SOCKINFO * info,
// respond OK
if( respond_ok( info, time_out, sub, request ) != UPNP_E_SUCCESS ) {
freeSubscriptionList( sub );
HandleUnlock( );
HandleUnlock();
return;
}
//add to subscription list
@ -1464,7 +1461,7 @@ gena_process_subscription_request( IN SOCKINFO * info,
callback_fun = handle_info->Callback;
cookie = handle_info->Cookie;
HandleUnlock( );
HandleUnlock();
//make call back with request struct
//in the future should find a way of mainting
@ -1527,7 +1524,7 @@ gena_process_subscription_renewal_request( IN SOCKINFO * info,
return;
}
HandleLock( );
HandleLock();
// CURRENTLY, ONLY SUPPORT ONE DEVICE
if( GetDeviceHandleInfo( &device_handle, &handle_info ) != HND_DEVICE ) {
@ -1544,22 +1541,21 @@ gena_process_subscription_renewal_request( IN SOCKINFO * info,
!service->active ||
( ( sub = GetSubscriptionSID( sid, service ) ) == NULL ) ) {
error_respond( info, HTTP_PRECONDITION_FAILED, request );
HandleUnlock( );
HandleUnlock();
return;
}
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"Renew request: Number of subscriptions already: %d\n "
"Max Subscriptions allowed:%d\n",
service->TotalSubscriptions,
handle_info->MaxSubscriptions );
)
// too many subscriptions
if( handle_info->MaxSubscriptions != -1 &&
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"Renew request: Number of subscriptions already: %d\n "
"Max Subscriptions allowed:%d\n",
service->TotalSubscriptions,
handle_info->MaxSubscriptions );
// too many subscriptions
if( handle_info->MaxSubscriptions != -1 &&
service->TotalSubscriptions > handle_info->MaxSubscriptions ) {
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
RemoveSubscriptionSID( sub->sid, service );
HandleUnlock( );
HandleUnlock();
return;
}
// set the timeout
@ -1598,7 +1594,7 @@ gena_process_subscription_renewal_request( IN SOCKINFO * info,
RemoveSubscriptionSID( sub->sid, service );
}
HandleUnlock( );
HandleUnlock();
}
/****************************************************************************
@ -1651,13 +1647,13 @@ gena_process_unsubscribe_request( IN SOCKINFO * info,
return;
}
HandleLock( );
HandleLock();
// CURRENTLY, ONLY SUPPORT ONE DEVICE
if( GetDeviceHandleInfo( &device_handle, &handle_info ) != HND_DEVICE ) {
error_respond( info, HTTP_PRECONDITION_FAILED, request );
membuffer_destroy( &event_url_path );
HandleUnlock( );
HandleUnlock();
return;
}
service = FindServiceEventURLPath( &handle_info->ServiceTable,
@ -1670,14 +1666,14 @@ gena_process_unsubscribe_request( IN SOCKINFO * info,
//CheckSubscriptionSID(sid, service) == NULL )
{
error_respond( info, HTTP_PRECONDITION_FAILED, request );
HandleUnlock( );
HandleUnlock();
return;
}
RemoveSubscriptionSID( sid, service );
error_respond( info, HTTP_OK, request ); // success
HandleUnlock( );
HandleUnlock();
}
#endif // INCLUDE_DEVICE_APIS

View File

@ -174,11 +174,9 @@ dispatch_request( IN SOCKINFO * info,
case HTTPMETHOD_NOTIFY:
case HTTPMETHOD_SUBSCRIBE:
case HTTPMETHOD_UNSUBSCRIBE:
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver %d: got GENA msg\n", info->socket );
)
callback = gGenaCallback;
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver %d: got GENA msg\n", info->socket );
callback = gGenaCallback;
break;
//HTTP server call
@ -275,12 +273,10 @@ handle_request( void *args )
struct mserv_request_t *request = ( struct mserv_request_t * )args;
int connfd = request->connfd;
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver %d: READING\n", connfd );
)
//parser_request_init( &parser ); ////LEAK_FIX_MK
hmsg = &parser.msg;
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver %d: READING\n", connfd );
//parser_request_init( &parser ); ////LEAK_FIX_MK
hmsg = &parser.msg;
if( sock_init_with_ip( &info, connfd, request->foreign_ip_addr,
request->foreign_ip_port ) != UPNP_E_SUCCESS ) {
@ -295,12 +291,10 @@ handle_request( void *args )
goto error_handler;
}
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver %d: PROCESSING...\n", connfd );
)
// dispatch
http_error_code = dispatch_request( &info, &parser );
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver %d: PROCESSING...\n", connfd );
// dispatch
http_error_code = dispatch_request( &info, &parser );
if( http_error_code != 0 ) {
goto error_handler;
}
@ -316,11 +310,9 @@ handle_request( void *args )
handle_error( &info, http_error_code, major, minor );
}
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver %d: COMPLETE\n", connfd );
)
sock_destroy( &info, SD_BOTH ); //should shutdown completely
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver %d: COMPLETE\n", connfd );
sock_destroy( &info, SD_BOTH ); //should shutdown completely
httpmsg_destroy( hmsg );
free( request );
@ -352,11 +344,9 @@ schedule_request_job( IN int connfd,
( struct mserv_request_t * )
malloc( sizeof( struct mserv_request_t ) );
if( request == NULL ) {
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv %d: out of memory\n", connfd );
)
shutdown( request->connfd, SD_BOTH );
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv %d: out of memory\n", connfd );
shutdown( request->connfd, SD_BOTH );
UpnpCloseSocket( connfd );
return;
}
@ -370,10 +360,8 @@ schedule_request_job( IN int connfd,
TPJobSetPriority( &job, MED_PRIORITY );
if( ThreadPoolAdd( &gRecvThreadPool, &job, NULL ) != 0 ) {
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv %d: cannot schedule request\n", connfd );
)
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv %d: cannot schedule request\n", connfd );
free( request );
shutdown( connfd, SD_BOTH );
UpnpCloseSocket( connfd );
@ -446,11 +434,9 @@ RunMiniServer( MiniServerSockArray * miniSock )
if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) ==
UPNP_SOCKETERROR ) {
DBGONLY( UpnpPrintf
( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in select call !!!\n" );
)
continue;
UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in select call !!!\n" );
continue;
} else {
if( FD_ISSET( miniServSock, &rdSet ) ) {
@ -459,12 +445,10 @@ RunMiniServer( MiniServerSockArray * miniSock )
( struct sockaddr * )&clientAddr,
&clientLen );
if( connectHnd == UPNP_INVALID_SOCKET ) {
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver: Error"
" in accepting connection\n" );
)
continue;
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver: Error"
" in accepting connection\n" );
continue;
}
schedule_request_job( connectHnd, &clientAddr );
}
@ -489,24 +473,19 @@ RunMiniServer( MiniServerSockArray * miniSock )
&clientLen );
if( byteReceived > 0 ) {
requestBuf[byteReceived] = '\0';
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"Received response !!! %s From host %s \n",
requestBuf,
inet_ntoa( clientAddr.sin_addr ) );
)
DBGONLY( UpnpPrintf
( UPNP_PACKET, MSERV, __FILE__, __LINE__,
"Received multicast packet: \n %s\n",
requestBuf );
)
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"Received response !!! %s From host %s \n",
requestBuf, inet_ntoa( clientAddr.sin_addr ) );
UpnpPrintf( UPNP_PACKET, MSERV, __FILE__, __LINE__,
"Received multicast packet: \n %s\n",
requestBuf );
if( NULL != strstr( requestBuf, "ShutDown" ) )
if( NULL != strstr( requestBuf, "ShutDown" ) ) {
break;
}
}
}
}
}
shutdown( miniServSock, SD_BOTH );
@ -555,12 +534,10 @@ get_port( int sockfd )
}
port = ntohs( sockinfo.sin_port );
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"sockfd = %d, .... port = %d\n", sockfd, port );
)
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"sockfd = %d, .... port = %d\n", sockfd, port );
return port;
return port;
}
/************************************************************************
@ -623,16 +600,10 @@ get_miniserver_sockets( MiniServerSockArray * out,
//THIS MAY CAUSE TCP TO BECOME LESS RELIABLE
//HOWEVER IT HAS BEEN SUGESTED FOR TCP SERVERS
DBGONLY( UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv start: resuseaddr set\n" );
)
sockError = setsockopt( listenfd,
SOL_SOCKET,
SO_REUSEADDR,
( const char * )&reuseaddr_on,
sizeof( int )
);
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv start: resuseaddr set\n" );
sockError = setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR,
( const char * )&reuseaddr_on, sizeof( int ));
if( sockError == UPNP_SOCKETERROR ) {
shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd );
@ -652,9 +623,9 @@ get_miniserver_sockets( MiniServerSockArray * out,
);
if( sockError == UPNP_SOCKETERROR ) {
#ifdef WIN32
errCode = WSAGetLastError();
errCode = WSAGetLastError();
#else
errCode = errno;
errCode = errno;
#endif
if( errno == EADDRINUSE )
errCode = 1;
@ -665,18 +636,16 @@ get_miniserver_sockets( MiniServerSockArray * out,
}
if( sockError == UPNP_SOCKETERROR ) {
DBGONLY( perror( "mserv start: bind failed" );
)
shutdown( listenfd, SD_BOTH );
perror( "mserv start: bind failed" );
shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd );
return UPNP_E_SOCKET_BIND; // bind failed
}
DBGONLY( UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv start: bind success\n" );
)
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv start: bind success\n" );
success = listen( listenfd, SOMAXCONN );
success = listen( listenfd, SOMAXCONN );
if( success == UPNP_SOCKETERROR ) {
shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd );
@ -694,11 +663,10 @@ get_miniserver_sockets( MiniServerSockArray * out,
if( ( miniServerStopSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) ==
UPNP_INVALID_SOCKET ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL,
MSERV, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
)
shutdown( listenfd, SD_BOTH );
UpnpPrintf( UPNP_CRITICAL,
MSERV, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd );
return UPNP_E_OUTOF_SOCKET;
}
@ -711,11 +679,10 @@ get_miniserver_sockets( MiniServerSockArray * out,
if( bind( miniServerStopSock, ( struct sockaddr * )&serverAddr,
sizeof( serverAddr ) ) == UPNP_SOCKETERROR ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL,
MSERV, __FILE__, __LINE__,
"Error in binding localhost!!!\n" );
)
shutdown( listenfd, SD_BOTH );
UpnpPrintf( UPNP_CRITICAL,
MSERV, __FILE__, __LINE__,
"Error in binding localhost!!!\n" );
shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd );
shutdown( miniServerStopSock, SD_BOTH );
UpnpCloseSocket( miniServerStopSock );
@ -877,11 +844,9 @@ StopMiniServer( void )
sock = socket( AF_INET, SOCK_DGRAM, 0 );
if( sock == UPNP_INVALID_SOCKET ) {
DBGONLY( UpnpPrintf
( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_SERVER:StopSSDPServer: Error in socket operation !!!\n" );
)
return 0;
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_SERVER:StopSSDPServer: Error in socket operation !!!\n" );
return 0;
}
while( gMServState != MSERV_IDLE ) {

File diff suppressed because it is too large Load Diff

View File

@ -40,25 +40,25 @@
#include <assert.h>
#include <stdarg.h>
#ifndef UPNP_USE_BCBPP
#ifndef UPNP_USE_MSVCPP
#include <inttypes.h>
#include <stdint.h>
#endif
#ifndef UPNP_USE_MSVCPP
#include <inttypes.h>
#include <stdint.h>
#endif
#endif
#ifndef WIN32
#include <arpa/inet.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/utsname.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/utsname.h>
#else
#include <winsock2.h>
#include <malloc.h>
#include <winsock2.h>
#include <malloc.h>
#endif
#include "unixutil.h"
#include "upnp.h"
@ -74,17 +74,17 @@
#define DOSOCKET_WRITE 0
/************************************************************************
* Function: http_FixUrl
*
* Parameters:
* IN uri_type* url ; URL to be validated and fixed
* Function: http_FixUrl
*
* Parameters:
* IN uri_type* url ; URL to be validated and fixed
* OUT uri_type* fixed_url ; URL after being fixed.
*
* Description: Validates URL
*
* Returns:
* UPNP_E_INVALID_URL
* UPNP_E_SUCCESS
*
* Description: Validates URL
*
* Returns:
* UPNP_E_INVALID_URL
* UPNP_E_SUCCESS
************************************************************************/
int
http_FixUrl( IN uri_type * url,
@ -111,18 +111,18 @@ http_FixUrl( IN uri_type * url,
}
/************************************************************************
* Function: http_FixStrUrl
*
* Parameters:
* IN char* urlstr ; Character string as a URL
* IN int urlstrlen ; Length of the character string
* Function: http_FixStrUrl
*
* Parameters:
* IN char* urlstr ; Character string as a 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
*
* Returns:
* UPNP_E_INVALID_URL
* UPNP_E_SUCCESS
*
* Description: Parses URL and then validates URL
*
* Returns:
* UPNP_E_INVALID_URL
* UPNP_E_SUCCESS
************************************************************************/
int
http_FixStrUrl( IN char *urlstr,
@ -139,18 +139,18 @@ http_FixStrUrl( IN char *urlstr,
}
/************************************************************************
* Function: http_Connect
*
* Parameters:
* IN uri_type* destination_url ; URL containing destination information
* OUT uri_type *url ; Fixed and corrected URL
*
* Function: http_Connect
*
* Parameters:
* 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
*
* Returns:
* socket descriptor on sucess
* UPNP_E_OUTOF_SOCKET
*
* Returns:
* socket descriptor on sucess
* UPNP_E_OUTOF_SOCKET
* UPNP_E_SOCKET_CONNECT on error
************************************************************************/
int
@ -169,10 +169,8 @@ http_Connect( IN uri_type * destination_url,
if( connect( connfd, ( struct sockaddr * )&url->hostport.IPv4address,
sizeof( struct sockaddr_in ) ) == -1 ) {
#ifdef WIN32
DBGONLY(
UpnpPrintf(UPNP_CRITICAL, HTTP, __FILE__, __LINE__,
"connect error: %d\n", WSAGetLastError());
)
UpnpPrintf(UPNP_CRITICAL, HTTP, __FILE__, __LINE__,
"connect error: %d\n", WSAGetLastError());
#endif
shutdown( connfd, SD_BOTH );
UpnpCloseSocket( connfd );
@ -183,23 +181,23 @@ http_Connect( IN uri_type * destination_url,
}
/************************************************************************
* Function: http_RecvMessage
*
* Parameters:
* IN SOCKINFO *info ; Socket information 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
*
* Function: http_RecvMessage
*
* Parameters:
* IN SOCKINFO *info ; Socket information 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
* parameter
*
* Returns:
* UPNP_E_BAD_HTTPMSG
* UPNP_E_SUCCESS
*
* Returns:
* UPNP_E_BAD_HTTPMSG
* UPNP_E_SUCCESS
************************************************************************/
int
http_RecvMessage( IN SOCKINFO * info,
@ -226,12 +224,10 @@ http_RecvMessage( IN SOCKINFO * info,
status = parser_append( parser, buf, num_read );
if( status == PARSE_SUCCESS ) {
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"<<< (RECVD) <<<\n%s\n-----------------\n",
parser->msg.msg.buf );
//print_http_headers( &parser->msg );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"<<< (RECVD) <<<\n%s\n-----------------\n",
parser->msg.msg.buf );
print_http_headers( &parser->msg );
if( parser->content_length >
( unsigned int )g_maxContentLength ) {
@ -252,12 +248,10 @@ http_RecvMessage( IN SOCKINFO * info,
}
} else if( num_read == 0 ) {
if( ok_on_close ) {
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"<<< (RECVD) <<<\n%s\n-----------------\n",
parser->msg.msg.buf );
//print_http_headers( &parser->msg );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"<<< (RECVD) <<<\n%s\n-----------------\n",
parser->msg.msg.buf );
print_http_headers( &parser->msg );
return 0;
} else {
@ -273,29 +267,29 @@ http_RecvMessage( IN SOCKINFO * info,
}
/************************************************************************
* Function: http_SendMessage
*
* Parameters:
* Function: http_SendMessage
*
* Parameters:
* IN SOCKINFO *info ; Socket information object
* 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
* IN const char* fmt parameter
* fmt types:
* 'f': arg = const char * file name
* 'm': arg1 = const char * mem_buffer; arg2= size_t buf_length
* E.g.:
* char *buf = "POST /xyz.cgi http/1.1\r\n\r\n";
* char *filename = "foo.dat";
* int status = http_SendMessage( tcpsock, "mf",
* buf, strlen(buf), // args for memory buffer
* filename ); // arg for file
*
* Returns:
* UPNP_E_OUTOF_MEMORY
* UPNP_E_FILE_READ_ERROR
* UPNP_E_SUCCESS
* 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
* IN const char* fmt parameter
* fmt types:
* 'f': arg = const char * file name
* 'm': arg1 = const char * mem_buffer; arg2= size_t buf_length
* E.g.:
* char *buf = "POST /xyz.cgi http/1.1\r\n\r\n";
* char *filename = "foo.dat";
* int status = http_SendMessage( tcpsock, "mf",
* buf, strlen(buf), // args for memory buffer
* filename ); // arg for file
*
* Returns:
* UPNP_E_OUTOF_MEMORY
* UPNP_E_FILE_READ_ERROR
* UPNP_E_SUCCESS
************************************************************************/
int
http_SendMessage( IN SOCKINFO * info,
@ -455,11 +449,9 @@ http_SendMessage( IN SOCKINFO * info,
num_written = sock_write( info, file_buf, num_read,
TimeOut );
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
">>> (SENT) >>>\n%.*s\n------------\n",
( int )num_written, file_buf );
)
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 ) {
@ -485,10 +477,9 @@ http_SendMessage( IN SOCKINFO * info,
num_written = sock_write( info, buf, buf_length, TimeOut );
if( ( size_t ) num_written != buf_length )
goto end;
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
">>> (SENT) >>>\n%.*s\n------------\n",
( int )buf_length, buf );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
">>> (SENT) >>>\n%.*s\n------------\n",
( int )buf_length, buf );
}
}
}
@ -500,24 +491,24 @@ http_SendMessage( IN SOCKINFO * info,
}
/************************************************************************
* Function: http_RequestAndResponse
*
* Parameters:
* IN uri_type* destination ; Destination URI object which contains
* remote IP address among other elements
* IN const char* request ; Request to be sent
* IN size_t request_length ; Length of the request
* Function: http_RequestAndResponse
*
* Parameters:
* IN uri_type* destination ; Destination URI object which contains
* remote IP address among other elements
* IN const char* request ; Request to be sent
* IN size_t request_length ; Length of the request
* IN http_method_t req_method ; HTTP Request method
* 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
* request and waits for the response from the remote end
*
* Returns:
* UPNP_E_SOCKET_ERROR
* UPNP_E_SOCKET_CONNECT
* Error Codes returned by http_SendMessage
* 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
* request and waits for the response from the remote end
*
* Returns:
* UPNP_E_SOCKET_ERROR
* UPNP_E_SOCKET_CONNECT
* Error Codes returned by http_SendMessage
* Error Codes returned by http_RecvMessage
************************************************************************/
int
@ -572,25 +563,24 @@ http_RequestAndResponse( IN uri_type * destination,
}
/************************************************************************
* Function : http_Download
* 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
* from the donloaded message.
* OUT int* doc_length : length of the extracted document
* OUT char* content_type : Type of content
* 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
* from the donloaded message.
* 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;
*
* Return : int;
* UPNP_E_SUCCESS;
* UPNP_E_INVALID_URL;
*
* Note :
* Note :
************************************************************************/
int
http_Download( IN const char *url_str,
@ -601,10 +591,10 @@ http_Download( IN const char *url_str,
{
int ret_code;
uri_type url;
char *msg_start,
*entity_start,
*hoststr,
*temp;
char *msg_start;
char *entity_start;
char *hoststr;
char *temp;
http_parser_t response;
size_t msg_length;
size_t hostlen;
@ -614,11 +604,9 @@ http_Download( IN const char *url_str,
char *urlPath = alloca( strlen( url_str ) + 1 );
//ret_code = parse_uri( (char*)url_str, strlen(url_str), &url );
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__, "DOWNLOAD URL : %s\n",
url_str );
)
ret_code =
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "DOWNLOAD URL : %s\n",
url_str );
ret_code =
http_FixStrUrl( ( char * )url_str, strlen( url_str ), &url );
if( ret_code != UPNP_E_SUCCESS ) {
return ret_code;
@ -641,32 +629,26 @@ http_Download( IN const char *url_str,
*temp = '\0';
hostlen = strlen( hoststr );
*temp = '/';
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen );
ret_code = http_MakeMessage(
&request, 1, 1,
"Q" "s" "bcDCUc",
HTTPMETHOD_GET, url.pathquery.buff, url.pathquery.size,
"HOST: ",
hoststr, hostlen );
ret_code = http_MakeMessage(
&request, 1, 1,
"Q" "s" "bcDCUc",
HTTPMETHOD_GET, url.pathquery.buff, url.pathquery.size,
"HOST: ",
hoststr, hostlen );
if( ret_code != 0 ) {
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Makemessage failed\n" );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Makemessage failed\n" );
membuffer_destroy( &request );
return ret_code;
}
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Buffer:\n %s\n----------END--------\n", request.buf );
)
// get doc msg
ret_code =
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Buffer:\n %s\n----------END--------\n", request.buf );
// get doc msg
ret_code =
http_RequestAndResponse( &url, request.buf, request.length,
HTTPMETHOD_GET, timeout_secs, &response );
@ -676,11 +658,8 @@ http_Download( IN const char *url_str,
return ret_code;
}
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__, "Response\n" );
)
DBGONLY( print_http_headers( &response.msg );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "Response\n" );
print_http_headers( &response.msg );
// optional content-type
if( content_type ) {
@ -771,13 +750,10 @@ MakePostMessage( const char *url_str,
char *hoststr,
*temp;
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"DOWNLOAD URL : %s\n", url_str );
)
ret_code =
ret_code =
http_FixStrUrl( ( char * )url_str, strlen( url_str ), url );
if( ret_code != UPNP_E_SUCCESS ) {
return ret_code;
}
@ -799,9 +775,8 @@ MakePostMessage( const char *url_str,
*temp = '\0';
hostlen = strlen( hoststr );
*temp = '/';
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen );
if( contentLength >= 0 ) {
ret_code = http_MakeMessage(
@ -833,19 +808,18 @@ MakePostMessage( const char *url_str,
}
if( ret_code != 0 ) {
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Makemessage failed\n" );
)
membuffer_destroy( request );
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Makemessage failed\n" );
membuffer_destroy( request );
return ret_code;
}
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Buffer:\n %s\n" "----------END--------\n",
request->buf );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Buffer:\n %s\n" "----------END--------\n",
request->buf );
return UPNP_E_SUCCESS;
return UPNP_E_SUCCESS;
}
/************************************************************************
@ -1108,11 +1082,10 @@ MakeGetMessage( const char *url_str,
char *hoststr,
*temp;
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"DOWNLOAD URL : %s\n", url_str );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"DOWNLOAD URL : %s\n", url_str );
ret_code =
ret_code =
http_FixStrUrl( ( char * )url_str, strlen( url_str ), url );
if( ret_code != UPNP_E_SUCCESS ) {
@ -1136,9 +1109,8 @@ MakeGetMessage( const char *url_str,
*temp = '\0';
hostlen = strlen( hoststr );
*temp = '/';
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen );
if( proxy_str ) {
querystr = url_str;
@ -1156,19 +1128,18 @@ MakeGetMessage( const char *url_str,
hoststr, hostlen );
if( ret_code != 0 ) {
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Makemessage failed\n" );
)
membuffer_destroy( request );
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Makemessage failed\n" );
membuffer_destroy( request );
return ret_code;
}
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Buffer:\n %s\n" "----------END--------\n",
request->buf );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Buffer:\n %s\n" "----------END--------\n",
request->buf );
return UPNP_E_SUCCESS;
return UPNP_E_SUCCESS;
}
/************************************************************************
@ -1297,25 +1268,25 @@ ReadResponseLineAndHeaders( IN SOCKINFO * info,
}
/************************************************************************
* Function : http_ReadHttpGet
* 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
* 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
*
* 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 ;
* 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 :
* Note :
************************************************************************/
int
http_ReadHttpGet( IN void *Handle,
@ -1386,11 +1357,9 @@ http_ReadHttpGet( IN void *Handle,
}
} else if( num_read == 0 ) {
if( ok_on_close ) {
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"<<< (RECVD) <<<\n%s\n-----------------\n",
handle->response.msg.msg.buf );
//print_http_headers( &parser->msg );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"<<< (RECVD) <<<\n%s\n-----------------\n",
handle->response.msg.msg.buf );
handle->response.position = POS_COMPLETE;
} else {
// partial msg
@ -1850,31 +1819,26 @@ http_MakeMessage( INOUT membuffer * buf,
va_start( argp, fmt );
while( ( c = *fmt++ ) != 0 ) {
if( c == 's' ) // C string
{
if( c == 's' ) {
// C string
s = ( char * )va_arg( argp, char * );
assert( s );
//DBGONLY(UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__,"Adding a string : %s\n", s);)
UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__,"Adding a string : %s\n", s);
if( membuffer_append( buf, s, strlen( s ) ) != 0 ) {
goto error_handler;
}
} else if( c == 'K' ) // Add Chunky header
{
} else if( c == 'K' ) {
// Add Chunky header
if( membuffer_append
( buf, "TRANSFER-ENCODING: chunked\r\n",
strlen( "Transfer-Encoding: chunked\r\n" ) ) != 0 ) {
goto error_handler;
}
} else if( c == 'G' ) // Add Range header
{
} else if( c == 'G' ) {
// Add Range header
struct SendInstruction *RespInstr;
RespInstr =
( struct SendInstruction * )va_arg( argp,
struct SendInstruction
* );
RespInstr = (struct SendInstruction *)
va_arg( argp, struct SendInstruction *);
assert( RespInstr );
// connection header
if( membuffer_append
@ -1882,38 +1846,34 @@ http_MakeMessage( INOUT membuffer * buf,
strlen( RespInstr->RangeHeader ) ) != 0 ) {
goto error_handler;
}
} else if( c == 'b' ) // mem buffer
{
} else if( c == 'b' ) {
// mem buffer
s = ( char * )va_arg( argp, char * );
//DBGONLY(UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__,"Adding a char Buffer starting with: %c\n", s[0]);)
UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__,
"Adding a char Buffer starting with: %c\n", s[0]);
assert( s );
length = ( size_t ) va_arg( argp, size_t );
if( membuffer_append( buf, s, length ) != 0 ) {
goto error_handler;
}
}
else if( c == 'c' ) // crlf
{
else if( c == 'c' ) {
// crlf
if( membuffer_append( buf, "\r\n", 2 ) != 0 ) {
goto error_handler;
}
}
else if( c == 'd' ) // integer
{
else if( c == 'd' ) {
// integer
num = ( int )va_arg( argp, int );
sprintf( tempbuf, "%"PRIzu, num );
if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) {
goto error_handler;
}
}
else if( c == 'h' ) // off_t
{
else if( c == 'h' ) {
// off_t
bignum = ( off_t )va_arg( argp, off_t );
sprintf( tempbuf, "%"PRId64, (int64_t)bignum );
@ -1921,9 +1881,8 @@ http_MakeMessage( INOUT membuffer * buf,
goto error_handler;
}
}
else if( c == 't' || c == 'D' ) // date
{
else if( c == 't' || c == 'D' ) {
// date
if( c == 'D' ) {
// header
start_str = "DATE: ";
@ -1947,9 +1906,7 @@ http_MakeMessage( INOUT membuffer * buf,
if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) {
goto error_handler;
}
}
else if( c == 'C' ) {
} else if( c == 'C' ) {
if( ( http_major_version > 1 ) ||
( http_major_version == 1 && http_minor_version == 1 )
) {
@ -1959,9 +1916,7 @@ http_MakeMessage( INOUT membuffer * buf,
goto error_handler;
}
}
}
else if( c == 'N' ) {
} else if( c == 'N' ) {
// content-length header
bignum = ( off_t )va_arg( argp, off_t );
@ -1972,11 +1927,8 @@ http_MakeMessage( INOUT membuffer * buf,
"CONTENT-LENGTH: ", bignum ) != 0 ) {
goto error_handler;
}
}
else if( c == 'S' || c == 'U' ) {
} else if( c == 'S' || c == 'U' ) {
// SERVER or USER-AGENT header
temp_str = ( c == 'S' ) ? "SERVER: " : "USER-AGENT: ";
get_sdk_info( tempbuf );
if (http_MakeMessage(
@ -1985,34 +1937,25 @@ http_MakeMessage( INOUT membuffer * buf,
temp_str, tempbuf ) != 0 ) {
goto error_handler;
}
}
else if( c == 'X' ) // C string
{
} else if( c == 'X' ) {
// C string
s = ( char * )va_arg( argp, char * );
assert( s );
if( membuffer_append_str( buf, "X-User-Agent: ") != 0 ) {
goto error_handler;
}
if( membuffer_append( buf, s, strlen( s ) ) != 0 ) {
goto error_handler;
}
}
else if( c == 'R' ) {
} else if( c == 'R' ) {
// response start line
// e.g.: 'HTTP/1.1 200 OK'
//
// code
status_code = ( int )va_arg( argp, int );
assert( status_code > 0 );
sprintf( tempbuf, "HTTP/%d.%d %d ",
http_major_version, http_minor_version, status_code );
// str
status_msg = http_get_code_text( status_code );
if (http_MakeMessage(
@ -2022,40 +1965,31 @@ http_MakeMessage( INOUT membuffer * buf,
status_msg ) != 0 ) {
goto error_handler;
}
}
else if( c == 'B' ) {
} else if( c == 'B' ) {
// body of a simple reply
//
status_code = ( int )va_arg( argp, int );
sprintf( tempbuf, "%s%d %s%s",
"<html><body><h1>",
status_code, http_get_code_text( status_code ),
"</h1></body></html>" );
bignum = strlen( tempbuf );
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"NTcs",
bignum, // content-length
"text/html", // content-type
tempbuf ) != 0 ) // body
{
tempbuf ) != 0 // body
) {
goto error_handler;
}
}
else if( c == 'Q' ) {
} else if( c == 'Q' ) {
// request start line
// GET /foo/bar.html HTTP/1.1\r\n
method = ( http_method_t ) va_arg( argp, http_method_t );
method_str = method_to_str( method );
url_str = ( const char * )va_arg( argp, const char * );
num = ( size_t )va_arg( argp, size_t ); // length of url_str
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"ssbsdsdc",
@ -2064,20 +1998,15 @@ http_MakeMessage( INOUT membuffer * buf,
" HTTP/", http_major_version, ".", http_minor_version ) != 0 ) {
goto error_handler;
}
}
else if( c == 'q' ) {
} else if( c == 'q' ) {
// request start line and HOST header
method = ( http_method_t ) va_arg( argp, http_method_t );
uri_ptr = ( uri_type * ) va_arg( argp, uri_type * );
assert( uri_ptr );
if( http_FixUrl( uri_ptr, &url ) != 0 ) {
error_code = UPNP_E_INVALID_URL;
goto error_handler;
}
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"Q" "sbc",
@ -2085,28 +2014,23 @@ http_MakeMessage( INOUT membuffer * buf,
"HOST: ", url.hostport.text.buff, url.hostport.text.size ) != 0 ) {
goto error_handler;
}
}
else if( c == 'T' ) {
} else if( c == 'T' ) {
// content type header
temp_str = ( const char * )va_arg( argp, const char * ); // type/subtype format
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"ssc",
"CONTENT-TYPE: ", temp_str ) != 0 ) {
goto error_handler;
}
}
else {
} else {
assert( 0 );
}
}
return 0;
error_handler:
error_handler:
va_end( argp );
membuffer_destroy( buf );
return error_code;
@ -2174,18 +2098,15 @@ MakeGetMessageEx( const char *url_str,
*temp;
do {
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"DOWNLOAD URL : %s\n", url_str );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"DOWNLOAD URL : %s\n", url_str );
if( ( errCode = http_FixStrUrl( ( char * )url_str,
strlen( url_str ),
url ) ) != UPNP_E_SUCCESS ) {
if( ( errCode = http_FixStrUrl( ( char * )url_str,
strlen( url_str ), url ) ) != UPNP_E_SUCCESS ) {
break;
}
// make msg
membuffer_init( request );
urlPath = alloca( strlen( url_str ) + 1 );
if( !urlPath ) {
errCode = UPNP_E_OUTOF_MEMORY;
@ -2193,9 +2114,7 @@ MakeGetMessageEx( const char *url_str,
}
memset( urlPath, 0, strlen( url_str ) + 1 );
strcpy( urlPath, url_str );
hoststr = strstr( urlPath, "//" );
if( hoststr == NULL ) {
errCode = UPNP_E_INVALID_URL;
@ -2212,13 +2131,11 @@ MakeGetMessageEx( const char *url_str,
*temp = '\0';
hostlen = strlen( hoststr );
*temp = '/';
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %"PRIzu"\n",
hoststr, hostlen );
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %"PRIzu"\n",
hoststr, hostlen );
)
errCode = http_MakeMessage(
errCode = http_MakeMessage(
request, 1, 1,
"Q" "s" "bc" "GDCUc",
HTTPMETHOD_GET, url->pathquery.buff, url->pathquery.size,
@ -2227,49 +2144,48 @@ MakeGetMessageEx( const char *url_str,
pRangeSpecifier );
if( errCode != 0 ) {
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Makemessage failed\n" );
)
membuffer_destroy( request );
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Makemessage failed\n" );
membuffer_destroy( request );
return errCode;
}
} while( 0 );
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Buffer:\n %s\n" "----------END--------\n",
request->buf );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Buffer:\n %s\n" "----------END--------\n",
request->buf );
return errCode;
return errCode;
}
#define SIZE_RANGE_BUFFER 50
/************************************************************************
* Function : http_OpenHttpGetEx
* Function : http_OpenHttpGetEx
*
* Parameters :
* 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
* response message
* IN int timeout : time out value
* Parameters :
* 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
* 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 ;
* 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 :
* Note :
*
************************************************************************/
int

View File

@ -637,13 +637,13 @@ get_file_info( IN const char *filename,
rc = get_content_type( filename, &info->content_type );
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"file info: %s, length: %lld, last_mod=%s readable=%d\n",
filename, (long long)info->file_length,
asctime( gmtime( &info->last_modified ) ),
info->is_readable ); )
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"file info: %s, length: %lld, last_mod=%s readable=%d\n",
filename, (long long)info->file_length,
asctime( gmtime( &info->last_modified ) ),
info->is_readable );
return rc;
return rc;
}
/************************************************************************
@ -1586,14 +1586,11 @@ http_RecvPostMessage( http_parser_t * parser,
}
} else if( num_read == 0 ) {
if( ok_on_close ) {
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"<<< (RECVD) <<<\n%s\n-----------------\n",
parser->msg.msg.buf );
//print_http_headers( &parser->msg );
)
parser->position = POS_COMPLETE;
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"<<< (RECVD) <<<\n%s\n-----------------\n",
parser->msg.msg.buf );
print_http_headers( &parser->msg );
parser->position = POS_COMPLETE;
} else {
// partial msg
parser->http_error_code = HTTP_BAD_REQUEST; // or response
@ -1760,10 +1757,9 @@ web_server_callback( IN http_parser_t * parser,
}
}
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"webserver: request processed...\n" );
)
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"webserver: request processed...\n" );
membuffer_destroy( &headers );
membuffer_destroy( &headers );
membuffer_destroy( &filename );
}

View File

@ -367,16 +367,20 @@ free_URL_list( URL_list * list )
* uri_type *in ; URI object
*
* Description : Function useful in debugging for printing a parsed uri.
* Compiled out with DBGONLY macro.
*
* Return : void ;
*
* Note :
************************************************************************/
DBGONLY( void print_uri( uri_type * in ) {
print_token( &in->scheme );
print_token( &in->hostport.text );
print_token( &in->pathquery ); print_token( &in->fragment );} )
#ifdef DEBUG
void print_uri( uri_type *in )
{
print_token( &in->scheme );
print_token( &in->hostport.text );
print_token( &in->pathquery );
print_token( &in->fragment );
}
#endif
/************************************************************************
* Function : print_token
@ -385,20 +389,23 @@ DBGONLY( void print_uri( uri_type * in ) {
* token * in ; token
*
* Description : Function useful in debugging for printing a token.
* Compiled out with DBGONLY macro.
*
* Return : void ;
*
* Note :
************************************************************************/
DBGONLY( void print_token( token * in ) {
int i = 0;
printf( "Token Size : %"PRIzu"\n\'", in->size );
for( i = 0; i < in->size; i++ ) {
putchar( in->buff[i] );}
putchar( '\'' ); putchar( '\n' );}
)
#ifdef DEBUG
void print_token(token * in)
{
int i = 0;
printf( "Token Size : %"PRIzu"\n\'", in->size );
for( i = 0; i < in->size; i++ ) {
putchar( in->buff[i] );
}
putchar( '\'' );
putchar( '\n' );
}
#endif
/************************************************************************
* Function : token_string_casecmp
@ -417,8 +424,10 @@ DBGONLY( void print_token( token * in ) {
*
* Note :
************************************************************************/
int token_string_casecmp( token * in1,
char *in2 ) {
int token_string_casecmp(
token * in1,
char *in2 )
{
int in2_length = strlen( in2 );
if( in1->size != in2_length )
@ -790,9 +799,8 @@ remove_dots( char *in,
return UPNP_E_OUTOF_MEMORY;
Segments[0] = NULL;
DBGONLY( UpnpPrintf
( UPNP_ALL, API, __FILE__, __LINE__,
"REMOVE_DOTS: before: %s\n", in ) );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"REMOVE_DOTS: before: %s\n", in );
while( ( copyFrom < max ) && ( *copyFrom != '?' )
&& ( *copyFrom != '#' ) ) {
@ -837,9 +845,8 @@ remove_dots( char *in,
}
( *copyTo ) = 0;
free( Segments );
DBGONLY( UpnpPrintf
( UPNP_ALL, API, __FILE__, __LINE__,
"REMOVE_DOTS: after: %s\n", in ) );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"REMOVE_DOTS: after: %s\n", in );
return UPNP_E_SUCCESS;
}

View File

@ -443,31 +443,47 @@ FindServiceControlURLPath( service_table * table,
*
* Note :
************************************************************************/
DBGONLY( void printService( service_info * service, Dbg_Level level,
Dbg_Module module ) {
if( service ) {
if( service->serviceType )
UpnpPrintf( level, module, __FILE__, __LINE__,
"serviceType: %s\n", service->serviceType );
if( service->serviceId )
UpnpPrintf( level, module, __FILE__, __LINE__, "serviceId: %s\n",
service->serviceId ); if( service->SCPDURL )
UpnpPrintf( level, module, __FILE__, __LINE__, "SCPDURL: %s\n",
service->SCPDURL ); if( service->controlURL )
UpnpPrintf( level, module, __FILE__, __LINE__, "controlURL: %s\n",
service->controlURL ); if( service->eventURL )
UpnpPrintf( level, module, __FILE__, __LINE__, "eventURL: %s\n",
service->eventURL ); if( service->UDN )
UpnpPrintf( level, module, __FILE__, __LINE__, "UDN: %s\n\n",
service->UDN ); if( service->active )
UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is active\n" );
else
UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is inactive\n" );}
}
)
#ifdef DEBUG
void printService(
service_info *service,
Dbg_Level level,
Dbg_Module module )
{
if( service ) {
if( service->serviceType ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"serviceType: %s\n", service->serviceType );
}
if( service->serviceId ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"serviceId: %s\n", service->serviceId );
}
if( service->SCPDURL ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"SCPDURL: %s\n", service->SCPDURL );
}
if( service->controlURL ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"controlURL: %s\n", service->controlURL );
}
if( service->eventURL ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"eventURL: %s\n", service->eventURL );
}
if( service->UDN ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"UDN: %s\n\n", service->UDN );
}
if( service->active ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is active\n" );
} else {
UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is inactive\n" );
}
}
}
#endif
/************************************************************************
* Function : printServiceList
@ -484,36 +500,48 @@ DBGONLY( void printService( service_info * service, Dbg_Level level,
*
* Note :
************************************************************************/
DBGONLY( void printServiceList( service_info * service,
Dbg_Level level,
Dbg_Module module ) {
while( service ) {
if( service->serviceType )
UpnpPrintf( level, module, __FILE__, __LINE__,
"serviceType: %s\n", service->serviceType );
if( service->serviceId )
UpnpPrintf( level, module, __FILE__, __LINE__,
"serviceId: %s\n", service->serviceId );
if( service->SCPDURL )
UpnpPrintf( level, module, __FILE__, __LINE__,
"SCPDURL: %s\n", service->SCPDURL );
if( service->controlURL )
UpnpPrintf( level, module, __FILE__, __LINE__,
"controlURL: %s\n", service->controlURL );
if( service->eventURL )
UpnpPrintf( level, module, __FILE__, __LINE__,
"eventURL: %s\n", service->eventURL );
if( service->UDN )
UpnpPrintf( level, module, __FILE__, __LINE__, "UDN: %s\n\n",
service->UDN ); if( service->active )
UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is active\n" );
else
UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is inactive\n" );
service = service->next;}
}
)
#ifdef DEBUG
void printServiceList(
service_info * service,
Dbg_Level level,
Dbg_Module module )
{
while( service ) {
if( service->serviceType ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"serviceType: %s\n", service->serviceType );
}
if( service->serviceId ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"serviceId: %s\n", service->serviceId );
}
if( service->SCPDURL ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"SCPDURL: %s\n", service->SCPDURL );
}
if( service->controlURL ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"controlURL: %s\n", service->controlURL );
}
if( service->eventURL ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"eventURL: %s\n", service->eventURL );
}
if( service->UDN ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"UDN: %s\n\n", service->UDN );
}
if( service->active ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is active\n" );
} else {
UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is inactive\n" );
}
service = service->next;
}
}
#endif
/************************************************************************
* Function : printServiceTable
@ -531,15 +559,18 @@ DBGONLY( void printService( service_info * service, Dbg_Level level,
*
* Note :
************************************************************************/
DBGONLY( void printServiceTable( service_table * table,
Dbg_Level level,
Dbg_Module module ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"URL_BASE: %s\n", table->URLBase );
UpnpPrintf( level, module, __FILE__, __LINE__,
"Services: \n" );
printServiceList( table->serviceList, level, module );}
)
#ifdef DEBUG
void printServiceTable(
service_table * table,
Dbg_Level level,
Dbg_Module module )
{
UpnpPrintf( level, module, __FILE__, __LINE__,
"URL_BASE: %s\n", table->URLBase );
UpnpPrintf( level, module, __FILE__, __LINE__,
"Services: \n" );
printServiceList( table->serviceList, level, module );}
#endif
/************************************************************************
* Function : freeService
@ -554,7 +585,7 @@ DBGONLY( void printService( service_info * service, Dbg_Level level,
*
* Note :
************************************************************************/
void freeService( service_info * in )
void freeService( service_info * in )
{
if( in ) {
if( in->serviceType )
@ -849,12 +880,10 @@ getServiceList( IXML_Node * node,
( !
( current->controlURL =
resolve_rel_url( URLBase, tempDOMString ) ) ) ) {
DBGONLY( UpnpPrintf
( UPNP_INFO, GENA, __FILE__, __LINE__,
"BAD OR MISSING CONTROL URL" ) );
DBGONLY( UpnpPrintf
( UPNP_INFO, GENA, __FILE__, __LINE__,
"CONTROL URL SET TO NULL IN SERVICE INFO" ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"BAD OR MISSING CONTROL URL" );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"CONTROL URL SET TO NULL IN SERVICE INFO" );
current->controlURL = NULL;
fail = 0;
}
@ -870,12 +899,10 @@ getServiceList( IXML_Node * node,
( !
( current->eventURL =
resolve_rel_url( URLBase, tempDOMString ) ) ) ) {
DBGONLY( UpnpPrintf
( UPNP_INFO, GENA, __FILE__, __LINE__,
"BAD OR MISSING EVENT URL" ) );
DBGONLY( UpnpPrintf
( UPNP_INFO, GENA, __FILE__, __LINE__,
"EVENT URL SET TO NULL IN SERVICE INFO" ) );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"BAD OR MISSING EVENT URL" );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"EVENT URL SET TO NULL IN SERVICE INFO" );
current->eventURL = NULL;
fail = 0;
}

View File

@ -304,27 +304,6 @@
/** @name DBGONLY
The {\bf DBGONLY} macro allows code to be marked so that it
is only included in the DEBUG build and not the release. To
use this macro, put the code inside of the parentheses:
{\tt DBGONLY(int i;)}
This will cause a declaration of the integer {\tt i} only
in the debug build.
*/
//@{
#ifdef DEBUG
# define DBGONLY(x) x
#else
# define DBGONLY(x)
#endif
//@}
#undef EXCLUDE_WEB_SERVER
#undef EXCLUDE_MINISERVER
#ifdef INTERNAL_WEB_SERVER
@ -368,4 +347,3 @@
//@}
#endif

View File

@ -89,25 +89,26 @@
#define DEFAULT_TIMEOUT 1801
extern ithread_mutex_t GlobalClientSubscribeMutex;
//Lock the subscription
// Lock the subscription
#define SubscribeLock() \
DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__, \
"Trying Subscribe Lock")); \
UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
"Trying Subscribe Lock"); \
ithread_mutex_lock(&GlobalClientSubscribeMutex); \
DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__,"Subscribe Lock");)
UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
"Subscribe Lock");
//Unlock the subscription
// Unlock the subscription
#define SubscribeUnlock() \
DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__, \
"Trying Subscribe UnLock")); \
UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
"Trying Subscribe UnLock"); \
ithread_mutex_unlock(&GlobalClientSubscribeMutex); \
DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__,"Subscribe UnLock");)
UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
"Subscribe UnLock");
//Structure to send NOTIFY message to all subscribed control points
// Structure to send NOTIFY message to all subscribed control points
typedef struct NOTIFY_THREAD_STRUCT {
char * headers;
DOMString propertySet;

View File

@ -214,37 +214,101 @@ EXTERN_C ssize_t readLine(int fd, char *out, int max, int *timeout);
EXTERN_C int remove_dots(char * in, int size);
DBGONLY(EXTERN_C void print_http_request(http_message
*message,Dbg_Level DLevel,
Dbg_Module Module,char *DbgFileName,
int DbgLineNo););
#ifdef DEBUG
EXTERN_C void print_http_request(
http_message *message,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_http_request(
http_message *message,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
DBGONLY(EXTERN_C void print_http_response(http_message *message,
Dbg_Level DLevel,
Dbg_Module Module,char *DbgFileName,
int DbgLineNo););
#ifdef DEBUG
EXTERN_C void print_http_response(
http_message *message,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_http_response(
http_message *message,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
DBGONLY(EXTERN_C void print_token( token * in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo););
#ifdef DEBUG
EXTERN_C void print_token(
token *in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_token(
token *in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
DBGONLY(EXTERN_C void print_status_line(http_status *in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo););
#ifdef DEBUG
EXTERN_C void print_status_line(
http_status *in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_status_line(
http_status *in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
DBGONLY(EXTERN_C void print_request_line(http_request *in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,int DbgLineNo));
#ifdef DEBUG
EXTERN_C void print_request_line(
http_request *in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_request_line(
http_request *in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
DBGONLY(EXTERN_C void print_uri( uri_type *in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo););
#ifdef DEBUG
EXTERN_C void print_uri(
uri_type *in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_uri(
uri_type *in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
#endif

View File

@ -478,17 +478,21 @@ int raw_find_str( IN memptr* raw_value, IN const char* str );
const char* method_to_str( IN http_method_t method );
/************************************************************************
* Function: print_http_headers
*
* Parameters:
* http_message_t* hmsg ; HTTP Message object
*
* Description:
*
* Returns:
* void
* Function: print_http_headers
*
* Parameters:
* http_message_t* hmsg ; HTTP Message object
*
* Description:
*
* Returns:
* void
************************************************************************/
void print_http_headers( IN http_message_t* hmsg );
#ifdef DEBUG
void print_http_headers( IN http_message_t *hmsg );
#else
static inline void print_http_headers( IN http_message_t *hmsg ) {}
#endif
#ifdef __cplusplus
} // extern "C"
@ -496,3 +500,4 @@ void print_http_headers( IN http_message_t* hmsg );
#endif // GENLIB_NET_HTTP_HTTPPARSER_H

View File

@ -47,7 +47,7 @@ extern "C" {
#define SID_SIZE 41
DEVICEONLY(
#ifdef INCLUDE_DEVICE_APIS
typedef struct SUBSCRIPTION {
Upnp_SID sid;
@ -263,9 +263,17 @@ service_info * FindServiceControlURLPath( service_table *table,
*
* Note :
************************************************************************/
DBGONLY(void printService(service_info *service,Dbg_Level
level,
Dbg_Module module));
#ifdef DEBUG
void printService(
service_info *service,
Dbg_Level level,
Dbg_Module module);
#else
static inline void printService(
service_info *service,
Dbg_Level level,
Dbg_Module module) {}
#endif
/************************************************************************
* Function : printServiceList
@ -282,8 +290,17 @@ DBGONLY(void printService(service_info *service,Dbg_Level
*
* Note :
************************************************************************/
DBGONLY(void printServiceList(service_info *service,
Dbg_Level level, Dbg_Module module));
#ifdef DEBUG
void printServiceList(
service_info *service,
Dbg_Level level,
Dbg_Module module);
#else
static inline void printServiceList(
service_info *service,
Dbg_Level level,
Dbg_Module module) {}
#endif
/************************************************************************
* Function : printServiceTable
@ -301,9 +318,17 @@ DBGONLY(void printServiceList(service_info *service,
*
* Note :
************************************************************************/
DBGONLY(void printServiceTable(service_table *
table,Dbg_Level
level,Dbg_Module module));
#ifdef DEBUG
void printServiceTable(
service_table *table,
Dbg_Level level,
Dbg_Module module);
#else
static inline void printServiceTable(
service_table *table,
Dbg_Level level,
Dbg_Module module) {}
#endif
/************************************************************************
* Function : freeService
@ -451,10 +476,11 @@ int getSubElement(const char *element_name, IXML_Node *node,
IXML_Node **out);
) /* DEVICEONLY */
#endif /* INCLUDE_DEVICE_APIS */
#ifdef __cplusplus
}
#endif
#endif /* _SERVICE_TABLE */

View File

@ -96,8 +96,16 @@ struct Handle_Info
extern ithread_mutex_t GlobalHndMutex;
Upnp_Handle_Type GetHandleInfo(int Hnd, struct Handle_Info **HndInfo);
#define HandleLock() DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"Trying Lock")); ithread_mutex_lock(&GlobalHndMutex); DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"LOCK"));
#define HandleUnlock() DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"Trying Unlock")); ithread_mutex_unlock(&GlobalHndMutex); DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"Unlock"));
#define HandleLock() \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying Lock"); \
ithread_mutex_lock(&GlobalHndMutex); \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "LOCK");
#define HandleUnlock() \
UpnpPrintf(UPNP_INFO, API,__FILE__, __LINE__, "Trying Unlock"); \
ithread_mutex_unlock(&GlobalHndMutex); \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Unlock");
Upnp_Handle_Type GetClientHandleInfo(int *client_handle_out,
struct Handle_Info **HndInfo);
Upnp_Handle_Type GetDeviceHandleInfo(int *device_handle_out,

View File

@ -182,13 +182,16 @@ void free_URL_list(URL_list * list);
* uri_type *in ; URI object
*
* Description : Function useful in debugging for printing a parsed uri.
* Compiled out with DBGONLY macro.
*
* Return : void ;
*
* Note :
************************************************************************/
DBGONLY(void print_uri( uri_type *in);)
#ifdef DEBUG
void print_uri(uri_type *in);
#else
static inline void print_uri(uri_type *in) {}
#endif
/************************************************************************
* Function : print_token
@ -197,13 +200,16 @@ DBGONLY(void print_uri( uri_type *in);)
* token * in ;
*
* Description : Function useful in debugging for printing a token.
* Compiled out with DBGONLY macro.
*
* Return : void ;
*
* Note :
************************************************************************/
void print_token( token * in);
#ifdef DEBUG
void print_token(token *in);
#else
static inline void print_token(token * in) {}
#endif
/************************************************************************
* Function : token_string_casecmp

View File

@ -619,11 +619,10 @@ SoapSendAction( IN char *action_url,
err_code = UPNP_E_OUTOF_MEMORY; // default error
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Inside SoapSendAction():" );
)
// init
membuffer_init( &request );
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Inside SoapSendAction():" );
// init
membuffer_init( &request );
membuffer_init( &responsename );
// print action
@ -642,12 +641,12 @@ SoapSendAction( IN char *action_url,
goto error_handler;
}
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"path=%.*s, hostport=%.*s\n",
(int)url.pathquery.size,
url.pathquery.buff,
(int)url.hostport.text.size,
url.hostport.text.buff ); )
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"path=%.*s, hostport=%.*s\n",
(int)url.pathquery.size,
url.pathquery.buff,
(int)url.hostport.text.size,
url.hostport.text.buff );
xml_start_len = strlen( xml_start );
xml_end_len = strlen( xml_end );
@ -771,11 +770,10 @@ SoapSendActionEx( IN char *action_url,
err_code = UPNP_E_OUTOF_MEMORY; // default error
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Inside SoapSendActionEx():" );
)
// init
membuffer_init( &request );
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Inside SoapSendActionEx():" );
// init
membuffer_init( &request );
membuffer_init( &responsename );
// header string
@ -799,12 +797,12 @@ SoapSendActionEx( IN char *action_url,
goto error_handler;
}
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"path=%.*s, hostport=%.*s\n",
(int)url.pathquery.size,
url.pathquery.buff,
(int)url.hostport.text.size,
url.hostport.text.buff ); )
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"path=%.*s, hostport=%.*s\n",
(int)url.pathquery.size,
url.pathquery.buff,
(int)url.hostport.text.size,
url.hostport.text.buff );
xml_start_len = strlen( xml_start );
xml_body_start_len = strlen( xml_body_start );

View File

@ -344,11 +344,10 @@ get_action_node( IN IXML_Document * TempDoc,
int ret_code = -1; // error, by default
IXML_NodeList *nl = NULL;
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"get_action_node(): node name =%s\n ", NodeName );
)
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"get_action_node(): node name =%s\n ", NodeName );
* RespNode = NULL;
*RespNode = NULL;
// Got the Envelope node here
EnvpNode = ixmlNode_getFirstChild( ( IXML_Node * ) TempDoc );
@ -738,15 +737,15 @@ send_action_response( IN SOCKINFO * info,
xml_response, strlen( xml_response ),
end_body, strlen( end_body ) );
DBGONLY( if( ret_code != 0 ) {
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Failed to send response: err code = %d\n",
ret_code );}
)
if( ret_code != 0 ) {
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Failed to send response: err code = %d\n",
ret_code );
}
err_code = 0;
err_code = 0;
error_handler:
error_handler:
ixmlFreeDOMString( xml_response );
membuffer_destroy( &headers );
if( err_code != 0 ) {
@ -814,14 +813,13 @@ get_var_name( IN IXML_Document * TempDoc,
Temp = ixmlNode_getNodeValue( VarNode );
linecopy( VarName, Temp );
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Received query for variable name %s\n",
VarName );
)
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Received query for variable name %s\n",
VarName );
ret_val = 0; // success
ret_val = 0; // success
error_handler:
error_handler:
return ret_val;
}
@ -878,8 +876,8 @@ handle_query_variable( IN SOCKINFO * info,
// send event
soap_event_callback( UPNP_CONTROL_GET_VAR_REQUEST, &variable, cookie );
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Return from callback for var request\n" ) );
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Return from callback for var request\n" );
// validate, and handle result
if( variable.CurrentVal == NULL ) {
@ -968,8 +966,8 @@ handle_invoke_action( IN SOCKINFO * info,
action.ErrCode = UPNP_E_SUCCESS;
action.CtrlPtIPAddr = info->foreign_ip_addr;
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Calling Callback\n" ) );
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Calling Callback\n" );
soap_event_callback( UPNP_CONTROL_ACTION_REQUEST, &action, cookie );

View File

@ -536,11 +536,10 @@ SearchByTarget( IN int Mx,
if( ReqBuf == NULL )
return UPNP_E_OUTOF_MEMORY;
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
">>> SSDP SEND >>>\n%s\n", ReqBuf );
)
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
">>> SSDP SEND >>>\n%s\n", ReqBuf );
timeTillRead = Mx;
timeTillRead = Mx;
if( timeTillRead < MIN_SEARCH_TIME ) {
timeTillRead = MIN_SEARCH_TIME;
@ -589,26 +588,23 @@ SearchByTarget( IN int Mx,
if( select( gSsdpReqSocket + 1, NULL, &wrSet, NULL, NULL )
== UPNP_SOCKETERROR ) {
DBGONLY( if( errno == EBADF ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB :RequestHandler:An invalid file descriptor"
" was givenin one of the sets. \n" );}
else
if( errno == EINTR ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB :RequestHandler: A non blocked "
"signal was caught. \n" );}
else
if( errno == EINVAL ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB :RequestHandler: n is negative. \n" );}
else
if( errno == ENOMEM ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB : RequestHandler:select was unable to "
"allocate memory for internal tables.\n" );}
)
shutdown( gSsdpReqSocket, SD_BOTH );
if( errno == EBADF ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB :RequestHandler:An invalid file descriptor"
" was givenin one of the sets. \n" );
} else if( errno == EINTR ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB :RequestHandler: A non blocked "
"signal was caught. \n" );
} else if( errno == EINVAL ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB :RequestHandler: n is negative. \n" );
} else if( errno == ENOMEM ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB : RequestHandler:select was unable to "
"allocate memory for internal tables.\n" );
}
shutdown( gSsdpReqSocket, SD_BOTH );
UpnpCloseSocket( gSsdpReqSocket );
free( ReqBuf );
return UPNP_E_INTERNAL_ERROR;

View File

@ -43,22 +43,22 @@
#include "unixutil.h"
#ifdef WIN32
#include <ws2tcpip.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <winsock2.h>
#endif
#define MSGTYPE_SHUTDOWN 0
#define MSGTYPE_SHUTDOWN 0
#define MSGTYPE_ADVERTISEMENT 1
#define MSGTYPE_REPLY 2
#define MSGTYPE_REPLY 2
/************************************************************************
* Function : advertiseAndReplyThread
*
* Parameters:
* IN void *data: Structure containing the search request
* Function : advertiseAndReplyThread
*
* Description:
* This function is a wrapper function to reply the search request
* Parameters:
* IN void *data: Structure containing the search request
*
* Description:
* This function is a wrapper function to reply the search request
* coming from the control point.
*
* Returns: void *
@ -81,11 +81,11 @@ advertiseAndReplyThread( IN void *data )
}
/************************************************************************
* Function : ssdp_handle_device_request
*
* Function : ssdp_handle_device_request
*
* Parameters:
* IN http_message_t* hmsg: SSDP search request from the control point
* IN struct sockaddr_in* dest_addr: The address info of control point
* IN http_message_t* hmsg: SSDP search request from the control point
* IN struct sockaddr_in* dest_addr: The address info of control point
*
* Description:
* This function handles the search request. It do the sanity checks of
@ -135,30 +135,30 @@ ssdp_handle_device_request( IN http_message_t * hmsg,
return; // bad ST header
}
HandleLock( );
HandleLock();
// device info
if( GetDeviceHandleInfo( &handle, &dev_info ) != HND_DEVICE ) {
HandleUnlock( );
HandleUnlock();
return; // no info found
}
maxAge = dev_info->MaxAge;
HandleUnlock( );
HandleUnlock();
DBGONLY( UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"ssdp_handle_device_request with Cmd %d SEARCH\n",
event.Cmd );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"MAX-AGE = %d\n", maxAge );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"MX = %d\n", event.Mx );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"DeviceType = %s\n", event.DeviceType );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"DeviceUuid = %s\n", event.UDN );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"ServiceType = %s\n", event.ServiceType ); )
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"ssdp_handle_device_request with Cmd %d SEARCH\n",
event.Cmd );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"MAX-AGE = %d\n", maxAge );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"MX = %d\n", event.Mx );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"DeviceType = %s\n", event.DeviceType );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"DeviceUuid = %s\n", event.UDN );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"ServiceType = %s\n", event.ServiceType );
threadArg =
threadArg =
( SsdpSearchReply * ) malloc( sizeof( SsdpSearchReply ) );
if( threadArg == NULL ) {
@ -185,7 +185,7 @@ ssdp_handle_device_request( IN http_message_t * hmsg,
mx = 1;
}
replyTime = rand( ) % mx;
replyTime = rand() % mx;
TimerThreadSchedule( &gTimerThread, replyTime, REL_SEC, &job,
SHORT_TERM, NULL );
@ -220,9 +220,9 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr,
ReplySock = socket( AF_INET, SOCK_DGRAM, 0 );
if( ReplySock == UPNP_INVALID_SOCKET ) {
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB: New Request Handler:"
"Error in socket operation !!!\n" ) );
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB: New Request Handler:"
"Error in socket operation !!!\n" );
return UPNP_E_OUTOF_SOCKET;
}
@ -247,13 +247,12 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr,
// So, NUM_COPY has been changed from 2 to 1.
NumCopy = 0;
while( NumCopy < NUM_COPY ) {
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
">>> SSDP SEND >>>\n%s\n",
*( RqPacket + Index ) );
)
rc = sendto( ReplySock, *( RqPacket + Index ),
strlen( *( RqPacket + Index ) ),
0, ( struct sockaddr * )DestAddr, socklen );
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
">>> SSDP SEND >>>\n%s\n",
*( RqPacket + Index ) );
rc = sendto( ReplySock, *( RqPacket + Index ),
strlen( *( RqPacket + Index ) ),
0, ( struct sockaddr * )DestAddr, socklen );
imillisleep( SSDP_PAUSE );
++NumCopy;
}
@ -388,11 +387,10 @@ DeviceAdvertisement( IN char *DevType,
char *msgs[3];
int ret_code;
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"In function SendDeviceAdvertisemenrt\n" );
)
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"In function SendDeviceAdvertisemenrt\n" );
DestAddr.sin_family = AF_INET;
DestAddr.sin_family = AF_INET;
DestAddr.sin_addr.s_addr = inet_addr( SSDP_IP );
DestAddr.sin_port = htons( SSDP_PORT );
@ -783,11 +781,11 @@ DeviceShutdown( IN char *DevType,
Mil_Usn, Location, Duration, &msgs[0] );
}
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"In function DeviceShutdown\n" ); )
// both root and sub-devices need to send these two messages
CreateServicePacket( MSGTYPE_SHUTDOWN, Udn, Udn,
Location, Duration, &msgs[1] );
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"In function DeviceShutdown\n" );
// both root and sub-devices need to send these two messages
CreateServicePacket( MSGTYPE_SHUTDOWN, Udn, Udn,
Location, Duration, &msgs[1] );
sprintf( Mil_Usn, "%s::%s", Udn, DevType );
CreateServicePacket( MSGTYPE_SHUTDOWN, DevType, Mil_Usn,

View File

@ -91,14 +91,14 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int AdvertiseAndReply( IN int AdFlag,
IN UpnpDevice_Handle Hnd,
IN enum SsdpSearchType SearchType,
IN struct sockaddr_in *DestAddr,
IN char *DeviceType,
IN char *DeviceUDN,
IN char *ServiceType,
int Exp )
int AdvertiseAndReply( IN int AdFlag,
IN UpnpDevice_Handle Hnd,
IN enum SsdpSearchType SearchType,
IN struct sockaddr_in *DestAddr,
IN char *DeviceType,
IN char *DeviceUDN,
IN char *ServiceType,
int Exp )
{
int i,
j;
@ -115,14 +115,14 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
const DOMString tmpStr;
char SERVER[200];
DBGONLY( const DOMString dbgStr;
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside AdvertiseAndReply with AdFlag = %d\n",
AdFlag ); )
const DOMString dbgStr;
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside AdvertiseAndReply with AdFlag = %d\n",
AdFlag );
HandleLock( );
HandleLock();
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
HandleUnlock( );
HandleUnlock();
return UPNP_E_INVALID_HANDLE;
}
defaultExp = SInfo->MaxAge;
@ -139,24 +139,20 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
// parse the device list and send advertisements/replies
for( i = 0;; i++ ) {
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Entering new device list with i = %d\n\n",
i );
)
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Entering new device list with i = %d\n\n", i );
tmpNode = ixmlNodeList_item( SInfo->DeviceList, i );
tmpNode = ixmlNodeList_item( SInfo->DeviceList, i );
if( tmpNode == NULL ) {
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting new device list with i = %d\n\n",
i );
)
break;
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting new device list with i = %d\n\n", i );
break;
}
DBGONLY( dbgStr = ixmlNode_getNodeName( tmpNode );
dbgStr = ixmlNode_getNodeName( tmpNode );
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Extracting device type once for %s\n",
dbgStr ); )
"Extracting device type once for %s\n",
dbgStr );
// extract device type
ixmlNodeList_free( nodeList );
nodeList = NULL;
@ -167,15 +163,14 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
continue;
}
DBGONLY( dbgStr = ixmlNode_getNodeName( tmpNode );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting UDN for %s\n", dbgStr ); )
dbgStr = ixmlNode_getNodeName( tmpNode );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting UDN for %s\n", dbgStr );
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting device type\n" );
)
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting device type\n" );
tmpNode2 = ixmlNodeList_item( nodeList, 0 );
tmpNode2 = ixmlNodeList_item( nodeList, 0 );
if( tmpNode2 == NULL ) {
continue;
}
@ -184,11 +179,10 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
continue;
}
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting device type \n" );
)
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting device type \n" );
tmpStr = ixmlNode_getNodeValue( textNode );
tmpStr = ixmlNode_getNodeValue( textNode );
if( tmpStr == NULL ) {
continue;
}
@ -198,47 +192,41 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
continue;
}
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting device type = %s\n", devType );
if( tmpNode == NULL ) {
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"TempNode is NULL\n" );}
dbgStr = ixmlNode_getNodeName( tmpNode );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting UDN for %s\n", dbgStr ); )
// extract UDN
ixmlNodeList_free( nodeList );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting device type = %s\n", devType );
if( tmpNode == NULL ) {
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"TempNode is NULL\n" );
}
dbgStr = ixmlNode_getNodeName( tmpNode );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting UDN for %s\n", dbgStr );
// extract UDN
ixmlNodeList_free( nodeList );
nodeList = NULL;
nodeList = ixmlElement_getElementsByTagName( ( IXML_Element * )
tmpNode, "UDN" );
if( nodeList == NULL ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL, API, __FILE__,
__LINE__, "UDN not found!!!\n" );
)
UpnpPrintf( UPNP_CRITICAL, API, __FILE__,
__LINE__, "UDN not found!!!\n" );
continue;
}
tmpNode2 = ixmlNodeList_item( nodeList, 0 );
if( tmpNode2 == NULL ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL, API, __FILE__,
__LINE__, "UDN not found!!!\n" );
)
continue;
UpnpPrintf( UPNP_CRITICAL, API, __FILE__,
__LINE__, "UDN not found!!!\n" );
continue;
}
textNode = ixmlNode_getFirstChild( tmpNode2 );
if( textNode == NULL ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL, API, __FILE__,
__LINE__, "UDN not found!!!\n" );
)
continue;
UpnpPrintf( UPNP_CRITICAL, API, __FILE__,
__LINE__, "UDN not found!!!\n" );
continue;
}
tmpStr = ixmlNode_getNodeValue( textNode );
if( tmpStr == NULL ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
"UDN not found!!!!\n" );
)
UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
"UDN not found!!!!\n" );
continue;
}
strcpy( UDNstr, tmpStr );
@ -246,9 +234,8 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
continue;
}
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Sending UDNStr = %s \n", UDNstr );
)
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Sending UDNStr = %s \n", UDNstr );
if( AdFlag ) {
// send the device advertisement
if( AdFlag == 1 ) {
@ -278,22 +265,16 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
{
if( DeviceUDN != NULL && strlen( DeviceUDN ) != 0 ) {
if( strcasecmp( DeviceUDN, UDNstr ) ) {
DBGONLY( UpnpPrintf
( UPNP_INFO, API, __FILE__,
__LINE__,
"DeviceUDN=%s and search "
"UDN=%s did not match\n",
UDNstr, DeviceUDN );
)
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"DeviceUDN=%s and search "
"UDN=%s did not match\n",
UDNstr, DeviceUDN );
break;
} else {
DBGONLY( UpnpPrintf
( UPNP_INFO, API, __FILE__,
__LINE__,
"DeviceUDN=%s and search "
"UDN=%s MATCH\n", UDNstr,
DeviceUDN );
)
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"DeviceUDN=%s and search "
"UDN=%s MATCH\n", UDNstr,
DeviceUDN );
SendReply( DestAddr, devType, 0,
UDNstr, SInfo->DescURL,
defaultExp, 0 );
@ -306,25 +287,18 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
if( !strncasecmp
( DeviceType, devType,
strlen( DeviceType ) ) ) {
DBGONLY( UpnpPrintf
( UPNP_INFO, API, __FILE__, __LINE__,
"DeviceType=%s and search devType=%s MATCH\n",
devType, DeviceType );
)
SendReply( DestAddr, devType, 0, UDNstr,
SInfo->DescURL, defaultExp, 1 );
}
DBGONLY(
else
UpnpPrintf( UPNP_INFO, API, __FILE__,
__LINE__,
"DeviceType=%s and search devType=%s"
" DID NOT MATCH\n",
devType, DeviceType );
)
break;
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"DeviceType=%s and search devType=%s MATCH\n",
devType, DeviceType );
SendReply( DestAddr, devType, 0, UDNstr,
SInfo->DescURL, defaultExp, 1 );
} else {
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"DeviceType=%s and search devType=%s"
" DID NOT MATCH\n",
devType, DeviceType );
}
break;
}
default:
break;
@ -332,11 +306,10 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
}
// send service advertisements for services corresponding
// to the same device
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Sending service Advertisement\n" );
)
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Sending service Advertisement\n" );
tmpNode = ixmlNodeList_item( SInfo->ServiceList, i );
tmpNode = ixmlNodeList_item( SInfo->ServiceList, i );
if( tmpNode == NULL ) {
continue;
}
@ -345,10 +318,9 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
nodeList = ixmlElement_getElementsByTagName( ( IXML_Element * )
tmpNode, "service" );
if( nodeList == NULL ) {
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Service not found 3\n" );
)
continue;
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Service not found 3\n" );
continue;
}
for( j = 0;; j++ ) {
tmpNode = ixmlNodeList_item( nodeList, j );
@ -357,15 +329,11 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
ixmlNodeList_free( tmpNodeList );
tmpNodeList = NULL;
tmpNodeList = ixmlElement_getElementsByTagName( ( IXML_Element
* ) tmpNode,
"serviceType" );
tmpNodeList = ixmlElement_getElementsByTagName(
( IXML_Element *)tmpNode, "serviceType" );
if( tmpNodeList == NULL ) {
DBGONLY( UpnpPrintf
( UPNP_CRITICAL, API, __FILE__, __LINE__,
"ServiceType not found \n" );
)
UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
"ServiceType not found \n" );
continue;
}
tmpNode2 = ixmlNodeList_item( tmpNodeList, 0 );
@ -386,19 +354,16 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
continue;
}
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"ServiceType = %s\n", servType );
)
if( AdFlag ) {
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"ServiceType = %s\n", servType );
if( AdFlag ) {
if( AdFlag == 1 ) {
ServiceAdvertisement( UDNstr, servType,
SInfo->DescURL, Exp );
} else // AdFlag == -1
{
} else { // AdFlag == -1
ServiceShutdown( UDNstr, servType,
SInfo->DescURL, Exp );
}
} else {
switch ( SearchType ) {
case SSDP_ALL:
@ -433,11 +398,10 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
ixmlNodeList_free( nodeList );
nodeList = NULL;
}
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting AdvertiseAndReply : \n" );
)
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting AdvertiseAndReply : \n" );
HandleUnlock( );
HandleUnlock( );
return UPNP_E_SUCCESS;
@ -733,20 +697,18 @@ start_event_handler( void *Data )
if( status == PARSE_FAILURE ) {
if( parser->msg.method != HTTPMETHOD_NOTIFY ||
!parser->valid_ssdp_notify_hack ) {
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP recvd bad msg code = %d\n",
status );
)
// ignore bad msg, or not enuf mem
goto error_handler;
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP recvd bad msg code = %d\n",
status );
// ignore bad msg, or not enuf mem
goto error_handler;
}
// valid notify msg
} else if( status != PARSE_SUCCESS ) {
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP recvd bad msg code = %d\n", status );
)
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP recvd bad msg code = %d\n", status );
goto error_handler;
goto error_handler;
}
// check msg
if( !valid_ssdp_msg( &parser->msg ) ) {
@ -863,21 +825,18 @@ readFromSSDPSocket( SOCKET socket )
if( byteReceived > 0 ) {
requestBuf[byteReceived] = '\0';
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP,
UpnpPrintf( UPNP_INFO, SSDP,
__FILE__, __LINE__,
"Received response !!! "
"%s From host %s \n",
requestBuf,
inet_ntoa( clientAddr.sin_addr ) );
)
DBGONLY( UpnpPrintf( UPNP_PACKET, SSDP,
__FILE__, __LINE__,
"Received multicast packet:"
"\n %s\n", requestBuf );
)
//add thread pool job to handle request
if( data != NULL ) {
UpnpPrintf( UPNP_PACKET, SSDP, __FILE__, __LINE__,
"Received multicast packet:"
"\n %s\n", requestBuf );
//add thread pool job to handle request
if( data != NULL ) {
data->parser.msg.msg.length += byteReceived;
// null-terminate
data->parser.msg.msg.buf[byteReceived] = 0;
@ -891,7 +850,6 @@ readFromSSDPSocket( SOCKET socket )
free_ssdp_event_handler_data( data );
}
}
} else {
free_ssdp_event_handler_data( data );
}
@ -926,9 +884,9 @@ get_ssdp_sockets( MiniServerSockArray * out )
CLIENTONLY( if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) )
== UPNP_INVALID_SOCKET ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" ); )
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
return UPNP_E_OUTOF_SOCKET;}
setsockopt( ssdpReqSock,
IPPROTO_IP,
@ -938,11 +896,10 @@ get_ssdp_sockets( MiniServerSockArray * out )
if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) )
== UPNP_INVALID_SOCKET ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
)
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
return UPNP_E_OUTOF_SOCKET;
}
@ -951,11 +908,10 @@ get_ssdp_sockets( MiniServerSockArray * out )
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR,
( char * )&onOff, sizeof( onOff ) ) != 0 ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in set reuse addr !!!\n" );
)
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in set reuse addr !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock );
@ -966,11 +922,10 @@ get_ssdp_sockets( MiniServerSockArray * out )
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT,
( char * )&onOff, sizeof( onOff ) ) != 0 ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in set reuse port !!!\n" );
)
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in set reuse port !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock );
@ -986,10 +941,9 @@ get_ssdp_sockets( MiniServerSockArray * out )
if( bind
( ssdpSock, ( struct sockaddr * )&ssdpAddr,
sizeof( ssdpAddr ) ) != 0 ) {
DBGONLY( UpnpPrintf
( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in binding !!!\n" );
)
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in binding !!!\n" );
shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
@ -1003,11 +957,10 @@ get_ssdp_sockets( MiniServerSockArray * out )
if( setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
( char * )&ssdpMcastAddr,
sizeof( struct ip_mreq ) ) != 0 ) {
DBGONLY( UpnpPrintf
( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in joining" " multicast group !!!\n" );
)
shutdown( ssdpSock, SD_BOTH );
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in joining" " multicast group !!!\n" );
shutdown( ssdpSock, SD_BOTH );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
UpnpCloseSocket( ssdpSock );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
@ -1019,8 +972,8 @@ get_ssdp_sockets( MiniServerSockArray * out )
addr.s_addr = inet_addr(LOCAL_HOST);
if (setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF,
(char *)&addr, sizeof addr) != 0) {
DBGONLY(UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"Couldn't set multicast interface.\n" ));
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"Couldn't set multicast interface.\n" );
/* This is probably not a critical error, so let's continue. */
}
@ -1029,11 +982,10 @@ get_ssdp_sockets( MiniServerSockArray * out )
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST,
( char * )&option, sizeof( option ) ) != 0 ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in setting broadcast !!!\n" );
)
shutdown( ssdpSock, SD_BOTH );
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in setting broadcast !!!\n" );
shutdown( ssdpSock, SD_BOTH );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
UpnpCloseSocket( ssdpSock );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );

View File

@ -168,11 +168,10 @@ calc_descURL( IN const char *ipPortStr,
strcat( descURL, ipPortStr );
strcat( descURL, alias );
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"desc url: %s\n", descURL );
)
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"desc url: %s\n", descURL );
return UPNP_E_SUCCESS;
return UPNP_E_SUCCESS;
}
/************************************************************************
@ -408,18 +407,16 @@ configure_urlbase( INOUT IXML_Document * doc,
goto error_handler;
}
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"desc url: %s\n", docURL );
)
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"doc = %s\n", xml_str );
)
// store in web server
err_code =
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"desc url: %s\n", docURL );
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"doc = %s\n", xml_str );
// store in web server
err_code =
web_server_set_alias( new_alias, xml_str, strlen( xml_str ),
last_modified );
error_handler:
error_handler:
free( root_path );
free( new_alias );