Compare commits

..

19 Commits

Author SHA1 Message Date
Marcelo Roberto Jimenez
62903b80f0 Missing configure.ac for release 1.6.2.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/tags/release-1.6.2@266 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-12-10 23:19:12 +00:00
Marcelo Roberto Jimenez
6080414dc9 Created tag for release 1.6.2.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/tags/release-1.6.2@262 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-12-10 22:37:04 +00:00
Marcelo Roberto Jimenez
6cbd7f0159 Use C comments instead of C++ in headers.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@260 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-12-10 22:27:20 +00:00
Marcelo Roberto Jimenez
c7c493c043 White spaces.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@259 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-12-10 22:23:20 +00:00
Marcelo Roberto Jimenez
c2f8e8789a Fixed a compilation error due to a missing #ifdef in
upnp/src/genlib/miniserver/miniserver.c. Thanks to Eugene Christensen.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@258 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-12-10 22:12:54 +00:00
Marcelo Roberto Jimenez
76457d0187 White spaces and comments fix.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@257 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-27 05:19:52 +00:00
Marcelo Roberto Jimenez
9f5d49f9fd Fixed a memory leak in upnpapi.c to delete gMiniServerThreadPool in
the call to UpnpFinish(). Thanks to Fabrice Fontaine.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@256 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-27 05:02:50 +00:00
Marcelo Roberto Jimenez
cad4d05cd7 White space fix.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@255 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-27 03:28:23 +00:00
Marcelo Roberto Jimenez
26b8968e0c Removing unnecessary second time set of nodeList to NULL in AdvertiseAndReply().
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@254 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-27 03:07:13 +00:00
Marcelo Roberto Jimenez
d2eaa23b59 Changelog fix to document the unreleased 1.4.7.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@253 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-19 14:39:21 +00:00
Marcelo Roberto Jimenez
b8aec74782 Spec file update.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@248 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-19 13:49:00 +00:00
Marcelo Roberto Jimenez
851cfbc4db Some rework of http_SendMessage(), no change in functionality. Mostly white spaces.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@246 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-13 04:14:17 +00:00
Marcelo Roberto Jimenez
f42bbb6dc2 "make check" was failing because ixml/test/test_document.sh did not
have the executable flag set. Thanks to Steve Bresson.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@245 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-12 03:27:58 +00:00
Marcelo Roberto Jimenez
bd6027c3d1 Changelog update.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@244 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-09 13:17:30 +00:00
Marcelo Roberto Jimenez
e3865bf6b6 Exit message goes to the end of the UpnpFinish().
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@243 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-09 11:53:43 +00:00
Marcelo Roberto Jimenez
27af41e562 Avoid 100% CPU in case of repeated error in select().
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@242 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-09 11:48:30 +00:00
Marcelo Roberto Jimenez
1f05f5d6cc Removing the macro CLIENTONLY() from miniserver.c. It breaks syntax highlight,
not to mention it is awful.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@241 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-09 10:34:12 +00:00
Marcelo Roberto Jimenez
43b9760840 White spaces.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@240 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-09 09:49:54 +00:00
Marcelo Roberto Jimenez
0103424b91 Homekeeping for the next release.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@239 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-08 02:25:38 +00:00
12 changed files with 1959 additions and 1943 deletions

View File

@@ -1,3 +1,24 @@
*******************************************************************************
Version 1.6.2
*******************************************************************************
2007-12-10 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Fixed a compilation error due to a missing #ifdef in
upnp/src/genlib/miniserver/miniserver.c. Thanks to Eugene Christensen.
2007-11-12 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* "make check" was failing because ixml/test/test_document.sh did not
have the executable flag set. Thanks to Steve Bresson.
2007-11-12 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Fixed a memory leak in upnpapi.c to delete gMiniServerThreadPool in
the call to UpnpFinish(). Thanks to Fabrice Fontaine.
2007-11-09 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Added a isleep() call to the error handler of select() in
RunMiniServer(), so that it does not take 100% cpu in case select()
fails repeatedly.
*******************************************************************************
Version 1.6.1
*******************************************************************************
@@ -116,6 +137,10 @@ Version 1.6.0
an interface change in the library and the minor library version was
bumped. Also, the libtool library numbers were changed accordingly.
*******************************************************************************
Version 1.4.7
*******************************************************************************
2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Added support for the Basic Device
(http://www.upnp.org/standardizeddcps/basic.asp) as suggested by

3
THANKS
View File

@@ -16,6 +16,8 @@ exempt of errors.
- Erik Johansson
- Eric Tanguy
- Erwan Velu
- Eugene Christensen
- Fabrice Fontaine
- Fredrik Svensson
- Glen Masgai
- Jiri Zouhar
@@ -34,6 +36,7 @@ exempt of errors.
- Rene Hexel
- Siva Chandran
- Stéphane Corthésy
- Steve Bresson
- Timothy Redaelli
- Titus Winters

View File

@@ -9,7 +9,7 @@
AC_PREREQ(2.60)
AC_INIT([libupnp], [1.6.1], [mroberto@users.sourceforge.net])
AC_INIT([libupnp], [1.6.2], [mroberto@users.sourceforge.net])
###############################################################################
# *Independently* of the above libupnp package version, the libtool version
# of the 3 libraries need to be updated whenever there is a change released:
@@ -84,9 +84,20 @@ AC_INIT([libupnp], [1.6.1], [mroberto@users.sourceforge.net])
#AC_SUBST([LT_VERSION_UPNP], [3:1:0])
#
###############################################################################
# Release 1.6.2:
# "current:revision:age"
#
# - Code has changed in upnp
# revision: 1 -> 2
#
#AC_SUBST([LT_VERSION_IXML], [2:4:0])
#AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2])
#AC_SUBST([LT_VERSION_UPNP], [3:2:0])
#
###############################################################################
AC_SUBST([LT_VERSION_IXML], [2:4:0])
AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2])
AC_SUBST([LT_VERSION_UPNP], [3:1:0])
AC_SUBST([LT_VERSION_UPNP], [3:2:0])
###############################################################################
# Repeating the algorithm so that it is closer to the modificatin place:
# - library code modified: revision++

0
ixml/test/test_document.sh Normal file → Executable file
View File

View File

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

View File

@@ -92,10 +92,8 @@ CLIENTONLY( ithread_mutex_t GlobalClientSubscribeMutex; )
TimerThread gTimerThread;
ThreadPool gRecvThreadPool;
ThreadPool gSendThreadPool;
ThreadPool gRecvThreadPool;
ThreadPool gMiniServerThreadPool;
//Flag to indicate the state of web server
@@ -410,14 +408,15 @@ UpnpFinish()
}
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Inside UpnpFinish : UpnpSdkInit is :%d:\n",
UpnpSdkInit );
"Inside UpnpFinish : UpnpSdkInit is :%d:\n", UpnpSdkInit );
if( UpnpSdkInit == 1 ) {
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"UpnpFinish : UpnpSdkInit is ONE\n" );
}
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool");
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
PrintThreadPoolStats(&gMiniServerThreadPool, __FILE__, __LINE__, "MiniServer Thread Pool");
#ifdef INCLUDE_DEVICE_APIS
if( GetDeviceHandleInfo( &device_handle, &temp ) == HND_DEVICE )
UpnpUnRegisterRootDevice( device_handle );
@@ -429,20 +428,19 @@ UpnpFinish()
#endif
TimerThreadShutdown( &gTimerThread );
StopMiniServer();
#if EXCLUDE_WEB_SERVER == 0
web_server_destroy();
#endif
ThreadPoolShutdown(&gSendThreadPool);
ThreadPoolShutdown(&gMiniServerThreadPool);
ThreadPoolShutdown(&gRecvThreadPool);
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Exiting UpnpFinish : UpnpSdkInit is :%d:\n", UpnpSdkInit);
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
ThreadPoolShutdown(&gSendThreadPool);
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool");
UpnpCloseLog();
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
PrintThreadPoolStats(&gMiniServerThreadPool, __FILE__, __LINE__, "MiniServer Thread Pool");
#ifdef INCLUDE_CLIENT_APIS
ithread_mutex_destroy(&GlobalClientSubscribeMutex);
@@ -461,6 +459,9 @@ UpnpFinish()
#endif
UpnpSdkInit = 0;
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Exiting UpnpFinish : UpnpSdkInit is :%d:\n", UpnpSdkInit);
UpnpCloseLog();
return UPNP_E_SUCCESS;

View File

@@ -42,12 +42,12 @@
#include <sys/wait.h>
#include <unistd.h>
#include <sys/time.h>
#else
#else /* WIN32 */
#include <winsock2.h>
typedef int socklen_t;
#define EAFNOSUPPORT 97
#endif
#endif /* WIN32 */
#include "unixutil.h"
#include "ithread.h"
@@ -91,13 +91,12 @@ static MiniServerState gMServState = MSERV_IDLE;
* Function: SetHTTPGetCallback
*
* Parameters :
* MiniServerCallback callback ; - HTTP Callback to be invoked
* MiniServerCallback callback - HTTP Callback to be invoked
*
* Description : Set HTTP Get Callback
* Description:
* Set HTTP Get Callback
*
* Return: void
*
* Note :
************************************************************************/
void
SetHTTPGetCallback( MiniServerCallback callback )
@@ -109,31 +108,31 @@ SetHTTPGetCallback( MiniServerCallback callback )
* Function: SetSoapCallback
*
* Parameters:
* MiniServerCallback callback ; - SOAP Callback to be invoked
* MiniServerCallback callback - SOAP Callback to be invoked
*
* Description : Set SOAP Callback
* Description:
* Set SOAP Callback
*
* Return: void
*
* Note :
************************************************************************/
#ifdef INCLUDE_DEVICE_APIS
void
SetSoapCallback( MiniServerCallback callback )
{
gSoapCallback = callback;
}
#endif /* INCLUDE_DEVICE_APIS */
/************************************************************************
* Function: SetGenaCallback
*
* Parameters:
* MiniServerCallback callback ; - GENA Callback to be invoked
* MiniServerCallback callback - GENA Callback to be invoked
*
* Description : Set GENA Callback
* Description:
* Set GENA Callback
*
* Return: void
*
* Note :
************************************************************************/
void
SetGenaCallback( MiniServerCallback callback )
@@ -145,17 +144,15 @@ SetGenaCallback( MiniServerCallback callback )
* Function : dispatch_request
*
* Parameters :
* IN SOCKINFO *info ; Socket Information object.
* http_parser_t* hparser ; HTTP parser object.
* IN SOCKINFO *info - Socket Information object.
* http_parser_t* hparser - HTTP parser object.
*
* Description : Based on the type pf message, appropriate callback
* is issued
* Description :
* Based on the type pf message, appropriate callback is issued
*
* Return : int ;
* Return: int
* 0 - On Success
* HTTP_INTERNAL_SERVER_ERROR - Callback is NULL
*
* Note :
************************************************************************/
static int
dispatch_request( IN SOCKINFO * info,
@@ -203,17 +200,15 @@ dispatch_request( IN SOCKINFO * info,
* Function: handle_error
*
* Parameters:
* IN SOCKINFO *info - Socket Inforamtion Object
* int http_error_code - HTTP Error Code
* int major - Major Version Number
* int minor - Minor Version Number
*
* IN SOCKINFO *info ; Socket Inforamtion Object
* int http_error_code ; HTTP Error Code
* int major ; Major Version Number
* int minor ; Minor Version Number
* Description:
* Send Error Message
*
* Description : Send Error Message
*
* Return : void;
*
* Note :
* Return: void
************************************************************************/
static UPNP_INLINE void
handle_error( IN SOCKINFO * info,
@@ -230,12 +225,11 @@ handle_error( IN SOCKINFO * info,
* Parameters:
* void *args ; Request Message to be freed
*
* Description : Free memory assigned for handling request and unitial-
* -ize socket functionality
* Description:
* Free memory assigned for handling request and unitialize socket
* functionality
*
* Return: void
*
* Note :
************************************************************************/
static void
free_handle_request_arg( void *args )
@@ -251,13 +245,12 @@ free_handle_request_arg( void *args )
* Function: handle_request
*
* Parameters:
* void *args ; Request Message to be handled
* void *args - Request Message to be handled
*
* Description : Receive the request and dispatch it for handling
* Description:
* Receive the request and dispatch it for handling
*
* Return: void
*
* Note :
************************************************************************/
static void
handle_request( void *args )
@@ -322,16 +315,14 @@ handle_request( void *args )
* Function: schedule_request_job
*
* Parameters:
* IN int connfd ; Socket Descriptor on which connection is accepted
* IN struct sockaddr_in* clientAddr ; Clients Address information
* IN int connfd - Socket Descriptor on which connection is accepted
* IN struct sockaddr_in* clientAddr - Clients Address information
*
* Description : Initilize the thread pool to handle a request.
* Description:
* Initilize the thread pool to handle a request.
* Sets priority for the job and adds the job to the thread pool
*
*
* Return: void
*
* Note :
************************************************************************/
static UPNP_INLINE void
schedule_request_job( IN int connfd,
@@ -374,29 +365,28 @@ schedule_request_job( IN int connfd,
* Function: RunMiniServer
*
* Parameters:
* MiniServerSockArray *miniSock ; Socket Array
* MiniServerSockArray *miniSock - Socket Array
*
* Description : Function runs the miniserver. The MiniServer accepts a
* Description:
* Function runs the miniserver. The MiniServer accepts a
* new request and schedules a thread to handle the new request.
* Checks for socket state and invokes appropriate read and shutdown
* actions for the Miniserver and SSDP sockets
*
* Return: void
*
* Note :
************************************************************************/
static void
RunMiniServer( MiniServerSockArray * miniSock )
{
struct sockaddr_in clientAddr;
socklen_t clientLen;
SOCKET miniServSock,
connectHnd;
SOCKET miniServStopSock;
SOCKET ssdpSock;
CLIENTONLY( SOCKET ssdpReqSock;
)
SOCKET connectHnd;
SOCKET miniServSock = miniSock->miniServerSock;
SOCKET miniServStopSock = miniSock->miniServerStopSock;
SOCKET ssdpSock = miniSock->ssdpSock;
#ifdef INCLUDE_CLIENT_APIS
SOCKET ssdpReqSock = miniSock->ssdpReqSock;
#endif
fd_set expSet;
fd_set rdSet;
@@ -404,66 +394,55 @@ RunMiniServer( MiniServerSockArray * miniSock )
int byteReceived;
char requestBuf[256];
miniServSock = miniSock->miniServerSock;
miniServStopSock = miniSock->miniServerStopSock;
ssdpSock = miniSock->ssdpSock;
CLIENTONLY( ssdpReqSock = miniSock->ssdpReqSock;
);
gMServState = MSERV_RUNNING;
maxMiniSock = max( miniServSock, miniServStopSock) ;
maxMiniSock = max( maxMiniSock, (SOCKET)(ssdpSock) );
CLIENTONLY( maxMiniSock =
max( maxMiniSock, ( SOCKET ) ( ssdpReqSock ) ) );
#ifdef INCLUDE_CLIENT_APIS
maxMiniSock = max( maxMiniSock, (SOCKET)(ssdpReqSock) );
#endif
++maxMiniSock;
gMServState = MSERV_RUNNING;
while( TRUE ) {
FD_ZERO( &rdSet );
FD_ZERO( &expSet );
FD_SET( miniServStopSock, &expSet );
FD_SET( miniServSock, &rdSet );
FD_SET( miniServStopSock, &rdSet );
FD_SET( ssdpSock, &rdSet );
CLIENTONLY( FD_SET( ssdpReqSock, &rdSet ) );
#ifdef INCLUDE_CLIENT_APIS
FD_SET( ssdpReqSock, &rdSet );
#endif
if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) ==
UPNP_SOCKETERROR ) {
UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in select call !!!\n" );
"Error in select call!\n" );
/* Avoid 100% CPU in case of repeated error in select() */
isleep( 1 );
continue;
} else {
if( FD_ISSET( miniServSock, &rdSet ) ) {
clientLen = sizeof( struct sockaddr_in );
connectHnd = accept( miniServSock,
( struct sockaddr * )&clientAddr,
&clientLen );
( struct sockaddr * )&clientAddr, &clientLen );
if( connectHnd == UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver: Error"
" in accepting connection\n" );
"miniserver: Error in accepting connection\n" );
continue;
}
schedule_request_job( connectHnd, &clientAddr );
}
#ifdef INCLUDE_CLIENT_APIS
// ssdp
CLIENTONLY( if( FD_ISSET( ssdpReqSock, &rdSet ) ) {
readFromSSDPSocket( ssdpReqSock );}
)
if( FD_ISSET( ssdpReqSock, &rdSet ) ) {
readFromSSDPSocket( ssdpReqSock );
}
#endif
if( FD_ISSET( ssdpSock, &rdSet ) ) {
readFromSSDPSocket( ssdpSock );
}
if( FD_ISSET( miniServStopSock, &rdSet ) ) {
clientLen = sizeof( struct sockaddr_in );
memset( ( char * )&clientAddr, 0,
sizeof( struct sockaddr_in ) );
@@ -479,7 +458,6 @@ RunMiniServer( MiniServerSockArray * miniSock )
UpnpPrintf( UPNP_PACKET, MSERV, __FILE__, __LINE__,
"Received multicast packet: \n %s\n",
requestBuf );
if( NULL != strstr( requestBuf, "ShutDown" ) ) {
break;
}
@@ -494,30 +472,29 @@ RunMiniServer( MiniServerSockArray * miniSock )
UpnpCloseSocket( miniServStopSock );
shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
#ifdef INCLUDE_CLIENT_APIS
shutdown( ssdpReqSock, SD_BOTH );
UpnpCloseSocket( ssdpReqSock );
#endif
free( miniSock );
gMServState = MSERV_IDLE;
return;
}
/************************************************************************
* Function: get_port
*
* Parameters:
* int sockfd ; Socket Descriptor
* int sockfd - Socket Descriptor
*
* Description : Returns port to which socket, sockfd, is bound.
* Description:
* Returns port to which socket, sockfd, is bound.
*
* Return : int,
* Return: int
* -1 on error; check errno
* > 0 means port number
*
* Note :
************************************************************************/
static int
get_port( int sockfd )
@@ -544,24 +521,24 @@ get_port( int sockfd )
* Function: get_miniserver_sockets
*
* Parameters:
* MiniServerSockArray *out ; Socket Array
* unsigned short listen_port ; port on which the server is listening
* for incoming connections
* MiniServerSockArray *out - Socket Array
* unsigned short listen_port - port on which the server is
* listening for incoming connections
*
* Description:
* Creates a STREAM socket, binds to INADDR_ANY and listens for
* incoming connecttions. Returns the actual port which the sockets
* sub-system returned.
*
* Description : Creates a STREAM socket, binds to INADDR_ANY and
* listens for incoming connecttions. Returns the actual port which
* the sockets sub-system returned.
* Also creates a DGRAM socket, binds to the loop back address and
* returns the port allocated by the socket sub-system.
*
* Return : int :
* Return: int
* UPNP_E_OUTOF_SOCKET - Failed to create a socket
* UPNP_E_SOCKET_BIND - Bind() failed
* UPNP_E_LISTEN - Listen() failed
* UPNP_E_INTERNAL_ERROR - Port returned by the socket layer is < 0
* UPNP_E_SUCCESS - Success
*
* Note :
************************************************************************/
int
get_miniserver_sockets( MiniServerSockArray * out,
@@ -692,8 +669,8 @@ get_miniserver_sockets( MiniServerSockArray * out,
miniStopSockPort = get_port( miniServerStopSock );
if( miniStopSockPort <= 0 ) {
shutdown( miniServerStopSock, SD_BOTH );
shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( miniServerStopSock );
shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd );
return UPNP_E_INTERNAL_ERROR;
}
@@ -711,10 +688,11 @@ get_miniserver_sockets( MiniServerSockArray * out,
* Function: StartMiniServer
*
* Parameters :
* unsigned short listen_port ; Port on which the server listens for
* unsigned short listen_port - Port on which the server listens for
* incoming connections
*
* Description : Initialize the sockets functionality for the
* Description:
* Initialize the sockets functionality for the
* Miniserver. Initialize a thread pool job to run the MiniServer
* and the job to the thread pool. If listen port is 0, port is
* dynamically picked
@@ -722,17 +700,14 @@ get_miniserver_sockets( MiniServerSockArray * out,
* Use timer mechanism to start the MiniServer, failure to meet the
* allowed delay aborts the attempt to launch the MiniServer.
*
* Return : int ;
* Actual port socket is bound to - On Success:
* Return: int
* Actual port socket is bound to - On Success
* A negative number UPNP_E_XXX - On Error
* Note :
************************************************************************/
int
StartMiniServer( unsigned short listen_port )
{
int success;
int count;
int max_count = 10000;
@@ -755,12 +730,10 @@ StartMiniServer( unsigned short listen_port )
}
if( ( success = get_ssdp_sockets( miniSocket ) ) != UPNP_E_SUCCESS ) {
shutdown( miniSocket->miniServerSock, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerSock );
shutdown( miniSocket->miniServerStopSock, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerStopSock );
free( miniSocket );
return success;
@@ -776,14 +749,15 @@ StartMiniServer( unsigned short listen_port )
if( success < 0 ) {
shutdown( miniSocket->miniServerSock, SD_BOTH );
shutdown( miniSocket->miniServerStopSock, SD_BOTH );
shutdown( miniSocket->ssdpSock, SD_BOTH );
CLIENTONLY( shutdown( miniSocket->ssdpReqSock, SD_BOTH ) );
UpnpCloseSocket( miniSocket->miniServerSock );
shutdown( miniSocket->miniServerStopSock, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerStopSock );
shutdown( miniSocket->ssdpSock, SD_BOTH );
UpnpCloseSocket( miniSocket->ssdpSock );
CLIENTONLY( UpnpCloseSocket( miniSocket->ssdpReqSock ) );
#ifdef INCLUDE_CLIENT_APIS
shutdown( miniSocket->ssdpReqSock, SD_BOTH );
UpnpCloseSocket( miniSocket->ssdpReqSock );
#endif
return UPNP_E_OUTOF_MEMORY;
}
@@ -796,16 +770,16 @@ StartMiniServer( unsigned short listen_port )
// taking too long to start that thread
if( count >= max_count ) {
shutdown( miniSocket->miniServerSock, SD_BOTH );
shutdown( miniSocket->miniServerStopSock, SD_BOTH );
shutdown( miniSocket->ssdpSock, SD_BOTH );
CLIENTONLY( shutdown( miniSocket->ssdpReqSock, SD_BOTH ) );
UpnpCloseSocket( miniSocket->miniServerSock );
shutdown( miniSocket->miniServerStopSock, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerStopSock );
shutdown( miniSocket->ssdpSock, SD_BOTH );
UpnpCloseSocket( miniSocket->ssdpSock );
CLIENTONLY( UpnpCloseSocket( miniSocket->ssdpReqSock ) );
#ifdef INCLUDE_CLIENT_APIS
shutdown( miniSocket->ssdpReqSock, SD_BOTH );
UpnpCloseSocket( miniSocket->ssdpReqSock );
#endif
return UPNP_E_INTERNAL_ERROR;
}
@@ -817,30 +791,30 @@ StartMiniServer( unsigned short listen_port )
* Function: StopMiniServer
*
* Parameters:
* void ;
* void
*
* Description : Stop and Shutdown the MiniServer and free socket
* Description:
* Stop and Shutdown the MiniServer and free socket
* resources.
*
* Return : int ;
* Return: int
* Always returns 0
*
* Note :
************************************************************************/
int
StopMiniServer( void )
{
int socklen = sizeof( struct sockaddr_in ),
sock;
int socklen = sizeof( struct sockaddr_in );
int sock;
struct sockaddr_in ssdpAddr;
char buf[256] = "ShutDown";
int bufLen = strlen( buf );
if( gMServState == MSERV_RUNNING )
if( gMServState == MSERV_RUNNING ) {
gMServState = MSERV_STOPPING;
else
} else {
return 0;
}
sock = socket( AF_INET, SOCK_DGRAM, 0 );
if( sock == UPNP_INVALID_SOCKET ) {
@@ -864,3 +838,4 @@ StopMiniServer( void )
UpnpCloseSocket( sock );
return 0;
}

View File

@@ -70,8 +70,10 @@
#include "sock.h"
#include "webserver.h"
#define DOSOCKET_READ 1
#define DOSOCKET_WRITE 0
const int CHUNK_HEADER_SIZE = 10;
const int CHUNK_TAIL_SIZE = 10;
/************************************************************************
* Function: http_FixUrl
@@ -80,7 +82,8 @@
* IN uri_type* url; URL to be validated and fixed
* OUT uri_type* fixed_url; URL after being fixed.
*
* Description: Validates URL
* Description:
* Validates URL
*
* Returns:
* UPNP_E_INVALID_URL
@@ -110,6 +113,7 @@ http_FixUrl( IN uri_type * url,
return UPNP_E_SUCCESS;
}
/************************************************************************
* Function: http_FixStrUrl
*
@@ -118,7 +122,8 @@ http_FixUrl( IN uri_type * url,
* IN int urlstrlen ; Length of the character string
* OUT uri_type* fixed_url ; Fixed and corrected URL
*
* Description: Parses URL and then validates URL
* Description:
* Parses URL and then validates URL
*
* Returns:
* UPNP_E_INVALID_URL
@@ -138,6 +143,7 @@ http_FixStrUrl( IN char *urlstr,
return http_FixUrl( &url, fixed_url );
}
/************************************************************************
* Function: http_Connect
*
@@ -145,8 +151,8 @@ http_FixStrUrl( IN char *urlstr,
* IN uri_type* destination_url; URL containing destination information
* OUT uri_type *url; Fixed and corrected URL
*
* Description: Gets destination address from URL and then connects to the
* remote end
* Description:
* Gets destination address from URL and then connects to the remote end
*
* Returns:
* socket descriptor on sucess
@@ -180,19 +186,21 @@ http_Connect( IN uri_type * destination_url,
return connfd;
}
/************************************************************************
* Function: http_RecvMessage
*
* Parameters:
* IN SOCKINFO *info; Socket information object
* OUT http_parser_t* parser, HTTP parser object
* OUT http_parser_t* parser; HTTP parser object
* IN http_method_t request_method; HTTP request method
* IN OUT int* timeout_secs; time out
* OUT int* http_error_code; HTTP error code returned
*
* Description: Get the data on the socket and take actions based on the
* read data to modify the parser objects buffer. If an error is reported
* while parsing the data, the error code is passed in the http_errr_code
* Description:
* Get the data on the socket and take actions based on the read data
* to modify the parser objects buffer. If an error is reported while
* parsing the data, the error code is passed in the http_errr_code
* parameter
*
* Returns:
@@ -266,6 +274,7 @@ http_RecvMessage( IN SOCKINFO * info,
}
}
/************************************************************************
* Function: http_SendMessage
*
@@ -274,7 +283,8 @@ http_RecvMessage( IN SOCKINFO * info,
* IN OUT int * TimeOut ; time out value
* IN const char* fmt, ... Pattern format to take actions upon
*
* Description: Sends a message to the destination based on the
* Description:
* Sends a message to the destination based on the
* IN const char* fmt parameter
* fmt types:
* 'f': arg = const char * file name
@@ -297,22 +307,19 @@ http_SendMessage( IN SOCKINFO * info,
IN const char *fmt,
... )
{
#define CHUNK_HEADER_SIZE 10
#define CHUNK_TAIL_SIZE 10
char c;
char *buf = NULL;
size_t buf_length;
char *filename = NULL;
FILE *Fp;
int num_read,
num_written;
int num_read;
int num_written;
off_t amount_to_be_read = 0;
va_list argp;
char *file_buf = NULL,
*ChunkBuf = NULL;
char *file_buf = NULL;
char *ChunkBuf = NULL;
struct SendInstruction *Instr = NULL;
char Chunk_Header[10];
char Chunk_Header[CHUNK_HEADER_SIZE];
int RetVal = 0;
// 10 byte allocated for chunk header.
@@ -322,44 +329,40 @@ http_SendMessage( IN SOCKINFO * info,
while( ( c = *fmt++ ) != 0 ) {
if( c == 'I' ) {
Instr = ( struct SendInstruction * )
va_arg( argp, struct SendInstruction * );
Instr = va_arg(argp, struct SendInstruction *);
assert( Instr );
if( Instr->ReadSendSize >= 0 )
if( Instr->ReadSendSize >= 0 ) {
amount_to_be_read = Instr->ReadSendSize;
else
} else {
amount_to_be_read = Data_Buf_Size;
if( amount_to_be_read < WEB_SERVER_BUF_SIZE )
Data_Buf_Size = amount_to_be_read;
ChunkBuf = ( char * )malloc( Data_Buf_Size +
CHUNK_HEADER_SIZE +
CHUNK_TAIL_SIZE );
if( !ChunkBuf )
return UPNP_E_OUTOF_MEMORY;
file_buf = ChunkBuf + 10;
}
if( c == 'f' ) { // file name
if( amount_to_be_read < WEB_SERVER_BUF_SIZE ) {
Data_Buf_Size = amount_to_be_read;
}
filename = ( char * )va_arg( argp, char * );
ChunkBuf = (char *)malloc(
Data_Buf_Size + CHUNK_HEADER_SIZE + CHUNK_TAIL_SIZE);
if( !ChunkBuf ) {
return UPNP_E_OUTOF_MEMORY;
}
if( Instr && Instr->IsVirtualFile )
file_buf = ChunkBuf + CHUNK_HEADER_SIZE;
} else if( c == 'f' ) {
// file name
filename = va_arg(argp, char *);
if( Instr && Instr->IsVirtualFile ) {
Fp = (virtualDirCallback.open)( filename, UPNP_READ );
else
} else {
Fp = fopen( filename, "rb" );
}
if( Fp == NULL ) {
free( ChunkBuf );
return UPNP_E_FILE_READ_ERROR;
}
assert( Fp );
if( Instr && Instr->IsRangeActive && Instr->IsVirtualFile ) {
if( virtualDirCallback.seek( Fp, Instr->RangeOffset,
SEEK_CUR ) != 0 ) {
@@ -375,26 +378,14 @@ http_SendMessage( IN SOCKINFO * info,
while( amount_to_be_read ) {
if( Instr ) {
if( amount_to_be_read >= Data_Buf_Size ) {
if( Instr->IsVirtualFile )
num_read = virtualDirCallback.read( Fp,
file_buf,
Data_Buf_Size );
else
num_read = fread( file_buf, 1, Data_Buf_Size,
Fp );
int n = (amount_to_be_read >= Data_Buf_Size) ?
Data_Buf_Size : amount_to_be_read;
if( Instr->IsVirtualFile ) {
num_read = virtualDirCallback.read( Fp, file_buf, n );
} else {
if( Instr->IsVirtualFile )
num_read = virtualDirCallback.read( Fp,
file_buf,
amount_to_be_read );
else
num_read = fread( file_buf, 1,
amount_to_be_read, Fp );
num_read = fread( file_buf, 1, n, Fp );
}
amount_to_be_read = amount_to_be_read - num_read;
if( Instr->ReadSendSize < 0 ) {
// read until close
amount_to_be_read = Data_Buf_Size;
@@ -403,12 +394,11 @@ http_SendMessage( IN SOCKINFO * info,
num_read = fread( file_buf, 1, Data_Buf_Size, Fp );
}
if( num_read == 0 ) // EOF so no more to send.
{
if( num_read == 0 ) {
// EOF so no more to send.
if( Instr && Instr->IsChunkActive ) {
num_written = sock_write( info, "0\r\n\r\n",
strlen( "0\r\n\r\n" ),
TimeOut );
char *str = "0\r\n\r\n";
num_written = sock_write(info, str, strlen(str), TimeOut);
} else {
RetVal = UPNP_E_FILE_READ_ERROR;
}
@@ -432,47 +422,41 @@ http_SendMessage( IN SOCKINFO * info,
// on the top of the buffer.
//file_buf[num_read+strlen(Chunk_Header)] = NULL;
//printf("Sending %s\n",file_buf-strlen(Chunk_Header));
num_written = sock_write( info,
file_buf -
strlen( Chunk_Header ),
num_read +
strlen( Chunk_Header ) + 2,
TimeOut );
num_written = sock_write(
info, file_buf - strlen( Chunk_Header ),
num_read + strlen( Chunk_Header ) + 2, TimeOut );
if( num_written !=
num_read + ( int )strlen( Chunk_Header )
+ 2 ) {
goto Cleanup_File; //Send error nothing we can do.
num_read + ( int )strlen( Chunk_Header ) + 2 ) {
// Send error nothing we can do.
goto Cleanup_File;
}
} else {
// write data
num_written = sock_write( info, file_buf, num_read,
TimeOut );
num_written = sock_write( info, file_buf, num_read, TimeOut );
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
">>> (SENT) >>>\n%.*s\n------------\n",
( int )num_written, file_buf );
// Send error nothing we can do
if( num_written != num_read ) {
goto Cleanup_File;
}
}
} //While
} // while
Cleanup_File:
va_end( argp );
if( Instr && Instr->IsVirtualFile )
if( Instr && Instr->IsVirtualFile ) {
virtualDirCallback.close( Fp );
else
} else {
fclose( Fp );
}
free( ChunkBuf );
return RetVal;
} else if( c == 'b' ) { // memory buffer
buf = ( char * )va_arg( argp, char * );
buf_length = ( size_t ) va_arg( argp, size_t );
} else if( c == 'b' ) {
// memory buffer
buf = va_arg(argp, char *);
buf_length = va_arg(argp, size_t);
if( buf_length > 0 ) {
num_written = sock_write( info, buf, buf_length, TimeOut );
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
@@ -480,11 +464,12 @@ http_SendMessage( IN SOCKINFO * info,
"%.*s\nbuf_length=%d, num_written=%d\n"
"------------\n",
(int)buf_length, buf, (int)buf_length, num_written );
if( ( size_t ) num_written != buf_length )
if( (size_t)num_written != buf_length ) {
goto end;
}
}
}
}
end:
va_end( argp );
@@ -492,6 +477,7 @@ http_SendMessage( IN SOCKINFO * info,
return 0;
}
/************************************************************************
* Function: http_RequestAndResponse
*
@@ -504,7 +490,8 @@ http_SendMessage( IN SOCKINFO * info,
* IN int timeout_secs; time out value
* OUT http_parser_t* response; Parser object to receive the repsonse
*
* Description: Initiates socket, connects to the destination, sends a
* Description:
* Initiates socket, connects to the destination, sends a
* request and waits for the response from the remote end
*
* Returns:
@@ -564,25 +551,25 @@ http_RequestAndResponse( IN uri_type * destination,
return ret_code;
}
/************************************************************************
* Function: http_Download
*
* Parameters:
* IN const char* url_str: String as a URL
* IN int timeout_secs: time out value
* OUT char** document: buffer to store the document extracted
* IN const char* url_str; String as a URL
* IN int timeout_secs; time out value
* OUT char** document; buffer to store the document extracted
* from the donloaded message.
* OUT int* doc_length: length of the extracted document
* OUT char* content_type: Type of content
* OUT int* doc_length; length of the extracted document
* OUT char* content_type; Type of content
*
* Description : Download the document message and extract the document
* Description:
* Download the document message and extract the document
* from the message.
*
* Return : int;
* UPNP_E_SUCCESS;
* UPNP_E_INVALID_URL;
*
* Note :
* Return: int
* UPNP_E_SUCCESS
* UPNP_E_INVALID_URL
************************************************************************/
int
http_Download( IN const char *url_str,
@@ -684,8 +671,8 @@ http_Download( IN const char *url_str,
if( ( *doc_length = ( int )response.msg.entity.length ) == 0 ) {
// 0-length msg
*document = NULL;
} else if( response.msg.status_code == HTTP_OK ) //LEAK_FIX_MK
{
} else if( response.msg.status_code == HTTP_OK ) {
//LEAK_FIX_MK
// copy entity
entity_start = response.msg.entity.buf; // what we want
msg_length = response.msg.msg.length; // save for posterity
@@ -727,12 +714,13 @@ typedef struct HTTPPOSTHANDLE {
* Parameters:
* const char *url_str; String as a URL
* membuffer *request; Buffer containing the request
* uri_type *url ; URI object containing the scheme, path
* query token, etc.
* uri_type *url; URI object containing the scheme,
* path query token, etc.
* int contentLength; length of content
* const char *contentType; Type of content
*
* Description: Makes the message for the HTTP POST message
* Description:
* Makes the message for the HTTP POST message
*
* Returns:
* UPNP_E_INVALID_URL
@@ -834,15 +822,14 @@ MakePostMessage( const char *url_str,
* IN unsigned int *size: Size of the data to be sent.
* IN int timeout: time out value
*
* Description : Formats data if format used is UPNP_USING_CHUNKED.
* Description:
* Formats data if format used is UPNP_USING_CHUNKED.
* Writes data on the socket connected to the peer.
*
* Return : int ;
* Return: int
* UPNP_E_SUCCESS - On Success
* UPNP_E_INVALID_PARAM - Invalid Parameter
* -1 - On Socket Error.
*
* Note :
************************************************************************/
int
http_WriteHttpPost( IN void *Handle,
@@ -864,17 +851,18 @@ http_WriteHttpPost( IN void *Handle,
if( handle->contentLength == UPNP_USING_CHUNKED ) {
if( ( *size ) ) {
int tempSize = 0;
tempbuf = ( char * )malloc(
*size + CHUNK_HEADER_SIZE + CHUNK_TAIL_SIZE );
if ( tempbuf == NULL) {
return UPNP_E_OUTOF_MEMORY;
}
tempbuf =
( char * )malloc( ( *size ) + CHUNK_HEADER_SIZE +
CHUNK_TAIL_SIZE );
if ( tempbuf == NULL) return UPNP_E_OUTOF_MEMORY;
sprintf( tempbuf, "%x\r\n", ( *size ) ); //begin chunk
// begin chunk
sprintf( tempbuf, "%x\r\n", ( *size ) );
tempSize = strlen( tempbuf );
memcpy( tempbuf + tempSize, buf, ( *size ) );
memcpy( tempbuf + tempSize + ( *size ), "\r\n", 2 ); //end of chunk
memcpy( tempbuf + tempSize + ( *size ), "\r\n", 2 );
// end of chunk
tempbufSize = tempSize + ( *size ) + 2;
freeTempbuf = 1;
}
@@ -903,20 +891,19 @@ http_WriteHttpPost( IN void *Handle,
* Function: http_CloseHttpPost
*
* Parameters:
* IN void *Handle : Handle to the http post object
* IN OUT int *httpStatus : HTTP status returned on receiving a
* IN void *Handle; Handle to the http post object
* IN OUT int *httpStatus; HTTP status returned on receiving a
* response message
* IN int timeout : time out value
* IN int timeout; time out value
*
* Description : Sends remaining data if using UPNP_USING_CHUNKED
* Description:
* Sends remaining data if using UPNP_USING_CHUNKED
* format. Receives any more messages. Destroys socket and any socket
* associated memory. Frees handle associated with the HTTP POST msg.
*
* Return : int ;
* UPNP_E_SUCCESS - On Sucess ;
* UPNP_E_INVALID_PARAM - Invalid Parameter;
*
* Note :
* Return: int
* UPNP_E_SUCCESS - On Sucess
* UPNP_E_INVALID_PARAM - Invalid Parameter
************************************************************************/
int
http_CloseHttpPost( IN void *Handle,
@@ -957,25 +944,24 @@ http_CloseHttpPost( IN void *Handle,
* Function: http_OpenHttpPost
*
* Parameters:
* IN const char *url_str : String as a URL
* IN OUT void **Handle : Pointer to buffer to store HTTP
* IN const char *url_str; String as a URL
* IN OUT void **Handle; Pointer to buffer to store HTTP
* post handle
* IN const char *contentType : Type of content
* IN int contentLength : length of content
* IN int timeout : time out value
* IN const char *contentType; Type of content
* IN int contentLength; length of content
* IN int timeout; time out value
*
* Description : Makes the HTTP POST message, connects to the peer,
* Description:
* Makes the HTTP POST message, connects to the peer,
* sends the HTTP POST request. Adds the post handle to buffer of
* such handles
*
* Return : int;
* UPNP_E_SUCCESS - On Sucess ;
* UPNP_E_INVALID_PARAM - Invalid Paramter ;
* UPNP_E_OUTOF_MEMORY ;
* UPNP_E_SOCKET_ERROR ;
* UPNP_E_SOCKET_CONNECT ;
*
* Note :
* UPNP_E_SUCCESS - On Sucess
* UPNP_E_INVALID_PARAM - Invalid Parameter
* UPNP_E_OUTOF_MEMORY
* UPNP_E_SOCKET_ERROR
* UPNP_E_SOCKET_CONNECT
************************************************************************/
int
http_OpenHttpPost( IN const char *url_str,
@@ -1063,7 +1049,8 @@ typedef struct HTTPGETHANDLE {
* uri_type *url ; URI object containing the scheme, path
* query token, etc.
*
* Description: Makes the message for the HTTP GET method
* Description:
* Makes the message for the HTTP GET method
*
* Returns:
* UPNP_E_INVALID_URL
@@ -1153,16 +1140,15 @@ MakeGetMessage( const char *url_str,
* IN OUT int *timeout_secs; time out value
* IN OUT int *http_error_code; HTTP errror code returned
*
* Description : Parses already exiting data. If not complete reads more
* Description:
* Parses already exiting data. If not complete reads more
* data on the connected socket. The read data is then parsed. The
* same methid is carried out for headers.
*
* Return : int ;
* Return: int
* PARSE_OK - On Success
* PARSE_FAILURE - Failure to parse data correctly
* UPNP_E_BAD_HTTPMSG - Socker read() returns an error
*
* Note :
************************************************************************/
int
ReadResponseLineAndHeaders( IN SOCKINFO * info,
@@ -1273,22 +1259,21 @@ ReadResponseLineAndHeaders( IN SOCKINFO * info,
* Function: http_ReadHttpGet
*
* Parameters:
* IN void *Handle : Handle to the HTTP get object
* IN OUT char *buf : Buffer to get the read and parsed data
* IN OUT unsigned int *size : Size of the buffer passed
* IN int timeout : time out value
* IN void *Handle; Handle to the HTTP get object
* IN OUT char *buf; Buffer to get the read and parsed data
* IN OUT unsigned int *size; Size of the buffer passed
* IN int timeout; time out value
*
* Description : Parses already existing data, then gets new data.
* Description:
* Parses already existing data, then gets new data.
* Parses and extracts information from the new data.
*
* Return : int ;
* UPNP_E_SUCCESS - On Sucess ;
* UPNP_E_INVALID_PARAM - Invalid Parameter;
* UPNP_E_BAD_RESPONSE ;
* UPNP_E_BAD_HTTPMSG ;
* UPNP_E_CANCELED ;
*
* Note :
* Return: int
* UPNP_E_SUCCESS - On Sucess
* UPNP_E_INVALID_PARAM - Invalid Parameter
* UPNP_E_BAD_RESPONSE
* UPNP_E_BAD_HTTPMSG
* UPNP_E_CANCELED
************************************************************************/
int
http_ReadHttpGet( IN void *Handle,
@@ -1398,18 +1383,16 @@ http_ReadHttpGet( IN void *Handle,
* Function: http_HttpGetProgress
*
* Parameters:
* IN void *Handle : Handle to the HTTP get object
* OUT unsigned int *length : Buffer to get the read and parsed data
* OUT unsigned int *total : Size of tge buffer passed
* IN void *Handle; Handle to the HTTP get object
* OUT unsigned int *length; Buffer to get the read and parsed data
* OUT unsigned int *total; Size of tge buffer passed
*
* Description : Extracts information from the Handle to the HTTP get
* object.
* Description:
* Extracts information from the Handle to the HTTP get object.
*
* Return : int ;
* UPNP_E_SUCCESS - On Sucess ;
* UPNP_E_INVALID_PARAM - Invalid Parameter;
*
* Note :
* Return: int
* UPNP_E_SUCCESS - On Sucess
* UPNP_E_INVALID_PARAM - Invalid Parameter
************************************************************************/
int http_HttpGetProgress( IN void *Handle,
OUT unsigned int *length,
@@ -1431,13 +1414,12 @@ int http_HttpGetProgress( IN void *Handle,
* Parameters:
* IN void *Handle; Handle to HTTP get object
*
* Description : Set the cancel flag of the HttpGet handle
* Description:
* Set the cancel flag of the HttpGet handle
*
* Return : int ;
* Return: int
* UPNP_E_SUCCESS - On Success
* UPNP_E_INVALID_PARAM - Invalid Parameter
*
* Note :
************************************************************************/
int
http_CancelHttpGet( IN void *Handle )
@@ -1460,14 +1442,13 @@ http_CancelHttpGet( IN void *Handle )
* Parameters:
* IN void *Handle; Handle to HTTP get object
*
* Description : Clears the handle allocated for the HTTP GET operation
* Description:
* Clears the handle allocated for the HTTP GET operation
* Clears socket states and memory allocated for socket operations.
*
* Return : int ;
* Return: int
* UPNP_E_SUCCESS - On Success
* UPNP_E_INVALID_PARAM - Invalid Parameter
*
* Note :
************************************************************************/
int
http_CloseHttpGet( IN void *Handle )
@@ -1498,19 +1479,17 @@ http_CloseHttpGet( IN void *Handle )
* response message
* IN int timeout: time out value
*
* Description : Makes the HTTP GET message, connects to the peer,
* Description:
* Makes the HTTP GET message, connects to the peer,
* sends the HTTP GET request, gets the response and parses the
* response.
*
* Return : int;
* UPNP_E_SUCCESS - On Success ;
* UPNP_E_INVALID_PARAM - Invalid Paramters ;
* UPNP_E_OUTOF_MEMORY ;
* UPNP_E_SOCKET_ERROR ;
* UPNP_E_BAD_RESPONSE ;
*
* Note :
*
* Return: int
* UPNP_E_SUCCESS - On Success
* UPNP_E_INVALID_PARAM - Invalid Paramters
* UPNP_E_OUTOF_MEMORY
* UPNP_E_SOCKET_ERROR
* UPNP_E_BAD_RESPONSE
************************************************************************/
int
http_OpenHttpGet( IN const char *url_str,
@@ -1527,30 +1506,27 @@ http_OpenHttpGet( IN const char *url_str,
* Function: http_OpenHttpGetProxy
*
* Parameters:
* IN const char *url_str : String as a URL
* IN const char *proxy_str : String as a URL
* IN OUT void **Handle : Pointer to buffer to store HTTP
* IN const char *url_str; String as a URL
* IN const char *proxy_str; String as a URL
* IN OUT void **Handle; Pointer to buffer to store HTTP
* post handle
* IN OUT char **contentType : Type of content
* OUT int *contentLength : length of content
* OUT int *httpStatus : HTTP status returned on receiving a
* IN OUT char **contentType; Type of content
* OUT int *contentLength; length of content
* OUT int *httpStatus; HTTP status returned on receiving a
* response message
* IN int timeout: time out value
*
* Description : Makes the HTTP GET message, connects to the peer,
* sends the HTTP GET request, gets the response and parses the
* response.
* Description:
* Makes the HTTP GET message, connects to the peer,
* sends the HTTP GET request, gets the response and parses the response.
* If a proxy URL is defined then the connection is made there.
*
* Return : int;
* UPNP_E_SUCCESS - On Success ;
* UPNP_E_INVALID_PARAM - Invalid Paramters ;
* UPNP_E_OUTOF_MEMORY ;
* UPNP_E_SOCKET_ERROR ;
* UPNP_E_BAD_RESPONSE ;
*
* Note :
*
* Return: int
* UPNP_E_SUCCESS - On Success
* UPNP_E_INVALID_PARAM - Invalid Paramters
* UPNP_E_OUTOF_MEMORY
* UPNP_E_SOCKET_ERROR
* UPNP_E_BAD_RESPONSE
************************************************************************/
int
http_OpenHttpGetProxy( IN const char *url_str,
@@ -1685,22 +1661,21 @@ http_OpenHttpGetProxy( IN const char *url_str,
* Function: http_SendStatusResponse
*
* Parameters:
* IN SOCKINFO *info : Socket information object
* IN int http_status_code : error code returned while making
* IN SOCKINFO *info; Socket information object
* IN int http_status_code; error code returned while making
* or sending the response message
* IN int request_major_version : request major version
* IN int request_minor_version : request minor version
* IN int request_major_version; request major version
* IN int request_minor_version; request minor version
*
* Description : Generate a response message for the status query and
* send the status response.
* Description:
* Generate a response message for the status query and send the
* status response.
*
* Return : int;
* Return: int
* 0 -- success
* UPNP_E_OUTOF_MEMORY
* UPNP_E_SOCKET_WRITE
* UPNP_E_TIMEDOUT
*
* Note :
************************************************************************/
int
http_SendStatusResponse( IN SOCKINFO * info,
@@ -1736,23 +1711,26 @@ http_SendStatusResponse( IN SOCKINFO * info,
return ret;
}
/************************************************************************
* Function: http_MakeMessage
*
* Parameters:
* INOUT membuffer* buf : buffer with the contents of the
* INOUT membuffer* buf; buffer with the contents of the
* message
* IN int http_major_version : HTTP major version
* IN int http_minor_version : HTTP minor version
* IN const char* fmt : Pattern format
* ... :
* IN int http_major_version; HTTP major version
* IN int http_minor_version; HTTP minor version
* IN const char* fmt; Pattern format
* ...;
*
* Description : Generate an HTTP message based on the format that is
* specified in the input parameters.
* Description:
* Generate an HTTP message based on the format that is specified
* in the input parameters.
*
* fmt types:
* 'B': arg = int status_code
* appends content-length, content-type and HTML body for given code
* appends content-length, content-type and HTML body
* for given code
* 'b': arg1 = const char* buf;
* arg2 = size_t buf_length memory ptr
* 'C': (no args) appends a HTTP CONNECTION: close header
@@ -1778,12 +1756,10 @@ http_SendStatusResponse( IN SOCKINFO * info,
* 'U': (no args) appends HTTP USER-AGENT: header
* 'X': arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent
*
* Return : int;
* Return: int
* 0 - On Success
* UPNP_E_OUTOF_MEMORY
* UPNP_E_INVALID_URL;
*
* Note :
* UPNP_E_INVALID_URL
************************************************************************/
int
http_MakeMessage( INOUT membuffer * buf,
@@ -2038,21 +2014,20 @@ error_handler:
return error_code;
}
/************************************************************************
* Function: http_CalcResponseVersion
*
* Parameters:
* IN int request_major_vers : Request major version
* IN int request_minor_vers : Request minor version
* OUT int* response_major_vers : Response mojor version
* OUT int* response_minor_vers : Response minor version
* IN int request_major_vers; Request major version
* IN int request_minor_vers; Request minor version
* OUT int* response_major_vers; Response mojor version
* OUT int* response_minor_vers; Response minor version
*
* Description : Calculate HTTP response versions based on the request
* versions.
* Description:
* Calculate HTTP response versions based on the request versions.
*
* Return: void
*
* Note :
************************************************************************/
void
http_CalcResponseVersion( IN int request_major_vers,
@@ -2080,7 +2055,8 @@ http_CalcResponseVersion( IN int request_major_vers,
* uri_type *url; URI object containing the scheme, path
* query token, etc.
*
* Description: Makes the message for the HTTP GET method
* Description:
* Makes the message for the HTTP GET method
*
* Returns:
* UPNP_E_INVALID_URL
@@ -2167,28 +2143,26 @@ MakeGetMessageEx( const char *url_str,
* Function: http_OpenHttpGetEx
*
* Parameters:
* IN const char *url_str : String as a URL
* IN OUT void **Handle : Pointer to buffer to store HTTP
* IN const char *url_str; String as a URL
* IN OUT void **Handle; Pointer to buffer to store HTTP
* post handle
* IN OUT char **contentType : Type of content
* OUT int *contentLength : length of content
* OUT int *httpStatus : HTTP status returned on receiving a
* IN OUT char **contentType; Type of content
* OUT int *contentLength; length of content
* OUT int *httpStatus; HTTP status returned on receiving a
* response message
* IN int timeout : time out value
* IN int timeout; time out value
*
* Description : Makes the HTTP GET message, connects to the peer,
* Description:
* Makes the HTTP GET message, connects to the peer,
* sends the HTTP GET request, gets the response and parses the
* response.
*
* Return : int;
* UPNP_E_SUCCESS - On Success ;
* UPNP_E_INVALID_PARAM - Invalid Paramters ;
* UPNP_E_OUTOF_MEMORY ;
* UPNP_E_SOCKET_ERROR ;
* UPNP_E_BAD_RESPONSE ;
*
* Note :
*
* Return: int
* UPNP_E_SUCCESS - On Success
* UPNP_E_INVALID_PARAM - Invalid Paramters
* UPNP_E_OUTOF_MEMORY
* UPNP_E_SOCKET_ERROR
* UPNP_E_BAD_RESPONSE
************************************************************************/
int
http_OpenHttpGetEx( IN const char *url_str,
@@ -2335,19 +2309,18 @@ http_OpenHttpGetEx( IN const char *url_str,
return errCode;
}
/************************************************************************
* Function: get_sdk_info
*
* Parameters:
* OUT char *info : buffer to store the operating system
* information
* OUT char *info; buffer to store the operating system information
*
* Description : Returns the server information for the operating
* system
* Description:
* Returns the server information for the operating system
*
* Return : UPNP_INLINE void
*
* Note :
* Return:
* UPNP_INLINE void
************************************************************************/
// 'info' should have a size of at least 100 bytes
void
@@ -2356,11 +2329,18 @@ get_sdk_info( OUT char *info )
#ifdef WIN32
OSVERSIONINFO versioninfo;
versioninfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&versioninfo)!=0)
sprintf( info, "%d.%d.%d %d/%s, UPnP/1.0, Portable SDK for UPnP devices/"PACKAGE_VERSION"\r\n",
versioninfo.dwMajorVersion, versioninfo.dwMinorVersion, versioninfo.dwBuildNumber, versioninfo.dwPlatformId, versioninfo.szCSDVersion );
else
if (GetVersionEx(&versioninfo)!=0) {
sprintf( info,
"%d.%d.%d %d/%s, UPnP/1.0, Portable SDK for UPnP devices/"PACKAGE_VERSION"\r\n",
versioninfo.dwMajorVersion,
versioninfo.dwMinorVersion,
versioninfo.dwBuildNumber,
versioninfo.dwPlatformId,
versioninfo.szCSDVersion );
} else {
*info = '\0';
}
#else
int ret_code;
struct utsname sys_info;
@@ -2369,9 +2349,10 @@ get_sdk_info( OUT char *info )
if( ret_code == -1 ) {
*info = '\0';
}
sprintf( info, "%s/%s, UPnP/1.0, Portable SDK for UPnP devices/"
PACKAGE_VERSION "\r\n",
sys_info.sysname, sys_info.release );
sprintf( info,
"%s/%s, UPnP/1.0, Portable SDK for UPnP devices/"PACKAGE_VERSION "\r\n",
sys_info.sysname,
sys_info.release );
#endif
}

View File

@@ -29,10 +29,10 @@
//
///////////////////////////////////////////////////////////////////////////
/************************************************************************
/******************************************************************************
* Purpose: This file defines the Web Server and has functions to carry out
* operations of the Web Server.
************************************************************************/
******************************************************************************/
#include "config.h"
#include <assert.h>
@@ -64,7 +64,11 @@
/*
Response Types
*/
enum resp_type { RESP_FILEDOC, RESP_XMLDOC, RESP_HEADERS, RESP_WEBDOC,
enum resp_type {
RESP_FILEDOC,
RESP_XMLDOC,
RESP_HEADERS,
RESP_WEBDOC,
RESP_POST };
// mapping of file extension to content-type of document
@@ -182,12 +186,9 @@ static const char *gEncodedMediaTypes =
"zip\0" APPLICATION_STR "zip\0" "\0";
// *** end ***
/***********************************************************************/
/*
/************************************************************************
module variables - Globals, static and externs
*/
/***********************************************************************/
************************************************************************/
static struct document_type_t gMediaTypeList[NUM_MEDIA_TYPES];
membuffer gDocumentRootDir; // a local dir which serves as webserver root
static struct xml_alias_t gAliasDoc; // XML document
@@ -589,10 +590,9 @@ web_server_destroy( void )
* Parameters:
* IN const char* filename ; Filename having the description document
* OUT struct File_Info * info ; File information object having file
* attributes such as filelength, when was
* the file last modified, whether a file
* or a directory and whether the file or
* directory is readable.
* attributes such as filelength, when was the file last
* modified, whether a file or a directory and whether the
* file or directory is readable.
*
* Description: Release memory allocated for the global web server root
* directory and the global XML document
@@ -689,8 +689,7 @@ web_server_set_root_dir( IN const char *root_dir )
* OUT struct xml_alias_t* alias ; xml alias object which has a file name
* stored
* OUT struct File_Info * info ; File information object which will be
* filled up if the file comparison
* succeeds
* filled up if the file comparison succeeds
*
* Description: Compare the files names between the one on the XML alias
* the one passed in as the input parameter. If equal extract file
@@ -870,7 +869,7 @@ StrTok( char **Src,
* OUT int * FirstByte ; gets the first byte of the token
* OUT int * LastByte ; gets the last byte of the token
*
* Description: Returns a range of integers from a sring
* Description: Returns a range of integers from a string
*
* Returns: int ;
* always returns 1;
@@ -929,8 +928,8 @@ GetNextRange( char **SrcRangeStr,
* Parameters:
* char * ByteRangeSpecifier ; String containing the range
* long FileLength ; Length of the file
* OUT struct SendInstruction * Instr ; SendInstruction object where the
* range operations will be stored
* OUT struct SendInstruction * Instr ; SendInstruction object
* where the range operations will be stored
*
* Description: Fills in the Offset, read size and contents to send out
* as an HTTP Range Response
@@ -1764,3 +1763,4 @@ web_server_callback( IN http_parser_t * parser,
membuffer_destroy( &headers );
membuffer_destroy( &filename );
}

View File

@@ -56,7 +56,8 @@ http_CancelHttpGet( IN void *Handle );
* IN uri_type* url; URL to be validated and fixed
* OUT uri_type* fixed_url; URL after being fixed.
*
* Description: Validates URL
* Description:
* Validates URL
*
* Returns:
* UPNP_E_INVALID_URL
@@ -64,6 +65,7 @@ http_CancelHttpGet( IN void *Handle );
************************************************************************/
int http_FixUrl( IN uri_type* url, OUT uri_type* fixed_url );
/************************************************************************
* Function: http_FixStrUrl
*
@@ -72,7 +74,8 @@ int http_FixUrl( IN uri_type* url, OUT uri_type* fixed_url );
* IN int urlstrlen ; Length of the character string
* OUT uri_type* fixed_url ; Fixed and corrected URL
*
* Description: Parses URL and then validates URL
* Description:
* Parses URL and then validates URL
*
* Returns:
* UPNP_E_INVALID_URL
@@ -88,8 +91,8 @@ int http_FixStrUrl( IN char* urlstr, IN int urlstrlen, OUT uri_type* fixed_url )
* IN uri_type* destination_url; URL containing destination information
* OUT uri_type *url; Fixed and corrected URL
*
* Description: Gets destination address from URL and then connects to the
* remote end
* Description:
* Gets destination address from URL and then connects to the remote end
*
* Returns:
* socket descriptor on sucess
@@ -98,19 +101,21 @@ int http_FixStrUrl( IN char* urlstr, IN int urlstrlen, OUT uri_type* fixed_url )
************************************************************************/
int http_Connect( IN uri_type* destination_url, OUT uri_type *url );
/************************************************************************
* Function: http_RecvMessage
*
* Parameters:
* IN SOCKINFO *info; Socket information object
* OUT http_parser_t* parser, HTTP parser object
* OUT http_parser_t* parser; HTTP parser object
* IN http_method_t request_method; HTTP request method
* IN OUT int* timeout_secs; time out
* OUT int* http_error_code; HTTP error code returned
*
* Description: Get the data on the socket and take actions based on the
* read data to modify the parser objects buffer. If an error is reported
* while parsing the data, the error code is passed in the http_errr_code
* Description:
* Get the data on the socket and take actions based on the read data
* to modify the parser objects buffer. If an error is reported while
* parsing the data, the error code is passed in the http_errr_code
* parameter
*
* Returns:
@@ -131,7 +136,8 @@ int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t* parser,
* IN OUT int * TimeOut ; time out value
* IN const char* fmt, ... Pattern format to take actions upon
*
* Description: Sends a message to the destination based on the
* Description:
* Sends a message to the destination based on the
* IN const char* fmt parameter
* fmt types:
* 'f': arg = const char * file name
@@ -148,9 +154,12 @@ int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t* parser,
* UPNP_E_FILE_READ_ERROR
* UPNP_E_SUCCESS
************************************************************************/
int http_SendMessage( IN SOCKINFO *info, IN OUT int* timeout_secs,
int http_SendMessage(
IN SOCKINFO *info,
IN OUT int* timeout_secs,
IN const char* fmt, ... );
/************************************************************************
* Function: http_RequestAndResponse
*
@@ -163,7 +172,8 @@ int http_SendMessage( IN SOCKINFO *info, IN OUT int* timeout_secs,
* IN int timeout_secs; time out value
* OUT http_parser_t* response; Parser object to receive the repsonse
*
* Description: Initiates socket, connects to the destination, sends a
* Description:
* Initiates socket, connects to the destination, sends a
* request and waits for the response from the remote end
*
* Returns:
@@ -172,12 +182,15 @@ int http_SendMessage( IN SOCKINFO *info, IN OUT int* timeout_secs,
* Error Codes returned by http_SendMessage
* Error Codes returned by http_RecvMessage
************************************************************************/
int http_RequestAndResponse( IN uri_type* destination,
IN const char* request, IN size_t request_length,
int http_RequestAndResponse(
IN uri_type* destination,
IN const char* request,
IN size_t request_length,
IN http_method_t req_method,
IN int timeout_secs,
OUT http_parser_t* response );
/************************************************************************
* return codes:
* 0 -- success
@@ -190,30 +203,31 @@ int http_RequestAndResponse( IN uri_type* destination,
* UPNP_E_SOCKET_WRITE
************************************************************************/
/************************************************************************
* Function: http_Download
*
* Parameters:
* IN const char* url_str : String as a URL
* IN int timeout_secs : time out value
* OUT char** document : buffer to store the document extracted
* IN const char* url_str; String as a URL
* IN int timeout_secs; time out value
* OUT char** document; buffer to store the document extracted
* from the donloaded message.
* OUT int* doc_length : length of the extracted document
* OUT char* content_type : Type of content
* OUT int* doc_length; length of the extracted document
* OUT char* content_type; Type of content
*
* Description : Download the document message and extract the document
* Description:
* Download the document message and extract the document
* from the message.
*
* Return : int;
* UPNP_E_SUCCESS;
* UPNP_E_INVALID_URL;
*
*
* Note :
* Return: int
* UPNP_E_SUCCESS
* UPNP_E_INVALID_URL
************************************************************************/
int http_Download( IN const char* url,
int http_Download(
IN const char* url,
IN int timeout_secs,
OUT char** document, OUT int* doc_length,
OUT char** document,
OUT int* doc_length,
OUT char* content_type );
@@ -227,67 +241,66 @@ int http_Download( IN const char* url,
* IN unsigned int *size: Size of the data to be sent.
* IN int timeout: time out value
*
* Description : Formats data if format used is UPNP_USING_CHUNKED.
* Description:
* Formats data if format used is UPNP_USING_CHUNKED.
* Writes data on the socket connected to the peer.
*
* Return : int ;
* Return: int
* UPNP_E_SUCCESS - On Success
* UPNP_E_INVALID_PARAM - Invalid Parameter
* -1 - On Socket Error.
*
* Note :
************************************************************************/
int http_WriteHttpPost(IN void *Handle,
IN char *buf,
IN unsigned int *size,
IN int timeout);
/************************************************************************
* Function: http_CloseHttpPost
*
* Parameters:
* IN void *Handle : Handle to the http post object
* IN OUT int *httpStatus : HTTP status returned on receiving a
* IN void *Handle; Handle to the http post object
* IN OUT int *httpStatus; HTTP status returned on receiving a
* response message
* IN int timeout : time out value
* IN int timeout; time out value
*
* Description : Sends remaining data if using UPNP_USING_CHUNKED
* Description:
* Sends remaining data if using UPNP_USING_CHUNKED
* format. Receives any more messages. Destroys socket and any socket
* associated memory. Frees handle associated with the HTTP POST msg.
*
* Return : int ;
* UPNP_E_SUCCESS - On Sucess ;
* UPNP_E_INVALID_PARAM - Invalid Parameter;
*
* Note :
* Return: int
* UPNP_E_SUCCESS - On Sucess
* UPNP_E_INVALID_PARAM - Invalid Parameter
************************************************************************/
int http_CloseHttpPost(IN void *Handle,
IN OUT int *httpStatus,
IN int timeout);
/************************************************************************
* Function: http_OpenHttpPost
*
* Parameters:
* IN const char *url_str : String as a URL
* IN OUT void **Handle : Pointer to buffer to store HTTP
* IN const char *url_str; String as a URL
* IN OUT void **Handle; Pointer to buffer to store HTTP
* post handle
* IN const char *contentType : Type of content
* IN int contentLength : length of content
* IN int timeout : time out value
* IN const char *contentType; Type of content
* IN int contentLength; length of content
* IN int timeout; time out value
*
* Description : Makes the HTTP POST message, connects to the peer,
* Description:
* Makes the HTTP POST message, connects to the peer,
* sends the HTTP POST request. Adds the post handle to buffer of
* such handles
*
* Return : int;
* UPNP_E_SUCCESS - On Sucess ;
* UPNP_E_INVALID_PARAM - Invalid Paramter ;
* UPNP_E_OUTOF_MEMORY ;
* UPNP_E_SOCKET_ERROR ;
* UPNP_E_SOCKET_CONNECT ;
*
* Note :
* UPNP_E_SUCCESS - On Sucess
* UPNP_E_INVALID_PARAM - Invalid Parameter
* UPNP_E_OUTOF_MEMORY
* UPNP_E_SOCKET_ERROR
* UPNP_E_SOCKET_CONNECT
************************************************************************/
int http_OpenHttpPost(IN const char *url_str,
IN OUT void **Handle,
@@ -295,69 +308,72 @@ int http_OpenHttpPost(IN const char *url_str,
IN int contentLength,
IN int timeout);
/************************************************************************
* Function: http_ReadHttpGet
*
* Parameters:
* IN void *Handle : Handle to the HTTP get object
* IN OUT char *buf : Buffer to get the read and parsed data
* IN OUT unsigned int *size : Size of tge buffer passed
* IN int timeout : time out value
* IN void *Handle; Handle to the HTTP get object
* IN OUT char *buf; Buffer to get the read and parsed data
* IN OUT unsigned int *size; Size of the buffer passed
* IN int timeout; time out value
*
* Description : Parses already existing data, then gets new data.
* Description:
* Parses already existing data, then gets new data.
* Parses and extracts information from the new data.
*
* Return : int ;
* UPNP_E_SUCCESS - On Sucess ;
* UPNP_E_INVALID_PARAM - Invalid Parameter;
* UPNP_E_BAD_RESPONSE ;
* UPNP_E_BAD_HTTPMSG ;
*
* Note :
* Return: int
* UPNP_E_SUCCESS - On Sucess
* UPNP_E_INVALID_PARAM - Invalid Parameter
* UPNP_E_BAD_RESPONSE
* UPNP_E_BAD_HTTPMSG
* UPNP_E_CANCELED
************************************************************************/
int http_ReadHttpGet(IN void *Handle,
int http_ReadHttpGet(
IN void *Handle,
IN OUT char *buf,
IN OUT unsigned int *size,
IN int timeout);
/************************************************************************
* Function: http_HttpGetProgress
*
* Parameters:
* IN void *Handle : Handle to the HTTP get object
* OUT unsigned int *length : Buffer to get the read and parsed data
* OUT unsigned int *total : Size of tge buffer passed
* IN void *Handle; Handle to the HTTP get object
* OUT unsigned int *length; Buffer to get the read and parsed data
* OUT unsigned int *total; Size of tge buffer passed
*
* Description : Extracts information from the Handle to the HTTP get
* object.
* Description:
* Extracts information from the Handle to the HTTP get object.
*
* Return : int ;
* UPNP_E_SUCCESS - On Sucess ;
* UPNP_E_INVALID_PARAM - Invalid Parameter;
*
* Note :
* Return: int
* UPNP_E_SUCCESS - On Sucess
* UPNP_E_INVALID_PARAM - Invalid Parameter
************************************************************************/
int http_HttpGetProgress(IN void *Handle,
int http_HttpGetProgress(
IN void *Handle,
OUT unsigned int *length,
OUT unsigned int *total );
/************************************************************************
* Function: http_CloseHttpGet
*
* Parameters:
* IN void *Handle; Handle to HTTP get object
*
* Description : Clears the handle allocated for the HTTP GET operation
* Description:
* Clears the handle allocated for the HTTP GET operation
* Clears socket states and memory allocated for socket operations.
*
* Return : int ;
* Return: int
* UPNP_E_SUCCESS - On Success
* UPNP_E_INVALID_PARAM - Invalid Parameter
*
* Note :
************************************************************************/
int http_CloseHttpGet(IN void *Handle);
/************************************************************************
* Function: http_OpenHttpGet
*
@@ -371,54 +387,52 @@ int http_CloseHttpGet(IN void *Handle);
* response message
* IN int timeout: time out value
*
* Description : Makes the HTTP GET message, connects to the peer,
* Description:
* Makes the HTTP GET message, connects to the peer,
* sends the HTTP GET request, gets the response and parses the
* response.
*
* Return : int;
* UPNP_E_SUCCESS - On Success ;
* UPNP_E_INVALID_PARAM - Invalid Paramters ;
* UPNP_E_OUTOF_MEMORY ;
* UPNP_E_SOCKET_ERROR ;
* UPNP_E_BAD_RESPONSE ;
*
* Note :
*
* Return: int
* UPNP_E_SUCCESS - On Success
* UPNP_E_INVALID_PARAM - Invalid Paramters
* UPNP_E_OUTOF_MEMORY
* UPNP_E_SOCKET_ERROR
* UPNP_E_BAD_RESPONSE
************************************************************************/
int http_OpenHttpGet(IN const char *url_str,
int http_OpenHttpGet(
IN const char *url_str,
IN OUT void **Handle,
IN OUT char **contentType,
OUT int *contentLength,
OUT int *httpStatus,
IN int timeout);
/************************************************************************
* Function: http_OpenHttpGetProxy
*
* Parameters:
* IN const char *url_str : String as a URL
* IN const char *proxy_str : String as a URL to the proxy
* IN OUT void **Handle : Pointer to buffer to store HTTP
* IN const char *url_str; String as a URL
* IN const char *proxy_str; String as a URL
* IN OUT void **Handle; Pointer to buffer to store HTTP
* post handle
* IN OUT char **contentType : Type of content
* OUT int *contentLength : length of content
* OUT int *httpStatus : HTTP status returned on receiving a
* IN OUT char **contentType; Type of content
* OUT int *contentLength; length of content
* OUT int *httpStatus; HTTP status returned on receiving a
* response message
* IN int timeout: time out value
*
* Description : Makes the HTTP GET message, connects to the peer,
* sends the HTTP GET request, gets the response and parses the
* response.
*
* Return : int;
* UPNP_E_SUCCESS - On Success ;
* UPNP_E_INVALID_PARAM - Invalid Paramters ;
* UPNP_E_OUTOF_MEMORY ;
* UPNP_E_SOCKET_ERROR ;
* UPNP_E_BAD_RESPONSE ;
*
* Note :
* Description:
* Makes the HTTP GET message, connects to the peer,
* sends the HTTP GET request, gets the response and parses the response.
* If a proxy URL is defined then the connection is made there.
*
* Return: int
* UPNP_E_SUCCESS - On Success
* UPNP_E_INVALID_PARAM - Invalid Paramters
* UPNP_E_OUTOF_MEMORY
* UPNP_E_SOCKET_ERROR
* UPNP_E_BAD_RESPONSE
************************************************************************/
int http_OpenHttpGetProxy(IN const char *url_str,
IN const char *proxy_str,
@@ -433,24 +447,25 @@ int http_OpenHttpGetProxy(IN const char *url_str,
* Function: http_SendStatusResponse
*
* Parameters:
* IN SOCKINFO *info : Socket information object
* IN int http_status_code : error code returned while making
* IN SOCKINFO *info; Socket information object
* IN int http_status_code; error code returned while making
* or sending the response message
* IN int request_major_version : request major version
* IN int request_minor_version : request minor version
* IN int request_major_version; request major version
* IN int request_minor_version; request minor version
*
* Description : Generate a response message for the status query and
* send the status response.
* Description:
* Generate a response message for the status query and send the
* status response.
*
* Return : int;
* Return: int
* 0 -- success
* UPNP_E_OUTOF_MEMORY
* UPNP_E_SOCKET_WRITE
* UPNP_E_TIMEDOUT
*
* Note :
************************************************************************/
int http_SendStatusResponse( IN SOCKINFO *info, IN int http_status_code,
int http_SendStatusResponse(
IN SOCKINFO *info,
IN int http_status_code,
IN int request_major_version,
IN int request_minor_version );
@@ -459,96 +474,103 @@ int http_SendStatusResponse( IN SOCKINFO *info, IN int http_status_code,
* Function: http_MakeMessage
*
* Parameters:
* INOUT membuffer* buf : buffer with the contents of the
* INOUT membuffer* buf; buffer with the contents of the
* message
* IN int http_major_version : HTTP major version
* IN int http_minor_version : HTTP minor version
* IN const char* fmt : Pattern format
* ... :
* IN int http_major_version; HTTP major version
* IN int http_minor_version; HTTP minor version
* IN const char* fmt; Pattern format
* ...;
*
* Description : Generate an HTTP message based on the format that is
* specified in the input parameters.
* Description:
* Generate an HTTP message based on the format that is specified
* in the input parameters.
*
* fmt types:
* 's': arg = const char* C_string
* 'b': arg1 = const char* buf; arg2 = size_t buf_length
* memory ptr
* 'c': (no args) appends CRLF "\r\n"
* 'd': arg = int number // appends decimal number
* 'h': arg = off_t number // appends off_t number
* 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt
* 'D': (no args) appends HTTP DATE: header
* 'S': (no args) appends HTTP SERVER: header
* 'U': (no args) appends HTTP USER-AGENT: header
* 'B': arg = int status_code
* appends content-length, content-type and HTML body
* for given code
* 'b': arg1 = const char* buf;
* arg2 = size_t buf_length memory ptr
* 'C': (no args) appends a HTTP CONNECTION: close header
* depending on major,minor version
* 'N': arg1 = int content_length // content-length header
* 'Q': arg1 = http_method_t; arg2 = char* url;
* arg3 = int url_length // start line of request
* 'c': (no args) appends CRLF "\r\n"
* 'D': (no args) appends HTTP DATE: header
* 'd': arg = int number // appends decimal number
* 'G': arg = range information // add range header
* 'h': arg = off_t number // appends off_t number
* 'K': (no args) // add chunky header
* 'N': arg1 = off_t content_length // content-length header
* 'q': arg1 = http_method_t // request start line and HOST header
* arg2 = (uri_type *)
* 'Q': arg1 = http_method_t; // start line of request
* arg2 = char* url;
* arg3 = size_t url_length
* 'R': arg = int status_code // adds a response start line
* 'B': arg = int status_code
* appends content-length, content-type and HTML body for given code
* 'T': arg = char * content_type; format e.g: "text/html";
* content-type header
* 'S': (no args) appends HTTP SERVER: header
* 's': arg = const char* C_string
* 'T': arg = char * content_type; format
* e.g: "text/html"; content-type header
* 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt
* 'U': (no args) appends HTTP USER-AGENT: header
* 'X': arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent
*
* Return : int;
* Return: int
* 0 - On Success
* UPNP_E_OUTOF_MEMORY
* UPNP_E_INVALID_URL;
*
* Note :
* UPNP_E_INVALID_URL
************************************************************************/
int http_MakeMessage( INOUT membuffer* buf,
int http_MakeMessage(
INOUT membuffer* buf,
IN int http_major_version,
IN int http_minor_version,
IN const char* fmt, ... );
/************************************************************************
* Function: http_CalcResponseVersion
*
* Parameters:
* IN int request_major_vers : Request major version
* IN int request_minor_vers : Request minor version
* OUT int* response_major_vers : Response mojor version
* OUT int* response_minor_vers : Response minor version
* IN int request_major_vers; Request major version
* IN int request_minor_vers; Request minor version
* OUT int* response_major_vers; Response mojor version
* OUT int* response_minor_vers; Response minor version
*
* Description : Calculate HTTP response versions based on the request
* versions.
* Description:
* Calculate HTTP response versions based on the request versions.
*
* Return: void
*
* Note :
************************************************************************/
void http_CalcResponseVersion(
IN int request_major_vers, IN int request_minor_vers,
OUT int* response_major_vers, OUT int* response_minor_vers );
IN int request_major_vers,
IN int request_minor_vers,
OUT int* response_major_vers,
OUT int* response_minor_vers );
/************************************************************************
* Function: http_OpenHttpGetEx
*
* Parameters:
* IN const char *url_str : String as a URL
* IN OUT void **Handle : Pointer to buffer to store HTTP
* IN const char *url_str; String as a URL
* IN OUT void **Handle; Pointer to buffer to store HTTP
* post handle
* IN OUT char **contentType : Type of content
* OUT int *contentLength : length of content
* OUT int *httpStatus : HTTP status returned on receiving a
* IN OUT char **contentType; Type of content
* OUT int *contentLength; length of content
* OUT int *httpStatus; HTTP status returned on receiving a
* response message
* IN int timeout : time out value
* IN int timeout; time out value
*
* Description : Makes the HTTP GET message, connects to the peer,
* Description:
* Makes the HTTP GET message, connects to the peer,
* sends the HTTP GET request, gets the response and parses the
* response.
*
* Return : int;
* UPNP_E_SUCCESS - On Success ;
* UPNP_E_INVALID_PARAM - Invalid Paramters ;
* UPNP_E_OUTOF_MEMORY ;
* UPNP_E_SOCKET_ERROR ;
* UPNP_E_BAD_RESPONSE ;
*
* Note :
*
* Return: int
* UPNP_E_SUCCESS - On Success
* UPNP_E_INVALID_PARAM - Invalid Paramters
* UPNP_E_OUTOF_MEMORY
* UPNP_E_SOCKET_ERROR
* UPNP_E_BAD_RESPONSE
************************************************************************/
int http_OpenHttpGetEx(IN const char *url_str,
IN OUT void **Handle,
@@ -559,18 +581,18 @@ int http_OpenHttpGetEx(IN const char *url_str,
IN int highRange,
IN int timeout);
/************************************************************************
* Function: get_sdk_info
*
* Parameters:
* OUT char *info ;
* OUT char *info; buffer to store the operating system information
*
* Description : Returns the server information for the operating
* system
* Description:
* Returns the server information for the operating system
*
* Return : void ;
*
* Note :
* Return:
* UPNP_INLINE void
************************************************************************/
void get_sdk_info( OUT char *info );
@@ -580,3 +602,4 @@ void get_sdk_info( OUT char *info );
#endif // GENLIB_NET_HTTP_HTTPREADWRITE_H

View File

@@ -1,63 +1,67 @@
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
/************************************************************************
*
* Copyright (c) 2000-2003 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* Neither name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
************************************************************************/
#ifndef MINISERVER_H
#define MINISERVER_H
#include "sock.h"
#include "httpparser.h"
extern SOCKET gMiniServerStopSock;
typedef struct MServerSockArray {
int miniServerSock; //socket for listening for miniserver
//requests
int miniServerStopSock; //socket for stopping miniserver
int ssdpSock; //socket for incoming advertisments and search requests
/* socket for listening for miniserver requests */
int miniServerSock;
/* socket for stopping miniserver */
int miniServerStopSock;
/* socket for incoming advertisments and search requests */
int ssdpSock;
int stopPort;
int miniServerPort;
CLIENTONLY(int ssdpReqSock;) //socket for sending search
//requests and receiving
// search replies
/* socket for sending search requests and receiving search replies */
CLIENTONLY(int ssdpReqSock;)
} MiniServerSockArray;
//typedef void (*MiniServerCallback) ( const char* document, int sockfd );
typedef void (*MiniServerCallback) ( IN http_parser_t *parser,
typedef void (*MiniServerCallback)(
IN http_parser_t *parser,
IN http_message_t* request,
IN SOCKINFO *info );
#ifdef __cplusplus
extern "C" {
#endif
@@ -71,8 +75,6 @@ extern "C" {
* Description: Set HTTP Get Callback
*
* Return: void
*
* Note :
************************************************************************/
void SetHTTPGetCallback( MiniServerCallback callback );
@@ -85,14 +87,12 @@ void SetHTTPGetCallback( MiniServerCallback callback );
* Description: Set SOAP Callback
*
* Return: void
*
* Note :
************************************************************************/
#ifdef INCLUDE_DEVICE_APIS
void SetSoapCallback( MiniServerCallback callback );
#else
#else /* INCLUDE_DEVICE_APIS */
static inline void SetSoapCallback( MiniServerCallback callback ) {}
#endif
#endif /* INCLUDE_DEVICE_APIS */
/************************************************************************
* Function: SetGenaCallback
@@ -100,11 +100,9 @@ static inline void SetSoapCallback( MiniServerCallback callback ) {}
* Parameters:
* MiniServerCallback callback; - GENA Callback to be invoked
*
* Description : Set GENA Callback
* D6escription: Set GENA Callback
*
* Return: void
*
* Note :
************************************************************************/
void SetGenaCallback( MiniServerCallback callback );
@@ -126,7 +124,6 @@ void SetGenaCallback( MiniServerCallback callback );
* Return: int;
* Actual port socket is bound to - On Success:
* A negative number UPNP_E_XXX - On Error
* Note :
************************************************************************/
int StartMiniServer( unsigned short listen_port );
@@ -136,19 +133,18 @@ int StartMiniServer( unsigned short listen_port );
* Parameters:
* void;
*
* Description : Stop and Shutdown the MiniServer and free socket
* resources.
* Description: Stop and Shutdown the MiniServer and free socket resources.
*
* Return : int;
* Always returns 0
*
* Note :
************************************************************************/
int StopMiniServer( void );
int StopMiniServer();
#ifdef __cplusplus
} /* extern C */
#endif
#endif /* MINISERVER_H */

View File

@@ -50,8 +50,7 @@
#define MAX_TIME_TOREAD 45
CLIENTONLY( SOCKET gSsdpReqSocket = 0;
)
CLIENTONLY( SOCKET gSsdpReqSocket = 0; )
void RequestHandler();
Event ErrotEvt;
@@ -61,11 +60,10 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
unsigned short ssdpStopPort;
struct SSDPSockArray {
int ssdpSock; //socket for incoming advertisments and search requests
CLIENTONLY( int ssdpReqSock;
) //socket for sending search
//requests and receiving
// search replies
// socket for incoming advertisments and search requests
int ssdpSock;
// socket for sending search requests and receiving search replies
CLIENTONLY( int ssdpReqSock; )
};
#ifdef INCLUDE_DEVICE_APIS
@@ -129,7 +127,6 @@ int AdvertiseAndReply( IN int AdFlag,
return UPNP_E_INVALID_HANDLE;
}
defaultExp = SInfo->MaxAge;
nodeList = NULL;
//get server info
@@ -398,8 +395,8 @@ int AdvertiseAndReply( IN int AdFlag,
} /****************** End of AdvertiseAndReply *********************/
#endif
#endif
#endif /* EXCLUDE_SSDP == 0 */
#endif /* INCLUDE_DEVICE_APIS */
/************************************************************************
* Function : Make_Socket_NoBlocking
@@ -737,8 +734,7 @@ ssdp_event_handler_thread( void *the_data )
// send msg to device or ctrlpt
if( ( hmsg->method == HTTPMETHOD_NOTIFY ) ||
( hmsg->request_method == HTTPMETHOD_MSEARCH ) ) {
CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, &data->dest_addr,
FALSE, NULL ););
CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, &data->dest_addr, FALSE, NULL );)
} else {
ssdp_handle_device_request( hmsg, &data->dest_addr );
}
@@ -860,17 +856,16 @@ readFromSSDPSocket( SOCKET socket )
int
get_ssdp_sockets( MiniServerSockArray * out )
{
SOCKET ssdpSock;
CLIENTONLY( SOCKET ssdpReqSock; )
int onOff = 1;
u_char ttl = 4;
struct ip_mreq ssdpMcastAddr;
struct sockaddr_in ssdpAddr;
int option = 1;
struct in_addr addr;
SOCKET ssdpSock;
#if INCLUDE_CLIENT_APIS
SOCKET ssdpReqSock;
CLIENTONLY(
if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
@@ -880,15 +875,15 @@ CLIENTONLY(
setsockopt( ssdpReqSock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
// just do it, regardless if fails or not.
Make_Socket_NoBlocking( ssdpReqSock );
gSsdpReqSocket = ssdpReqSock; )
// END CLIENTONLY
gSsdpReqSocket = ssdpReqSock;
#endif /* INCLUDE_CLIENT_APIS */
if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
return UPNP_E_OUTOF_SOCKET;
}
@@ -898,8 +893,8 @@ CLIENTONLY(
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in set reuse addr !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock );
return UPNP_E_SOCKET_ERROR;
@@ -911,13 +906,13 @@ CLIENTONLY(
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in set reuse port !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock );
return UPNP_E_SOCKET_ERROR;
}
#endif
#endif /* __FreeBSD__ */
memset( ( void * )&ssdpAddr, 0, sizeof( struct sockaddr_in ) );
ssdpAddr.sin_family = AF_INET;
@@ -931,8 +926,8 @@ CLIENTONLY(
"Error in binding !!!\n" );
shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
return UPNP_E_SOCKET_BIND;
}
@@ -945,9 +940,9 @@ CLIENTONLY(
SSDP, __FILE__, __LINE__,
"Error in joining" " multicast group !!!\n" );
shutdown( ssdpSock, SD_BOTH );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
UpnpCloseSocket( ssdpSock );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
return UPNP_E_SOCKET_ERROR;
}
@@ -961,7 +956,7 @@ CLIENTONLY(
/* This is probably not a critical error, so let's continue. */
}
// result is not checked becuase it will fail in WinMe and Win9x.
/* result is not checked becuase it will fail in WinMe and Win9x. */
setsockopt( ssdpSock, IPPROTO_IP,
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST,
@@ -970,16 +965,16 @@ CLIENTONLY(
SSDP, __FILE__, __LINE__,
"Error in setting broadcast !!!\n" );
shutdown( ssdpSock, SD_BOTH );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
UpnpCloseSocket( ssdpSock );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
return UPNP_E_NETWORK_ERROR;
}
CLIENTONLY( out->ssdpReqSock = ssdpReqSock; );
CLIENTONLY( out->ssdpReqSock = ssdpReqSock; )
out->ssdpSock = ssdpSock;
return UPNP_E_SUCCESS;
}
#endif // EXCLUDE_SSDP
#endif /* EXCLUDE_SSDP */