From d4bfb577ef83d59383cc0dde182a7be18c5f9b71 Mon Sep 17 00:00:00 2001 From: fangye Date: Mon, 10 Oct 2022 11:38:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dshell=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=91=BD=E4=BB=A4=E8=AF=AF=E5=88=A0=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: fangye Change-Id: Ia8f26ff4b250a6540f5644e2dd38fb22cd85d326 --- components/shell/src/cmds/vfs_shellcmd.c | 28 ++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/components/shell/src/cmds/vfs_shellcmd.c b/components/shell/src/cmds/vfs_shellcmd.c index 801f6e99..35cc6b1d 100644 --- a/components/shell/src/cmds/vfs_shellcmd.c +++ b/components/shell/src/cmds/vfs_shellcmd.c @@ -625,6 +625,24 @@ STATIC INT32 OsIsContainersWildcard(const CHAR *filename) return 0; } +/* Delete a non directory file */ +STATIC INT32 OsRmFileOnly(const CHAR *fullpath) +{ + struct stat statInfo = {0}; + INT32 ret = stat(fullpath, &statInfo); + if (ret == 0) { + if (!S_ISDIR(statInfo.st_mode)) { + ret = unlink(fullpath); + } else { + ret = 0; + PRINTK("rm: cannot remove '%s': Is a directory\n", fullpath); + } + } else { + PRINTK("stat: get '%s' statInfo fail!\n", fullpath); + } + return ret; +} + /* Delete a matching file or directory */ STATIC INT32 OsWildcardDeleteFileOrDir(const CHAR *fullpath, wildcard_type mark) @@ -636,7 +654,7 @@ STATIC INT32 OsWildcardDeleteFileOrDir(const CHAR *fullpath, wildcard_type mark) ret = OsShellCmdDoRmdir(fullpath); break; case RM_FILE: - ret = unlink(fullpath); + ret = OsRmFileOnly(fullpath); break; case RM_DIR: ret = rmdir(fullpath); @@ -649,8 +667,6 @@ STATIC INT32 OsWildcardDeleteFileOrDir(const CHAR *fullpath, wildcard_type mark) perror("rm/rmdir error!"); return ret; } - - PRINTK("%s match successful!delete!\n", fullpath); return 0; } @@ -728,6 +744,10 @@ STATIC INT32 OsWildcardExtractDirectory(CHAR *fullpath, VOID *dst, wildcard_type break; } + if (!strcmp(dirent->d_name, ".") || !strcmp(dirent->d_name, "..")) { + continue; + } + ret = strcpy_s(src, PATH_MAX, f); if (ret != EOK) { goto closedir_out; @@ -910,7 +930,7 @@ INT32 OsShellCmdRm(INT32 argc, const CHAR **argv) if (OsIsContainersWildcard(fullpath)) { ret = OsWildcardExtractDirectory(fullpath, NULL, RM_FILE); } else { - ret = unlink(fullpath); + ret = OsRmFileOnly(fullpath); } } if (ret == -1) {