]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDebug1CommandsLib/SetVar.c
ShellPkg: Parse new SMBIOS 3.0 fields.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / SetVar.c
index 9e57998ff85f797be72b4caed6e7ee3bff24cc2d..e711d22729e08fb0fcff11913b11176b4d7791b5 100644 (file)
@@ -1,7 +1,8 @@
 /** @file\r
   Main file for SetVar shell Debug1 function.\r
 \r
-  Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>\r
+  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
+  Copyright (c) 2010 - 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
@@ -44,7 +45,6 @@ ShellCommandRunSetVar (
   EFI_GUID            Guid;\r
   CONST CHAR16        *StringGuid;\r
   UINT32              Attributes;\r
-  UINT32              Attributes2;\r
   VOID                *Buffer;\r
   UINTN               Size;\r
   UINTN               LoopVar;\r
@@ -72,7 +72,7 @@ ShellCommandRunSetVar (
   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), gShellDebug1HiiHandle, ProblemParam);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"setvar", ProblemParam);  \r
       FreePool(ProblemParam);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
@@ -80,10 +80,10 @@ ShellCommandRunSetVar (
     }\r
   } else {\r
     if (ShellCommandLineGetCount(Package) < 2) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"setvar");  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else if (ShellCommandLineGetCount(Package) > 3) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"setvar");  \r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
       VariableName  = ShellCommandLineGetRawValue(Package, 1);\r
@@ -94,11 +94,11 @@ ShellCommandRunSetVar (
         StringGuid = ShellCommandLineGetValue(Package, L"-guid");\r
         Status = ConvertStringToGuid(StringGuid, &Guid);\r
         if (EFI_ERROR(Status)) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, StringGuid);\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", StringGuid);  \r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
         }\r
       }\r
-      if (Data == NULL) {\r
+      if (Data == NULL || Data[0] !=  L'=') {\r
         //\r
         // Display what's there\r
         //\r
@@ -114,7 +114,7 @@ ShellCommandRunSetVar (
           }\r
           ShellPrintEx(-1, -1, L"\r\n");\r
         } else {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_GET), gShellDebug1HiiHandle, &Guid, VariableName, Status);\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_GET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName);  \r
           ShellStatus = SHELL_ACCESS_DENIED;\r
         }\r
       } else if (StrCmp(Data, L"=") == 0) {\r
@@ -123,31 +123,52 @@ ShellCommandRunSetVar (
         //\r
         Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, 0, NULL);\r
         if (EFI_ERROR(Status)) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, &Guid, VariableName, Status);\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName);  \r
           ShellStatus = SHELL_ACCESS_DENIED;\r
         } else {\r
           ASSERT(ShellStatus == SHELL_SUCCESS);\r
         }\r
       } else {\r
-        if (Data[0] == L'=') {\r
-          Data++;\r
-        }\r
         //\r
-        // Change what's there\r
+        // Change what's there or create a new one.\r
         //\r
-        if (ShellCommandLineGetFlag(Package, L"-bs")) {\r
-          Attributes |= EFI_VARIABLE_BOOTSERVICE_ACCESS;\r
-        }\r
-        if (ShellCommandLineGetFlag(Package, L"-rt")) {\r
-          Attributes |= EFI_VARIABLE_RUNTIME_ACCESS |\r
-                        EFI_VARIABLE_BOOTSERVICE_ACCESS;\r
+\r
+        ASSERT(Data[0] == L'=');\r
+        Data++;\r
+\r
+        //\r
+        // Determine if the variable exists and get the attributes\r
+        //\r
+        Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer);\r
+        if (Status == EFI_BUFFER_TOO_SMALL) {\r
+          Buffer = AllocateZeroPool(Size);\r
+          Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer);\r
         }\r
-        if (ShellCommandLineGetFlag(Package, L"-nv")) {\r
-          Attributes |= EFI_VARIABLE_NON_VOLATILE;\r
+\r
+        if (EFI_ERROR(Status) || Buffer == NULL) {\r
+          //\r
+          // Creating a new variable.  determine attributes from command line.\r
+          //\r
+          Attributes = 0;\r
+          if (ShellCommandLineGetFlag(Package, L"-bs")) {\r
+            Attributes |= EFI_VARIABLE_BOOTSERVICE_ACCESS;\r
+          }\r
+          if (ShellCommandLineGetFlag(Package, L"-rt")) {\r
+            Attributes |= EFI_VARIABLE_RUNTIME_ACCESS |\r
+                          EFI_VARIABLE_BOOTSERVICE_ACCESS;\r
+          }\r
+          if (ShellCommandLineGetFlag(Package, L"-nv")) {\r
+            Attributes |= EFI_VARIABLE_NON_VOLATILE;\r
+          }\r
         }\r
+        SHELL_FREE_NON_NULL(Buffer);\r
+\r
+        //\r
+        // What type is the new data.\r
+        //\r
         if (ShellIsHexOrDecimalNumber(Data, TRUE, FALSE)) {\r
           if (StrLen(Data) % 2 != 0) {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, Data);\r
+            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", Data);  \r
             ShellStatus = SHELL_INVALID_PARAMETER;\r
           } else {\r
             //\r
@@ -164,24 +185,13 @@ ShellCommandRunSetVar (
               Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, StrLen(Data) / 2, Buffer);\r
             }\r
             if (EFI_ERROR(Status)) {\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, &Guid, VariableName, Status);\r
+              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName);  \r
               ShellStatus = SHELL_ACCESS_DENIED;\r
             } else {\r
               ASSERT(ShellStatus == SHELL_SUCCESS);\r
             }\r
           }\r
         } else if (StrnCmp(Data, L"\"", 1) == 0) {\r
-          Size = 0;\r
-          Attributes2 = 0;\r
-          Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes2, &Size, Buffer);\r
-          if (Status == EFI_BUFFER_TOO_SMALL) {\r
-            Buffer = AllocateZeroPool(Size);\r
-            Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes2, &Size, Buffer);\r
-            if (Buffer != NULL) {\r
-              FreePool(Buffer);\r
-            }\r
-            Attributes = Attributes2;\r
-          }          \r
           //\r
           // ascii text\r
           //\r
@@ -195,7 +205,7 @@ ShellCommandRunSetVar (
             Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, AsciiStrSize(Buffer)-sizeof(CHAR8), Buffer);\r
           }\r
           if (EFI_ERROR(Status)) {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, &Guid, VariableName, Status);\r
+            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName);  \r
             ShellStatus = SHELL_ACCESS_DENIED;\r
           } else {\r
             ASSERT(ShellStatus == SHELL_SUCCESS);\r
@@ -208,7 +218,7 @@ ShellCommandRunSetVar (
           Data++;\r
           Buffer = AllocateZeroPool(StrSize(Data));\r
           if (Buffer == NULL) {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle);\r
+            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"setvar");  \r
             ShellStatus = SHELL_OUT_OF_RESOURCES;\r
           } else {\r
             UnicodeSPrint(Buffer, StrSize(Data), L"%s", Data);\r
@@ -216,7 +226,7 @@ ShellCommandRunSetVar (
 \r
             Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, StrSize(Buffer)-sizeof(CHAR16), Buffer);\r
             if (EFI_ERROR(Status)) {\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, &Guid, VariableName, Status);\r
+              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName);  \r
               ShellStatus = SHELL_ACCESS_DENIED;\r
             } else {\r
               ASSERT(ShellStatus == SHELL_SUCCESS);\r
@@ -230,19 +240,19 @@ ShellCommandRunSetVar (
           Data++;\r
           DevPath = ConvertTextToDevicePath(Data);\r
           if (DevPath == NULL) {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_DPFT), gShellDebug1HiiHandle, Status);\r
+            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_DPFT), gShellDebug1HiiHandle, L"setvar");  \r
             ShellStatus = SHELL_INVALID_PARAMETER;\r
           } else {\r
             Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, GetDevicePathSize(DevPath), DevPath);\r
             if (EFI_ERROR(Status)) {\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, &Guid, VariableName, Status);\r
+              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName);  \r
               ShellStatus = SHELL_ACCESS_DENIED;\r
             } else {\r
               ASSERT(ShellStatus == SHELL_SUCCESS);\r
             }\r
           }\r
         } else {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Data);\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", Data);  \r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
         }\r
       }\r