static void web_server_accept(SOCKET lsock, fd_set *set) { #ifdef INTERNAL_WEB_SERVER SOCKET asock; socklen_t clientLen; struct sockaddr_storage clientAddr; char errorBuffer[ERROR_BUFFER_LEN]; if (lsock != INVALID_SOCKET && FD_ISSET(lsock, set)) { clientLen = sizeof(clientAddr); asock = accept(lsock, (struct sockaddr *)&clientAddr, &clientLen); if (asock == INVALID_SOCKET) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, "miniserver: Error in accept(): %s\n", errorBuffer); } else { schedule_request_job(asock, (struct sockaddr *)&clientAddr); } } #endif /* INTERNAL_WEB_SERVER */ }
/************************************************************************ * Function: RunMiniServer * * Parameters: * MiniServerSockArray *miniSock - Socket Array * * Description: * Function runs the miniserver. The MiniServer accepts a * new request and schedules a thread to handle the new request. * Checks for socket state and invokes appropriate read and shutdown * actions for the Miniserver and SSDP sockets * * Return: void ************************************************************************/ static void RunMiniServer( MiniServerSockArray * miniSock ) { struct sockaddr_in clientAddr; socklen_t clientLen; SOCKET connectHnd; SOCKET miniServSock = miniSock->miniServerSock; SOCKET miniServStopSock = miniSock->miniServerStopSock; SOCKET ssdpSock = miniSock->ssdpSock; #ifdef INCLUDE_CLIENT_APIS SOCKET ssdpReqSock = miniSock->ssdpReqSock; #endif fd_set expSet; fd_set rdSet; int maxMiniSock; int byteReceived; char requestBuf[256]; maxMiniSock = max( miniServSock, miniServStopSock) ; maxMiniSock = max( maxMiniSock, (SOCKET)(ssdpSock) ); #ifdef INCLUDE_CLIENT_APIS maxMiniSock = max( maxMiniSock, (SOCKET)(ssdpReqSock) ); #endif ++maxMiniSock; gMServState = MSERV_RUNNING; while( TRUE ) { FD_ZERO( &rdSet ); FD_ZERO( &expSet ); FD_SET( miniServStopSock, &expSet ); FD_SET( miniServSock, &rdSet ); FD_SET( miniServStopSock, &rdSet ); FD_SET( ssdpSock, &rdSet ); #ifdef INCLUDE_CLIENT_APIS FD_SET( ssdpReqSock, &rdSet ); #endif if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) == DLNA_SOCKETERROR ) { dlnaPrintf( DLNA_CRITICAL, SSDP, __FILE__, __LINE__, "Error in select call!\n" ); /* Avoid 100% CPU in case of repeated error in select() */ isleep( 1 ); continue; } else { if( FD_ISSET( miniServSock, &rdSet ) ) { clientLen = sizeof( struct sockaddr_in ); connectHnd = accept( miniServSock, ( struct sockaddr * )&clientAddr, &clientLen ); if( connectHnd == DLNA_INVALID_SOCKET ) { dlnaPrintf( DLNA_INFO, MSERV, __FILE__, __LINE__, "miniserver: Error in accepting connection\n" ); continue; } schedule_request_job( connectHnd, &clientAddr ); } #ifdef INCLUDE_CLIENT_APIS // ssdp if( FD_ISSET( ssdpReqSock, &rdSet ) ) { readFromSSDPSocket( ssdpReqSock ); } #endif if( FD_ISSET( ssdpSock, &rdSet ) ) { readFromSSDPSocket( ssdpSock ); } if( FD_ISSET( miniServStopSock, &rdSet ) ) { clientLen = sizeof( struct sockaddr_in ); memset( ( char * )&clientAddr, 0, sizeof( struct sockaddr_in ) ); byteReceived = recvfrom( miniServStopSock, requestBuf, 25, 0, ( struct sockaddr * )&clientAddr, &clientLen ); if( byteReceived > 0 ) { requestBuf[byteReceived] = '\0'; dlnaPrintf( DLNA_INFO, MSERV, __FILE__, __LINE__, "Received response !!! %s From host %s \n", requestBuf, inet_ntoa( clientAddr.sin_addr ) ); dlnaPrintf( DLNA_PACKET, MSERV, __FILE__, __LINE__, "Received multicast packet: \n %s\n", requestBuf ); if( NULL != strstr( requestBuf, "ShutDown" ) ) { break; } } } } } shutdown( miniServSock, SD_BOTH ); dlnaCloseSocket( miniServSock ); shutdown( miniServStopSock, SD_BOTH ); dlnaCloseSocket( miniServStopSock ); shutdown( ssdpSock, SD_BOTH ); dlnaCloseSocket( ssdpSock ); #ifdef INCLUDE_CLIENT_APIS shutdown( ssdpReqSock, SD_BOTH ); dlnaCloseSocket( ssdpReqSock ); #endif free( miniSock ); gMServState = MSERV_IDLE; return; }