/********************************************************************************************************* ** 函数名称: __ram_move ** 功能描述: ramfs 移动或者重命名一个文件 ** 输 入 : pramn 文件节点 ** pcNewName 新的名字 ** 输 出 : ERROR ** 全局变量: ** 调用模块: *********************************************************************************************************/ INT __ram_move (PRAM_NODE pramn, PCHAR pcNewName) { PRAM_VOLUME pramfs; PRAM_NODE pramnTemp; PRAM_NODE pramnFather; PRAM_NODE pramnNewFather; BOOL bRoot; BOOL bLast; PCHAR pcTail; PCHAR pcTemp; PCHAR pcFileName; pramfs = pramn->RAMN_pramfs; pramnFather = pramn->RAMN_pramnFather; pramnTemp = __ram_open(pramfs, pcNewName, &pramnNewFather, &bRoot, &bLast, &pcTail); if (pramnTemp) { _ErrorHandle(EEXIST); return (PX_ERROR); } if (bRoot || (bLast == LW_FALSE)) { /* 新名字指向根或者没有目录 */ _ErrorHandle(EINVAL); return (PX_ERROR); } if (pramnFather != pramnNewFather) { /* 目录发生改变 */ if (pramnFather) { _List_Line_Del(&pramn->RAMN_lineBrother, &pramnFather->RAMN_plineSon); } else { _List_Line_Del(&pramn->RAMN_lineBrother, &pramfs->RAMFS_plineSon); } if (pramnNewFather) { _List_Line_Add_Ahead(&pramn->RAMN_lineBrother, &pramnNewFather->RAMN_plineSon); } else { _List_Line_Add_Ahead(&pramn->RAMN_lineBrother, &pramfs->RAMFS_plineSon); } } pcFileName = lib_rindex(pcNewName, PX_DIVIDER); if (pcFileName) { pcFileName++; } else { pcFileName = pcNewName; } pcTemp = (PCHAR)__SHEAP_ALLOC(lib_strlen(pcFileName) + 1); if (pcTemp == LW_NULL) { _ErrorHandle(ENOMEM); return (PX_ERROR); } lib_strcpy(pcTemp, pcFileName); __SHEAP_FREE(pramn->RAMN_pcName); pramn->RAMN_pcName = pcTemp; return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: __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); }
/********************************************************************************************************* ** 函数名称: __ram_maken ** 功能描述: ramfs 创建一个文件 ** 输 入 : pramfs 文件系统 ** pcName 文件名 ** pramnFather 父亲, NULL 表示根目录 ** mode mode_t ** pcLink 如果为连接文件, 这里指明连接目标. ** 输 出 : 创建结果 ** 全局变量: ** 调用模块: *********************************************************************************************************/ PRAM_NODE __ram_maken (PRAM_VOLUME pramfs, CPCHAR pcName, PRAM_NODE pramnFather, mode_t mode, CPCHAR pcLink) { PRAM_NODE pramn = (PRAM_NODE)__SHEAP_ALLOC(sizeof(RAM_NODE)); CPCHAR pcFileName; if (pramn == LW_NULL) { _ErrorHandle(ENOMEM); return (LW_NULL); } lib_bzero(pramn, sizeof(RAM_NODE)); pcFileName = lib_rindex(pcName, PX_DIVIDER); if (pcFileName) { pcFileName++; } else { pcFileName = pcName; } pramn->RAMN_pcName = (PCHAR)__SHEAP_ALLOC(lib_strlen(pcFileName) + 1); if (pramn->RAMN_pcName == LW_NULL) { __SHEAP_FREE(pramn); _ErrorHandle(ENOMEM); return (LW_NULL); } lib_strcpy(pramn->RAMN_pcName, pcFileName); if (S_ISLNK(mode)) { pramn->RAMN_pcLink = (PCHAR)__SHEAP_ALLOC(lib_strlen(pcLink) + 1); if (pramn->RAMN_pcLink == LW_NULL) { __SHEAP_FREE(pramn->RAMN_pcName); __SHEAP_FREE(pramn); _ErrorHandle(ENOMEM); return (LW_NULL); } lib_strcpy(pramn->RAMN_pcLink, pcLink); } else { if ((mode & S_IFMT) == 0) { mode |= S_IFREG; } pramn->RAMN_pcLink = LW_NULL; } pramn->RAMN_pramnFather = pramnFather; pramn->RAMN_pramfs = pramfs; pramn->RAMN_mode = mode; pramn->RAMN_timeCreate = lib_time(LW_NULL); pramn->RAMN_timeAccess = pramn->RAMN_timeCreate; pramn->RAMN_timeChange = pramn->RAMN_timeCreate; pramn->RAMN_uid = getuid(); pramn->RAMN_gid = getgid(); pramn->RAMN_prambCookie = LW_NULL; if (pramnFather) { _List_Line_Add_Ahead(&pramn->RAMN_lineBrother, &pramnFather->RAMN_plineSon); } else { _List_Line_Add_Ahead(&pramn->RAMN_lineBrother, &pramfs->RAMFS_plineSon); } return (pramn); }