]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c
ShellPkg: Update Level2 profile commands response output
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Vol.c
index 3688a503a7ddfecf5cda44b44b552a3b723be08e..0bf0dd0ad5c924be36304b69aaff7f01cc79039c 100644 (file)
@@ -1,7 +1,8 @@
 /** @file\r
   Main file for vol shell level 2 function.\r
 \r
-  Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2015, Hewlett-Packard Development Company, L.P.<BR>\r
+  Copyright (c) 2011 - 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
@@ -30,7 +31,7 @@ EFIAPI
 HandleVol(\r
   IN CONST CHAR16  *Path,\r
   IN CONST BOOLEAN Delete,\r
-  IN CONST CHAR16  *Name\r
+  IN CONST CHAR16  *Name OPTIONAL\r
   )\r
 {\r
   EFI_STATUS            Status;\r
@@ -44,15 +45,37 @@ HandleVol(
 \r
   ShellStatus   = SHELL_SUCCESS;\r
 \r
+  if (\r
+      Name != NULL && (\r
+      StrStr(Name, L"%") != NULL ||\r
+      StrStr(Name, L"^") != NULL ||\r
+      StrStr(Name, L"*") != NULL ||\r
+      StrStr(Name, L"+") != NULL ||\r
+      StrStr(Name, L"=") != NULL ||\r
+      StrStr(Name, L"[") != NULL ||\r
+      StrStr(Name, L"]") != NULL ||\r
+      StrStr(Name, L"|") != NULL ||\r
+      StrStr(Name, L":") != NULL ||\r
+      StrStr(Name, L";") != NULL ||\r
+      StrStr(Name, L"\"") != NULL ||\r
+      StrStr(Name, L"<") != NULL ||\r
+      StrStr(Name, L">") != NULL ||\r
+      StrStr(Name, L"?") != NULL ||\r
+      StrStr(Name, L"/") != NULL ||\r
+      StrStr(Name, L" ") != NULL )\r
+      ){\r
+    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"vol", Name);  \r
+    return (SHELL_INVALID_PARAMETER);\r
+  }\r
+\r
   Status = gEfiShellProtocol->OpenFileByName(\r
     Path,\r
     &ShellFileHandle,\r
     Name != NULL?EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE:EFI_FILE_MODE_READ);\r
 \r
   if (EFI_ERROR(Status) || ShellFileHandle == NULL) {\r
-    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, Path);\r
-    ShellStatus = SHELL_ACCESS_DENIED;\r
-    return (ShellStatus);\r
+    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"vol", Path);  \r
+    return (SHELL_ACCESS_DENIED);\r
   }\r
 \r
   //\r
@@ -76,8 +99,10 @@ HandleVol(
       SysInfo);\r
   }\r
 \r
+  ASSERT(SysInfo != NULL);\r
+\r
   if (Delete) {\r
-    StrCpy ((CHAR16 *) SysInfo->VolumeLabel, L"");\r
+    *((CHAR16 *) SysInfo->VolumeLabel) = CHAR_NULL;\r
     SysInfo->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize(SysInfo->VolumeLabel);\r
     Status = EfiFpHandle->SetInfo(\r
       EfiFpHandle,\r
@@ -89,50 +114,71 @@ HandleVol(
     Size2 = StrSize(SysInfo->VolumeLabel);\r
     if (Size1 > Size2) {\r
       SysInfo = ReallocatePool((UINTN)SysInfo->Size, (UINTN)SysInfo->Size + Size1 - Size2, SysInfo);\r
+      if (SysInfo == NULL) {\r
+        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"vol");  \r
+        ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+      } \r
+    }\r
+    if (SysInfo != NULL) {\r
+      StrnCpy ((CHAR16 *) SysInfo->VolumeLabel, Name, (Size1 > Size2?Size1/sizeof(CHAR16):Size2/sizeof(CHAR16))-1);\r
+      SysInfo->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + Size1;\r
+      Status = EfiFpHandle->SetInfo(\r
+        EfiFpHandle,\r
+        &gEfiFileSystemInfoGuid,\r
+        (UINTN)SysInfo->Size,\r
+        SysInfo);\r
     }\r
-    StrCpy ((CHAR16 *) SysInfo->VolumeLabel, Name);\r
-    SysInfo->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + Size1;\r
-    Status = EfiFpHandle->SetInfo(\r
-      EfiFpHandle,\r
-      &gEfiFileSystemInfoGuid,\r
-      (UINTN)SysInfo->Size,\r
-      SysInfo);\r
   }  \r
 \r
   FreePool(SysInfo);\r
 \r
   if (Delete || Name != NULL) {\r
     if (EFI_ERROR(Status)) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, Path);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"vol", Path);  \r
       ShellStatus = SHELL_ACCESS_DENIED;\r
     }\r
   }\r
 \r
-  SysInfo = AllocateZeroPool(SysInfoSize);\r
+  SysInfoSize = 0;\r
+  SysInfo = NULL;\r
+\r
   Status = EfiFpHandle->GetInfo(\r
     EfiFpHandle,\r
     &gEfiFileSystemInfoGuid,\r
     &SysInfoSize,\r
     SysInfo);\r
 \r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    SysInfo = AllocateZeroPool(SysInfoSize);\r
+    Status = EfiFpHandle->GetInfo(\r
+      EfiFpHandle,\r
+      &gEfiFileSystemInfoGuid,\r
+      &SysInfoSize,\r
+      SysInfo);\r
+  }\r
+\r
   gEfiShellProtocol->CloseFile(ShellFileHandle);\r
+  \r
+  ASSERT(SysInfo != NULL);\r
 \r
-  //\r
-  // print VolumeInfo table\r
-  //\r
-  ShellPrintHiiEx (\r
-    0,\r
-    gST->ConOut->Mode->CursorRow,\r
-    NULL,\r
-    STRING_TOKEN (STR_VOL_VOLINFO),\r
-    gShellLevel2HiiHandle,\r
-    SysInfo->VolumeLabel,\r
-    SysInfo->ReadOnly?L"r":L"rw",\r
-    SysInfo->VolumeSize,\r
-    SysInfo->FreeSpace,\r
-    SysInfo->BlockSize\r
-   );\r
-  SHELL_FREE_NON_NULL(SysInfo);\r
+  if (SysInfo != NULL) {\r
+    //\r
+    // print VolumeInfo table\r
+    //\r
+    ShellPrintHiiEx (\r
+      0,\r
+      gST->ConOut->Mode->CursorRow,\r
+      NULL,\r
+      STRING_TOKEN (STR_VOL_VOLINFO),\r
+      gShellLevel2HiiHandle,\r
+      SysInfo->VolumeLabel,\r
+      SysInfo->ReadOnly?L"r":L"rw",\r
+      SysInfo->VolumeSize,\r
+      SysInfo->FreeSpace,\r
+      SysInfo->BlockSize\r
+     );\r
+    SHELL_FREE_NON_NULL(SysInfo);\r
+  }\r
 \r
   return (ShellStatus);\r
 }\r
@@ -164,7 +210,9 @@ ShellCommandRunVol (
   CONST CHAR16  *CurDir;\r
   BOOLEAN       DeleteMode;\r
   CHAR16        *FullPath;\r
+  CHAR16        *TempSpot;\r
   UINTN         Length;\r
+  CONST CHAR16  *NewName;\r
 \r
   Length              = 0;\r
   ProblemParam        = NULL;\r
@@ -191,7 +239,7 @@ ShellCommandRunVol (
   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"vol", ProblemParam);  \r
       FreePool(ProblemParam);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
@@ -206,7 +254,7 @@ ShellCommandRunVol (
     }\r
 \r
     if (ShellCommandLineGetCount(Package) > 2) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"vol");  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
       PathName = ShellCommandLineGetRawValue(Package, 1);\r
@@ -214,31 +262,38 @@ ShellCommandRunVol (
         CurDir = gEfiShellProtocol->GetCurDir(NULL);\r
         if (CurDir == NULL) {\r
           ShellStatus = SHELL_NOT_FOUND;\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle);\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"vol");  \r
         } else {\r
           PathName = CurDir;\r
         }\r
       }\r
       if (PathName != NULL) {\r
-        StrnCatGrow(&FullPath, &Length, PathName, StrStr(PathName, L"\\")==NULL?0:StrStr(PathName, L"\\")-PathName+1);\r
-        if (StrStr(FullPath, L":\\") == NULL) {\r
-          StrnCatGrow(&FullPath, &Length, L":\\", 0);\r
+        TempSpot = StrStr(PathName, L":");\r
+        if (TempSpot != NULL) {\r
+          *TempSpot = CHAR_NULL;\r
+        }\r
+        TempSpot = StrStr(PathName, L"\\");\r
+        if (TempSpot != NULL) {\r
+          *TempSpot = CHAR_NULL;\r
         }\r
+        StrnCatGrow(&FullPath, &Length, PathName, 0);\r
+        StrnCatGrow(&FullPath, &Length, L":\\", 0);\r
         DeleteMode = ShellCommandLineGetFlag(Package, L"-d");\r
+        NewName    = ShellCommandLineGetValue(Package, L"-n");\r
         if (DeleteMode && ShellCommandLineGetFlag(Package, L"-n")) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle);\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellLevel2HiiHandle, L"vol", L"-d", L"-n");  \r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
-        } else if (ShellCommandLineGetFlag(Package, L"-n") && ShellCommandLineGetValue(Package, L"-n") == NULL) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"-n");\r
+        } else if (ShellCommandLineGetFlag(Package, L"-n") && NewName == NULL) {\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"vol", L"-n");  \r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
-        } else if (ShellCommandLineGetValue(Package, L"-n") != NULL && StrLen(ShellCommandLineGetValue(Package, L"-n")) > 11) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"-n");\r
+        } else if (NewName != NULL && StrLen(NewName) > 11) {\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"vol", NewName, L"-n");  \r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
         } else if (ShellStatus == SHELL_SUCCESS) {\r
           ShellStatus = HandleVol(\r
             FullPath,\r
             DeleteMode,\r
-            ShellCommandLineGetValue(Package, L"-n")\r
+            NewName\r
            );\r
         }\r
       }\r