/********************************************************************************************************* ** 函数名称: 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)); }
/********************************************************************************************************* ** 函数名称: 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); /* 关键字错误 */ } }
/********************************************************************************************************* ** 函数名称: __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); /* 显示目录下指定匹配的文件 */ }
/********************************************************************************************************* ** 函数名称: 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); }