BST_ERR_ENUM_UINT8 BST_OS_DeleteMbx( BST_OS_MBX_T *pstMbx ) { BST_OS_MAIL_T *pstContent; BST_OS_LOCKCNT_T tThreadLockCnt; BST_ASSERT_NULL_RTN( pstMbx, BST_ERR_INVALID_PTR ); BST_ASSERT_NULL_RTN( pstMbx->hSem, BST_ERR_INVALID_PTR ); BST_OS_DeleteSem( pstMbx->hSem ); tThreadLockCnt = BST_OS_ThreadLock(); for (;;) { if( 0 == lstCount( &pstMbx->hList ) ) { break; } pstContent = (BST_OS_MAIL_T *)lstGet( &pstMbx->hList ); BST_OS_FREE( pstContent ); } lstFree( &pstMbx->hList); BST_OS_FREE( pstMbx ); BST_OS_ThreadUnLock( tThreadLockCnt ); /*lint -e438*/ return( BST_NO_ERROR_MSG ); /*lint +e438*/ }
BST_APP_CEmailIMAP::BST_APP_CEmailIMAP( const EMAIL_ACCOUNT_STRU *penInAccountInfo ) : BST_APP_CEmailPacketProc( penInAccountInfo ) { m_usTag = BST_IMAP_START_TAG; m_lServerState = BST_EMAIL_UNCONNECT; m_pstrImapIDCmd = BST_LIB_StrCreat( BST_LIB_SHORT_STR_LEN ); BST_ASSERT_NORM( BST_NULL_PTR == m_pstrImapIDCmd ); m_pcServerResponse0 = (BST_UINT8 *)BST_OS_MALLOC( BST_IMAP_COLUMN_MAX ); if ( BST_NULL_PTR == m_pcServerResponse0 ) { BST_LIB_StrDelete( m_pstrImapIDCmd ); return; } m_pcServerResponse1 = (BST_UINT8 *)BST_OS_MALLOC( BST_IMAP_COLUMN_MAX ); if ( BST_NULL_PTR == m_pcServerResponse1 ) { BST_LIB_StrDelete( m_pstrImapIDCmd ); BST_OS_FREE( m_pcServerResponse0 ); return; } m_pcServerResponse2 = (BST_UINT8 *)BST_OS_MALLOC( BST_IMAP_COLUMN_MAX ); if ( BST_NULL_PTR == m_pcServerResponse2 ) { BST_LIB_StrDelete( m_pstrImapIDCmd ); BST_OS_FREE( m_pcServerResponse0 ); BST_OS_FREE( m_pcServerResponse1 ); return; } BST_OS_MEMSET( m_pcServerResponse0, 0, BST_IMAP_COLUMN_MAX ); BST_OS_MEMSET( m_pcServerResponse1, 0, BST_IMAP_COLUMN_MAX ); BST_OS_MEMSET( m_pcServerResponse2, 0, BST_IMAP_COLUMN_MAX ); }
BST_VOID BST_SRV_CHNL_ThreadEntry( BST_VOID *pvArg ) { BST_OS_MBX_T **pstMailBox; BST_OS_LOCKCNT_T tThreadLockCnt; BST_EVT_HEAD_STRU *pstEvent; BST_UINT32 ulRtnVal; if ( BST_NULL_PTR == pvArg ) { return; } /* * 线程参数初始化,包括邮箱,运行标识 */ tThreadLockCnt = BST_OS_ThreadLock (); pstMailBox = (BST_OS_MBX_T **)pvArg; *pstMailBox = BST_OS_CreateMbx ( BST_OS_GetCurrentThreadId(), BST_L_MBOX_SIZE ); if ( BST_NULL_PTR == *pstMailBox ) { BST_OS_ThreadUnLock ( tThreadLockCnt ); return; } BST_SetThreadInitFlag( BST_CHNL_CTRL_THREAD_FLAG ); g_lstChnlMng = BST_NULL_PTR; BST_OS_InitSpinLock( &g_HighPriCntSpinLock ); BST_OS_ThreadUnLock ( tThreadLockCnt ); /* * 进入线程主循环,等待邮件,邮件内容为即将执行的任务 */ for(;;) { ulRtnVal = BST_OS_RecvMail ( *pstMailBox, (BST_VOID **)&pstEvent, BST_OS_SYS_FOREVER ); BST_ASSERT_NORM( BST_OS_SYS_TIMEOUT == ulRtnVal ); BST_SRV_ProcChnlCtrEvent( pstEvent ); /*这里判断指针不为空再次释放,因此需要传递指针的指针*/ if( BST_NULL_PTR != pstEvent->pucData ) { BST_DBG_LOG1( "tiger BST_OS_FREE 8,", pstEvent->pucData ); BST_OS_FREE( pstEvent->pucData ); } BST_OS_FREE( pstEvent ); #if ( BST_VER_TYPE == BST_UT_VER ) break; #endif } }
/*lint -e438 -e429*/ BST_UINT32 BST_SRV_CEvent::RcvTimerExpired ( BST_OS_TIMERID_T ulTimerId ) { BST_TIMER_EVT_STRU *pstSendTimerEvent; if( BST_NULL_PTR == m_pstEventMbx ) { return BST_ERR_INVALID_PTR; } pstSendTimerEvent = ( BST_TIMER_EVT_STRU *)BST_OS_MALLOC ( BST_OS_SIZEOF(BST_TIMER_EVT_STRU) ); BST_ASSERT_NULL_RTN( pstSendTimerEvent, BST_ERR_NO_MEMORY ); pstSendTimerEvent->pucData = ( BST_UINT8 *)BST_OS_MALLOC ( BST_OS_SIZEOF(ulTimerId) ); if ( BST_NULL_PTR == pstSendTimerEvent->pucData ) { BST_OS_FREE( pstSendTimerEvent ); return BST_ERR_NO_MEMORY; } pstSendTimerEvent->ulLength = BST_OS_SIZEOF( ulTimerId ); BST_OS_MEMCPY( pstSendTimerEvent->pucData, &ulTimerId, pstSendTimerEvent->ulLength ); pstSendTimerEvent->enId = BST_SRV_TIMER_EVENT; return BST_OS_SendMail( m_pstEventMbx, pstSendTimerEvent ); }
BST_OS_SEM_STRU *BST_OS_CreateSem( BST_VOID *pvArg, BST_UINT32 ulInitCnt ) { BST_OS_SEM_STRU *pstOsSem; BST_OS_LOCKCNT_T tThreadLockCnt; pstOsSem = (BST_OS_SEM_STRU *)BST_OS_MALLOC( BST_OS_SIZEOF( BST_OS_SEM_STRU ) ); if( BST_NULL_PTR == pstOsSem ) { return BST_NULL_PTR; } tThreadLockCnt = BST_OS_ThreadLock(); pstOsSem->pvArg = BST_OS_GetCurrentThreadId(); pstOsSem->stHandle = BST_OS_PalCreateSem( ulInitCnt ); if ( BST_OS_SYS_IsSemValid(pstOsSem->stHandle) ) { BST_OS_FREE( pstOsSem ); BST_OS_ThreadUnLock( tThreadLockCnt ); /*lint -e438*/ return BST_NULL_PTR; /*lint +e438*/ } #ifdef BST_OS_SIGNAL_COUNTER pstOsSem->ulCounter = ulInitCnt; if ( 0U != pstOsSem->ulCounter ) { BST_OS_PalSendSem( pstOsSem->stHandle, pstOsSem->pvArg ); } #endif BST_OS_ThreadUnLock( tThreadLockCnt ); return pstOsSem; }
/*lint -e438 -e429*/ BST_ERR_ENUM_UINT8 BST_SRV_CEvent::RcvTcpIpEvent ( BST_IP_EVENT_STRU *pstEvent ) { BST_NET_EVENT_STRU *pstNetEvent; BST_IP_EVENT_STRU *pstLwipEvent; if ( BST_NULL_PTR == m_pstEventMbx ) { return BST_ERR_INVALID_PTR; } if ( BST_NULL_PTR == pstEvent ) { return BST_ERR_INVALID_PTR; } pstLwipEvent = ( BST_IP_EVENT_STRU *)BST_OS_MALLOC ( BST_OS_SIZEOF ( BST_IP_EVENT_STRU ) ); BST_ASSERT_NULL_RTN( pstLwipEvent, BST_ERR_NO_MEMORY ); pstNetEvent = ( BST_NET_EVENT_STRU *)BST_OS_MALLOC ( BST_OS_SIZEOF ( BST_NET_EVENT_STRU ) ); if ( BST_NULL_PTR == pstNetEvent ) { BST_OS_FREE( pstLwipEvent ); return BST_ERR_INVALID_PTR; } BST_OS_MEMCPY ( pstLwipEvent, pstEvent, BST_OS_SIZEOF ( BST_IP_EVENT_STRU ) ); pstNetEvent->enId = BST_SRV_TCPIP_EVENT; pstNetEvent->pucData = ( BST_UINT8 * )pstLwipEvent; pstNetEvent->ulLength = BST_OS_SIZEOF ( BST_IP_EVENT_STRU ); return BST_OS_SendMail( m_pstEventMbx, pstNetEvent ); }
/*lint -e438 -e429*/ BST_ERR_ENUM_UINT8 BST_SRV_CEvent::RcvAcomData( BST_UINT32 ulLength, BST_UINT8 *pucData ) { BST_ACOM_EVT_STRU *pstAcpuEvent; if( BST_NULL_PTR == m_pstEventMbx ) { return BST_ERR_INVALID_PTR; } if( BST_NULL_PTR == pucData ) { return BST_ERR_INVALID_PTR; } if( 0 == ulLength ) { return BST_ERR_PAR_LEN; } pstAcpuEvent = (BST_ACOM_EVT_STRU *)BST_OS_MALLOC( BST_OS_SIZEOF(BST_ACOM_EVT_STRU) ); BST_ASSERT_NULL_RTN( pstAcpuEvent, BST_ERR_NO_MEMORY ); pstAcpuEvent->pucData = (BST_UINT8 *)BST_OS_MALLOC( ulLength ); if ( BST_NULL_PTR == pstAcpuEvent->pucData ) { BST_OS_FREE( pstAcpuEvent ); return BST_ERR_NO_MEMORY; } pstAcpuEvent->enId = BST_SRV_ACOM_EVENT; pstAcpuEvent->ulLength = ulLength; BST_OS_MEMCPY( pstAcpuEvent->pucData, pucData, ulLength ); return BST_OS_SendMail( m_pstEventMbx, pstAcpuEvent ); }
BST_ERR_ENUM_UINT8 BST_APP_CEmailIMAP::QueryServer( const BST_UINT8 *pucLastNum, BST_UINT16 usLen ) { BST_ERR_ENUM_UINT8 enErrMsg; BST_CHAR *pucSearchCmd; BST_UINT16 usSearchCmdLen; if ( BST_NULL_PTR == pucLastNum ) { return BST_ERR_INVALID_PTR; } if ( 0 == usLen ) { return BST_ERR_PAR_LEN; } pucSearchCmd = (BST_CHAR *)BST_OS_MALLOC(BST_OTHER_CMD_MAX_LEN); if ( BST_NULL_PTR == pucSearchCmd) { return BST_ERR_NO_MEMORY; } usSearchCmdLen = (BST_UINT16)snprintf( pucSearchCmd, BST_OTHER_CMD_MAX_LEN, "%d UID Search %.*s\r\n", m_usTag, usLen, pucLastNum ); enErrMsg = SendCommand( (BST_UINT8 *)pucSearchCmd, usSearchCmdLen ); BST_APP_UPDATE_IMAP_TAG( m_usTag ); BST_OS_FREE( pucSearchCmd ); return enErrMsg; }
BST_ERR_ENUM_UINT8 BST_APP_CEmailIMAP::SendID( BST_VOID ) { BST_CHAR *pucSendIDCmd; BST_UINT16 usSendIDCmdLen; BST_UINT16 usImapIDLen; BST_ERR_ENUM_UINT8 enErrMsg; pucSendIDCmd = (BST_CHAR *)BST_OS_MALLOC( BST_IMAP_ID_CMD_MAX_LEN ); if ( BST_NULL_PTR == pucSendIDCmd ) { return BST_ERR_INVALID_PTR; } usImapIDLen = MakeImapID(); usSendIDCmdLen = ( BST_UINT16 )snprintf( pucSendIDCmd, BST_IMAP_ID_CMD_MAX_LEN, "%d %.*s", m_usTag, usImapIDLen, m_pstrImapIDCmd->pData); enErrMsg = SendCommand( (BST_UINT8 *)pucSendIDCmd, usSendIDCmdLen ); BST_OS_FREE(pucSendIDCmd); BST_APP_UPDATE_IMAP_TAG( m_usTag ); return enErrMsg; }
BST_IP_ERR_T BST_SRV_CChnlIpRcver::Connectd( BST_IP_CSocket *pcSocket ) { BST_DBG_LOG("BST_SRV_CChnlIpRcver Connectd. "); #if ( ( BST_OS_VER == BST_WIN32 && BST_VER_TYPE == BST_DBG_VER ) || (BST_MODEM_SELF == 1) ) BST_SRV_CHNL_LINK_STRU *pstLinkItem = BST_NULL_PTR; BST_SRV_CHNL_LINK_STRU *pstLinkItem2; BST_SRV_CHNL_HEAD_STRU *pstPktItem; BST_ERR_ENUM_UINT8 enRtnVal; pstLinkItem = BST_SRV_Q_PeekHead( g_lstChnlMng ); pstPktItem = BST_SRV_Q_PeekHead( pstLinkItem->pUnsendList ); pstPktItem->ucPropType = BST_IP_SKT_PROP_NONE; /*不使用包中的socket属性*/ enRtnVal = BST_SRV_CHNL_Send_Runing( pstLinkItem, pstPktItem ); if( BST_ERR_ILLEGAL_PARAM == enRtnVal ) { BST_SRV_Q_RmvItem( (BST_SRV_CHNL_Q **)&g_lstChnlMng, (BST_SRV_CHNL_Q *)pstLinkItem, (BST_SRV_CHNL_Q **)&pstLinkItem2 ); BST_OS_TimerRemove( pstLinkItem->ulTimerId ); BST_DBG_LOG1( "tiger BST_OS_FREE 10,", pstLinkItem ); BST_OS_FREE( pstLinkItem ); } #endif return BST_IP_ERR_OK; }
BST_UINT32 BST_OS_RecvMail( BST_OS_MBX_T *pstMbx, BST_VOID **pMsg, BST_UINT32 ulExTime ) { BST_OS_MAIL_T *pstContent; BST_UINT32 ulPendTime; BST_UINT32 ulPastTime; BST_OS_LOCKCNT_T tThreadLockCnt; BST_ASSERT_NULL_RTN( pstMbx, BST_ERR_INVALID_PTR ); BST_ASSERT_NULL_RTN( pstMbx->hSem, BST_ERR_INVALID_PTR ); BST_ASSERT_NULL_RTN( pMsg, BST_ERR_INVALID_PTR ); *pMsg = BST_NULL_PTR; if( (BST_UINT32)BST_OS_SYS_FOREVER == ulExTime ) { ulPendTime = (BST_UINT32)BST_OS_SYS_FOREVER; } else if( ulExTime < BST_OS_TICKS_MS ) { ulPendTime = BST_OS_TICKS_MS; } else { ulPendTime = ulExTime; } ulPastTime = BST_OS_RecvSem( pstMbx->hSem, ulPendTime ); if( BST_OS_SYS_TIMEOUT == ulPastTime ) { return BST_OS_SYS_TIMEOUT; } tThreadLockCnt = (BST_OS_LOCKCNT_T)BST_OS_SpinLock( &g_MboxLock ); pstContent = (BST_OS_MAIL_T *)lstGet( &pstMbx->hList ); if ( BST_NULL_PTR == pstContent ) { *pMsg = BST_NULL_PTR; BST_OS_SpinUnLock( &g_MboxLock, (BST_UINT32)tThreadLockCnt ); return BST_OS_SYS_TIMEOUT; } *pMsg = pstContent->ulContent; BST_OS_FREE( pstContent ); BST_OS_SpinUnLock( &g_MboxLock, (BST_UINT32)tThreadLockCnt ); /*lint -e438*/ return( ulPastTime ); /*lint +e438*/ }
BST_VOID BST_SRV_CHNL_Clear( BST_SRV_CHNL_LINK_STRU *pstChnlLink ) { BST_SRV_CHNL_SENT_STRU *pSentItem; BST_SRV_CHNL_SENT_STRU *pSentItem2; BST_SRV_CHNL_HEAD_STRU *pstPktItem; BST_SRV_CHNL_HEAD_STRU *pstPktItem2; BST_DRV_STRU *pNetDrvHandle; BST_UINT8 ucUnused; BST_UINT32 ulSpinlockCnt; BST_ASSERT_NULL( pstChnlLink ); pstChnlLink->ulIsPropSet = BST_FALSE; for(;;) { pSentItem = BST_SRV_Q_PeekHead(pstChnlLink->pSentList); if( BST_NULL_PTR == pSentItem ) { break; } if( BST_DSPP_FLG_LVLTYPE_HS == pSentItem->usProcLevel ) { ulSpinlockCnt = BST_OS_SpinLock( &g_HighPriCntSpinLock ); if ( g_ulHighPriCnt > 0 ) { g_ulHighPriCnt--; if ( 0 == g_ulHighPriCnt ) { pNetDrvHandle= BST_DRV_NetGetDvcHandle(); ucUnused = 0; pNetDrvHandle->pfIoCtrl( BST_DRV_CMD_HPR_DATA_FINISH, (BST_VOID *)&ucUnused ); } } BST_OS_SpinUnLock( &g_HighPriCntSpinLock , ulSpinlockCnt ); } BST_DBG_LOG1("BST_SRV_CHNL_Clear,g_ulHighPriCnt--",g_ulHighPriCnt); BST_SRV_Q_RmvItem( (BST_SRV_CHNL_Q **)&pstChnlLink->pSentList, (BST_SRV_CHNL_Q *)pSentItem, (BST_SRV_CHNL_Q **)&pSentItem2 ); BST_OS_FREE( pSentItem ); } for(;;) { pstPktItem = BST_SRV_Q_PeekHead(pstChnlLink->pUnsendList); if( BST_NULL_PTR == pstPktItem ) { break; } BST_SRV_Q_RmvItem( (BST_SRV_CHNL_Q **)&pstChnlLink->pUnsendList, (BST_SRV_CHNL_Q *)pstPktItem, (BST_SRV_CHNL_Q **)&pstPktItem2 ); BST_SRV_FreeIpBlock( pstPktItem ); } }
BST_APP_CEmailIMAP::~BST_APP_CEmailIMAP() { if ( BST_NULL_PTR != m_pcServerResponse0 ) { BST_OS_FREE( m_pcServerResponse0 ); } if ( BST_NULL_PTR != m_pcServerResponse1 ) { BST_OS_FREE( m_pcServerResponse1 ); } if ( BST_NULL_PTR != m_pcServerResponse2 ) { BST_OS_FREE( m_pcServerResponse2 ); } if ( BST_NULL_PTR!= m_pstrImapIDCmd ) { BST_LIB_StrDelete( m_pstrImapIDCmd ); } BST_RLS_LOG("BST_APP_CEmailIMAP destructor"); }
/*lint -e48 -e18 -e438 -e516*/ void *realloc(void *mem_address, unsigned int newsize) { void * NewPtr; if ( !mem_address) { return BST_OS_MALLOC( newsize ); } else if ( newsize == 0 ) { BST_OS_FREE( mem_address ); } else { NewPtr = BST_OS_MALLOC(newsize); if ( NewPtr ) { BST_OS_MEMCPY( NewPtr, mem_address, newsize ); BST_OS_FREE( mem_address ); return NewPtr; } } return BST_NULL_PTR; }
BST_ERR_ENUM_UINT8 BST_APP_CEmailIMAP::LoginServer( BST_VOID ) { BST_UINT8 *pucLoginCmd; BST_UINT8 *pucUserName; BST_UINT8 *pucPassWord; BST_UINT16 usLoginCmdLen; BST_UINT16 usUserNameLen; BST_UINT16 usPassWordLen; BST_ERR_ENUM_UINT8 enErrMsg; if ( BST_NULL_PTR == m_pstAccountInfo ) { return BST_ERR_INVALID_PTR; } if ( BST_NULL_PTR == m_pstAccountInfo->pUserName ) { return BST_ERR_INVALID_PTR; } if ( BST_NULL_PTR == m_pstAccountInfo->pPassWord ) { return BST_ERR_INVALID_PTR; } pucUserName = ( BST_UINT8 *)( m_pstAccountInfo->pUserName->pData ); usUserNameLen = m_pstAccountInfo->pUserName->usUsed; pucPassWord = ( BST_UINT8 *)(m_pstAccountInfo->pPassWord->pData); usPassWordLen = m_pstAccountInfo->pPassWord->usUsed; pucLoginCmd = (BST_UINT8 *)BST_OS_MALLOC(BST_IMAP_AUTH_CMD_MAX_LEN); if ( BST_NULL_PTR == pucLoginCmd ) { return BST_ERR_NO_MEMORY; } usLoginCmdLen = (BST_UINT16)snprintf( (BST_CHAR *)pucLoginCmd, BST_IMAP_AUTH_CMD_MAX_LEN, "%d LOGIN %.*s %.*s\r\n", m_usTag, usUserNameLen, pucUserName, usPassWordLen, pucPassWord ); enErrMsg = SendCommand( pucLoginCmd, usLoginCmdLen); BST_APP_UPDATE_IMAP_TAG( m_usTag ); BST_OS_FREE( pucLoginCmd ); return enErrMsg; }
BST_ERR_ENUM_UINT8 BST_OS_DeleteSem( BST_OS_SEM_STRU *pstSemHandle ) { BST_ERR_ENUM_UINT8 ucRtnVal; if( BST_NULL_PTR == pstSemHandle ) { return BST_ERR_INVALID_PTR; } ucRtnVal = BST_OS_PalDeleteSem( pstSemHandle->stHandle ); if( BST_NO_ERROR_MSG == ucRtnVal ) { BST_OS_FREE( pstSemHandle ); } /*lint -e438*/ return ucRtnVal; /*lint +e438*/ }
BST_IP_ERR_T BST_IP_BsdReceive( BST_FD_T fd, BST_UINT8* pData, BST_UINT16 usLength ) { BST_IP_ERR_T lRtnVal; BST_IP_ERR_T lTmpVal; BST_UINT8 *pucTmpData; BST_UINT16 usDefLength; usDefLength = BST_IP_MTU_SIZE; if( !BST_IP_IsBsdFdValid(fd) ) { return BST_IP_ERR_MEM; } if( BST_NULL_PTR == pData || usLength <= 0 ) { return BST_IP_ERR_MEM; } lRtnVal = (BST_IP_ERR_T)lwip_read( fd.lFd, pData, usLength ); if ( lRtnVal < usLength ) { return lRtnVal; } /* 读空socket缓冲区里的数据 */ pucTmpData = (BST_UINT8 *)BST_OS_MALLOC( usDefLength ); if ( BST_NULL_PTR == pucTmpData ) { return lRtnVal; } BST_OS_MEMSET( pucTmpData, 0, usDefLength ); while( 1 ) { lTmpVal = (BST_IP_ERR_T)lwip_read( fd.lFd, pucTmpData, usDefLength ); if ( lTmpVal < usDefLength ) { break; } } BST_OS_FREE( pucTmpData ); return lRtnVal; }
BST_ERR_ENUM_UINT8 BST_APP_CEmailIMAP::QuitServer( BST_VOID ) { BST_CHAR *pucLogoutCmd; BST_UINT16 usLogoutCmdLen; BST_ERR_ENUM_UINT8 enErrMsg; pucLogoutCmd = (BST_CHAR *)BST_OS_MALLOC(BST_OTHER_CMD_MAX_LEN); BST_ASSERT_NULL_RTN( pucLogoutCmd, BST_ERR_NO_MEMORY ); usLogoutCmdLen = ( BST_UINT16 )snprintf( pucLogoutCmd, BST_OTHER_CMD_MAX_LEN, "%d LOGOUT\r\n", m_usTag ); enErrMsg = SendCommand( (BST_UINT8 *)pucLogoutCmd, usLogoutCmdLen ); BST_APP_UPDATE_IMAP_TAG( m_usTag ); BST_OS_FREE( pucLogoutCmd ); return enErrMsg; }
/*lint -e438 -e429*/ BST_ERR_ENUM_UINT8 BST_SRV_CEvent::RcvAsEvent( BST_AS_EVT_ENUM_UINT32 enAsEvent, BST_UINT32 ulLength, BST_VOID *pvData ) { BST_AS_EVT_STRU *pstSendAsEvent; if( BST_NULL_PTR == m_pstEventMbx ) { return BST_ERR_INVALID_PTR; } if( !BST_SRV_IsValidAsEvent( enAsEvent ) ) { return BST_ERR_INVALID_PTR; } pstSendAsEvent = (BST_AS_EVT_STRU *)BST_OS_MALLOC( BST_OS_SIZEOF(BST_AS_EVT_STRU) ); BST_ASSERT_NULL_RTN( pstSendAsEvent, BST_ERR_NO_MEMORY ); if( ( BST_NULL_PTR == pvData ) || ( 0 == ulLength ) ) { pstSendAsEvent->pucData = BST_NULL_PTR; pstSendAsEvent->ulLength = 0; } else { pstSendAsEvent->pucData = (BST_UINT8 *)BST_OS_MALLOC( ulLength ); if ( BST_NULL_PTR == pstSendAsEvent->pucData ) { BST_RLS_LOG( "BST_SRV_CEvent::RcvAsEvent No Memory" ); BST_OS_FREE( pstSendAsEvent ); return BST_ERR_NO_MEMORY; } pstSendAsEvent->ulLength = ulLength; BST_OS_MEMCPY( pstSendAsEvent->pucData, pvData, ulLength ); } pstSendAsEvent->enId = BST_SRV_AS_EVENT; pstSendAsEvent->enAsEvent = enAsEvent; return BST_OS_SendMail( m_pstEventMbx, pstSendAsEvent ); }
BST_VOID BST_SRV_CChnlIpRcver::IpErr ( BST_IP_CSocket *pcSocket, BST_IP_ERR_T InIpErrMsg ) { BST_SRV_CHNL_LINK_STRU *pstLinkItem; BST_SRV_CHNL_LINK_STRU *pstLinkItem2; BST_DSPP_CAppUlVc *pstDsppUl; pstDsppUl = BST_DSPP_CAppUlVc::GetInstance(); pstLinkItem = BST_SRV_Q_PeekHead( g_lstChnlMng ); for(;;) { if( BST_NULL_PTR == pstLinkItem ) { break; } if( pstLinkItem->pcSocket == pcSocket ) { break; } pstLinkItem = pstLinkItem->pNext; } if( BST_NULL_PTR == pstLinkItem ) { return; } pstDsppUl->Report( BST_DSPP_FLG_CMD_CLOSE, pstLinkItem->stLink.ulMainLinkId, pstLinkItem->stLink.ulAuxLinkId ); BST_SRV_CHNL_ReportTrafficFlow( pstLinkItem ); BST_SRV_CHNL_Close( pstLinkItem ); delete pstLinkItem->pcSocket; BST_SRV_Q_RmvItem( (BST_SRV_CHNL_Q **)&g_lstChnlMng, (BST_SRV_CHNL_Q *)pstLinkItem, (BST_SRV_CHNL_Q **)&pstLinkItem2 ); BST_OS_TimerRemove( pstLinkItem->ulTimerId ); BST_OS_FREE( pstLinkItem ); }
BST_OS_MBX_T *BST_OS_CreateMbx( BST_VOID *pvArg, BST_UINT32 ulSize ) { BST_OS_MBX_T *pstMbx; pstMbx = BST_OS_MALLOC( BST_OS_SIZEOF(BST_OS_MBX_T) ); BST_ASSERT_NULL_RTN( pstMbx, BST_NULL_PTR ); pstMbx->hSem = BST_NULL_PTR; lstInit( &pstMbx->hList ); pstMbx->hSem = BST_OS_CreateSem( pvArg, 0U ); if( BST_NULL_PTR == pstMbx->hSem ) { BST_DBG_LOG("Create Mail Box Fail.\n"); lstFree( &pstMbx->hList ); BST_OS_FREE(pstMbx); /*lint -e438*/ return BST_NULL_PTR; /*lint +e438*/ } return( pstMbx ); }
BST_ERR_ENUM_UINT8 BST_APP_CEmailIMAP::SelectInBox( BST_VOID ) { BST_CHAR *pcSelectCmd; BST_UINT16 usSelectCmdLen; BST_ERR_ENUM_UINT8 enErrMsg; pcSelectCmd = (BST_CHAR *)BST_OS_MALLOC( BST_OTHER_CMD_MAX_LEN ); if ( BST_NULL_PTR == pcSelectCmd ) { return BST_ERR_INVALID_PTR; } usSelectCmdLen = (BST_UINT16)snprintf( pcSelectCmd, BST_OTHER_CMD_MAX_LEN, "%d Select \"INBOX\"\r\n", m_usTag ); enErrMsg = SendCommand( (BST_UINT8 *)pcSelectCmd, usSelectCmdLen ); BST_APP_UPDATE_IMAP_TAG( m_usTag ); BST_OS_FREE( pcSelectCmd ); return enErrMsg; }
/*lint -e438*/ BST_VOID BST_CTaskSchdler::Detach ( BST_CORE_CPTask *pC_PTask ) { BST_CORE_PTASK_NODE_STRU *pstPtaskNode; if ( !BST_OS_IsTimerValid (m_ulTimerId) ) { BST_RLS_LOG1( "BST_CTaskSchdler::Detach m_ulTimerId=%u is invalid", m_ulTimerId ); return; } if ( BST_NULL_PTR == pC_PTask ) { BST_RLS_LOG( "BST_CTaskSchdler::Detach pC_PTask=NULL" ); return; } /* * 遍历列表,找到pctask相符的任务,从链表删除,释放资源 */ for ( pstPtaskNode = (BST_CORE_PTASK_NODE_STRU *)lstFirst( &g_stPTaskList ); pstPtaskNode!= BST_NULL_PTR; pstPtaskNode = (BST_CORE_PTASK_NODE_STRU *)lstNext((NODE *)pstPtaskNode) ) { if( pstPtaskNode->pcTask != pC_PTask ) { continue; } lstDelete( &g_stPTaskList, (NODE *)pstPtaskNode ); BST_OS_FREE( pstPtaskNode ); break; } /* * 注销后,如果认为列表为空,则直接关闭定时器,不进行任何调度 */ if ( 0 == lstCount( &g_stPTaskList ) ) { BST_DBG_LOG( "BST_CTaskSchdler::Detach Stop Scheduler Timer" ); BST_OS_TimerStop ( m_ulTimerId ); } }
BST_VOID BST_SYS_MntnRemoveTask( BST_UINT16 usType, BST_UINT16 usTaskId ) { BST_SYS_MNTN_APP_NODE_STRU *pstAppNode; BST_OS_LOCKCNT_T tThreadLockCnt; if ( !BST_SYS_MNTN_IsMntnInited() ) { return; } tThreadLockCnt = BST_OS_ThreadLock(); /* 查找链表中是否已经存在该Task信息 */ for ( pstAppNode = ( BST_SYS_MNTN_APP_NODE_STRU *)lstFirst(BST_SYS_MNTN_GetAppListHead()); pstAppNode != BST_NULL_PTR; pstAppNode = ( BST_SYS_MNTN_APP_NODE_STRU *)lstNext( (NODE *)pstAppNode ) ) { if ( ( usTaskId == pstAppNode->stAppInfo.usTaskId ) && ( usType == pstAppNode->stAppInfo.usAppType ) ) { break; } } if ( BST_NULL_PTR == pstAppNode ) { BST_OS_ThreadUnLock( tThreadLockCnt ); return; } lstDelete( BST_SYS_MNTN_GetAppListHead(), (NODE *)pstAppNode ); BST_OS_FREE( pstAppNode ); BST_RLS_LOG3( "[Mntn] Remove Task: TypeId=, TaskId=, Total=", usType, usTaskId, BST_SYS_MNTN_GetAppNumber() ); BST_SYS_MntnChangedInd(); BST_OS_ThreadUnLock( tThreadLockCnt ); /*lint -e438*/ }
BST_UINT32 BST_OS_PeekMail( BST_OS_MBX_T *pstMbx, BST_VOID **pMsg ) { BST_OS_MAIL_T *pstContent; BST_OS_LOCKCNT_T tThreadLockCnt; BST_ASSERT_NULL_RTN( pstMbx, BST_ERR_INVALID_PTR ); BST_ASSERT_NULL_RTN( pstMbx->hSem, BST_ERR_INVALID_PTR ); BST_ASSERT_NULL_RTN( pMsg, BST_ERR_INVALID_PTR ); *pMsg = BST_NULL_PTR; if( BST_OS_SYS_TIMEOUT == BST_OS_RecvSem( pstMbx->hSem, BST_OS_SYS_NOWAIT ) ) { return BST_OS_SYS_TIMEOUT; } tThreadLockCnt = BST_OS_ThreadLock(); pstContent = (BST_OS_MAIL_T *)lstGet( &pstMbx->hList ); if ( BST_NULL_PTR == pstContent ) { BST_OS_ThreadUnLock( tThreadLockCnt ); return BST_OS_SYS_TIMEOUT; } *pMsg = pstContent->ulContent; #ifdef BST_OS_SIGNAL_COUNTER if ( pstMbx->hSem->ulCounter > 0U ) { pstMbx->hSem->ulCounter--; } #endif BST_OS_FREE( pstContent ); BST_OS_ThreadUnLock( tThreadLockCnt ); /*lint -e438*/ return( BST_NO_ERROR_MSG ); /*lint +e438*/ }
BST_ERR_ENUM_UINT8 BST_CORE_DencryptChk ( BST_CORE_PID_ENUM_UINT16 enPid, const BST_VOID *pvData, BST_UINT16 usLen, BST_VOID **ppOutData, BST_UINT16 *pusOutLen ) { BST_ERR_ENUM_UINT8 enRet; BST_UINT32 ulInLen; BST_UINT32 ulOutLen; BST_UINT32 ulBase64DataLen; BST_UINT8 *pucIn; BST_UINT8 *pucOut; BST_UINT8 *pucBase64Data; ulInLen = 0; ulOutLen = 0; ulBase64DataLen = 0; pucIn = BST_NULL_PTR; pucOut = BST_NULL_PTR; pucBase64Data = BST_NULL_PTR; enRet = BST_NO_ERROR_MSG; if ( ( BST_NULL_PTR == pvData ) || ( BST_NULL_PTR == pusOutLen ) || ( BST_NULL_PTR == ppOutData) ) { return BST_ERR_INVALID_PTR; } if ( 0 == usLen ) { return BST_ERR_PAR_LEN; } if ( CheckIfEcryOrDecry ( enPid ) ) { pucIn = ( BST_UINT8 * )BST_OS_MALLOC ( usLen ); if ( BST_NULL_PTR == pucIn ) { return BST_ERR_NO_MEMORY; } BST_OS_MEMCPY ( pucIn, pvData, usLen ); ulInLen = usLen; pucBase64Data = ( BST_UINT8 * )BST_OS_MALLOC ( ulInLen ); if ( BST_NULL_PTR == pucBase64Data ) { BST_OS_FREE ( pucIn ); pucIn = BST_NULL_PTR; return BST_ERR_NO_MEMORY; } ulBase64DataLen = EVP_DecodeBlock ( pucBase64Data, pucIn, ulInLen ); while ( pucIn[--ulInLen] == '=' ) // Ecrypter string end is '=' { ulBase64DataLen--; } pucOut = ( BST_UINT8 * )BST_OS_MALLOC ( ulInLen ); if ( BST_NULL_PTR == pucOut ) { BST_OS_FREE ( pucIn ); pucIn = BST_NULL_PTR; BST_OS_FREE ( pucBase64Data ); pucBase64Data = BST_NULL_PTR; return BST_ERR_NO_MEMORY; } BST_OS_MEMSET ( pucOut, 0, ulInLen ); enRet = DecryptInternal ( pucBase64Data, ulBase64DataLen, pucOut, &ulOutLen, gs_BastetDsppKey ); if ( BST_NO_ERROR_MSG == enRet ) { *ppOutData = ( BST_VOID * )pucOut; *pusOutLen = ( BST_UINT16 )ulOutLen; } BST_OS_FREE ( pucIn ); pucIn = BST_NULL_PTR; BST_OS_FREE ( pucBase64Data ); pucBase64Data = BST_NULL_PTR; return enRet; } return BST_NO_ERROR_MSG; }
BST_ERR_ENUM_UINT8 BST_CORE_EncryptChk ( BST_CORE_PID_ENUM_UINT16 enPid, const BST_VOID *pvData, BST_UINT16 usLen, BST_VOID **ppOutData, BST_UINT16 *pusOutLen ) { BST_ERR_ENUM_UINT8 enRet; BST_UINT32 ulInLen; BST_UINT32 ulOutLen; BST_UINT32 ulBase64DataLen; BST_UINT8 *pucIn; BST_UINT8 *pucOut; BST_UINT8 *pucBase64Data; ulInLen = 0; ulOutLen = 0; ulBase64DataLen = 0; pucIn = BST_NULL_PTR; pucOut = BST_NULL_PTR; pucBase64Data = BST_NULL_PTR; enRet = BST_NO_ERROR_MSG; if ( ( BST_NULL_PTR == pvData ) || ( BST_NULL_PTR == pusOutLen ) || ( BST_NULL_PTR == ppOutData) ) { return BST_ERR_INVALID_PTR; } if ( 0 == usLen ) { return BST_ERR_PAR_LEN; } if ( CheckIfEcryOrDecry ( enPid ) ) { pucIn = ( BST_UINT8 * )BST_OS_MALLOC ( usLen ); if ( BST_NULL_PTR == pucIn ) { return BST_ERR_NO_MEMORY; } BST_OS_MEMCPY ( pucIn, pvData, usLen ); ulInLen = usLen; pucOut = ( BST_UINT8 * )BST_OS_MALLOC ( ulInLen + EVP_MAX_IV_LENGTH ); if ( BST_NULL_PTR == pucOut ) { BST_OS_FREE ( pucIn ); pucIn = BST_NULL_PTR; return BST_ERR_NO_MEMORY; } enRet = EncryptInternal ( ( BST_UINT8 * )pucIn, ulInLen, pucOut, &ulOutLen, gs_BastetDsppKey ); if ( BST_NO_ERROR_MSG == enRet ) { pucBase64Data = ( BST_UINT8 * )BST_OS_MALLOC ( ulOutLen * 2 ); if ( BST_NULL_PTR == pucBase64Data ) { BST_OS_FREE ( pucIn ); pucIn = BST_NULL_PTR; BST_OS_FREE ( pucOut ); pucOut = BST_NULL_PTR; return BST_ERR_NO_MEMORY; } ulBase64DataLen = EVP_EncodeBlock ( pucBase64Data, pucOut, ulOutLen ); *ppOutData = pucBase64Data; *pusOutLen = ulBase64DataLen; } BST_OS_FREE ( pucIn ); pucIn = BST_NULL_PTR; BST_OS_FREE ( pucOut ); pucOut = BST_NULL_PTR; return enRet; } return BST_NO_ERROR_MSG; }
BST_IP_ERR_T BST_IP_SslReceive( BST_FD_T fd, BST_UINT8* pData, BST_UINT16 usLength ) { SSL *pstSsl; BST_UINT8 *pucTmpBuf; BST_INT32 lRtnVal; BST_INT32 lCopyedLen; BST_INT32 lSelect; BST_INT32 lSockFd; fd_set stRdFds; timeval stTval; stTval.tv_sec = 0; stTval.tv_usec = 0; if ( BST_NULL_PTR == fd.pFd ) { return BST_IP_ERR_ARG; } if ( BST_NULL_PTR == pData ) { return BST_IP_ERR_ARG; } lCopyedLen = 0; pstSsl = (SSL *)fd.pFd; lSockFd = SSL_get_fd( pstSsl ); pucTmpBuf = (BST_UINT8 *)BST_OS_MALLOC( usLength ); if ( BST_NULL_PTR == pucTmpBuf ) { return BST_IP_ERR_MEM; } do { FD_ZERO( &stRdFds ); FD_SET( lSockFd, &stRdFds ); lRtnVal = SSL_read( pstSsl, pucTmpBuf, usLength ); if ( lRtnVal <= 0 ) { BST_RLS_LOG( "BST_IP_SslReceive SSL_read error" ); break; } if ( 0 == lCopyedLen ) { BST_OS_MEMCPY( pData, pucTmpBuf, lRtnVal ); lCopyedLen = lRtnVal; BST_DBG_LOG1( "BST_IP_SslReceive lCopyedLen", lCopyedLen ); } /*如果ssl内部缓冲区没有数据可读,则判断IP协议栈是否有数据可读*/ if ( !SSL_pending( pstSsl ) ) { lSelect = lwip_select( lSockFd + 1, &stRdFds, NULL, NULL, &stTval ); if ( lSelect < 0) { BST_RLS_LOG( "BST_IP_SslReceive lwip_select error" ); break; } /*如果协议栈也没有数据可读,则说明这次读取完毕,退出*/ if ( !FD_ISSET( lSockFd,&stRdFds ) ) { BST_DBG_LOG( "BST_IP_SslReceive socket is not data" ); break; } } } while( 1 ); BST_OS_FREE( pucTmpBuf ); return lCopyedLen; }
/*lint -e438*/ err_t BST_IP_TcpRecvCB( BST_VOID *arg, struct tcp_pcb * tpcb, struct pbuf *p, BST_IP_ERR_T err ) { err_t ucErrMsg; BST_UINT16 usCopyedLength; BST_IP_CRcverMng *pcRcverMnger; BST_IP_PKTPROC_MODE_ENUM enProcMode; struct pbuf *q; BST_UINT8 *pucSdu; BST_FD_T FdTmp; BST_OS_LOCKCNT_T tThreadLockCnt; BST_ASSERT_NULL_RTN( tpcb, ERR_ARG ); tThreadLockCnt = BST_OS_ThreadLock(); FdTmp.pFd = tpcb; pcRcverMnger = BST_IP_CRcverMng::GetInstance(); pucSdu = BST_NULL_PTR; q = BST_NULL_PTR; usCopyedLength = 0; ucErrMsg = ERR_OK; enProcMode = BST_IP_PKT_REMOVE_PROC; if( BST_NULL_PTR == pcRcverMnger ) { ucErrMsg = ERR_MEM; BST_IP_TCP_RCVAPI_FREE(); } /* * * p=NULL means this pcb is closed by Remote* * */ if( BST_IP_IsLwipNull(p) ) { pcRcverMnger->ClosedRcver ( FdTmp ); BST_OS_ThreadUnLock( tThreadLockCnt ); return ERR_OK; } if ( p->tot_len > 0 ) { pucSdu = ( BST_UINT8 * )BST_OS_MALLOC( p->tot_len ); } else { ucErrMsg = ERR_BUF; tcp_recved( tpcb, p->tot_len ); BST_IP_TCP_RCVAPI_FREE(); } if ( BST_NULL_PTR == pucSdu ) { ucErrMsg = ERR_BUF; tcp_recved( tpcb, p->tot_len ); BST_IP_TCP_RCVAPI_FREE(); } q = p; usCopyedLength = 0; while ( BST_NULL_PTR != q ) { if ( ( q->len > 0 ) && ( BST_NULL_PTR != q->payload ) && ( q->len + usCopyedLength <= p->tot_len ) ) { BST_OS_MEMCPY( pucSdu + usCopyedLength, q->payload, q->len ); } else { break; } usCopyedLength += q->len; q = q->next; } if ( usCopyedLength > 0 ) { BST_IP_ApiRecordLastSktProp( (BST_IP_PKT_ID_T)p ); /* * *The Received Message must put it here where is before call Application CB. *This can avoid app close socket in callback when the rcv_wnd != TCP_WND. * */ tcp_recved( tpcb, p->tot_len ); enProcMode = pcRcverMnger->PacketRcver( FdTmp, ( BST_UINT8 * )pucSdu, usCopyedLength ); if( BST_IP_PKT_FORWARD_PROC == enProcMode ) { BST_IP_ApiForwordPacket( (BST_IP_PKT_ID_T)p ); } ucErrMsg = ERR_OK; } else { ucErrMsg = ERR_BUF; } BST_OS_FREE( pucSdu ); BST_IP_TCP_RCVAPI_FREE(); }
/*lint -e438*/ BST_VOID BST_IP_UdpRecvCB( BST_VOID *arg, struct udp_pcb *upcb, struct pbuf *p, BST_IPADDR_U32T *addr, BST_UINT16 port ) { BST_UINT16 usCopyedLength; BST_IP_CRcverMng *pcRcverMnger; BST_IP_PKTPROC_MODE_ENUM enProcMode; struct pbuf *q; BST_UINT8 *pucSdu; BST_FD_T FdTmp; BST_OS_LOCKCNT_T tThreadLockCnt; BST_ASSERT_NULL( addr ); BST_ASSERT_NULL( upcb ); BST_ASSERT_NULL( p ); tThreadLockCnt = BST_OS_ThreadLock(); FdTmp.pFd = upcb; pucSdu = BST_NULL_PTR; q = BST_NULL_PTR; usCopyedLength = 0; enProcMode = BST_IP_PKT_REMOVE_PROC; pcRcverMnger = BST_IP_CRcverMng::GetInstance(); if( BST_NULL_PTR == pcRcverMnger ) { BST_IP_UDP_RCVAPI_FREE(); } if ( p->tot_len > 0 ) { pucSdu = ( BST_UINT8 * )BST_OS_MALLOC( p->tot_len ); } else { BST_IP_UDP_RCVAPI_FREE(); } if ( BST_NULL_PTR == pucSdu ) { BST_IP_UDP_RCVAPI_FREE(); } q = p; usCopyedLength = 0; while ( BST_NULL_PTR != q ) { if ( ( q->len > 0 ) && ( BST_NULL_PTR != q->payload ) && ( q->len + usCopyedLength <= p->tot_len ) ) { BST_OS_MEMCPY( pucSdu + usCopyedLength, q->payload, q->len ); } else { break; } usCopyedLength += q->len; q = q->next; } if ( usCopyedLength > 0 ) { enProcMode = pcRcverMnger->PacketRcver( FdTmp, ( BST_UINT8 * )pucSdu, usCopyedLength ); if( BST_IP_PKT_FORWARD_PROC == enProcMode ) { BST_IP_ApiForwordPacket( (BST_IP_PKT_ID_T)p ); } } BST_OS_FREE( pucSdu ); BST_IP_UDP_RCVAPI_FREE(); }