Miniserver is a required part of libupnp, no matter how configured.

However, it is possible to disable parts of the miniserver processing.

git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@400 119443c7-1b9e-41f8-b6fc-b9c35fce742c
This commit is contained in:
Charles Nepveu
2008-06-02 15:09:27 +00:00
parent 1175a0cadb
commit ecb06fa24f
2 changed files with 86 additions and 41 deletions

View File

@@ -118,9 +118,7 @@ TimerThread gTimerThread;
ThreadPool gSendThreadPool;
ThreadPool gRecvThreadPool;
#ifdef INTERNAL_WEB_SERVER
ThreadPool gMiniServerThreadPool;
#endif
ThreadPool gMiniServerThreadPool;
// Flag to indicate the state of web server
WebServerState bWebServerState = WEB_SERVER_DISABLED;
@@ -309,9 +307,7 @@ int UpnpFinish()
}
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool");
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
#ifdef INTERNAL_WEB_SERVER
PrintThreadPoolStats(&gMiniServerThreadPool, __FILE__, __LINE__, "MiniServer Thread Pool");
#endif
#ifdef INCLUDE_DEVICE_APIS
if (GetDeviceHandleInfo(AF_INET, &device_handle, &temp) == HND_DEVICE ) {
@@ -335,10 +331,8 @@ int UpnpFinish()
web_server_destroy();
#endif
#ifdef INTERNAL_WEB_SERVER
ThreadPoolShutdown(&gMiniServerThreadPool);
PrintThreadPoolStats(&gMiniServerThreadPool, __FILE__, __LINE__, "MiniServer Thread Pool");
#endif
ThreadPoolShutdown(&gRecvThreadPool);
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool");
ThreadPoolShutdown(&gSendThreadPool);
@@ -3280,12 +3274,10 @@ int UpnpInitThreadPools()
goto ExitFunction;
}
#ifdef INTERNAL_WEB_SERVER
if (ThreadPoolInit(&gMiniServerThreadPool, &attr) != UPNP_E_SUCCESS) {
ret = UPNP_E_INIT_FAILED;
goto ExitFunction;
}
#endif
ExitFunction:
if (ret != UPNP_E_SUCCESS) {

View File

@@ -29,19 +29,18 @@
*
**************************************************************************/
/************************************************************************
* Purpose: This file implements the functionality and utility functions
* used by the Miniserver module.
*
* The miniserver is a central point for processing all network requests.
* It is made of:
* - The SSDP sockets for discovery.
* - The HTTP listeners for description / control / eventing.
************************************************************************/
#include "config.h"
#include "miniserver.h"
#include "httpreadwrite.h"
#include "ithread.h"
#include "ssdplib.h"
@@ -50,8 +49,6 @@
#include "unixutil.h" /* for socklen_t, EAFNOSUPPORT */
#include "upnpapi.h"
#include "util.h"
#include <assert.h>
#include <errno.h>
#include <stdio.h>
@@ -131,6 +128,7 @@ SetGenaCallback( MiniServerCallback callback )
gGenaCallback = callback;
}
#ifdef INTERNAL_WEB_SERVER
/************************************************************************
* Function : dispatch_request
*
@@ -350,6 +348,7 @@ schedule_request_job( IN int connfd,
}
}
#endif
/************************************************************************
* Function: RunMiniServer
@@ -372,11 +371,13 @@ RunMiniServer( MiniServerSockArray *miniSock )
struct sockaddr_storage clientAddr;
socklen_t clientLen;
SOCKET connectHnd;
SOCKET miniServSock4 = miniSock->miniServerSock4;
SOCKET miniServSock6 = miniSock->miniServerSock6;
SOCKET miniServStopSock = miniSock->miniServerStopSock;
SOCKET ssdpSock4 = miniSock->ssdpSock4;
SOCKET ssdpSock6 = miniSock->ssdpSock6;
#ifdef INTERNAL_WEB_SERVER
SOCKET miniServSock4 = miniSock->miniServerSock4;
SOCKET miniServSock6 = miniSock->miniServerSock6;
#endif
#ifdef INCLUDE_CLIENT_APIS
SOCKET ssdpReqSock4 = miniSock->ssdpReqSock4;
SOCKET ssdpReqSock6 = miniSock->ssdpReqSock6;
@@ -389,10 +390,12 @@ RunMiniServer( MiniServerSockArray *miniSock )
char requestBuf[256];
int ret = 0;
#ifdef INTERNAL_WEB_SERVER
if( miniServSock4 != INVALID_SOCKET )
maxMiniSock = max( maxMiniSock, miniServSock4 );
if( miniServSock6 != INVALID_SOCKET )
maxMiniSock = max( maxMiniSock, miniServSock6 );
#endif
if( ssdpSock4 != INVALID_SOCKET )
maxMiniSock = max( maxMiniSock, ssdpSock4 );
if( ssdpSock6 != INVALID_SOCKET )
@@ -413,10 +416,12 @@ RunMiniServer( MiniServerSockArray *miniSock )
FD_SET( miniServStopSock, &expSet );
FD_SET( miniServStopSock, &rdSet );
#ifdef INTERNAL_WEB_SERVER
if( miniServSock4 != INVALID_SOCKET )
FD_SET( miniServSock4, &rdSet );
if( miniServSock6 != INVALID_SOCKET )
FD_SET( miniServSock6, &rdSet );
#endif
if( ssdpSock4 != INVALID_SOCKET )
FD_SET( ssdpSock4, &rdSet );
if( ssdpSock6 != INVALID_SOCKET )
@@ -437,6 +442,7 @@ RunMiniServer( MiniServerSockArray *miniSock )
isleep( 1 );
continue;
} else {
#ifdef INTERNAL_WEB_SERVER
if( miniServSock6 != INVALID_SOCKET &&
FD_ISSET( miniServSock6, &rdSet ) ) {
clientLen = sizeof( clientAddr );
@@ -463,6 +469,7 @@ RunMiniServer( MiniServerSockArray *miniSock )
}
schedule_request_job( connectHnd, (struct sockaddr*)&clientAddr );
}
#endif
#ifdef INCLUDE_CLIENT_APIS
// ssdp
if( ssdpReqSock6 != INVALID_SOCKET &&
@@ -508,10 +515,12 @@ RunMiniServer( MiniServerSockArray *miniSock )
}
}
#ifdef INTERNAL_WEB_SERVER
shutdown( miniServSock4, SD_BOTH );
UpnpCloseSocket( miniServSock4 );
shutdown( miniServSock6, SD_BOTH );
UpnpCloseSocket( miniServSock6 );
#endif
shutdown( miniServStopSock, SD_BOTH );
UpnpCloseSocket( miniServStopSock );
shutdown( ssdpSock4, SD_BOTH );
@@ -569,6 +578,7 @@ get_port( int sockfd )
return port;
}
#ifdef INTERNAL_WEB_SERVER
/************************************************************************
* Function: get_miniserver_sockets
*
@@ -610,7 +620,6 @@ get_miniserver_sockets( MiniServerSockArray * out,
int reuseaddr_on = 0;
int sockError = UPNP_E_SUCCESS;
int errCode = 0;
int miniServerStopSock;
int ret = 0;
// Create listen socket for IPv4/IPv6. An error here may indicate
@@ -827,33 +836,56 @@ get_miniserver_sockets( MiniServerSockArray * out,
out->miniServerPort6 = actual_port6;
}
out->miniServerSock4 = listenfd4;
out->miniServerSock6 = listenfd6;
return UPNP_E_SUCCESS;
}
#endif
/************************************************************************
* Function: get_miniserver_stopsock
*
* Parameters:
* MiniServerSockArray *out - Miniserver Socket Array
*
* Description:
* Creates the miniserver STOP socket. This socket is created and
* listened on to know when it is time to stop the Miniserver.
*
* Return: int
* UPNP_E_OUTOF_SOCKET - Failed to create a socket
* UPNP_E_SOCKET_BIND - Bind() failed
* UPNP_E_INTERNAL_ERROR - Port returned by the socket layer is < 0
* UPNP_E_SUCCESS - Success
************************************************************************/
int get_miniserver_stopsock( MiniServerSockArray * out )
{
char errorBuffer[ERROR_BUFFER_LEN];
struct sockaddr_in stop_sockaddr;
int miniServerStopSock;
int ret;
miniServerStopSock = socket( AF_INET, SOCK_DGRAM, 0 );
if ( miniServerStopSock == -1 ) {
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
UpnpPrintf( UPNP_CRITICAL, MSERV, __FILE__, __LINE__,
"Error in socket(): %s\n", errorBuffer );
shutdown( listenfd4, SD_BOTH );
UpnpCloseSocket( listenfd4 );
shutdown( listenfd6, SD_BOTH );
UpnpCloseSocket( listenfd6 );
return UPNP_E_OUTOF_SOCKET;
}
// bind to local socket
memset( &__ss_v4, 0, sizeof( __ss_v4 ) );
serverAddr4->sin_family = AF_INET;
serverAddr4->sin_addr.s_addr = inet_addr( "127.0.0.1" );
ret = bind( miniServerStopSock, (struct sockaddr *)&__ss_v4,
sizeof(__ss_v4) );
memset( &stop_sockaddr, 0, sizeof( stop_sockaddr ) );
stop_sockaddr.sin_family = AF_INET;
stop_sockaddr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
ret = bind( miniServerStopSock, (struct sockaddr *)&stop_sockaddr,
sizeof(stop_sockaddr) );
if ( ret == -1 ) {
UpnpPrintf( UPNP_CRITICAL,
MSERV, __FILE__, __LINE__,
"Error in binding localhost!!!\n" );
shutdown( listenfd4, SD_BOTH );
UpnpCloseSocket( listenfd4 );
shutdown( listenfd6, SD_BOTH );
UpnpCloseSocket( listenfd6 );
shutdown( miniServerStopSock, SD_BOTH );
UpnpCloseSocket( miniServerStopSock );
@@ -864,22 +896,17 @@ get_miniserver_sockets( MiniServerSockArray * out,
if ( miniStopSockPort <= 0 ) {
shutdown( miniServerStopSock, SD_BOTH );
UpnpCloseSocket( miniServerStopSock );
shutdown( listenfd4, SD_BOTH );
UpnpCloseSocket( listenfd4 );
shutdown( listenfd6, SD_BOTH );
UpnpCloseSocket( listenfd6 );
return UPNP_E_INTERNAL_ERROR;
}
out->stopPort = miniStopSockPort;
out->miniServerSock4 = listenfd4;
out->miniServerSock6 = listenfd6;
out->miniServerStopSock = miniServerStopSock;
out->stopPort = miniStopSockPort;
return UPNP_E_SUCCESS;
}
/************************************************************************
* Function: StartMiniServer
*
@@ -922,18 +949,38 @@ StartMiniServer( unsigned short* listen_port4,
}
memset( miniSocket, 0, sizeof(*miniSocket) );
#ifdef INTERNAL_WEB_SERVER
// V4 and V6 http listeners.
ret_code = get_miniserver_sockets( miniSocket, *listen_port4, *listen_port6 );
if( ret_code != UPNP_E_SUCCESS ) {
free( miniSocket );
return ret_code;
}
#endif
ret_code = get_ssdp_sockets( miniSocket );
// Stop socket (To end miniserver processing).
ret_code = get_miniserver_stopsock( miniSocket );
if( ret_code != UPNP_E_SUCCESS ) {
#ifdef INTERNAL_WEB_SERVER
shutdown( miniSocket->miniServerSock4, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerSock4 );
shutdown( miniSocket->miniServerSock6, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerSock6 );
#endif
free( miniSocket );
return ret_code;
}
// SSDP socket for discovery / advertising.
ret_code = get_ssdp_sockets( miniSocket );
if( ret_code != UPNP_E_SUCCESS ) {
#ifdef INTERNAL_WEB_SERVER
shutdown( miniSocket->miniServerSock4, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerSock4 );
shutdown( miniSocket->miniServerSock6, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerSock6 );
#endif
shutdown( miniSocket->miniServerStopSock, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerStopSock );
free( miniSocket );
@@ -947,10 +994,12 @@ StartMiniServer( unsigned short* listen_port4,
ret_code = ThreadPoolAddPersistent( &gMiniServerThreadPool, &job, NULL );
if ( ret_code < 0 ) {
#ifdef INTERNAL_WEB_SERVER
shutdown( miniSocket->miniServerSock4, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerSock4 );
shutdown( miniSocket->miniServerSock6, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerSock6 );
#endif
shutdown( miniSocket->miniServerStopSock, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerStopSock );
shutdown( miniSocket->ssdpSock4, SD_BOTH );
@@ -975,10 +1024,12 @@ StartMiniServer( unsigned short* listen_port4,
// taking too long to start that thread
if ( count >= max_count ) {
#ifdef INTERNAL_WEB_SERVER
shutdown( miniSocket->miniServerSock4, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerSock4 );
shutdown( miniSocket->miniServerSock6, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerSock6 );
#endif
shutdown( miniSocket->miniServerStopSock, SD_BOTH );
UpnpCloseSocket( miniSocket->miniServerStopSock );
shutdown( miniSocket->ssdpSock4, SD_BOTH );
@@ -994,8 +1045,10 @@ StartMiniServer( unsigned short* listen_port4,
return UPNP_E_INTERNAL_ERROR;
}
#ifdef INTERNAL_WEB_SERVER
*listen_port4 = miniSocket->miniServerPort4;
*listen_port6 = miniSocket->miniServerPort6;
#endif
return UPNP_E_SUCCESS;
}