]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c
ShellPkg/[hex]edit: Fix mouse freeze issue
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Rm.c
index d167b36fb4507eb1d5362832a17c04939cc41d1c..288e7666a819ef9f903a079a149f993398ed3f51 100644 (file)
@@ -1,7 +1,8 @@
 /** @file\r
   Main file for attrib shell level 2 function.\r
 \r
-  Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>\r
+  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
+  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -28,7 +29,6 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
   @retval FALSE The directory has at least 1 file or directory in it.\r
 **/\r
 BOOLEAN\r
-EFIAPI\r
 IsDirectoryEmpty (\r
   IN EFI_HANDLE   FileHandle\r
   )\r
@@ -40,10 +40,11 @@ IsDirectoryEmpty (
 \r
   RetVal = TRUE;\r
   NoFile = FALSE;\r
+  FileInfo = NULL;\r
 \r
   for (Status = FileHandleFindFirstFile(FileHandle, &FileInfo)\r
-    ;  !NoFile\r
-    ;  Status = FileHandleFindNextFile(FileHandle, FileInfo, &NoFile)\r
+    ;  !NoFile && !EFI_ERROR (Status)\r
+    ;  FileHandleFindNextFile(FileHandle, FileInfo, &NoFile)\r
    ){\r
     if (StrStr(FileInfo->FileName, L".") != FileInfo->FileName\r
       &&StrStr(FileInfo->FileName, L"..") != FileInfo->FileName) {\r
@@ -65,7 +66,6 @@ IsDirectoryEmpty (
   @retval SHELL_DEVICE_ERROR  A device error occured reading this Node.\r
 **/\r
 SHELL_STATUS\r
-EFIAPI\r
 CascadeDelete(\r
   IN EFI_SHELL_FILE_INFO  *Node,\r
   IN CONST BOOLEAN        Quiet\r
@@ -76,6 +76,8 @@ CascadeDelete(
   EFI_SHELL_FILE_INFO   *Node2;\r
   EFI_STATUS            Status;\r
   SHELL_PROMPT_RESPONSE *Resp;\r
+  CHAR16                *TempName;\r
+  UINTN                 NewSize;\r
 \r
   Resp                  = NULL;\r
   ShellStatus           = SHELL_SUCCESS;\r
@@ -83,7 +85,7 @@ CascadeDelete(
   Status                = EFI_SUCCESS;\r
 \r
   if ((Node->Info->Attribute & EFI_FILE_READ_ONLY) == EFI_FILE_READ_ONLY) {\r
-    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_RM_LOG_DETELE_RO), gShellLevel2HiiHandle, Node->FullName);\r
+    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_RM_LOG_DETELE_RO), gShellLevel2HiiHandle, L"rm", Node->FullName);  \r
     return (SHELL_ACCESS_DENIED);\r
   }\r
 \r
@@ -92,7 +94,6 @@ CascadeDelete(
       if (!Quiet) {\r
         Status = ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_RM_LOG_DELETE_CONF), gShellLevel2HiiHandle, Node->FullName);\r
         Status = ShellPromptForResponse(ShellPromptResponseTypeYesNo, NULL, (VOID**)&Resp);\r
-        ASSERT_EFI_ERROR(Status);\r
         ASSERT(Resp != NULL);\r
         if (EFI_ERROR(Status) || *Resp != ShellPromptResponseYes) {\r
           SHELL_FREE_NON_NULL(Resp);\r
@@ -121,7 +122,32 @@ CascadeDelete(
           continue;\r
         }\r
         Node2->Status = gEfiShellProtocol->OpenFileByName (Node2->FullName, &Node2->Handle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE);\r
-        ShellStatus = CascadeDelete(Node2, Quiet);\r
+        if (EFI_ERROR(Node2->Status) && StrStr(Node2->FileName, L":") == NULL) {\r
+          //\r
+          // Update the node filename to have full path with file system identifier\r
+          //\r
+          NewSize = StrSize(Node->FullName) + StrSize(Node2->FullName);\r
+          TempName = AllocateZeroPool(NewSize);\r
+          if (TempName == NULL) {\r
+            ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+          } else {\r
+            StrCpyS(TempName, NewSize/sizeof(CHAR16), Node->FullName);\r
+            TempName[StrStr(TempName, L":")+1-TempName] = CHAR_NULL;\r
+            StrCatS(TempName, NewSize/sizeof(CHAR16), Node2->FullName);\r
+            FreePool((VOID*)Node2->FullName);\r
+            Node2->FullName = TempName;\r
+\r
+            //\r
+            // Now try again to open the file\r
+            //\r
+            Node2->Status = gEfiShellProtocol->OpenFileByName (Node2->FullName, &Node2->Handle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE);\r
+          }\r
+        }\r
+        if (!EFI_ERROR(Node2->Status)) {\r
+          ShellStatus = CascadeDelete(Node2, Quiet);\r
+        } else if (ShellStatus == SHELL_SUCCESS) {\r
+          ShellStatus = (SHELL_STATUS)(Node2->Status&(~0x80000000));\r
+        }\r
         if (ShellStatus != SHELL_SUCCESS) {\r
           if (List!=NULL) {\r
             gEfiShellProtocol->FreeFileList(&List);\r
@@ -139,7 +165,9 @@ CascadeDelete(
     //\r
     // now delete the current node...\r
     //\r
-    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_RM_LOG_DELETE), gShellLevel2HiiHandle, Node->FullName);\r
+    if (!Quiet) {\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_RM_LOG_DELETE), gShellLevel2HiiHandle, Node->FullName);\r
+    }\r
     Status = gEfiShellProtocol->DeleteFile(Node->Handle);\r
     Node->Handle = NULL;\r
   }\r
@@ -151,20 +179,21 @@ CascadeDelete(
     ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_RM_LOG_DELETE_ERR), gShellLevel2HiiHandle, Status);\r
     return (SHELL_ACCESS_DENIED);\r
   } else {\r
-    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_RM_LOG_DELETE_COMP), gShellLevel2HiiHandle);\r
+    if (!Quiet) {\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_RM_LOG_DELETE_COMP), gShellLevel2HiiHandle);\r
+    }\r
     return (SHELL_SUCCESS);\r
   }\r
 }\r
 \r
 /**\r
-  Determins if a Node is a valid delete target.  Will prevent deleting the root directory.\r
+  Determines if a Node is a valid delete target.  Will prevent deleting the root directory.\r
 \r
   @param[in] List       RESERVED.  Not used.\r
   @param[in] Node       The node to analyze.\r
   @param[in] Package    RESERVED.  Not used.\r
 **/\r
 BOOLEAN\r
-EFIAPI\r
 IsValidDeleteTarget(\r
   IN CONST EFI_SHELL_FILE_INFO  *List,\r
   IN CONST EFI_SHELL_FILE_INFO  *Node,\r
@@ -200,7 +229,9 @@ IsValidDeleteTarget(
   Pattern       = NULL;\r
   SearchString  = NULL;\r
   Size          = 0;\r
-  Pattern       = StrnCatGrow(&Pattern     , NULL, TempLocation  , 0);\r
+  Pattern       = StrnCatGrow(&Pattern, &Size, TempLocation  , 0);\r
+  Pattern       = StrnCatGrow(&Pattern, &Size, L"\\"  , 0);\r
+  Size = 0;\r
   SearchString  = StrnCatGrow(&SearchString, &Size, Node->FullName, 0);\r
   if (!EFI_ERROR(ShellIsDirectory(SearchString))) {\r
     SearchString  = StrnCatGrow(&SearchString, &Size, L"\\", 0);\r
@@ -261,7 +292,7 @@ ShellCommandRunRm (
   Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
   if (EFI_ERROR(Status)) {\r
     if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"rm", ProblemParam);  \r
       FreePool(ProblemParam);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
@@ -278,7 +309,7 @@ ShellCommandRunRm (
       //\r
       // we insufficient parameters\r
       //\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"rm");  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
       //\r
@@ -291,7 +322,7 @@ ShellCommandRunRm (
          ){\r
         Status = ShellOpenFileMetaArg((CHAR16*)Param, EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList);\r
         if (EFI_ERROR(Status) || FileList == NULL || IsListEmpty(&FileList->Link)) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, (CHAR16*)Param);\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"rm", (CHAR16*)Param);  \r
           ShellStatus = SHELL_NOT_FOUND;\r
           break;\r
         }\r