⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cli_log.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 3 页
字号:
    _U16                   *ausMapTbl;

    /* WIN32调试版本, 做一下检查 */
    #if (EOS_OS_TYPE == EOS_WIN32)
    DBG_ASSERT( CLI_LogTableCheck() == G_SUCCESS );
    #endif

    /* 不需要重置映射表 */
    if( CT_AL_NULL <= m_ulLogMapResetMinLevel )
    {
        return G_SUCCESS;
    }

    /* 没有初始化, 申请到索引表的内存 */
    if( G_NULL == m_ausLogMapIndexTable[0] )
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    /* 日志表为空, 映射表全部重置 */
    if( 0 == m_pstLogTblCtrl->usLogCount )
    {
        m_ulLogMapResetMinLevel = CT_AL_QUERY;
    }

    /* 大于最小改动级别的映射表需要重置, 控制结构需要重新初始化 */
    for( ulUserLevel = m_ulLogMapResetMinLevel; ulUserLevel < CT_AL_NULL ; ulUserLevel ++ )
    {
        EOS_MemZero( &m_astLogIndexMapCtrl[ulUserLevel], sizeof(ST_LOG_INDEX_MAP_CTRL) );
        EOS_MemSet( m_ausLogMapIndexTable[ulUserLevel], G_NULL_BYTE, sizeof(_U16) * LOG_MAX_NUM );
    }

    /* 遍历日志表, 重置映射表 */
    usLogIndex  = m_pstLogTblCtrl->usLogHead;

    for( i = 0; i < m_pstLogTblCtrl->usLogCount; i ++ )
    {
        pstLogItem = &m_astLogTable[usLogIndex];

        DBG_ASSERT( pstLogItem->ulLevel < CT_AL_NULL );

        for( ulUserLevel = m_ulLogMapResetMinLevel; ulUserLevel < CT_AL_NULL ; ulUserLevel ++ )
        {
            if( pstLogItem->ulLevel <= ulUserLevel )
            {
                pstMapCtrl  = &m_astLogIndexMapCtrl[ulUserLevel];
                ausMapTbl   = m_ausLogMapIndexTable[ulUserLevel];

                ausMapTbl[pstMapCtrl->usMapTail] = usLogIndex;

                pstMapCtrl->usMapTail = CLI_INCCYCLE(pstMapCtrl->usMapTail, LOG_MAX_NUM);
                pstMapCtrl->usMapCount ++;

                DBG_ASSERT( pstMapCtrl->usMapCount <= LOG_MAX_NUM );
                DBG_ASSERT( pstMapCtrl->usMapHead == 0 );
            }
        }

        usLogIndex = CLI_INCCYCLE( usLogIndex, LOG_MAX_NUM );

    }

    m_ulLogMapResetMinLevel = CT_AL_NULL;

    /* WIN32调试版本, 做一下检查 */
    #if (EOS_OS_TYPE == EOS_WIN32)
    DBG_ASSERT( G_SUCCESS == CLI_LogMapCheck() );
    #endif

    return G_SUCCESS;

}
/*-----------------------------------------------------------------------------
 函数名称    : CLI_LogMapCheck();
 功能        : 索引映射表的合法性检查;
 输入参数    : 无.
 输出参数    : 无.
 返回值      : G_SUCCESS,   成功;
               其他,        失败.
 函数调用说明:
 典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_LogMapCheck( _VOID )
{
    _U32                    i, j;
    _U32                    ulUserLevel;
    _U16                    usCount, ausCount[CT_AL_NULL];
    _U16                    usLogIndex;
    _U16                    usMapIndex, usHighMapIndex;
    P_ST_LOG_ITEM           pstLogItem;
    ST_LOG_INDEX_MAP_CTRL  *pstMapCtrl, *pstHighMapCtrl;
    _U16                   *ausMapTbl,  *ausHighMapTbl;
    _BOOL                   bLogIndexMatch;

    /* 日志总数的合法性检查 */
    pstMapCtrl  = &m_astLogIndexMapCtrl[CT_AL_NULL - 1];
    if( pstMapCtrl->usMapCount != m_pstLogTblCtrl->usLogCount )
    {
        DBG_ErrLog( 0, EN_ERR_LEVEL_GENERAL, pstMapCtrl->usMapCount, m_pstLogTblCtrl->usLogCount );
        return G_FAILURE;
    }

    /* 不同级别用户的日志数目的合法性检查 */
    EOS_MemZero( ausCount, ( sizeof(_U16) * CT_AL_NULL ) );

    usLogIndex  = m_pstLogTblCtrl->usLogHead;

    for( i = 0; i < m_pstLogTblCtrl->usLogCount; i ++ )
    {
        pstLogItem = &m_astLogTable[usLogIndex];

        if( CT_AL_NULL > pstLogItem->ulLevel )
        {
            ausCount[pstLogItem->ulLevel] ++;
        }
        else
        {
            DBG_ErrLog( 0, EN_ERR_LEVEL_GENERAL, usLogIndex, pstLogItem->ulLevel );
        }

        usLogIndex = CLI_INCCYCLE(usLogIndex, LOG_MAX_NUM);
    }

    usCount = 0;
    for( ulUserLevel = 0; ulUserLevel < CT_AL_NULL; ulUserLevel ++ )
    {
        pstMapCtrl  = &m_astLogIndexMapCtrl[ulUserLevel];

        usCount += ausCount[ulUserLevel];

        if( usCount != pstMapCtrl->usMapCount )
        {
            MT_ERRLOG(ulUserLevel);
            return G_FAILURE;
        }
    }


    /* 位置的合法性检查(1) : 最大级别映射表肯定与日志表保持一致 */
    pstMapCtrl  = &m_astLogIndexMapCtrl[CT_AL_NULL - 1];
    ausMapTbl   = m_ausLogMapIndexTable[CT_AL_NULL - 1];

    usMapIndex  = pstMapCtrl->usMapHead;
    usLogIndex  = m_pstLogTblCtrl->usLogHead;

    for( i = 0; i < m_pstLogTblCtrl->usLogCount; i ++ )
    {
        if( ausMapTbl[usMapIndex] != usLogIndex )
        {
            DBG_ErrLog( 0, EN_ERR_LEVEL_GENERAL, usMapIndex, usLogIndex );
        }

        usMapIndex = CLI_INCCYCLE(usMapIndex, LOG_MAX_NUM);
        usLogIndex = CLI_INCCYCLE(usLogIndex, LOG_MAX_NUM);
    }


    /* 位置的合法性检查(2) : 大级别的映射表包含小级别的映射表 */
    for( ulUserLevel = 0; ulUserLevel < CT_AL_NULL - 1; ulUserLevel ++ )
    {
        pstMapCtrl      = &m_astLogIndexMapCtrl[ulUserLevel];
        ausMapTbl       = m_ausLogMapIndexTable[ulUserLevel];

        pstHighMapCtrl  = &m_astLogIndexMapCtrl[ulUserLevel + 1];
        ausHighMapTbl   = m_ausLogMapIndexTable[ulUserLevel + 1];

        if( 0 == pstMapCtrl->usMapCount )
        {
            continue;
        }

        usMapIndex      = pstMapCtrl->usMapHead;
        usHighMapIndex  = pstHighMapCtrl->usMapHead;

        j = 0;
        bLogIndexMatch = G_TRUE;

        for( i = 0; i < pstMapCtrl->usMapCount; i ++ )
        {
            for( ; j < pstHighMapCtrl->usMapCount; j ++ )
            {
                /* 匹配了 */
                if( ausMapTbl[usMapIndex] == ausHighMapTbl[usHighMapIndex] )
                {
                    bLogIndexMatch = G_TRUE;
                }

                usHighMapIndex = CLI_INCCYCLE(usHighMapIndex, LOG_MAX_NUM);

                if( G_TRUE == bLogIndexMatch )
                {
                    break;
                }
            }

            if( G_TRUE == bLogIndexMatch )
            {
                usMapIndex = CLI_INCCYCLE(usMapIndex, LOG_MAX_NUM);
            }
            else
            {
                MT_ERRLOG(ulUserLevel);
                return G_FAILURE;
            }

        }

    }


    return G_SUCCESS;

}


/*-----------------------------------------------------------------------------
 函数名称    : CLI_LogMapDisplay();
 功能        : 显示索引映射表的信息;
 输入参数    : 无.
 输出参数    : 无.
 返回值      : G_SUCCESS,   成功;
               其他,        失败.
 函数调用说明:
 典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_LogMapDisplay ( _U32 ulTermID )
{
    _U32                    i, ulRet;
    _U32                    ulUserLevel;
    _U16                    usLogIndex;
    _U16                    usMapIndex;
    P_ST_LOG_ITEM           pstLogItem;
    ST_LOG_INDEX_MAP_CTRL  *pstMapCtrl;
    _U16                   *ausMapTbl;
    _S8                     szOut[256];

    #ifdef PC_LINT
    (_VOID)ulTermID;
    #endif

    /* 重置映射表 */
    ulRet = CLI_LogMapReset();
    if( G_SUCCESS != ulRet )
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    for( ulUserLevel = 0; ulUserLevel < CT_AL_NULL; ulUserLevel ++ )
    {
        pstMapCtrl  = &m_astLogIndexMapCtrl[ulUserLevel];
        ausMapTbl   = m_ausLogMapIndexTable[ulUserLevel];

        EOS_Sprintf( szOut,
                     G_STR_HEAD"-------- <ulUserLevel %ld> --------"
                     G_STR_HEAD"usMapCount      %ld"
                     G_STR_HEAD"usMapHead       %ld"
                     G_STR_HEAD"usMapTail       %ld",
                     ulUserLevel,
                     pstMapCtrl->usMapCount,
                     pstMapCtrl->usMapHead,
                     pstMapCtrl->usMapTail
                     );
        IO_OutString( szOut );

        if( 0 == pstMapCtrl->usMapCount )
        {
            continue;
        }

        usMapIndex  = pstMapCtrl->usMapHead;

        for( i = 0; i < pstMapCtrl->usMapCount; i ++ )
        {
            usLogIndex = ausMapTbl[usMapIndex];

            EOS_Sprintf( szOut,
                         G_STR_HEAD"<usMapIndex %3ld>  ==>  <usLogIndex %3ld>  ",
                         usMapIndex,
                         usLogIndex
                         );
            IO_OutString( szOut );

            pstLogItem = CLI_GetOneLog( usLogIndex );
            if( G_NULL == pstLogItem )
            {
                DBG_ErrLog( 0, EN_ERR_LEVEL_GENERAL, ulUserLevel, usMapIndex );
                continue;
            }

            ulRet = CLI_LogItemCheck( pstLogItem );
            if( G_SUCCESS != ulRet )
            {
                DBG_ErrLog( 0, EN_ERR_LEVEL_GENERAL, ulUserLevel, usMapIndex );
                continue;
            }

            (_VOID)CLI_DisplayOneLog(pstLogItem);

            usMapIndex = CLI_INCCYCLE(usMapIndex, LOG_MAX_NUM);

        }

    }


    return G_SUCCESS;

}

/*********************************************************************/
/* 函数名称 : CLI_SaveUserLog()                                      */
/* 函数功能 : 存储一条日志到日志表                                   */
/* 输入参数 : szUserName  日志发生的操作者                           */
/*            ulLogMode   操作者的登录方式                           */
/*            ulClientIp  终端IP                                     */
/*            szCommand   日志内容                                   */
/* 输出参数 : 无                                                     */
/* 返回     : 成功、失败                                             */
/* 上层函数 :                                                        */
/* 创建者   :                                                        */
/* 修改记录 :                                                        */
/*********************************************************************/
_U32 CLI_SaveUserLog(const _S8 *szUserName, _U32 ulLogMode, _U32 ulClientIp, const _S8 *szCommand)
{
    ST_TIME                 sTime;
    P_ST_LOG_ITEM           pstLogItem;
    _U32                    ulLevel, ulDelLevel, ulMinLevel;
    _U16                    usSaveIndex;

    if ( CLI_LogTableCtlrCheck() != G_SUCCESS )
    {
        MT_ERRLOG(0);
        (_VOID)CLI_LogTableInit();
        return G_FAILURE;
    }

    if ( CLI_GetUserLevel( szUserName, &ulLevel) != G_SUCCESS )
    {
        MT_ERRLOG(0);
        return G_FAILURE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -