]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c
This patch replaces StrCpy with StrnCpy or refactors out the usage of StrCpy through...
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Rm.c
index 32b7580103ff4641a1462b4040396fd5fd370372..6cc5dcf69107a91a6ea98f0b6aa56a5fa5f4cf81 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Main file for attrib shell level 2 function.\r
 \r
-  Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2014, 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
@@ -33,17 +33,17 @@ IsDirectoryEmpty (
   IN EFI_HANDLE   FileHandle\r
   )\r
 {\r
-  EFI_STATUS      Status;\r
   EFI_FILE_INFO   *FileInfo;\r
   BOOLEAN         NoFile;\r
   BOOLEAN         RetVal;\r
 \r
   RetVal = TRUE;\r
   NoFile = FALSE;\r
+  FileInfo = NULL;\r
 \r
-  for (Status = FileHandleFindFirstFile(FileHandle, &FileInfo)\r
+  for (FileHandleFindFirstFile(FileHandle, &FileInfo)\r
     ;  !NoFile\r
-    ;  Status = FileHandleFindNextFile(FileHandle, FileInfo, &NoFile)\r
+    ;  FileHandleFindNextFile(FileHandle, FileInfo, &NoFile)\r
    ){\r
     if (StrStr(FileInfo->FileName, L".") != FileInfo->FileName\r
       &&StrStr(FileInfo->FileName, L"..") != FileInfo->FileName) {\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
@@ -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
+            StrnCpy(TempName, Node->FullName, NewSize/sizeof(CHAR16) -1);\r
+            TempName[StrStr(TempName, L":")+1-TempName] = CHAR_NULL;\r
+            StrnCat(TempName, Node2->FullName, NewSize/sizeof(CHAR16) -1 - StrLen(TempName));\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
@@ -151,7 +177,9 @@ 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
@@ -202,7 +230,10 @@ IsValidDeleteTarget(
   Size          = 0;\r
   Pattern       = StrnCatGrow(&Pattern     , NULL, TempLocation  , 0);\r
   SearchString  = StrnCatGrow(&SearchString, &Size, Node->FullName, 0);\r
-  SearchString  = StrnCatGrow(&SearchString, &Size, L"*", 0);\r
+  if (!EFI_ERROR(ShellIsDirectory(SearchString))) {\r
+    SearchString  = StrnCatGrow(&SearchString, &Size, L"\\", 0);\r
+    SearchString  = StrnCatGrow(&SearchString, &Size, L"*", 0);\r
+  }\r
 \r
   if (Pattern == NULL || SearchString == NULL) {\r
     RetVal = FALSE;\r