Example #1
0
/*********************************************************************************************************
** 函数名称: API_TShellKeywordAddEx
** 功能描述: 向 ttiny shell 系统添加一个关键字.
** 输 入  : pcKeyword     关键字
**           pfuncCommand  执行的 shell 函数
**           ulOption      选项
** 输 出  : 错误代码.
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
ULONG  API_TShellKeywordAddEx (CPCHAR  pcKeyword, PCOMMAND_START_ROUTINE  pfuncCommand, ULONG  ulOption)
{
    REGISTER size_t    stStrLen;

    if (__PROC_GET_PID_CUR() != 0) {                                    /*  进程中不能注册命令          */
        _ErrorHandle(ENOTSUP);
        return  (ENOTSUP);
    }
    
    if (!pcKeyword) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "pcKeyword invalidate.\r\n");
        _ErrorHandle(ERROR_TSHELL_EPARAM);
        return  (ERROR_TSHELL_EPARAM);
    }
    
    stStrLen = lib_strnlen(pcKeyword, LW_CFG_SHELL_MAX_KEYWORDLEN);
    
    if (stStrLen >= (LW_CFG_SHELL_MAX_KEYWORDLEN + 1)) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "pcKeyword is too long.\r\n");
        _ErrorHandle(ERROR_TSHELL_EPARAM);
        return  (ERROR_TSHELL_EPARAM);
    }

    return  (__tshellKeywordAdd(pcKeyword, stStrLen, pfuncCommand, ulOption));
}
Example #2
0
/*********************************************************************************************************
** 函数名称: API_TShellFormatAdd
** 功能描述: 为一个关键字添加格式字串信息
** 输 入  : pcKeyword     关键字
**           pcFormat      格式字串
** 输 出  : 错误代码.
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
ULONG  API_TShellFormatAdd (CPCHAR  pcKeyword, CPCHAR  pcFormat)
{
             __PTSHELL_KEYWORD   pskwNode = LW_NULL;
    REGISTER size_t              stStrLen;
    
    if (__PROC_GET_PID_CUR() != 0) {                                    /*  进程中不允许操作            */
        _ErrorHandle(ENOTSUP);
        return  (ENOTSUP);
    }
    
    if (!pcKeyword) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "pcKeyword invalidate.\r\n");
        _ErrorHandle(ERROR_TSHELL_EPARAM);
        return  (ERROR_TSHELL_EPARAM);
    }
    if (!pcFormat) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "pcHelp invalidate.\r\n");
        _ErrorHandle(ERROR_TSHELL_EPARAM);
        return  (ERROR_TSHELL_EPARAM);
    }
    
    stStrLen = lib_strnlen(pcKeyword, LW_CFG_SHELL_MAX_KEYWORDLEN);
    
    if (stStrLen >= (LW_CFG_SHELL_MAX_KEYWORDLEN + 1)) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "pcKeyword is too long.\r\n");
        _ErrorHandle(ERROR_TSHELL_EPARAM);
        return  (ERROR_TSHELL_EPARAM);
    }
    
    if (ERROR_NONE == __tshellKeywordFind(pcKeyword, &pskwNode)) {      /*  查找关键字                  */
        
        __TTINY_SHELL_LOCK();                                           /*  互斥访问                    */
        if (pskwNode->SK_pcFormatString) {
            __TTINY_SHELL_UNLOCK();                                     /*  释放资源                    */
            
            _DebugHandle(__ERRORMESSAGE_LEVEL, "format string overlap.\r\n");
            _ErrorHandle(ERROR_TSHELL_OVERLAP);
            return  (ERROR_TSHELL_OVERLAP);
        }
        
        stStrLen = lib_strlen(pcFormat);                                /*  为帮助字串开辟空间          */
        pskwNode->SK_pcFormatString = (PCHAR)__SHEAP_ALLOC(stStrLen + 1);
        if (!pskwNode->SK_pcFormatString) {
            _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
            _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
            return  (ERROR_SYSTEM_LOW_MEMORY);
        }
        lib_strcpy(pskwNode->SK_pcFormatString, pcFormat);
        __TTINY_SHELL_UNLOCK();                                         /*  释放资源                    */
        return  (ERROR_NONE);
    
    } else {
        
        _ErrorHandle(ERROR_TSHELL_EKEYWORD);
        return  (ERROR_TSHELL_EKEYWORD);                                /*  关键字错误                  */
    }
}
Example #3
0
/*********************************************************************************************************
** 函数名称: __tshellCharTab
** 功能描述: shell 收到一个 tab 按键.
** 输 入  : iFd                           文件描述符
**           psicContext                   当前输入上下文
** 输 出  : NONE
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static VOID  __tshellCharTab (INT  iFd, __PSHELL_INPUT_CTX  psicContext)
{
#define __TTINY_SHELL_CMD_ISWHITE(pcCmd)    \
        ((*(pcCmd) == ' ') || (*(pcCmd) == '\t') || (*(pcCmd) == '\r') || (*(pcCmd) == '\n'))

#define __TTINY_SHELL_CMD_ISEND(pcCmd)      (*(pcCmd) == PX_EOS)

             INT         i;
             PCHAR       pcCmd;
             size_t      stStrLen;
             CHAR        cCommandBuffer[MAX_FILENAME_LENGTH];
             PCHAR       pcParamList[LW_CFG_SHELL_MAX_PARAMNUM + 1];    /*  参数列表                    */
             
             PCHAR       pcDir;
             PCHAR       pcFileName;
    REGISTER ULONG       ulError;
    
    if (CTX_CURSOR < CTX_TOTAL) {                                       /*  将光标移动到行末            */
        __tshellTtyCursorMoveRight(iFd, CTX_TOTAL - CTX_CURSOR);
        CTX_CURSOR = CTX_TOTAL;
    }
    CTX_BUFFER[CTX_TOTAL] = PX_EOS;                                     /*  假设命令结束                */
    
    pcCmd = CTX_BUFFER;
    
    if (!pcCmd || __TTINY_SHELL_CMD_ISEND(pcCmd)) {                     /*  命令错误                    */
        return;
    }
    
    while (__TTINY_SHELL_CMD_ISWHITE(pcCmd)) {                          /*  过滤前面的不可见字符        */
        pcCmd++;
        if (__TTINY_SHELL_CMD_ISEND(pcCmd)) {
            return;                                                     /*  不是有效的命令字            */
        }
    }
    
    if (*pcCmd == '#') {                                                /*  注释行直接忽略              */
        return;
    }
    
    stStrLen = lib_strnlen(pcCmd, LW_CFG_SHELL_MAX_COMMANDLEN + 1);     /*  计算字符串长短              */
    if ((stStrLen > LW_CFG_SHELL_MAX_COMMANDLEN - 1) ||
        (stStrLen < 1)) {                                               /*  字符串长度错误              */
        return;
    }
    
    lib_bzero(cCommandBuffer, LW_CFG_SHELL_MAX_COMMANDLEN);             /*  清空 cCommandBuffer 缓冲区  */
    
    ulError = __tshellStrConvertVar(CTX_BUFFER, cCommandBuffer);        /*  变量替换                    */
    if (ulError) {
        return;
    }
    __tshellStrFormat(cCommandBuffer, cCommandBuffer);                  /*  整理 shell 命令             */
    
    pcParamList[0] = cCommandBuffer;
    for (i = 0; i < LW_CFG_SHELL_MAX_PARAMNUM; i++) {                   /*  开始查询参数                */
        __tshellStrGetToken(pcParamList[i], 
                            &pcParamList[i + 1]);
        __tshellStrDelTransChar(pcParamList[i], pcParamList[i]);        /*  删除转义字符与非转义引号    */
        if (pcParamList[i + 1] == LW_NULL) {                            /*  参数结束                    */
            break;
        }
    }
    
    pcDir = pcParamList[i];                                             /*  仅分析最后一个字段          */
    if (pcDir == LW_NULL) {
        return;
    }
    
    if (lib_strlen(pcDir) == 0) {                                       /*  没有内容, 当前目录          */
        pcDir = ".";
        pcFileName = "";
        __tshellFileMatch(iFd, pcDir, pcFileName, psicContext);         /*  显示目录下指定匹配的文件    */
        return;
    }
    
    pcFileName = lib_rindex(pcDir, PX_DIVIDER);
    if (pcFileName == LW_NULL) {                                        /*  当前目录                    */
        pcFileName = pcDir;
        pcDir = ".";

    } else {
        if (pcFileName == pcDir) {                                      /*  根目录下第一级目录          */
            pcDir = PX_STR_DIVIDER;
            pcFileName++;
        
        } else {
            *pcFileName = PX_EOS;
            pcFileName++;
        }
    }
    
    __tshellFileMatch(iFd, pcDir, pcFileName, psicContext);             /*  显示目录下指定匹配的文件    */
}
Example #4
0
/*********************************************************************************************************
** 函数名称: API_OemDiskMountEx2
** 功能描述: 自动挂载一个磁盘的所有分区. 可以使用指定的文件系统类型挂载
** 输 入  : pcVolName          根节点名字 (当前 API 将根据分区情况在末尾加入数字)
**           pblkdDisk          物理磁盘控制块 (必须是直接操作物理磁盘)
**           pvDiskCacheMem     磁盘 CACHE 缓冲区的内存起始地址  (为零表示动态分配磁盘缓冲)
**           stMemSize          磁盘 CACHE 缓冲区大小            (为零表示不需要 DISK CACHE)
**           iMaxRBurstSector   磁盘猝发读的最大扇区数
**           iMaxWBurstSector   磁盘猝发写的最大扇区数
**           pcFsName           文件系统类型, 例如: "vfat" "tpsfs" "iso9660" "ntfs" ...
**           bForceFsType       是否强制使用指定的文件系统类型
** 输 出  : OEM 磁盘控制块
** 全局变量: 
** 调用模块: 
** 注  意  : 挂载的文件系统不包含 yaffs 文件系统, yaffs 属于静态文件系统.
                                           API 函数
*********************************************************************************************************/
LW_API 
PLW_OEMDISK_CB  API_OemDiskMountEx2 (CPCHAR        pcVolName,
                                     PLW_BLK_DEV   pblkdDisk,
                                     PVOID         pvDiskCacheMem, 
                                     size_t        stMemSize, 
                                     INT           iMaxRBurstSector,
                                     INT           iMaxWBurstSector,
                                     CPCHAR        pcFsName,
                                     BOOL          bForceFsType)
{
             INT            i;
             INT            iErrLevel = 0;
             
    REGISTER ULONG          ulError;
             CHAR           cFullVolName[MAX_FILENAME_LENGTH];          /*  完整卷标名                  */
             
             INT            iBlkIo;
             INT            iBlkIoErr;
             PCHAR          pcTail;

             INT            iVolSeq;
    REGISTER INT            iNPart;
             DISKPART_TABLE dptPart;                                    /*  分区表                      */
             PLW_OEMDISK_CB poemd;
             
             FUNCPTR        pfuncFsCreate;
    
    /*
     *  挂载节点名检查
     */
    if (pcVolName == LW_NULL || *pcVolName != PX_ROOT) {                /*  名字错误                    */
        _ErrorHandle(EINVAL);
        return  (LW_NULL);
    }
    i = (INT)lib_strnlen(pcVolName, (PATH_MAX - __OEM_DISK_TAIL_LEN));
    if (i >= (PATH_MAX - __OEM_DISK_TAIL_LEN)) {                        /*  名字过长                    */
        _ErrorHandle(ERROR_IO_NAME_TOO_LONG);
        return  (LW_NULL);
    }
    
    /*
     *  分配 OEM 磁盘控制块内存
     */
    poemd = (PLW_OEMDISK_CB)__SHEAP_ALLOC(sizeof(LW_OEMDISK_CB) + (size_t)i);
    if (poemd == LW_NULL) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return  (LW_NULL);
    }
    lib_bzero(poemd, sizeof(LW_OEMDISK_CB) + i);                        /*  清空                        */
    
    poemd->OEMDISK_pblkdDisk = pblkdDisk;
    
    /* 
     *  分配磁盘缓冲内存
     */
    if ((pvDiskCacheMem == LW_NULL) && (stMemSize > 0)) {               /*  是否需要动态分配磁盘缓冲    */
        poemd->OEMDISK_pvCache = __SHEAP_ALLOC(stMemSize);
        if (poemd->OEMDISK_pvCache == LW_NULL) {
            _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);                      /*  系统缺少内存                */
            goto    __error_handle;
        }
        pvDiskCacheMem = poemd->OEMDISK_pvCache;
    }
    
    /*
     *  创建物理磁盘缓冲, 同时会初始化磁盘
     */
    if (stMemSize) {
        ulError = API_DiskCacheCreateEx(pblkdDisk, 
                                        pvDiskCacheMem, 
                                        stMemSize,
                                        iMaxRBurstSector, 
                                        iMaxWBurstSector, 
                                        &poemd->OEMDISK_pblkdCache);
        if (ulError) {
            iErrLevel = 1;
            goto    __error_handle;
        }
    } else {
        poemd->OEMDISK_pblkdCache = pblkdDisk;                          /*  不需要磁盘缓冲              */
    }
    
    /*
     *  创建 blk io 设备
     */
    pcTail = lib_rindex(pcVolName, PX_DIVIDER);
    if (pcTail == LW_NULL) {
        pcTail =  (PCHAR)pcVolName;
    } else {
        pcTail++;
    }

    for (iBlkIo = 0; iBlkIo < 64; iBlkIo++) {
        snprintf(cFullVolName, MAX_FILENAME_LENGTH, "%s%s%d", LW_BLKIO_PERFIX, pcTail, iBlkIo);
        if (API_IosDevMatchFull(cFullVolName) == LW_NULL) {
            iBlkIoErr = API_OemBlkIoCreate(cFullVolName,
                                           poemd->OEMDISK_pblkdCache);
            if (iBlkIoErr == ERROR_NONE) {
                break;

            } else if (errno != ERROR_IOS_DUPLICATE_DEVICE_NAME) {
                iErrLevel = 2;
                goto    __error_handle;
            }
        }
    }

    /*
     *  扫面磁盘所有分区信息
     */
    iNPart = API_DiskPartitionScan(poemd->OEMDISK_pblkdCache, 
                                   &dptPart);                           /*  扫描分区表                  */
    if (iNPart < 1) {
        iErrLevel = 3;
        goto    __error_handle;
    }
    poemd->OEMDISK_uiNPart = (UINT)iNPart;                              /*  记录分区数量                */
    
    /*
     *  初始化所有的分区挂载失败
     */
    for (i = 0; i < iNPart; i++) {
        poemd->OEMDISK_iVolSeq[i] = PX_ERROR;                           /*  默认为挂载失败              */
    }
    
    /*
     *  分别挂载各个分区
     */
    iVolSeq = 0;
    for (i = 0; i < iNPart; i++) {                                      /*  装载各个分区                */
        if (API_DiskPartitionGet(&dptPart, i, 
                                 &poemd->OEMDISK_pblkdPart[i]) < 0) {   /*  获得分区 logic device       */
            break;
        }
        
__refined_seq:
        sprintf(cFullVolName, "%s%d", pcVolName, iVolSeq);              /*  获得完整卷名                */
        if (API_IosDevMatchFull(cFullVolName)) {                        /*  设备名重名预判              */
            iVolSeq++;
            goto    __refined_seq;                                      /*  重新确定卷序号              */
        }
        
        pfuncFsCreate = LW_NULL;
        
        switch (dptPart.DPT_dpoLogic[i].DPO_dpnEntry.DPN_ucPartType) {  /*  判断文件系统分区类型        */
            
        case LW_DISK_PART_TYPE_FAT12:                                   /*  FAT 文件系统类型            */
        case LW_DISK_PART_TYPE_FAT16:
        case LW_DISK_PART_TYPE_FAT16_BIG:
        case LW_DISK_PART_TYPE_WIN95_FAT32:
        case LW_DISK_PART_TYPE_WIN95_FAT32LBA:
        case LW_DISK_PART_TYPE_WIN95_FAT16LBA:
            if (bForceFsType) {                                         /*  是否强制指定文件系统类型    */
                pfuncFsCreate = __fsCreateFuncGet(pcFsName);
            } else {
                pfuncFsCreate = __fsCreateFuncGet("vfat");
            }
            break;
            
        case LW_DISK_PART_TYPE_TPS:
            if (bForceFsType) {                                         /*  是否强制指定文件系统类型    */
                pfuncFsCreate = __fsCreateFuncGet(pcFsName);
            } else {
                pfuncFsCreate = __fsCreateFuncGet("tpsfs");
            }
            break;
        
        default:                                                        /*  默认使用指定文件系统类型    */
            if (bForceFsType) {                                         /*  是否强制指定文件系统类型    */
                pfuncFsCreate = __fsCreateFuncGet(pcFsName);
            }
            break;
        }
        
        if (pfuncFsCreate) {                                            /*  存在支持的文件系统          */
            if (pfuncFsCreate(cFullVolName, 
                              poemd->OEMDISK_pblkdPart[i]) < 0) {       /*  挂载文件系统                */
                if (API_GetLastError() == ERROR_IOS_DUPLICATE_DEVICE_NAME) {
                    iVolSeq++;
                    goto    __refined_seq;                              /*  重新确定卷序号              */
                } else {
                    goto    __mount_over;                               /*  挂载失败                    */
                }
            }
            poemd->OEMDISK_pdevhdr[i] = API_IosDevMatchFull(cFullVolName);
            poemd->OEMDISK_iVolSeq[i] = iVolSeq;                        /*  记录卷序号                  */
        
        } else {
            continue;                                                   /*  此分区无法加载              */
        }
        
        if (poemd->OEMDISK_iVolSeq[i] >= 0) {
            __oemDiskForceDeleteEn(cFullVolName);                       /*  默认为强制删除              */
        }
        
        iVolSeq++;                                                      /*  已处理完当前卷              */
    }

__mount_over:                                                           /*  所有分区挂载完毕            */
    lib_strcpy(poemd->OEMDISK_cVolName, pcVolName);                     /*  拷贝名字                    */
    
    return  (poemd);
    
__error_handle:
    if (iErrLevel > 2) {
        if (poemd->OEMDISK_pblkdCache) {
            API_OemBlkIoDelete(poemd->OEMDISK_pblkdCache);
        }
    }
    if (iErrLevel > 1) {
        if (poemd->OEMDISK_pblkdCache != pblkdDisk) {
            API_DiskCacheDelete(poemd->OEMDISK_pblkdCache);
        }
    }
    if (iErrLevel > 0) {
        if (poemd->OEMDISK_pvCache) {
            __SHEAP_FREE(poemd->OEMDISK_pvCache);
        }
    }
    __SHEAP_FREE(poemd);
    
    return  (LW_NULL);
}