Compare commits
19 Commits
release-1.
...
release-1.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
62903b80f0 | ||
![]() |
6080414dc9 | ||
![]() |
6cbd7f0159 | ||
![]() |
c7c493c043 | ||
![]() |
c2f8e8789a | ||
![]() |
76457d0187 | ||
![]() |
9f5d49f9fd | ||
![]() |
cad4d05cd7 | ||
![]() |
26b8968e0c | ||
![]() |
d2eaa23b59 | ||
![]() |
b8aec74782 | ||
![]() |
851cfbc4db | ||
![]() |
f42bbb6dc2 | ||
![]() |
bd6027c3d1 | ||
![]() |
e3865bf6b6 | ||
![]() |
27af41e562 | ||
![]() |
1f05f5d6cc | ||
![]() |
43b9760840 | ||
![]() |
0103424b91 |
25
ChangeLog
25
ChangeLog
@@ -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
3
THANKS
@@ -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
|
||||||
|
|
||||||
|
15
configure.ac
15
configure.ac
@@ -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
0
ixml/test/test_document.sh
Normal file → Executable file
@@ -1,4 +1,4 @@
|
|||||||
Version: 1.4.2
|
Version: 1.6.2
|
||||||
Summary: Universal Plug and Play (UPnP) SDK
|
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
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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
@@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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 */
|
||||||
|
|
||||||
|
@@ -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 */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user