📄 ssdp_server.c
字号:
)
tmpNode = ixmlNodeList_item( SInfo->ServiceList, i );
if( tmpNode == NULL ) {
continue;
}
ixmlNodeList_free( nodeList );
nodeList = NULL;
nodeList = ixmlElement_getElementsByTagName( ( IXML_Element * )
tmpNode, "service" );
if( nodeList == NULL ) {
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Service not found 3\n" );
)
continue;
}
for( j = 0;; j++ ) {
tmpNode = ixmlNodeList_item( nodeList, j );
if( tmpNode == NULL )
break;
ixmlNodeList_free( tmpNodeList );
tmpNodeList = NULL;
tmpNodeList = ixmlElement_getElementsByTagName( ( IXML_Element
* ) tmpNode,
"serviceType" );
if( tmpNodeList == NULL ) {
DBGONLY( UpnpPrintf
( UPNP_CRITICAL, API, __FILE__, __LINE__,
"ServiceType not found \n" );
)
continue;
}
tmpNode2 = ixmlNodeList_item( tmpNodeList, 0 );
if( tmpNode2 == NULL ) {
continue;
}
textNode = ixmlNode_getFirstChild( tmpNode2 );
if( textNode == NULL ) {
continue;
}
// servType is of format Servicetype:ServiceVersion
tmpStr = ixmlNode_getNodeValue( textNode );
if( tmpStr == NULL ) {
continue;
}
strcpy( servType, tmpStr );
if( servType == NULL ) {
continue;
}
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"ServiceType = %s\n", servType );
)
if( AdFlag ) {
if( AdFlag == 1 ) {
ServiceAdvertisement( UDNstr, servType,
SInfo->DescURL, Exp );
} else // AdFlag == -1
{
ServiceShutdown( UDNstr, servType,
SInfo->DescURL, Exp );
}
} else {
switch ( SearchType ) {
case SSDP_ALL:
{
ServiceReply( DestAddr, servType,
UDNstr, SInfo->DescURL,
defaultExp );
break;
}
case SSDP_SERVICE:
{
if( ServiceType != NULL ) {
if( !strncasecmp( ServiceType,
servType,
strlen( ServiceType ) ) )
{
ServiceReply( DestAddr, servType,
UDNstr, SInfo->DescURL,
defaultExp );
}
}
break;
}
default:
break;
} // switch(SearchType)
}
}
ixmlNodeList_free( tmpNodeList );
tmpNodeList = NULL;
ixmlNodeList_free( nodeList );
nodeList = NULL;
}
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting AdvertiseAndReply : \n" );
)
HandleUnlock( );
return UPNP_E_SUCCESS;
} /****************** End of AdvertiseAndReply *********************/
#endif
#endif
/************************************************************************
* Function : Make_Socket_NoBlocking
*
* Parameters:
* IN int sock: socket
*
* Description:
* This function makes socket non-blocking.
*
* Returns: int
* 0 if successful else -1
***************************************************************************/
int
Make_Socket_NoBlocking( int sock )
{
int val;
#ifndef _WIN32
val = fcntl( sock, F_GETFL, 0 );
if( fcntl( sock, F_SETFL, val | O_NONBLOCK ) == -1 ) {
return -1;
}
#else
unsigned long ctlVal = 1;
val = ioctlsocket(sock, FIONBIO, &ctlVal);
#endif
return 0;
}
/************************************************************************
* Function : unique_service_name
*
* Parameters:
* IN char *cmd: Service Name string
* OUT SsdpEvent *Evt: The SSDP event structure partially filled
* by all the function.
*
* Description:
* This function fills the fields of the event structure like DeviceType,
* Device UDN and Service Type
*
* Returns: int
* 0 if successful else -1
***************************************************************************/
int
unique_service_name( IN char *cmd,
IN SsdpEvent * Evt )
{
char *TempPtr,
TempBuf[COMMAND_LEN],
*Ptr,
*ptr1,
*ptr2,
*ptr3;
int CommandFound = 0;
if( ( TempPtr = strstr( cmd, "uuid:schemas" ) ) != NULL ) {
ptr1 = strstr( cmd, ":device" );
if( ptr1 != NULL ) {
ptr2 = strstr( ptr1 + 1, ":" );
} else {
return -1;
}
if( ptr2 != NULL ) {
ptr3 = strstr( ptr2 + 1, ":" );
} else {
return -1;
}
if( ptr3 != NULL ) {
sprintf( Evt->UDN, "uuid:%s", ptr3 + 1 );
} else {
return -1;
}
ptr1 = strstr( cmd, ":" );
if( ptr1 != NULL ) {
strncpy( TempBuf, ptr1, ptr3 - ptr1 );
TempBuf[ptr3 - ptr1] = '\0';
sprintf( Evt->DeviceType, "urn%s", TempBuf );
} else {
return -1;
}
return 0;
}
if( ( TempPtr = strstr( cmd, "uuid" ) ) != NULL ) {
//printf("cmd = %s\n",cmd);
if( ( Ptr = strstr( cmd, "::" ) ) != NULL ) {
strncpy( Evt->UDN, TempPtr, Ptr - TempPtr );
Evt->UDN[Ptr - TempPtr] = '\0';
} else {
strcpy( Evt->UDN, TempPtr );
}
CommandFound = 1;
}
if( strstr( cmd, "urn:" ) != NULL
&& strstr( cmd, ":service:" ) != NULL ) {
if( ( TempPtr = strstr( cmd, "urn" ) ) != NULL ) {
strcpy( Evt->ServiceType, TempPtr );
CommandFound = 1;
}
}
if( strstr( cmd, "urn:" ) != NULL
&& strstr( cmd, ":device:" ) != NULL ) {
if( ( TempPtr = strstr( cmd, "urn" ) ) != NULL ) {
strcpy( Evt->DeviceType, TempPtr );
CommandFound = 1;
}
}
if( CommandFound == 0 ) {
return -1;
}
return 0;
}
/************************************************************************
* Function : ssdp_request_type1
*
* Parameters:
* IN char *cmd: command came in the ssdp request
*
* Description:
* This function figures out the type of the SSDP search in the
* in the request.
*
* Returns: enum SsdpSearchType
* return appropriate search type else returns SSDP_ERROR
***************************************************************************/
enum SsdpSearchType
ssdp_request_type1( IN char *cmd )
{
if( strstr( cmd, ":all" ) != NULL ) {
return SSDP_ALL;
}
if( strstr( cmd, ":rootdevice" ) != NULL ) {
return SSDP_ROOTDEVICE;
}
if( strstr( cmd, "uuid:" ) != NULL ) {
return SSDP_DEVICEUDN;
}
if( ( strstr( cmd, "urn:" ) != NULL )
&& ( strstr( cmd, ":device:" ) != NULL ) ) {
return SSDP_DEVICETYPE;
}
if( ( strstr( cmd, "urn:" ) != NULL )
&& ( strstr( cmd, ":service:" ) != NULL ) ) {
return SSDP_SERVICE;
}
return SSDP_SERROR;
}
/************************************************************************
* Function : ssdp_request_type
*
* Parameters:
* IN char *cmd: command came in the ssdp request
* OUT SsdpEvent *Evt: The event structure partially filled by
* this function.
*
* Description:
* This function starts filling the SSDP event structure based upon the
* request received.
*
* Returns: int
* 0 on success; -1 on error
***************************************************************************/
int
ssdp_request_type( IN char *cmd,
OUT SsdpEvent * Evt )
{
// clear event
memset( Evt, 0, sizeof( SsdpEvent ) );
unique_service_name( cmd, Evt );
Evt->ErrCode = NO_ERROR_FOUND;
if( ( Evt->RequestType = ssdp_request_type1( cmd ) ) == SSDP_SERROR ) {
Evt->ErrCode = E_HTTP_SYNTEX;
return -1;
}
return 0;
}
/************************************************************************
* Function : free_ssdp_event_handler_data
*
* Parameters:
* IN void *the_data: ssdp_thread_data structure. This structure contains
* SSDP request message.
*
* Description:
* This function frees the ssdp request
*
* Returns: VOID
*
***************************************************************************/
static void
free_ssdp_event_handler_data( void *the_data )
{
ssdp_thread_data *data = ( ssdp_thread_data * ) the_data;
if( data != NULL ) {
http_message_t *hmsg = &data->parser.msg;
// free data
httpmsg_destroy( hmsg );
free( data );
}
}
/************************************************************************
* Function : valid_ssdp_msg
*
* Parameters:
* IN void *the_data: ssdp_thread_data structure. This structure contains
* SSDP request message.
*
* Description:
* This function do some quick checking of the ssdp msg
*
* Returns: xboolean
* returns TRUE if msg is valid else FALSE
***************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -