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

📄 cli_private.inc

📁 命令行在嵌入式系统的实现
💻 INC
字号:
/************************************************************************
Copyright 200X - 200X+1.

filename     : CLI_User.inc

description  : 命令行模块大部分子功能需要用到的定义与声明。私有,对其它模块不提供

author       : Woodhead

modification : Woodhead    create              2004-12-07
************************************************************************/

#ifndef _CLI_PRIVATE_INC_
#define _CLI_PRIVATE_INC_

#include "..\include\Cli_reg.h"
#include "Cli_Dbg.inc"
#include "CLI_PrvCfg.h"
#include "MT_Pub.h"
#include "MT_User.h"
#include "Agent_Pub.h"

#define CLI_ML_NULL         ML_NULL_STRING_SID

#define CLI_PID_NULL        0xffff      /*ddddd*/

/* 延时,单位为1/100秒 */
#define CLI_DELAY(s)   EOS_TaskDelay(s*10)

#define HISTORY_SIZE        10                      /* 历史命令个数      */
#define USERNAME_LEN        MT_USERNAME_LEN         /* 用户名最大长度    */
#define PASSWORD_LEN        MT_PASSWORD_LEN         /* 口令的最大长度 */
#define HOSTNAME_LENGTH     MT_HOSTNAME_LENGTH      /* 主机名最大长度    */
#define MAX_TOKEN_SIZE      80                      /* 单个命令字最大长度*/
#define CT_MAX_CMDBUF       256                     /* 命令缓冲最大长度  */
#define TERM_TIMEOUT        300                     /* 接收的超时长度定义*/

#define FIRST_TELNET_DATA   2                       /* 第一个telnet数据(终端)的位置*/
#define MAX_USER_NUM        MT_MAX_USER_NUM         /* 操作用户最大个数  */

#define TERM_IO_BUFFER      1024                    /* 终端发送与接收缓冲大小 */
#define TERM_OUT_FOR_RESPONSE 24                    /* 预留给从命令执行反馈的空间*/

#define CLI_INVALID         (_U32)(-1)

/* 定义最大重试次数 */
#define MAX_FAILED_LOG_TIME     3

/* 超时开关定义     */
#define TIMEOUT_ON     0
#define TIMEOUT_OFF    1

/* 语言模式定义     */
#define ENGLISH_L        0
#define CHINESE_L        1

/* 帮助模式开关定义 */
#define CTHELPMODEON     0
#define CTHELPMODEOFF    1

/* 自动、手动分屏开关 */
#define SCROLL_MANUAL    1
#define SCROLL_AUTO      0

/* 交互允许开关定义 */
#define SMART_ON         0
#define SMART_OFF        1

/* telnet 端口号定义            */
#define TELNETPORT      23
/* 终端socket在非telnet状态下的属性   */
#define SOCKET_FOR_SERIAL       -1
#define SOCKET_FOR_MML          -2
#define SOCKET_FOR_WEB          -3
#define SOCKET_NOT_INITIAL      -4
/* Telnet登录通道定义*/
#define INBAND           0
#define OUTBAND          1

/* 终端任务的运行状态定义        */
enum  Term_Status_E
{
    TERM_SLEEPING = 0,
    TERM_ACTIVE,
    TERM_LOGED,
    TERM_EXECCMD,
    TERM_WAIT_RESPONSE,

    TELNET_MAX_STATUS
} ;

/* -------------------------------- 宏操作定义 ------------------------------ */

/* 定义串口控制台端口号         */
#define SERIAL_PORT (DEV_SERIAL | 1)

/* 有界索引值加1、减1宏定义 */
#define CLI_INCCYCLE(idx, max)   ( ((idx) >= ((max) - 1)) ? 0 : ((idx) + 1) )
#define CLI_DECCYCLE(idx, max)   ( ((idx) == 0) ? (max - 1) : ((idx) - 1) )

/* 判断指定终端的状态是否正常 */
#define IS_TERM_NORMAL(lp) ((lp)->ucTermStatus >= TERM_ACTIVE && (lp)->ulTimeLeft != 0)

/* 终端信号量控制 */
#define TERM_SEM_P(lp) EOS_SemP(lp->ulSemID, 3000)
#define TERM_SEM_V(lp) EOS_SemV(lp->ulSemID)

/* 判断字符c是否为Tab键         */
#define ISTAB( c )       (( c == '\t' ) ? 1 : 0)
/* 判断字符c是否为CTL + 字符键  */
#define ISCTRLCHAR( c )  (( c >= 0 && c <= 32 ) ? ('@' + c) : 0)
/* 判断字符c是否为BackSpace键   */
#define ISBACKSPACE( c ) (( c == '\b' ) ? 1 : 0)
/* 判断字符c是否为Delete键      */
#define ISDELETE( c )    (( c == 127 ) ? 1  : 0)
/* 判断字符c是否为ESC键         */
#define ISESC( c )       (( c == '\x1b' ) ? 1  : 0)
/* 判断字符c是否为[键           */
#define ISESC2( c )      (( c == '[' ) ? 1 : 0 )
/* 判断字符c是否为o键           */
#define ISESC3( c )      (( c == 'O' ) ? 1 : 0 )
/* 判断字符c是否为方向键        */
#define ISARROW( c )     (( c >= 'A' && c <= 'D' ) ? (c - 'A' + 1) : 0 )
#define ISSPACEBAR(c)    (((c) == ' ') ? 1 : 0)


#define CLI_ASSURE_OR_FAIL(exp)    \
{                               \
/*lint -e506 -e774 */ \
    if (!(exp))                 \
/*lint -restore */ \
    {                           \
        DBG_Out(PID_CLI, CLI_DBGOUT_ERR, \
                "\r\n CLI FATAL: filename:%s, line:%d", __FILE__, __LINE__); \
        MT_ERRLOG(0);          \
        return G_FAILURE;       \
    }                           \
}

#define CLI_ASSURE_OR_NULL(exp)    \
{                               \
/*lint -e506 -e774 */ \
    if (!(exp))                 \
/*lint -restore */ \
    {                           \
        DBG_Out(PID_CLI, CLI_DBGOUT_ERR, \
                "\r\n CLI FATAL: filename:%s, line:%d", __FILE__, __LINE__); \
        MT_ERRLOG(0);          \
        return G_NULL;          \
    }                           \
}


/* 用户终端任务数据结构定义开始                             {
*/
/* telnet参数结构体                     */
#define TERMLENGTH   41
struct Telnet_Param_S
{
    _U32  TTState  ;   /* socket输入状态       */
    _U32  SubState ;   /* 选项子协商状态       */
    _U8 OptionCmd ;    /* 选项命令             */
    _U8 Synching ;     /* SYNCH信令标识        */
    _U8 DoEcho ;       /* ECHO 选项            */
    _S8 TermType[TERMLENGTH];  /* 终端类型     */
    _S8 FirstTermType[TERMLENGTH] ;/* 第一类终端类型   */
    _U8 SendBinary ;   /* 发送二进制选项       */
    _U8 RecvBinary ;   /* 接收二进制选项       */
    _U8 Noga ;         /* go head选项          */
} ;

typedef struct Term_Data_S * PTerm_Data_S ;
struct Term_Data_S
{
    _U32      ulTermId;                     /* 终端ID                   */
    _S32      iSocket ;                     /* socket连接标识           */
    _S8       szCurUserName[USERNAME_LEN];  /* 当前用户名               */

    _S8       szRecvBuf[TERM_IO_BUFFER] ;   /* 接收缓冲区               */
    _S32      iRecvLen ;                    /* 实际接收到的数据长度     */

    _S8       szSendBuf[TERM_IO_BUFFER] ;   /* 发送缓冲区               */
    _S32      iSendLen ;                    /* 发送缓冲区的实际数据长度 */

    _S8       szHistory[HISTORY_SIZE][CT_MAX_CMDBUF] ;/* 历史命令缓冲区 */
    _S32      iHistoryPos ;                 /* 当前历史命令所在的位置   */

    _S8       szEditBuf[CT_MAX_CMDBUF] ;    /* 键盘编辑缓冲区           */
    _S32      iCurrentPos ;                 /* 当前的光标位置           */
    _S32      iPromptLen ;                  /* 当前命令的提示符长度     */

    _S8       szCommandBuf[CT_MAX_CMDBUF] ; /* 命令缓冲区               */
    _S8       szInputCmd[CT_MAX_CMDBUF] ;   /* 已经输入的命令           */
    _S32      iEditStatus ;                 /* 字符串的编辑状态         */
    _S32      iMaxLen ;                     /* 当前命令行编辑的最大长度 */
    _U32      ulTimeLeft;                   /* 终端剩余时间             */

    struct    Telnet_Param_S TelnetParam ;  /* telnet 参数              */
    _U32      ulClientIP ;                  /* IP地址                   */
    _U32      ulCommandExecOk ;             /* 命令执行标志             */
    _U32      ulRecurCmd;                   /* 重现命令行标志           */
    _U32      ulDispLineCount;              /* 已经显示的行数           */
    _U32      ulSemID;                      /* 终端信号量               */

    struct    CT_WS_S  *pWS;                /* 状态结构变量             */

    _U8       ucTimeOutFlag;                /* 超时长短的设置           */
    _U8       ucChannel;                    /* telnet 登录通道设置      */
    _U8       ucTermStatus;                 /* 终端运行状态             */
    _U8       ucScroll;                     /* 多行输出控制             */
    _U8       ucUserLevel ;                 /* 当前用户的权级           */
    _U8       ucHelpMode ;                  /* 当前命令行的帮助模式     */
    _U8       ucAlarmLevel;                 /* 告警的输出控制标志       */
    _U8       ucInputStatus;                /* 字符串输入状态           */

} ;

/* 任务数据表                               */
struct TD_S
{
    _U32 lTaskid ;               /* 任务ID号 */
    PTerm_Data_S pTermStruct ;   /* 任务数据 */
} ;
/* 用户终端任务数据结构定义结束                               }
*/

/* IP访问控制表 */
#define ACL_USED_FLAG 0xAA
typedef struct tag_ST_ACL
{
    _U8  ucValid;
    _U8  ucReserve;
    _U32 ulIpAddr ;    /* Telnet的IP地址 */
    _U32 ulIpMask ;    /* Telnet的掩码 */
    _U32 ulState ;     /* 当前状态 如果是ACL_USED_FLAG, 则有效 */
}ST_ACL, *P_ST_ACL;

typedef struct CT_MODE_RECORD_S
{
    _S8 szName[256] ;
    _U32 ulCount ;
} CT_MODE_RECORD_T;

/* 命令行主从设备交互消息结构 */
typedef struct tag_ST_MS_CLIMSG
{
    _U8   ucTermID;      //对应的处理终端ID
    _U8   ucMode;        //对于透传命令而言,命令的执行模式
    _U8   ucLan;         //保留字
    _U8   ucData[1];     //消息数据, 申请时多出这个作结束符使用
}ST_MSCLI_MSG, *PST_MSCLI_MSG;

extern struct TD_S     *m_TDTable;
extern _U8              m_CliIsMainDevice;
extern _S8              m_szHostName[HOSTNAME_LENGTH];
extern _U32             m_ulCliMaxTermNum;
extern _U32             m_ulCliMaxOnlineUser;
#if CLI_DBASE_SUPPORT
extern _U32             m_ulCliUserHandle;
extern _U16             m_usHostNameTable;
extern _U16             m_usClientACLTable;
extern ST_ACL         m_stCliAcl[MT_ACL_NUM];
#endif



/* 【1】Cli_init.c的函数声明 */

_U32  CLI_TDTableInit (_VOID);
PTerm_Data_S CLI_GetTaskDataByPid (_U32 ulPid);
PTerm_Data_S CLI_GetTaskDataByName (_S8 *szUsername);
PTerm_Data_S CLI_GetCurrentTaskData ( _VOID );
#if MULTI_DEVICE_SUPPORT
    ST_MSG* CLI_MSMsgCreat(_U32 usDeviceID, _U32 ulTermID, _U16 usMSmsgType, _S8 *szSend);
#endif
_VOID CLI_TaskDataInit( PTerm_Data_S pTermStruct );
_U32  CLI_ResetEnviroment(CT_WS_P pWS);

/* 【2】Cli_Term.c的函数声明 */
_U32   CLI_SendToTerm( PTerm_Data_S pTermStruct );
_U32   CLI_ReceiveFromTerm(PTerm_Data_S pTermStruct , _U32 ulSecond);
_U32 CLI_SendToMML(PTerm_Data_S pTermStruct);

#if (EOS_OS_TYPE != EOS_WIN32)
_VOID  CLI_SerialInit(_VOID);
_U32   CLI_SendToSerial ( PTerm_Data_S pTermStruct ) ;
_U32   CLI_ReceiveFromSerial ( PTerm_Data_S pTermStruct, _U32 ulSecond) ;
_U32   CLI_SerialSetBaudrate( _U32 ulBaudrate );
_U32   CLI_SerialGetChar( _U8 *pucChar );
#else
_VOID  CLI_SerialInit( _VOID );
_U32   CLI_SendToSerial ( PTerm_Data_S pTermStruct ) ;
_U32   CLI_ReceiveFromSerial ( PTerm_Data_S pTermStruct, _U32 ulSecond) ;
_VOID  CLI_WinMoveToCurrentPos ( _S32 iTmp, _S8 cFlag );
#endif

#if CLI_TELNET_SUPPORT
_U32   CLI_TelnetServerInit (_S32 *iSocketServer);
_VOID  CLI_TelnetServer (_U32 ulArg1, _U32 ulArg2 );
_U32   CLI_AclAdd(_U32 ulIpaddr, _U32 ulIpMask);
_U32   CLI_AclDel(_U32 ulIpaddr, _U32 ulIpMask);
_U32   CLI_AclCheck(_U32 ulIpaddr);
_U32   CLI_AclDisplay(_VOID);
#endif
_VOID CLI_SerialTask( _U32 ulArg1, _U32 ulArg2);
_VOID CLI_MmlTask( _U32 ulArg1, _U32 ulArg2);
_VOID CLI_TelnetTask( _U32 ulArg1, _U32 ulArg2);
_VOID CLI_PeriodProc(_VOID);
_VOID  CLI_TermTaskProc (PTerm_Data_S pTermStruct);
_VOID  CLI_TermLogin (PTerm_Data_S pTermStruct);
_VOID  CLI_TermLogout (PTerm_Data_S pTermStruct);
_U32   CLI_ReturnRootMode (PTerm_Data_S pTermStruct);
_U32   CLI_EditString ( PTerm_Data_S pTermStruct );
_U32   CLI_CharProcess ( PTerm_Data_S pTermStruct, _U8 ucTmp ) ;
_VOID  CLI_CharInsert ( PTerm_Data_S pTermStruct, _S8 ch );
_VOID  CLI_EditSpecialKey ( PTerm_Data_S pTermStruct, _S8 ch );
_VOID  CLI_DealWithBackSpace ( PTerm_Data_S pTermStruct );
_VOID  CLI_DealWithDelete ( PTerm_Data_S pTermStruct ) ;
_VOID  CLI_PrevCmdDisp ( PTerm_Data_S pTermStruct );
_VOID  CLI_NextCmdDisp ( PTerm_Data_S pTermStruct );
_VOID  CLI_MoveToCurrentPos ( PTerm_Data_S pTermStruct, _U32 iPos );
_VOID  CLI_SetTermStatus(PTerm_Data_S pTermStruct, _U8 ucTermStatus);

_VOID  CLI_Bell ( PTerm_Data_S pTermStruct );
_U32   CLI_PatchCommand(PTerm_Data_S pTermStruct);
_U32   CLI_PatchCmdWord(PTerm_Data_S pTermStruct);
_U32   CLI_DealWitchCommand(PTerm_Data_S pTermStruct);

_U32    CLI_GetUserLogModeByTermID( _U32 ulTermID );
_U32    CLI_GetTermLevel( _U32 ulTermId );
_U32    CLI_WebTermAlloc( _U32 *pulTermID );
_U32    CLI_WebLogin( _U32 ulLogIp, const _S8* username, const _S8* password,_U32* pulTermId );
_VOID   CLI_WebLogout( _U32 ulLogIp, _U32 ulTermId );
_U32    CLI_WebSendKickOffUserMsg( _U32 ulTermId );


/* 【3】Cli_lib.c的函数声明 */
_U32  _isfloatstr(_S8 * pStr);
_U32  _isintstr(_S8 * pStr);
_S8* _btrim (_S8 * pStr);
_S8* _ltrim(_S8 *pStr);
_S8* _rtrim(_S8 *pStr);
_VOID _TrimString( _S8* pDst, _S8 * pSrc );
_U32  strmatch(_S8 *s8Src, _S8 *s8Dest);
_U32 _isempty(_S8 * pStr);
_U32 _VerifyFixedString(_S8 *pStr, _U32 ulLen);
_U32 _VerifyAndCvtDwordI(_S8 * szNum, _S32 dwLow, _S32 dwHigh, _S32 * pdwValue);
_U32 _VerifyAndCvtDword (_S8 * szNum, _U32 dwLow, _U32 dwHigh, _U32 *
pdwValue);
_U32 _VerifyAndCvtDwordH (_S8 * szNum, _U32 dwLow, _U32 dwHigh, _U32 *
pdwValue);
_U32 _isdecstr (_S8 * pStr);
_U32 _isxdecstr (_S8 * pStr);
_U32 _DateOrTimeToUl(_S8 *szDate, _U32 *pulDate);
_U32 _VerifyDate (_S8 *szDate1);
_U32 _VerifyTime (_S8 *szTime1);
_U32 _VerifyHostIPAddress(_S8 *szIPAdd);
_U32 _VerifyGeneralIPAddress(_S8 *szIPAdd);
_U32 _VerifyMASKAddress(_S8 *szMaskAdd);
_U32 _VerifyMACAddress(_S8 *szMACAdd);
_U32 _AffirmStrBeLower(_S8 *szStr);
int  _Split(_S8 **Sour,_S8 *Dest,_S8 flag,int Len);
_U32 _StrToIPAddr(_S8 *string, _U32 *ulRet);
_S8* _IPAddrToStr(_U32 ulIPAddr, _S8 *string);
int  _atoulx(register _S8 *Sour,unsigned long * pTemp);
int  _atoul(register _S8 *Sour,unsigned long * pTemp);
int _atol(_S8 *szSrc, _S32 *ulVal);
int  _atou(_S8 *Sour,_U32 * pTemp);
_U32 _strtol(const _S8 *str, _U32 base);
int  _atoux(register _S8 *Sour,unsigned short * pTemp);
_U32  _IsChar(_S8 c);
_U32 _IsCmdChar(_S8 c);


/* 【4】Cli_Io.c的部分私有函数声明 */
_U32  IO_InsertDispInfo(_U32 ulTermID, _S8 *szOutput);
_VOID IO_DispBaseInit(_VOID);
_U32  IO_OutToTerm(PTerm_Data_S pTermStruct, const _S8 *szOutString);
_U32  IO_PrintToAllTerm(_U32 ulInfoID, ...);
_U32  IO_Print(_U32 ulInfoID, ...);
_VOID IO_AsynDispTask(_U32 ulArg1, _U32 ulArg2);

/* 【5】其他文件的私有函数声明 */
_U32    CLI_EnterDiagMode(_U32 ulTermID);

#endif /*end of #ifndef _CLI_PRIVATE_INC_*/

⌨️ 快捷键说明

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