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 Version 1.6.1
******************************************************************************* *******************************************************************************
@@ -116,6 +137,10 @@ Version 1.6.0
an interface change in the library and the minor library version was an interface change in the library and the minor library version was
bumped. Also, the libtool library numbers were changed accordingly. bumped. Also, the libtool library numbers were changed accordingly.
*******************************************************************************
Version 1.4.7
*******************************************************************************
2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net> 2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Added support for the Basic Device * Added support for the Basic Device
(http://www.upnp.org/standardizeddcps/basic.asp) as suggested by (http://www.upnp.org/standardizeddcps/basic.asp) as suggested by

3
THANKS
View File

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

View File

@@ -9,7 +9,7 @@
AC_PREREQ(2.60) 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 # *Independently* of the above libupnp package version, the libtool version
# of the 3 libraries need to be updated whenever there is a change released: # of the 3 libraries need to be updated whenever there is a change released:
@@ -84,9 +84,20 @@ AC_INIT([libupnp], [1.6.1], [mroberto@users.sourceforge.net])
#AC_SUBST([LT_VERSION_UPNP], [3:1:0]) #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_IXML], [2:4:0])
AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2]) 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: # Repeating the algorithm so that it is closer to the modificatin place:
# - library code modified: revision++ # - 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 Summary: Universal Plug and Play (UPnP) SDK
Name: libupnp Name: libupnp
Release: 1%{?dist} Release: 1%{?dist}
@@ -77,6 +77,12 @@ make install DESTDIR=$RPM_BUILD_ROOT
rm -rf %{buildroot} rm -rf %{buildroot}
%changelog %changelog
* Mon Nov 19 2007 Marcelo Jimenez <mroberto@users.sourceforge.net> - 1.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 * Fri Feb 02 2007 Eric Tanguy <eric.tanguy@univ-nantes.fr> - 1.4.2-1
- Update to version 1.4.2 - Update to version 1.4.2

View File

@@ -92,11 +92,9 @@ CLIENTONLY( ithread_mutex_t GlobalClientSubscribeMutex; )
TimerThread gTimerThread; TimerThread gTimerThread;
ThreadPool gRecvThreadPool;
ThreadPool gSendThreadPool; ThreadPool gSendThreadPool;
ThreadPool gRecvThreadPool;
ThreadPool gMiniServerThreadPool; ThreadPool gMiniServerThreadPool;
//Flag to indicate the state of web server //Flag to indicate the state of web server
WebServerState bWebServerState = WEB_SERVER_DISABLED; WebServerState bWebServerState = WEB_SERVER_DISABLED;
@@ -268,7 +266,7 @@ int UpnpInit( IN const char *HostIP,
if( ThreadPoolInit( &gMiniServerThreadPool, &attr ) != UPNP_E_SUCCESS ) { if( ThreadPoolInit( &gMiniServerThreadPool, &attr ) != UPNP_E_SUCCESS ) {
UpnpSdkInit = 0; UpnpSdkInit = 0;
UpnpFinish( ); UpnpFinish();
return UPNP_E_INIT_FAILED; return UPNP_E_INIT_FAILED;
} }
@@ -402,7 +400,7 @@ UpnpFinish()
struct Handle_Info *temp; struct Handle_Info *temp;
#ifdef WIN32 #ifdef WIN32
// WSACleanup( ); // WSACleanup();
#endif #endif
if( UpnpSdkInit != 1 ) { if( UpnpSdkInit != 1 ) {
@@ -410,14 +408,15 @@ UpnpFinish()
} }
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Inside UpnpFinish : UpnpSdkInit is :%d:\n", "Inside UpnpFinish : UpnpSdkInit is :%d:\n", UpnpSdkInit );
UpnpSdkInit );
if( UpnpSdkInit == 1 ) { if( UpnpSdkInit == 1 ) {
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"UpnpFinish : UpnpSdkInit is ONE\n" ); "UpnpFinish : UpnpSdkInit is ONE\n" );
} }
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send 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 #ifdef INCLUDE_DEVICE_APIS
if( GetDeviceHandleInfo( &device_handle, &temp ) == HND_DEVICE ) if( GetDeviceHandleInfo( &device_handle, &temp ) == HND_DEVICE )
UpnpUnRegisterRootDevice( device_handle ); UpnpUnRegisterRootDevice( device_handle );
@@ -429,20 +428,19 @@ UpnpFinish()
#endif #endif
TimerThreadShutdown( &gTimerThread ); TimerThreadShutdown( &gTimerThread );
StopMiniServer(); StopMiniServer();
#if EXCLUDE_WEB_SERVER == 0 #if EXCLUDE_WEB_SERVER == 0
web_server_destroy(); web_server_destroy();
#endif #endif
ThreadPoolShutdown(&gSendThreadPool); ThreadPoolShutdown(&gMiniServerThreadPool);
ThreadPoolShutdown(&gRecvThreadPool); ThreadPoolShutdown(&gRecvThreadPool);
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, ThreadPoolShutdown(&gSendThreadPool);
"Exiting UpnpFinish : UpnpSdkInit is :%d:\n", UpnpSdkInit);
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool"); 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 #ifdef INCLUDE_CLIENT_APIS
ithread_mutex_destroy(&GlobalClientSubscribeMutex); ithread_mutex_destroy(&GlobalClientSubscribeMutex);
@@ -456,11 +454,14 @@ UpnpFinish()
// allow static linking // allow static linking
#ifdef WIN32 #ifdef WIN32
#ifdef PTW32_STATIC_LIB #ifdef PTW32_STATIC_LIB
pthread_win32_thread_detach_np (); pthread_win32_thread_detach_np();
#endif #endif
#endif #endif
UpnpSdkInit = 0; UpnpSdkInit = 0;
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Exiting UpnpFinish : UpnpSdkInit is :%d:\n", UpnpSdkInit);
UpnpCloseLog();
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -29,10 +29,10 @@
// //
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
/************************************************************************ /******************************************************************************
* Purpose: This file defines the Web Server and has functions to carry out * Purpose: This file defines the Web Server and has functions to carry out
* operations of the Web Server. * operations of the Web Server.
************************************************************************/ ******************************************************************************/
#include "config.h" #include "config.h"
#include <assert.h> #include <assert.h>
@@ -64,8 +64,12 @@
/* /*
Response Types Response Types
*/ */
enum resp_type { RESP_FILEDOC, RESP_XMLDOC, RESP_HEADERS, RESP_WEBDOC, enum resp_type {
RESP_POST }; RESP_FILEDOC,
RESP_XMLDOC,
RESP_HEADERS,
RESP_WEBDOC,
RESP_POST };
// mapping of file extension to content-type of document // mapping of file extension to content-type of document
struct document_type_t { struct document_type_t {
@@ -95,18 +99,18 @@ static const char *gMediaTypes[] = {
*/ */
// index into 'gMediaTypes' // index into 'gMediaTypes'
#define AUDIO_STR "\1" #define AUDIO_STR "\1"
#define VIDEO_STR "\2" #define VIDEO_STR "\2"
#define IMAGE_STR "\3" #define IMAGE_STR "\3"
#define APPLICATION_STR "\4" #define APPLICATION_STR "\4"
#define TEXT_STR "\5" #define TEXT_STR "\5"
// int index // int index
#define APPLICATION_INDEX 4 #define APPLICATION_INDEX 4
#define TEXT_INDEX 5 #define TEXT_INDEX 5
// general // general
#define NUM_MEDIA_TYPES 69 #define NUM_MEDIA_TYPES 69
#define NUM_HTTP_HEADER_NAMES 33 #define NUM_HTTP_HEADER_NAMES 33
// sorted by file extension; must have 'NUM_MEDIA_TYPES' extensions // sorted by file extension; must have 'NUM_MEDIA_TYPES' extensions
@@ -182,12 +186,9 @@ static const char *gEncodedMediaTypes =
"zip\0" APPLICATION_STR "zip\0" "\0"; "zip\0" APPLICATION_STR "zip\0" "\0";
// *** end *** // *** end ***
/***********************************************************************/ /************************************************************************
/*
module variables - Globals, static and externs module variables - Globals, static and externs
*/ ************************************************************************/
/***********************************************************************/
static struct document_type_t gMediaTypeList[NUM_MEDIA_TYPES]; static struct document_type_t gMediaTypeList[NUM_MEDIA_TYPES];
membuffer gDocumentRootDir; // a local dir which serves as webserver root membuffer gDocumentRootDir; // a local dir which serves as webserver root
static struct xml_alias_t gAliasDoc; // XML document static struct xml_alias_t gAliasDoc; // XML document
@@ -195,16 +196,16 @@ static ithread_mutex_t gWebMutex;
extern str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES]; extern str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES];
/************************************************************************ /************************************************************************
* Function: has_xml_content_type * Function: has_xml_content_type
* *
* Parameters: * Parameters:
* none * none
* *
* Description: decodes list and stores it in gMediaTypeList * Description: decodes list and stores it in gMediaTypeList
* *
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
static UPNP_INLINE void static UPNP_INLINE void
media_list_init( void ) media_list_init( void )
{ {
@@ -229,20 +230,20 @@ media_list_init( void )
} }
/************************************************************************ /************************************************************************
* Function: has_xml_content_type * Function: has_xml_content_type
* *
* Parameters: * Parameters:
* IN const char* extension ; * IN const char* extension ;
* OUT const char** con_type, * OUT const char** con_type,
* OUT const char** con_subtype * OUT const char** con_subtype
* *
* Description: Based on the extension, returns the content type and * Description: Based on the extension, returns the content type and
* content subtype * content subtype
* *
* Returns: * Returns:
* 0 on success; * 0 on success;
* -1 on error * -1 on error
************************************************************************/ ************************************************************************/
static UPNP_INLINE int static UPNP_INLINE int
search_extension( IN const char *extension, search_extension( IN const char *extension,
OUT const char **con_type, OUT const char **con_type,
@@ -276,20 +277,20 @@ search_extension( IN const char *extension,
} }
/************************************************************************ /************************************************************************
* Function: get_content_type * Function: get_content_type
* *
* Parameters: * Parameters:
* IN const char* filename, * IN const char* filename,
* OUT DOMString* content_type * OUT DOMString* content_type
* *
* Description: Based on the extension, clones an XML string based on * Description: Based on the extension, clones an XML string based on
* type and content subtype. If content type and sub type are not * type and content subtype. If content type and sub type are not
* found, unknown types are used * found, unknown types are used
* *
* Returns: * Returns:
* 0 - On Sucess * 0 - On Sucess
* UPNP_E_OUTOF_MEMORY - on memory allocation failures * UPNP_E_OUTOF_MEMORY - on memory allocation failures
************************************************************************/ ************************************************************************/
UPNP_INLINE int UPNP_INLINE int
get_content_type( IN const char *filename, get_content_type( IN const char *filename,
OUT DOMString * content_type ) OUT DOMString * content_type )
@@ -337,17 +338,17 @@ get_content_type( IN const char *filename,
} }
/************************************************************************ /************************************************************************
* Function: glob_alias_init * Function: glob_alias_init
* *
* Parameters: * Parameters:
* none * none
* *
* Description: Initialize the global XML document. Allocate buffers * Description: Initialize the global XML document. Allocate buffers
* for the XML document * for the XML document
* *
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
static UPNP_INLINE void static UPNP_INLINE void
glob_alias_init( void ) glob_alias_init( void )
{ {
@@ -360,16 +361,16 @@ glob_alias_init( void )
} }
/************************************************************************ /************************************************************************
* Function: is_valid_alias * Function: is_valid_alias
* *
* Parameters: * Parameters:
* IN const struct xml_alias_t* alias ; XML alias object * IN const struct xml_alias_t* alias ; XML alias object
* *
* Description: Check for the validity of the XML object buffer * Description: Check for the validity of the XML object buffer
* *
* Returns: * Returns:
* BOOLEAN * BOOLEAN
************************************************************************/ ************************************************************************/
static UPNP_INLINE xboolean static UPNP_INLINE xboolean
is_valid_alias( IN const struct xml_alias_t *alias ) is_valid_alias( IN const struct xml_alias_t *alias )
{ {
@@ -377,17 +378,17 @@ is_valid_alias( IN const struct xml_alias_t *alias )
} }
/************************************************************************ /************************************************************************
* Function: alias_grab * Function: alias_grab
* *
* Parameters: * Parameters:
* OUT struct xml_alias_t* alias ; XML alias object * OUT struct xml_alias_t* alias ; XML alias object
* *
* Description: Copy the contents of the global XML document into the * Description: Copy the contents of the global XML document into the
* local OUT parameter * local OUT parameter
* *
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
static void static void
alias_grab( OUT struct xml_alias_t *alias ) alias_grab( OUT struct xml_alias_t *alias )
{ {
@@ -402,17 +403,17 @@ alias_grab( OUT struct xml_alias_t *alias )
} }
/************************************************************************ /************************************************************************
* Function: alias_release * Function: alias_release
* *
* Parameters: * Parameters:
* IN struct xml_alias_t* alias ; XML alias object * IN struct xml_alias_t* alias ; XML alias object
* *
* Description: Release the XML document referred to by the IN parameter * Description: Release the XML document referred to by the IN parameter
* Free the allocated buffers associated with this object * Free the allocated buffers associated with this object
* *
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
static void static void
alias_release( IN struct xml_alias_t *alias ) alias_release( IN struct xml_alias_t *alias )
{ {
@@ -436,24 +437,24 @@ alias_release( IN struct xml_alias_t *alias )
} }
/************************************************************************ /************************************************************************
* Function: web_server_set_alias * Function: web_server_set_alias
* *
* Parameters: * Parameters:
* alias_name: webserver name of alias; created by caller and freed by * alias_name: webserver name of alias; created by caller and freed by
* caller (doesn't even have to be malloc()d .) * caller (doesn't even have to be malloc()d .)
* alias_content: the xml doc; this is allocated by the caller; and * alias_content: the xml doc; this is allocated by the caller; and
* freed by the web server * freed by the web server
* alias_content_length: length of alias body in bytes * alias_content_length: length of alias body in bytes
* last_modified: time when the contents of alias were last * last_modified: time when the contents of alias were last
* changed (local time) * changed (local time)
* *
* Description: Replaces current alias with the given alias. To remove * Description: Replaces current alias with the given alias. To remove
* the current alias, set alias_name to NULL. * the current alias, set alias_name to NULL.
* *
* Returns: * Returns:
* 0 - OK * 0 - OK
* UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here * UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here
************************************************************************/ ************************************************************************/
int int
web_server_set_alias( IN const char *alias_name, web_server_set_alias( IN const char *alias_name,
IN const char *alias_content, IN const char *alias_content,
@@ -516,19 +517,19 @@ web_server_set_alias( IN const char *alias_name,
} }
/************************************************************************ /************************************************************************
* Function: web_server_init * Function: web_server_init
* *
* Parameters: * Parameters:
* none * none
* *
* Description: Initilialize the different documents. Initialize the * Description: Initilialize the different documents. Initialize the
* memory for root directory for web server. Call to initialize global * memory for root directory for web server. Call to initialize global
* XML document. Sets bWebServerState to WEB_SERVER_ENABLED * XML document. Sets bWebServerState to WEB_SERVER_ENABLED
* *
* Returns: * Returns:
* 0 - OK * 0 - OK
* UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here * UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here
************************************************************************/ ************************************************************************/
int int
web_server_init( void ) web_server_init( void )
{ {
@@ -552,18 +553,18 @@ web_server_init( void )
} }
/************************************************************************ /************************************************************************
* Function: web_server_destroy * Function: web_server_destroy
* *
* Parameters: * Parameters:
* none * none
* *
* Description: Release memory allocated for the global web server root * Description: Release memory allocated for the global web server root
* directory and the global XML document * directory and the global XML document
* Resets the flag bWebServerState to WEB_SERVER_DISABLED * Resets the flag bWebServerState to WEB_SERVER_DISABLED
* *
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
void void
web_server_destroy( void ) web_server_destroy( void )
{ {
@@ -584,23 +585,22 @@ web_server_destroy( void )
} }
/************************************************************************ /************************************************************************
* Function: get_file_info * Function: get_file_info
* *
* Parameters: * Parameters:
* IN const char* filename ; Filename having the description document * IN const char* filename ; Filename having the description document
* OUT struct File_Info * info ; File information object having file * OUT struct File_Info * info ; File information object having file
* attributes such as filelength, when was * attributes such as filelength, when was the file last
* the file last modified, whether a file * modified, whether a file or a directory and whether the
* or a directory and whether the file or * file or directory is readable.
* directory is readable. *
* * Description: Release memory allocated for the global web server root
* Description: Release memory allocated for the global web server root * directory and the global XML document
* directory and the global XML document * Resets the flag bWebServerState to WEB_SERVER_DISABLED
* Resets the flag bWebServerState to WEB_SERVER_DISABLED *
* * Returns:
* Returns: * int
* int ************************************************************************/
************************************************************************/
static int static int
get_file_info( IN const char *filename, get_file_info( IN const char *filename,
OUT struct File_Info *info ) OUT struct File_Info *info )
@@ -647,19 +647,19 @@ get_file_info( IN const char *filename,
} }
/************************************************************************ /************************************************************************
* Function: web_server_set_root_dir * Function: web_server_set_root_dir
* *
* Parameters: * Parameters:
* IN const char* root_dir ; String having the root directory for the * IN const char* root_dir ; String having the root directory for the
* document * document
* *
* Description: Assign the path specfied by the IN const char* root_dir * Description: Assign the path specfied by the IN const char* root_dir
* parameter to the global Document root directory. Also check for * parameter to the global Document root directory. Also check for
* path names ending in '/' * path names ending in '/'
* *
* Returns: * Returns:
* int * int
************************************************************************/ ************************************************************************/
int int
web_server_set_root_dir( IN const char *root_dir ) web_server_set_root_dir( IN const char *root_dir )
{ {
@@ -682,24 +682,23 @@ web_server_set_root_dir( IN const char *root_dir )
} }
/************************************************************************ /************************************************************************
* Function: get_alias * Function: get_alias
* *
* Parameters: * Parameters:
* IN const char* request_file ; request file passed in to be compared with * IN const char* request_file ; request file passed in to be compared with
* OUT struct xml_alias_t* alias ; xml alias object which has a file name * OUT struct xml_alias_t* alias ; xml alias object which has a file name
* stored * stored
* OUT struct File_Info * info ; File information object which will be * OUT struct File_Info * info ; File information object which will be
* filled up if the file comparison * filled up if the file comparison succeeds
* succeeds *
* * Description: Compare the files names between the one on the XML alias
* Description: Compare the files names between the one on the XML alias * the one passed in as the input parameter. If equal extract file
* the one passed in as the input parameter. If equal extract file * information
* information *
* * Returns:
* Returns: * TRUE - On Success
* TRUE - On Success * FALSE if request is not an alias
* FALSE if request is not an alias ************************************************************************/
************************************************************************/
static UPNP_INLINE xboolean static UPNP_INLINE xboolean
get_alias( IN const char *request_file, get_alias( IN const char *request_file,
OUT struct xml_alias_t *alias, OUT struct xml_alias_t *alias,
@@ -720,17 +719,17 @@ get_alias( IN const char *request_file,
} }
/************************************************************************ /************************************************************************
* Function: isFileInVirtualDir * Function: isFileInVirtualDir
* *
* Parameters: * Parameters:
* IN char *filePath ; directory path to be tested for virtual directory * IN char *filePath ; directory path to be tested for virtual directory
* *
* Description: Compares filePath with paths from the list of virtual * Description: Compares filePath with paths from the list of virtual
* directory lists * directory lists
* *
* Returns: * Returns:
* BOOLEAN * BOOLEAN
************************************************************************/ ************************************************************************/
int int
isFileInVirtualDir( IN char *filePath ) isFileInVirtualDir( IN char *filePath )
{ {
@@ -757,16 +756,16 @@ isFileInVirtualDir( IN char *filePath )
} }
/************************************************************************ /************************************************************************
* Function: ToUpperCase * Function: ToUpperCase
* *
* Parameters: * Parameters:
* INOUT char * Str ; Input string to be converted * INOUT char * Str ; Input string to be converted
* *
* Description: Converts input string to upper case * Description: Converts input string to upper case
* *
* Returns: * Returns:
* int * int
************************************************************************/ ************************************************************************/
int int
ToUpperCase( char *Str ) ToUpperCase( char *Str )
{ {
@@ -779,17 +778,17 @@ ToUpperCase( char *Str )
} }
/************************************************************************ /************************************************************************
* Function: StrStr * Function: StrStr
* *
* Parameters: * Parameters:
* IN char * S1 ; Input string * IN char * S1 ; Input string
* IN char * S2 ; Input sub-string * IN char * S2 ; Input sub-string
* *
* Description: Finds a substring from a string * Description: Finds a substring from a string
* *
* Returns: * Returns:
* char * ptr - pointer to the first occurence of S2 in S1 * char * ptr - pointer to the first occurence of S2 in S1
************************************************************************/ ************************************************************************/
char * char *
StrStr( char *S1, StrStr( char *S1,
char *S2 ) char *S2 )
@@ -829,17 +828,17 @@ StrStr( char *S1,
} }
/************************************************************************ /************************************************************************
* Function: StrTok * Function: StrTok
* *
* Parameters: * Parameters:
* IN char ** Src ; String containing the token * IN char ** Src ; String containing the token
* IN char * del ; Set of delimiter characters * IN char * del ; Set of delimiter characters
* *
* Description: Finds next token in a string * Description: Finds next token in a string
* *
* Returns: * Returns:
* char * ptr - pointer to the first occurence of S2 in S1 * char * ptr - pointer to the first occurence of S2 in S1
************************************************************************/ ************************************************************************/
char * char *
StrTok( char **Src, StrTok( char **Src,
char *Del ) char *Del )
@@ -863,18 +862,18 @@ StrTok( char **Src,
} }
/************************************************************************ /************************************************************************
* Function: GetNextRange * Function: GetNextRange
* *
* Parameters: * Parameters:
* IN char ** SrcRangeStr ; string containing the token / range * IN char ** SrcRangeStr ; string containing the token / range
* OUT int * FirstByte ; gets the first byte of the token * OUT int * FirstByte ; gets the first byte of the token
* OUT int * LastByte ; gets the last 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 ; * Returns: int ;
* always returns 1; * always returns 1;
************************************************************************/ ************************************************************************/
int int
GetNextRange( char **SrcRangeStr, GetNextRange( char **SrcRangeStr,
off_t *FirstByte, off_t *FirstByte,
@@ -924,23 +923,23 @@ GetNextRange( char **SrcRangeStr,
} }
/************************************************************************ /************************************************************************
* Function: CreateHTTPRangeResponseHeader * Function: CreateHTTPRangeResponseHeader
* *
* Parameters: * Parameters:
* char * ByteRangeSpecifier ; String containing the range * char * ByteRangeSpecifier ; String containing the range
* long FileLength ; Length of the file * long FileLength ; Length of the file
* OUT struct SendInstruction * Instr ; SendInstruction object where the * OUT struct SendInstruction * Instr ; SendInstruction object
* range operations will be stored * where the range operations will be stored
* *
* Description: Fills in the Offset, read size and contents to send out * Description: Fills in the Offset, read size and contents to send out
* as an HTTP Range Response * as an HTTP Range Response
* *
* Returns: * Returns:
* HTTP_BAD_REQUEST * HTTP_BAD_REQUEST
* UPNP_E_OUTOF_MEMORY * UPNP_E_OUTOF_MEMORY
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE * HTTP_REQUEST_RANGE_NOT_SATISFIABLE
* HTTP_OK * HTTP_OK
************************************************************************/ ************************************************************************/
int int
CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier, CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
off_t FileLength, off_t FileLength,
@@ -1036,24 +1035,24 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
} }
/************************************************************************ /************************************************************************
* Function: CheckOtherHTTPHeaders * Function: CheckOtherHTTPHeaders
* *
* Parameters: * Parameters:
* IN http_message_t * Req ; HTTP Request message * IN http_message_t * Req ; HTTP Request message
* OUT struct SendInstruction * RespInstr ; Send Instruction object to * OUT struct SendInstruction * RespInstr ; Send Instruction object to
* data for the response * data for the response
* int FileSize ; Size of the file containing the request document * int FileSize ; Size of the file containing the request document
* *
* Description: Get header id from the request parameter and take * Description: Get header id from the request parameter and take
* appropriate action based on the ids. * appropriate action based on the ids.
* as an HTTP Range Response * as an HTTP Range Response
* *
* Returns: * Returns:
* HTTP_BAD_REQUEST * HTTP_BAD_REQUEST
* UPNP_E_OUTOF_MEMORY * UPNP_E_OUTOF_MEMORY
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE * HTTP_REQUEST_RANGE_NOT_SATISFIABLE
* HTTP_OK * HTTP_OK
************************************************************************/ ************************************************************************/
int int
CheckOtherHTTPHeaders( IN http_message_t * Req, CheckOtherHTTPHeaders( IN http_message_t * Req,
OUT struct SendInstruction *RespInstr, OUT struct SendInstruction *RespInstr,
@@ -1167,27 +1166,27 @@ CheckOtherHTTPHeaders( IN http_message_t * Req,
} }
/************************************************************************ /************************************************************************
* Function: process_request * Function: process_request
* *
* Parameters: * Parameters:
* IN http_message_t *req ; HTTP Request message * IN http_message_t *req ; HTTP Request message
* OUT enum resp_type *rtype ; Tpye of response * OUT enum resp_type *rtype ; Tpye of response
* OUT membuffer *headers ; * OUT membuffer *headers ;
* OUT membuffer *filename ; Get filename from request document * OUT membuffer *filename ; Get filename from request document
* OUT struct xml_alias_t *alias ; Xml alias document from the * OUT struct xml_alias_t *alias ; Xml alias document from the
* request document, * request document,
* OUT struct SendInstruction * RespInstr ; Send Instruction object * OUT struct SendInstruction * RespInstr ; Send Instruction object
* where the response is set up. * where the response is set up.
* *
* Description: Processes the request and returns the result in the OUT * Description: Processes the request and returns the result in the OUT
* parameters * parameters
* *
* Returns: * Returns:
* HTTP_BAD_REQUEST * HTTP_BAD_REQUEST
* UPNP_E_OUTOF_MEMORY * UPNP_E_OUTOF_MEMORY
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE * HTTP_REQUEST_RANGE_NOT_SATISFIABLE
* HTTP_OK * HTTP_OK
************************************************************************/ ************************************************************************/
static int static int
process_request( IN http_message_t * req, process_request( IN http_message_t * req,
OUT enum resp_type *rtype, OUT enum resp_type *rtype,
@@ -1495,23 +1494,23 @@ process_request( IN http_message_t * req,
} }
/************************************************************************ /************************************************************************
* Function: http_RecvPostMessage * Function: http_RecvPostMessage
* *
* Parameters: * Parameters:
* http_parser_t* parser ; HTTP Parser object * http_parser_t* parser ; HTTP Parser object
* IN SOCKINFO *info ; Socket Information object * IN SOCKINFO *info ; Socket Information object
* char * filename ; File where received data is copied to * char * filename ; File where received data is copied to
* struct SendInstruction * Instr ; Send Instruction object which gives * struct SendInstruction * Instr ; Send Instruction object which gives
* information whether the file is a virtual file or not. * information whether the file is a virtual file or not.
* *
* Description: Receives the HTTP post message * Description: Receives the HTTP post message
* *
* Returns: * Returns:
* HTTP_INTERNAL_SERVER_ERROR * HTTP_INTERNAL_SERVER_ERROR
* HTTP_UNAUTHORIZED * HTTP_UNAUTHORIZED
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE * HTTP_REQUEST_RANGE_NOT_SATISFIABLE
* HTTP_OK * HTTP_OK
************************************************************************/ ************************************************************************/
int int
http_RecvPostMessage( http_parser_t * parser, http_RecvPostMessage( http_parser_t * parser,
IN SOCKINFO * info, IN SOCKINFO * info,
@@ -1659,19 +1658,19 @@ http_RecvPostMessage( http_parser_t * parser,
} }
/************************************************************************ /************************************************************************
* Function: web_server_callback * Function: web_server_callback
* *
* Parameters: * Parameters:
* IN http_parser_t *parser ; HTTP Parser Object * IN http_parser_t *parser ; HTTP Parser Object
* INOUT http_message_t* req ; HTTP Message request * INOUT http_message_t* req ; HTTP Message request
* IN SOCKINFO *info ; Socket information object * IN SOCKINFO *info ; Socket information object
* *
* Description: main entry point into web server; * Description: main entry point into web server;
* handles HTTP GET and HEAD requests * handles HTTP GET and HEAD requests
* *
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
void void
web_server_callback( IN http_parser_t * parser, web_server_callback( IN http_parser_t * parser,
INOUT http_message_t * req, INOUT http_message_t * req,
@@ -1764,3 +1763,4 @@ web_server_callback( IN http_parser_t * parser,
membuffer_destroy( &headers ); membuffer_destroy( &headers );
membuffer_destroy( &filename ); membuffer_destroy( &filename );
} }

View File

@@ -50,73 +50,78 @@ int
http_CancelHttpGet( IN void *Handle ); http_CancelHttpGet( IN void *Handle );
/************************************************************************ /************************************************************************
* Function: http_FixUrl * Function: http_FixUrl
* *
* Parameters: * Parameters:
* IN uri_type* url ; URL to be validated and fixed * IN uri_type* url; URL to be validated and fixed
* OUT uri_type* fixed_url ; URL after being fixed. * OUT uri_type* fixed_url; URL after being fixed.
* *
* Description: Validates URL * Description:
* * Validates URL
* Returns: *
* UPNP_E_INVALID_URL * Returns:
* UPNP_E_SUCCESS * UPNP_E_INVALID_URL
************************************************************************/ * UPNP_E_SUCCESS
************************************************************************/
int http_FixUrl( IN uri_type* url, OUT uri_type* fixed_url ); int http_FixUrl( IN uri_type* url, OUT uri_type* fixed_url );
/************************************************************************ /************************************************************************
* Function: http_FixStrUrl * Function: http_FixStrUrl
* *
* Parameters: * Parameters:
* IN char* urlstr ; Character string as a URL * IN char* urlstr ; Character string as a URL
* IN int urlstrlen ; Length of the character string * IN int urlstrlen ; Length of the character string
* OUT uri_type* fixed_url ; Fixed and corrected URL * 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 * Returns:
* UPNP_E_SUCCESS * UPNP_E_INVALID_URL
************************************************************************/ * UPNP_E_SUCCESS
************************************************************************/
int http_FixStrUrl( IN char* urlstr, IN int urlstrlen, OUT uri_type* fixed_url ); int http_FixStrUrl( IN char* urlstr, IN int urlstrlen, OUT uri_type* fixed_url );
/************************************************************************ /************************************************************************
* Function: http_Connect * Function: http_Connect
* *
* Parameters: * Parameters:
* IN uri_type* destination_url ; URL containing destination information * IN uri_type* destination_url; URL containing destination information
* OUT uri_type *url ; Fixed and corrected URL * OUT uri_type *url; Fixed and corrected URL
* *
* Description: Gets destination address from URL and then connects to the * Description:
* remote end * Gets destination address from URL and then connects to the remote end
* *
* Returns: * Returns:
* socket descriptor on sucess * socket descriptor on sucess
* UPNP_E_OUTOF_SOCKET * UPNP_E_OUTOF_SOCKET
* UPNP_E_SOCKET_CONNECT on error * UPNP_E_SOCKET_CONNECT on error
************************************************************************/ ************************************************************************/
int http_Connect( IN uri_type* destination_url, OUT uri_type *url ); int http_Connect( IN uri_type* destination_url, OUT uri_type *url );
/************************************************************************ /************************************************************************
* Function: http_RecvMessage * Function: http_RecvMessage
* *
* Parameters: * Parameters:
* IN SOCKINFO *info ; Socket information object * 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 http_method_t request_method; HTTP request method
* IN OUT int* timeout_secs ; time out * IN OUT int* timeout_secs; time out
* OUT int* http_error_code ; HTTP error code returned * OUT int* http_error_code; HTTP error code returned
* *
* Description: Get the data on the socket and take actions based on the * Description:
* read data to modify the parser objects buffer. If an error is reported * Get the data on the socket and take actions based on the read data
* while parsing the data, the error code is passed in the http_errr_code * to modify the parser objects buffer. If an error is reported while
* parameter * parsing the data, the error code is passed in the http_errr_code
* * parameter
* Returns: *
* UPNP_E_BAD_HTTPMSG * Returns:
* UPNP_E_SUCCESS * UPNP_E_BAD_HTTPMSG
************************************************************************/ * UPNP_E_SUCCESS
************************************************************************/
int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t* parser, int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t* parser,
IN http_method_t request_method, IN http_method_t request_method,
IN OUT int* timeout_secs, IN OUT int* timeout_secs,
@@ -124,302 +129,311 @@ int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t* parser,
/************************************************************************ /************************************************************************
* Function: http_SendMessage * Function: http_SendMessage
* *
* Parameters: * Parameters:
* IN SOCKINFO *info ; Socket information object * IN SOCKINFO *info ; Socket information object
* IN OUT int * TimeOut ; time out value * IN OUT int * TimeOut ; time out value
* IN const char* fmt, ... Pattern format to take actions upon * IN const char* fmt, ... Pattern format to take actions upon
* *
* Description: Sends a message to the destination based on the * Description:
* IN const char* fmt parameter * Sends a message to the destination based on the
* fmt types: * IN const char* fmt parameter
* 'f': arg = const char * file name * fmt types:
* 'm': arg1 = const char * mem_buffer; arg2= size_t buf_length * 'f': arg = const char * file name
* E.g.: * 'm': arg1 = const char * mem_buffer; arg2= size_t buf_length
* char *buf = "POST /xyz.cgi http/1.1\r\n\r\n"; * E.g.:
* char *filename = "foo.dat"; * char *buf = "POST /xyz.cgi http/1.1\r\n\r\n";
* int status = http_SendMessage( tcpsock, "mf", * char *filename = "foo.dat";
* buf, strlen(buf), // args for memory buffer * int status = http_SendMessage( tcpsock, "mf",
* filename ); // arg for file * buf, strlen(buf), // args for memory buffer
* * filename ); // arg for file
* Returns: *
* UPNP_E_OUTOF_MEMORY * Returns:
* UPNP_E_FILE_READ_ERROR * UPNP_E_OUTOF_MEMORY
* UPNP_E_SUCCESS * UPNP_E_FILE_READ_ERROR
************************************************************************/ * UPNP_E_SUCCESS
int http_SendMessage( IN SOCKINFO *info, IN OUT int* timeout_secs, ************************************************************************/
IN const char* fmt, ... ); int http_SendMessage(
IN SOCKINFO *info,
/************************************************************************ IN OUT int* timeout_secs,
* Function: http_RequestAndResponse IN const char* fmt, ... );
*
* 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
* Error Codes returned by http_RecvMessage
************************************************************************/
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
* UPNP_E_OUTOF_MEMORY
* UPNP_E_TIMEDOUT
* UPNP_E_BAD_REQUEST
* UPNP_E_BAD_RESPONSE
* UPNP_E_INVALID_URL
* UPNP_E_SOCKET_READ
* 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
* 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
* from the message.
*
* Return : int;
* UPNP_E_SUCCESS;
* UPNP_E_INVALID_URL;
*
*
* Note :
************************************************************************/
int http_Download( IN const char* url,
IN int timeout_secs,
OUT char** document, OUT int* doc_length,
OUT char* content_type );
/************************************************************************ /************************************************************************
* Function : http_WriteHttpPost * Function: http_RequestAndResponse
* *
* Parameters : * Parameters:
* IN void *Handle : Handle to the http post object * IN uri_type* destination; Destination URI object which contains
* IN char *buf : Buffer to send to peer, if format used * remote IP address among other elements
* is not UPNP_USING_CHUNKED, * IN const char* request; Request to be sent
* IN unsigned int *size : Size of the data to be sent. * IN size_t request_length; Length of the request
* IN int timeout : time out value * IN http_method_t req_method; HTTP Request method
* * IN int timeout_secs; time out value
* Description : Formats data if format used is UPNP_USING_CHUNKED. * OUT http_parser_t* response; Parser object to receive the repsonse
* Writes data on the socket connected to the peer. *
* * Description:
* Return : int ; * Initiates socket, connects to the destination, sends a
* UPNP_E_SUCCESS - On Success * request and waits for the response from the remote end
* UPNP_E_INVALID_PARAM - Invalid Parameter *
* -1 - On Socket Error. * Returns:
* * UPNP_E_SOCKET_ERROR
* Note : * UPNP_E_SOCKET_CONNECT
************************************************************************/ * 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,
IN http_method_t req_method,
IN int timeout_secs,
OUT http_parser_t* response );
/************************************************************************
* return codes:
* 0 -- success
* UPNP_E_OUTOF_MEMORY
* UPNP_E_TIMEDOUT
* UPNP_E_BAD_REQUEST
* UPNP_E_BAD_RESPONSE
* UPNP_E_INVALID_URL
* UPNP_E_SOCKET_READ
* 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
* 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
* from the message.
*
* Return: int
* UPNP_E_SUCCESS
* UPNP_E_INVALID_URL
************************************************************************/
int http_Download(
IN const char* url,
IN int timeout_secs,
OUT char** document,
OUT int* doc_length,
OUT char* content_type );
/************************************************************************
* Function: http_WriteHttpPost
*
* Parameters:
* IN void *Handle: Handle to the http post object
* IN char *buf: Buffer to send to peer, if format used
* is not UPNP_USING_CHUNKED,
* 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.
* Writes data on the socket connected to the peer.
*
* Return: int
* UPNP_E_SUCCESS - On Success
* UPNP_E_INVALID_PARAM - Invalid Parameter
* -1 - On Socket Error.
************************************************************************/
int http_WriteHttpPost(IN void *Handle, int http_WriteHttpPost(IN void *Handle,
IN char *buf, IN char *buf,
IN unsigned int *size, IN unsigned int *size,
IN int timeout); IN int timeout);
/************************************************************************ /************************************************************************
* Function : http_CloseHttpPost * Function: http_CloseHttpPost
* *
* Parameters : * Parameters:
* IN void *Handle : Handle to the http post object * IN void *Handle; Handle to the http post object
* IN OUT int *httpStatus : HTTP status returned on receiving a * IN OUT int *httpStatus; HTTP status returned on receiving a
* response message * response message
* IN int timeout : time out value * IN int timeout; time out value
* *
* Description : Sends remaining data if using UPNP_USING_CHUNKED * Description:
* format. Receives any more messages. Destroys socket and any socket * Sends remaining data if using UPNP_USING_CHUNKED
* associated memory. Frees handle associated with the HTTP POST msg. * 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 ; * Return: int
* UPNP_E_INVALID_PARAM - Invalid Parameter; * UPNP_E_SUCCESS - On Sucess
* * UPNP_E_INVALID_PARAM - Invalid Parameter
* Note : ************************************************************************/
************************************************************************/
int http_CloseHttpPost(IN void *Handle, int http_CloseHttpPost(IN void *Handle,
IN OUT int *httpStatus, IN OUT int *httpStatus,
IN int timeout); IN int timeout);
/************************************************************************ /************************************************************************
* Function : http_OpenHttpPost * Function: http_OpenHttpPost
* *
* Parameters : * Parameters:
* IN const char *url_str : String as a URL * IN const char *url_str; String as a URL
* IN OUT void **Handle : Pointer to buffer to store HTTP * IN OUT void **Handle; Pointer to buffer to store HTTP
* post handle * post handle
* IN const char *contentType : Type of content * IN const char *contentType; Type of content
* IN int contentLength : length of content * IN int contentLength; length of content
* IN int timeout : time out value * IN int timeout; time out value
* *
* Description : Makes the HTTP POST message, connects to the peer, * Description:
* sends the HTTP POST request. Adds the post handle to buffer of * Makes the HTTP POST message, connects to the peer,
* such handles * sends the HTTP POST request. Adds the post handle to buffer of
* * such handles
* Return : int; *
* UPNP_E_SUCCESS - On Sucess ; * Return : int;
* UPNP_E_INVALID_PARAM - Invalid Paramter ; * UPNP_E_SUCCESS - On Sucess
* UPNP_E_OUTOF_MEMORY ; * UPNP_E_INVALID_PARAM - Invalid Parameter
* UPNP_E_SOCKET_ERROR ; * UPNP_E_OUTOF_MEMORY
* UPNP_E_SOCKET_CONNECT ; * UPNP_E_SOCKET_ERROR
* * UPNP_E_SOCKET_CONNECT
* Note : ************************************************************************/
************************************************************************/
int http_OpenHttpPost(IN const char *url_str, int http_OpenHttpPost(IN const char *url_str,
IN OUT void **Handle, IN OUT void **Handle,
IN const char *contentType, IN const char *contentType,
IN int contentLength, IN int contentLength,
IN int timeout); 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
*
* 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 :
************************************************************************/
int http_ReadHttpGet(IN void *Handle,
IN OUT char *buf,
IN OUT unsigned int *size,
IN int timeout);
/************************************************************************ /************************************************************************
* Function : http_HttpGetProgress * Function: http_ReadHttpGet
* *
* Parameters : * Parameters:
* IN void *Handle : Handle to the HTTP get object * IN void *Handle; Handle to the HTTP get object
* OUT unsigned int *length : Buffer to get the read and parsed data * IN OUT char *buf; Buffer to get the read and parsed data
* OUT unsigned int *total : Size of tge buffer passed * IN OUT unsigned int *size; Size of the buffer passed
* * IN int timeout; time out value
* Description : Extracts information from the Handle to the HTTP get *
* object. * Description:
* * Parses already existing data, then gets new data.
* Return : int ; * Parses and extracts information from the new data.
* UPNP_E_SUCCESS - On Sucess ; *
* UPNP_E_INVALID_PARAM - Invalid Parameter; * Return: int
* * UPNP_E_SUCCESS - On Sucess
* Note : * UPNP_E_INVALID_PARAM - Invalid Parameter
************************************************************************/ * UPNP_E_BAD_RESPONSE
int http_HttpGetProgress(IN void *Handle, * UPNP_E_BAD_HTTPMSG
OUT unsigned int *length, * UPNP_E_CANCELED
OUT unsigned int *total ); ************************************************************************/
int http_ReadHttpGet(
IN void *Handle,
IN OUT char *buf,
IN OUT unsigned int *size,
IN int timeout);
/************************************************************************ /************************************************************************
* Function : http_CloseHttpGet * Function: http_HttpGetProgress
* *
* Parameters : * Parameters:
* IN void *Handle ; Handle to HTTP get object * IN void *Handle; Handle to the HTTP get object
* * OUT unsigned int *length; Buffer to get the read and parsed data
* Description : Clears the handle allocated for the HTTP GET operation * OUT unsigned int *total; Size of tge buffer passed
* Clears socket states and memory allocated for socket operations. *
* * Description:
* Return : int ; * Extracts information from the Handle to the HTTP get object.
* UPNP_E_SUCCESS - On Success *
* UPNP_E_INVALID_PARAM - Invalid Parameter * Return: int
* * UPNP_E_SUCCESS - On Sucess
* Note : * UPNP_E_INVALID_PARAM - Invalid Parameter
************************************************************************/ ************************************************************************/
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
* Clears socket states and memory allocated for socket operations.
*
* Return: int
* UPNP_E_SUCCESS - On Success
* UPNP_E_INVALID_PARAM - Invalid Parameter
************************************************************************/
int http_CloseHttpGet(IN void *Handle); int http_CloseHttpGet(IN void *Handle);
/************************************************************************
* Function : http_OpenHttpGet
*
* 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,
* 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 :
*
************************************************************************/
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 * Function: http_OpenHttpGet
* *
* Parameters : * Parameters:
* IN const char *url_str : String as a URL * 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 OUT void **Handle : Pointer to buffer to store HTTP * post handle
* post handle * IN OUT char **contentType: Type of content
* IN OUT char **contentType : Type of content * OUT int *contentLength: length of content
* OUT int *contentLength : length of content * OUT int *httpStatus: HTTP status returned on receiving a
* OUT int *httpStatus : HTTP status returned on receiving a * response message
* response message * IN int timeout: time out value
* IN int timeout : time out value *
* * Description:
* Description : Makes the HTTP GET message, connects to the peer, * Makes the HTTP GET message, connects to the peer,
* sends the HTTP GET request, gets the response and parses the * sends the HTTP GET request, gets the response and parses the
* response. * response.
* *
* Return : int; * Return: int
* UPNP_E_SUCCESS - On Success ; * UPNP_E_SUCCESS - On Success
* UPNP_E_INVALID_PARAM - Invalid Paramters ; * UPNP_E_INVALID_PARAM - Invalid Paramters
* UPNP_E_OUTOF_MEMORY ; * UPNP_E_OUTOF_MEMORY
* UPNP_E_SOCKET_ERROR ; * UPNP_E_SOCKET_ERROR
* UPNP_E_BAD_RESPONSE ; * UPNP_E_BAD_RESPONSE
* ************************************************************************/
* Note : 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
* 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,
* 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, int http_OpenHttpGetProxy(IN const char *url_str,
IN const char *proxy_str, IN const char *proxy_str,
IN OUT void **Handle, IN OUT void **Handle,
@@ -430,126 +444,134 @@ int http_OpenHttpGetProxy(IN const char *url_str,
/************************************************************************ /************************************************************************
* Function : http_SendStatusResponse * Function: http_SendStatusResponse
* *
* Parameters : * Parameters:
* IN SOCKINFO *info : Socket information object * IN SOCKINFO *info; Socket information object
* IN int http_status_code : error code returned while making * IN int http_status_code; error code returned while making
* or sending the response message * or sending the response message
* IN int request_major_version : request major version * IN int request_major_version; request major version
* IN int request_minor_version : request minor version * IN int request_minor_version; request minor version
* *
* Description : Generate a response message for the status query and * Description:
* send the status response. * Generate a response message for the status query and send the
* * status response.
* Return : int; *
* 0 -- success * Return: int
* UPNP_E_OUTOF_MEMORY * 0 -- success
* UPNP_E_SOCKET_WRITE * UPNP_E_OUTOF_MEMORY
* UPNP_E_TIMEDOUT * UPNP_E_SOCKET_WRITE
* * UPNP_E_TIMEDOUT
* Note : ************************************************************************/
************************************************************************/ int http_SendStatusResponse(
int http_SendStatusResponse( IN SOCKINFO *info, IN int http_status_code, IN SOCKINFO *info,
IN int request_major_version, IN int http_status_code,
IN int request_minor_version ); IN int request_major_version,
IN int request_minor_version );
/************************************************************************ /************************************************************************
* Function : http_MakeMessage * Function: http_MakeMessage
* *
* Parameters : * Parameters:
* INOUT membuffer* buf : buffer with the contents of the * INOUT membuffer* buf; buffer with the contents of the
* message * message
* IN int http_major_version : HTTP major version * IN int http_major_version; HTTP major version
* IN int http_minor_version : HTTP minor version * IN int http_minor_version; HTTP minor version
* IN const char* fmt : Pattern format * IN const char* fmt; Pattern format
* ... : * ...;
* *
* Description : Generate an HTTP message based on the format that is * Description:
* specified in the input parameters. * Generate an HTTP message based on the format that is specified
* * in the input parameters.
* fmt types: *
* 's': arg = const char* C_string * fmt types:
* 'b': arg1 = const char* buf; arg2 = size_t buf_length * 'B': arg = int status_code
* memory ptr * appends content-length, content-type and HTML body
* 'c': (no args) appends CRLF "\r\n" * for given code
* 'd': arg = int number // appends decimal number * 'b': arg1 = const char* buf;
* 'h': arg = off_t number // appends off_t number * arg2 = size_t buf_length memory ptr
* 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt * 'C': (no args) appends a HTTP CONNECTION: close header
* 'D': (no args) appends HTTP DATE: header * depending on major,minor version
* 'S': (no args) appends HTTP SERVER: header * 'c': (no args) appends CRLF "\r\n"
* 'U': (no args) appends HTTP USER-AGENT: header * 'D': (no args) appends HTTP DATE: header
* 'C': (no args) appends a HTTP CONNECTION: close header * 'd': arg = int number // appends decimal number
* depending on major,minor version * 'G': arg = range information // add range header
* 'N': arg1 = int content_length // content-length header * 'h': arg = off_t number // appends off_t number
* 'Q': arg1 = http_method_t; arg2 = char* url; * 'K': (no args) // add chunky header
* arg3 = int url_length // start line of request * 'N': arg1 = off_t content_length // content-length header
* 'R': arg = int status_code // adds a response start line * 'q': arg1 = http_method_t // request start line and HOST header
* 'B': arg = int status_code * arg2 = (uri_type *)
* appends content-length, content-type and HTML body for given code * 'Q': arg1 = http_method_t; // start line of request
* 'T': arg = char * content_type; format e.g: "text/html"; * arg2 = char* url;
* content-type header * arg3 = size_t url_length
* * 'R': arg = int status_code // adds a response start line
* Return : int; * 'S': (no args) appends HTTP SERVER: header
* 0 - On Success * 's': arg = const char* C_string
* UPNP_E_OUTOF_MEMORY * 'T': arg = char * content_type; format
* UPNP_E_INVALID_URL; * e.g: "text/html"; content-type header
* * 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt
* Note : * 'U': (no args) appends HTTP USER-AGENT: header
************************************************************************/ * 'X': arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent
int http_MakeMessage( INOUT membuffer* buf, *
IN int http_major_version, * Return: int
IN int http_minor_version, * 0 - On Success
IN const char* fmt, ... ); * UPNP_E_OUTOF_MEMORY
* UPNP_E_INVALID_URL
************************************************************************/
int http_MakeMessage(
INOUT membuffer* buf,
IN int http_major_version,
IN int http_minor_version,
IN const char* fmt, ... );
/************************************************************************ /************************************************************************
* Function : http_CalcResponseVersion * Function: http_CalcResponseVersion
* *
* Parameters : * Parameters:
* IN int request_major_vers : Request major version * IN int request_major_vers; Request major version
* IN int request_minor_vers : Request minor version * IN int request_minor_vers; Request minor version
* OUT int* response_major_vers : Response mojor version * OUT int* response_major_vers; Response mojor version
* OUT int* response_minor_vers : Response minor version * OUT int* response_minor_vers; Response minor version
* *
* Description : Calculate HTTP response versions based on the request * Description:
* versions. * Calculate HTTP response versions based on the request versions.
* *
* Return : void * Return: void
* ************************************************************************/
* Note :
************************************************************************/
void http_CalcResponseVersion( void http_CalcResponseVersion(
IN int request_major_vers, IN int request_minor_vers, IN int request_major_vers,
OUT int* response_major_vers, OUT int* response_minor_vers ); IN int request_minor_vers,
OUT int* response_major_vers,
OUT int* response_minor_vers );
/************************************************************************ /************************************************************************
* Function : http_OpenHttpGetEx * Function: http_OpenHttpGetEx
* *
* Parameters : * Parameters:
* IN const char *url_str : String as a URL * IN const char *url_str; String as a URL
* IN OUT void **Handle : Pointer to buffer to store HTTP * IN OUT void **Handle; Pointer to buffer to store HTTP
* post handle * post handle
* IN OUT char **contentType : Type of content * IN OUT char **contentType; Type of content
* OUT int *contentLength : length of content * OUT int *contentLength; length of content
* OUT int *httpStatus : HTTP status returned on receiving a * OUT int *httpStatus; HTTP status returned on receiving a
* response message * 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:
* sends the HTTP GET request, gets the response and parses the * Makes the HTTP GET message, connects to the peer,
* response. * sends the HTTP GET request, gets the response and parses the
* * response.
* Return : int; *
* UPNP_E_SUCCESS - On Success ; * Return: int
* UPNP_E_INVALID_PARAM - Invalid Paramters ; * UPNP_E_SUCCESS - On Success
* UPNP_E_OUTOF_MEMORY ; * UPNP_E_INVALID_PARAM - Invalid Paramters
* UPNP_E_SOCKET_ERROR ; * UPNP_E_OUTOF_MEMORY
* UPNP_E_BAD_RESPONSE ; * UPNP_E_SOCKET_ERROR
* * UPNP_E_BAD_RESPONSE
* Note : ************************************************************************/
*
************************************************************************/
int http_OpenHttpGetEx(IN const char *url_str, int http_OpenHttpGetEx(IN const char *url_str,
IN OUT void **Handle, IN OUT void **Handle,
IN OUT char **contentType, IN OUT char **contentType,
@@ -559,19 +581,19 @@ int http_OpenHttpGetEx(IN const char *url_str,
IN int highRange, IN int highRange,
IN int timeout); IN int timeout);
/************************************************************************ /************************************************************************
* Function : get_sdk_info * Function: get_sdk_info
* *
* Parameters : * Parameters:
* OUT char *info ; * OUT char *info; buffer to store the operating system information
* *
* Description : Returns the server information for the operating * Description:
* system * Returns the server information for the operating system
* *
* Return : void ; * Return:
* * UPNP_INLINE void
* Note : ************************************************************************/
************************************************************************/
void get_sdk_info( OUT char *info ); void get_sdk_info( OUT char *info );
#ifdef __cplusplus #ifdef __cplusplus
@@ -580,3 +602,4 @@ void get_sdk_info( OUT char *info );
#endif // GENLIB_NET_HTTP_HTTPREADWRITE_H #endif // GENLIB_NET_HTTP_HTTPREADWRITE_H

View File

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

View File

@@ -43,56 +43,54 @@
#include "httpreadwrite.h" #include "httpreadwrite.h"
#ifdef WIN32 #ifdef WIN32
#include <winsock2.h> #include <winsock2.h>
#include <ws2tcpip.h> #include <ws2tcpip.h>
#include "unixutil.h" #include "unixutil.h"
#endif #endif
#define MAX_TIME_TOREAD 45 #define MAX_TIME_TOREAD 45
CLIENTONLY( SOCKET gSsdpReqSocket = 0; CLIENTONLY( SOCKET gSsdpReqSocket = 0; )
)
void RequestHandler( ); void RequestHandler();
Event ErrotEvt; Event ErrotEvt;
enum Listener { Idle, Stopping, Running }; enum Listener { Idle, Stopping, Running };
unsigned short ssdpStopPort; unsigned short ssdpStopPort;
struct SSDPSockArray { struct SSDPSockArray {
int ssdpSock; //socket for incoming advertisments and search requests // socket for incoming advertisments and search requests
CLIENTONLY( int ssdpReqSock; int ssdpSock;
) //socket for sending search // socket for sending search requests and receiving search replies
//requests and receiving CLIENTONLY( int ssdpReqSock; )
// search replies };
};
#ifdef INCLUDE_DEVICE_APIS #ifdef INCLUDE_DEVICE_APIS
#if EXCLUDE_SSDP == 0 #if EXCLUDE_SSDP == 0
/************************************************************************ /************************************************************************
* Function : AdvertiseAndReply * Function : AdvertiseAndReply
* *
* Parameters: * Parameters:
* IN int AdFlag: * IN int AdFlag:
* -1 = Send shutdown, * -1 = Send shutdown,
* 0 = send reply, * 0 = send reply,
* 1 = Send Advertisement * 1 = Send Advertisement
* IN UpnpDevice_Handle Hnd: Device handle * IN UpnpDevice_Handle Hnd: Device handle
* IN enum SsdpSearchType SearchType:Search type for sending replies * IN enum SsdpSearchType SearchType:Search type for sending replies
* IN struct sockaddr_in *DestAddr:Destination address * IN struct sockaddr_in *DestAddr:Destination address
* IN char *DeviceType:Device type * IN char *DeviceType:Device type
* IN char *DeviceUDN:Device UDN * IN char *DeviceUDN:Device UDN
* IN char *ServiceType:Service type * IN char *ServiceType:Service type
* IN int Exp:Advertisement age * IN int Exp:Advertisement age
* *
* Description: * Description:
* This function sends SSDP advertisements, replies and shutdown messages. * This function sends SSDP advertisements, replies and shutdown messages.
* *
* Returns: int * Returns: int
* UPNP_E_SUCCESS if successful else appropriate error * UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/ ***************************************************************************/
int AdvertiseAndReply( IN int AdFlag, int AdvertiseAndReply( IN int AdFlag,
IN UpnpDevice_Handle Hnd, IN UpnpDevice_Handle Hnd,
IN enum SsdpSearchType SearchType, IN enum SsdpSearchType SearchType,
@@ -129,7 +127,6 @@ int AdvertiseAndReply( IN int AdFlag,
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
} }
defaultExp = SInfo->MaxAge; defaultExp = SInfo->MaxAge;
nodeList = NULL;
//get server info //get server info
@@ -398,21 +395,21 @@ int AdvertiseAndReply( IN int AdFlag,
} /****************** End of AdvertiseAndReply *********************/ } /****************** End of AdvertiseAndReply *********************/
#endif #endif /* EXCLUDE_SSDP == 0 */
#endif #endif /* INCLUDE_DEVICE_APIS */
/************************************************************************ /************************************************************************
* Function : Make_Socket_NoBlocking * Function : Make_Socket_NoBlocking
* *
* Parameters: * Parameters:
* IN int sock: socket * IN int sock: socket
* *
* Description: * Description:
* This function makes socket non-blocking. * This function makes socket non-blocking.
* *
* Returns: int * Returns: int
* 0 if successful else -1 * 0 if successful else -1
***************************************************************************/ ***************************************************************************/
int int
Make_Socket_NoBlocking( int sock ) Make_Socket_NoBlocking( int sock )
{ {
@@ -431,20 +428,20 @@ Make_Socket_NoBlocking( int sock )
} }
/************************************************************************ /************************************************************************
* Function : unique_service_name * Function : unique_service_name
* *
* Parameters: * Parameters:
* IN char *cmd: Service Name string * IN char *cmd: Service Name string
* OUT SsdpEvent *Evt: The SSDP event structure partially filled * OUT SsdpEvent *Evt: The SSDP event structure partially filled
* by all the function. * by all the function.
* *
* Description: * Description:
* This function fills the fields of the event structure like DeviceType, * This function fills the fields of the event structure like DeviceType,
* Device UDN and Service Type * Device UDN and Service Type
* *
* Returns: int * Returns: int
* 0 if successful else -1 * 0 if successful else -1
***************************************************************************/ ***************************************************************************/
int int
unique_service_name( IN char *cmd, unique_service_name( IN char *cmd,
IN SsdpEvent * Evt ) IN SsdpEvent * Evt )
@@ -526,18 +523,18 @@ unique_service_name( IN char *cmd,
} }
/************************************************************************ /************************************************************************
* Function : ssdp_request_type1 * Function : ssdp_request_type1
* *
* Parameters: * Parameters:
* IN char *cmd: command came in the ssdp request * IN char *cmd: command came in the ssdp request
* *
* Description: * Description:
* This function figures out the type of the SSDP search in the * This function figures out the type of the SSDP search in the
* in the request. * in the request.
* *
* Returns: enum SsdpSearchType * Returns: enum SsdpSearchType
* return appropriate search type else returns SSDP_ERROR * return appropriate search type else returns SSDP_ERROR
***************************************************************************/ ***************************************************************************/
enum SsdpSearchType enum SsdpSearchType
ssdp_request_type1( IN char *cmd ) ssdp_request_type1( IN char *cmd )
{ {
@@ -562,20 +559,20 @@ ssdp_request_type1( IN char *cmd )
} }
/************************************************************************ /************************************************************************
* Function : ssdp_request_type * Function : ssdp_request_type
* *
* Parameters: * Parameters:
* IN char *cmd: command came in the ssdp request * IN char *cmd: command came in the ssdp request
* OUT SsdpEvent *Evt: The event structure partially filled by * OUT SsdpEvent *Evt: The event structure partially filled by
* this function. * this function.
* *
* Description: * Description:
* This function starts filling the SSDP event structure based upon the * This function starts filling the SSDP event structure based upon the
* request received. * request received.
* *
* Returns: int * Returns: int
* 0 on success; -1 on error * 0 on success; -1 on error
***************************************************************************/ ***************************************************************************/
int int
ssdp_request_type( IN char *cmd, ssdp_request_type( IN char *cmd,
OUT SsdpEvent * Evt ) OUT SsdpEvent * Evt )
@@ -593,18 +590,18 @@ ssdp_request_type( IN char *cmd,
} }
/************************************************************************ /************************************************************************
* Function : free_ssdp_event_handler_data * Function : free_ssdp_event_handler_data
* *
* Parameters: * Parameters:
* IN void *the_data: ssdp_thread_data structure. This structure contains * IN void *the_data: ssdp_thread_data structure. This structure contains
* SSDP request message. * SSDP request message.
* *
* Description: * Description:
* This function frees the ssdp request * This function frees the ssdp request
* *
* Returns: VOID * Returns: VOID
* *
***************************************************************************/ ***************************************************************************/
static void static void
free_ssdp_event_handler_data( void *the_data ) free_ssdp_event_handler_data( void *the_data )
{ {
@@ -620,18 +617,18 @@ free_ssdp_event_handler_data( void *the_data )
} }
/************************************************************************ /************************************************************************
* Function : valid_ssdp_msg * Function : valid_ssdp_msg
* *
* Parameters: * Parameters:
* IN void *the_data: ssdp_thread_data structure. This structure contains * IN void *the_data: ssdp_thread_data structure. This structure contains
* SSDP request message. * SSDP request message.
* *
* Description: * Description:
* This function do some quick checking of the ssdp msg * This function do some quick checking of the ssdp msg
* *
* Returns: xboolean * Returns: xboolean
* returns TRUE if msg is valid else FALSE * returns TRUE if msg is valid else FALSE
***************************************************************************/ ***************************************************************************/
static UPNP_INLINE xboolean static UPNP_INLINE xboolean
valid_ssdp_msg( IN http_message_t * hmsg ) valid_ssdp_msg( IN http_message_t * hmsg )
{ {
@@ -661,19 +658,19 @@ valid_ssdp_msg( IN http_message_t * hmsg )
} }
/************************************************************************ /************************************************************************
* Function : start_event_handler * Function : start_event_handler
* *
* Parameters: * Parameters:
* IN void *the_data: ssdp_thread_data structure. This structure contains * IN void *the_data: ssdp_thread_data structure. This structure contains
* SSDP request message. * SSDP request message.
* *
* Description: * Description:
* This function parses the message and dispatches it to a handler * This function parses the message and dispatches it to a handler
* which handles the ssdp request msg * which handles the ssdp request msg
* *
* Returns: int * Returns: int
* 0 if successful -1 if error * 0 if successful -1 if error
***************************************************************************/ ***************************************************************************/
static UPNP_INLINE int static UPNP_INLINE int
start_event_handler( void *Data ) start_event_handler( void *Data )
{ {
@@ -713,18 +710,18 @@ start_event_handler( void *Data )
} }
/************************************************************************ /************************************************************************
* Function : ssdp_event_handler_thread * Function : ssdp_event_handler_thread
* *
* Parameters: * Parameters:
* IN void *the_data: ssdp_thread_data structure. This structure contains * IN void *the_data: ssdp_thread_data structure. This structure contains
* SSDP request message. * SSDP request message.
* *
* Description: * Description:
* This function is a thread that handles SSDP requests. * This function is a thread that handles SSDP requests.
* *
* Returns: void * Returns: void
* *
***************************************************************************/ ***************************************************************************/
static void static void
ssdp_event_handler_thread( void *the_data ) ssdp_event_handler_thread( void *the_data )
{ {
@@ -737,8 +734,7 @@ ssdp_event_handler_thread( void *the_data )
// send msg to device or ctrlpt // send msg to device or ctrlpt
if( ( hmsg->method == HTTPMETHOD_NOTIFY ) || if( ( hmsg->method == HTTPMETHOD_NOTIFY ) ||
( hmsg->request_method == HTTPMETHOD_MSEARCH ) ) { ( hmsg->request_method == HTTPMETHOD_MSEARCH ) ) {
CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, &data->dest_addr, CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, &data->dest_addr, FALSE, NULL );)
FALSE, NULL ););
} else { } else {
ssdp_handle_device_request( hmsg, &data->dest_addr ); ssdp_handle_device_request( hmsg, &data->dest_addr );
} }
@@ -748,17 +744,17 @@ ssdp_event_handler_thread( void *the_data )
} }
/************************************************************************ /************************************************************************
* Function : readFromSSDPSocket * Function : readFromSSDPSocket
* *
* Parameters: * Parameters:
* IN SOCKET socket: SSDP socket * IN SOCKET socket: SSDP socket
* *
* Description: * Description:
* This function reads the data from the ssdp socket. * This function reads the data from the ssdp socket.
* *
* Returns: void * Returns: void
* *
***************************************************************************/ ***************************************************************************/
void void
readFromSSDPSocket( SOCKET socket ) readFromSSDPSocket( SOCKET socket )
{ {
@@ -845,32 +841,31 @@ readFromSSDPSocket( SOCKET socket )
} }
/************************************************************************ /************************************************************************
* Function : get_ssdp_sockets * Function : get_ssdp_sockets
* *
* Parameters: * Parameters:
* OUT MiniServerSockArray *out: Arrays of SSDP sockets * OUT MiniServerSockArray *out: Arrays of SSDP sockets
* *
* Description: * Description:
* This function creates the ssdp sockets. It set their option to listen * This function creates the ssdp sockets. It set their option to listen
* for multicast traffic. * for multicast traffic.
* *
* Returns: int * Returns: int
* return UPNP_E_SUCCESS if successful else returns appropriate error * return UPNP_E_SUCCESS if successful else returns appropriate error
***************************************************************************/ ***************************************************************************/
int int
get_ssdp_sockets( MiniServerSockArray * out ) get_ssdp_sockets( MiniServerSockArray * out )
{ {
SOCKET ssdpSock;
CLIENTONLY( SOCKET ssdpReqSock; )
int onOff = 1; int onOff = 1;
u_char ttl = 4; u_char ttl = 4;
struct ip_mreq ssdpMcastAddr; struct ip_mreq ssdpMcastAddr;
struct sockaddr_in ssdpAddr; struct sockaddr_in ssdpAddr;
int option = 1; int option = 1;
struct in_addr addr; struct in_addr addr;
SOCKET ssdpSock;
#if INCLUDE_CLIENT_APIS
SOCKET ssdpReqSock;
CLIENTONLY(
if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) { if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL, UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__, SSDP, __FILE__, __LINE__,
@@ -880,15 +875,15 @@ CLIENTONLY(
setsockopt( ssdpReqSock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); setsockopt( ssdpReqSock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
// just do it, regardless if fails or not. // just do it, regardless if fails or not.
Make_Socket_NoBlocking( ssdpReqSock ); Make_Socket_NoBlocking( ssdpReqSock );
gSsdpReqSocket = ssdpReqSock; ) gSsdpReqSocket = ssdpReqSock;
// END CLIENTONLY #endif /* INCLUDE_CLIENT_APIS */
if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) { if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL, UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__, SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" ); "Error in socket operation !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
return UPNP_E_OUTOF_SOCKET; return UPNP_E_OUTOF_SOCKET;
} }
@@ -898,26 +893,26 @@ CLIENTONLY(
UpnpPrintf( UPNP_CRITICAL, UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__, SSDP, __FILE__, __LINE__,
"Error in set reuse addr !!!\n" ); "Error in set reuse addr !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
shutdown( ssdpSock, SD_BOTH ); shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock ); UpnpCloseSocket( ssdpSock );
return UPNP_E_SOCKET_ERROR; return UPNP_E_SOCKET_ERROR;
} }
#ifdef __FreeBSD__ #ifdef __FreeBSD__
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT, if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT,
( char * )&onOff, sizeof( onOff ) ) != 0 ) { ( char * )&onOff, sizeof( onOff ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL, UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__, SSDP, __FILE__, __LINE__,
"Error in set reuse port !!!\n" ); "Error in set reuse port !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
shutdown( ssdpSock, SD_BOTH ); shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock ); UpnpCloseSocket( ssdpSock );
return UPNP_E_SOCKET_ERROR; return UPNP_E_SOCKET_ERROR;
} }
#endif #endif /* __FreeBSD__ */
memset( ( void * )&ssdpAddr, 0, sizeof( struct sockaddr_in ) ); memset( ( void * )&ssdpAddr, 0, sizeof( struct sockaddr_in ) );
ssdpAddr.sin_family = AF_INET; ssdpAddr.sin_family = AF_INET;
@@ -931,8 +926,8 @@ CLIENTONLY(
"Error in binding !!!\n" ); "Error in binding !!!\n" );
shutdown( ssdpSock, SD_BOTH ); shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock ); UpnpCloseSocket( ssdpSock );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
return UPNP_E_SOCKET_BIND; return UPNP_E_SOCKET_BIND;
} }
@@ -945,9 +940,9 @@ CLIENTONLY(
SSDP, __FILE__, __LINE__, SSDP, __FILE__, __LINE__,
"Error in joining" " multicast group !!!\n" ); "Error in joining" " multicast group !!!\n" );
shutdown( ssdpSock, SD_BOTH ); shutdown( ssdpSock, SD_BOTH );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
UpnpCloseSocket( ssdpSock ); UpnpCloseSocket( ssdpSock );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
return UPNP_E_SOCKET_ERROR; return UPNP_E_SOCKET_ERROR;
} }
@@ -961,7 +956,7 @@ CLIENTONLY(
/* This is probably not a critical error, so let's continue. */ /* 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, setsockopt( ssdpSock, IPPROTO_IP,
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST, if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST,
@@ -970,16 +965,16 @@ CLIENTONLY(
SSDP, __FILE__, __LINE__, SSDP, __FILE__, __LINE__,
"Error in setting broadcast !!!\n" ); "Error in setting broadcast !!!\n" );
shutdown( ssdpSock, SD_BOTH ); shutdown( ssdpSock, SD_BOTH );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
UpnpCloseSocket( ssdpSock ); UpnpCloseSocket( ssdpSock );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
return UPNP_E_NETWORK_ERROR; return UPNP_E_NETWORK_ERROR;
} }
CLIENTONLY( out->ssdpReqSock = ssdpReqSock; ); CLIENTONLY( out->ssdpReqSock = ssdpReqSock; )
out->ssdpSock = ssdpSock; out->ssdpSock = ssdpSock;
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }
#endif // EXCLUDE_SSDP #endif /* EXCLUDE_SSDP */