]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c
ShellPkg: acpiview: Add GT Frame Number validation to GTDT parser
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Set.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for attrib shell level 2 function.\r
3\r
c011b6c9 4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
ba0014b9 5 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
56ba3746 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
a405b86d 7\r
8**/\r
9\r
10#include "UefiShellLevel2CommandsLib.h"\r
11\r
12/**\r
13 Print out each environment variable registered with the Shell 2.0 GUID.\r
14\r
15 If you spawn a pre 2.0 shell from the Shell 2.0 the environment variable may not carry through.\r
16\r
17 @retval STATUS_SUCCESS the printout was sucessful\r
18 @return any return code from GetNextVariableName except EFI_NOT_FOUND\r
19**/\r
20SHELL_STATUS\r
a405b86d 21PrintAllShellEnvVars(\r
22 VOID\r
23 )\r
24{\r
25 CONST CHAR16 *Value;\r
26 CONST CHAR16 *ConstEnvNameList;\r
27\r
28 ConstEnvNameList = gEfiShellProtocol->GetEnv(NULL);\r
29 if (ConstEnvNameList == NULL) {\r
30 return (SHELL_SUCCESS);\r
31 }\r
32 while (*ConstEnvNameList != CHAR_NULL){\r
33 Value = gEfiShellProtocol->GetEnv(ConstEnvNameList);\r
34 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SET_DISP), gShellLevel2HiiHandle, ConstEnvNameList, Value);\r
35 ConstEnvNameList += StrLen(ConstEnvNameList)+1;\r
36 }\r
37\r
38 return (SHELL_SUCCESS);\r
39}\r
40\r
41STATIC CONST SHELL_PARAM_ITEM SetParamList[] = {\r
42 {L"-d", TypeValue},\r
43 {L"-v", TypeFlag},\r
44 {NULL, TypeMax}\r
45 };\r
46\r
47/**\r
48 Function for 'set' command.\r
49\r
50 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
51 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
52**/\r
53SHELL_STATUS\r
54EFIAPI\r
55ShellCommandRunSet (\r
56 IN EFI_HANDLE ImageHandle,\r
57 IN EFI_SYSTEM_TABLE *SystemTable\r
58 )\r
59{\r
60 EFI_STATUS Status;\r
61 LIST_ENTRY *Package;\r
62 CONST CHAR16 *KeyName;\r
63 CONST CHAR16 *Value;\r
64 CHAR16 *ProblemParam;\r
65 SHELL_STATUS ShellStatus;\r
66\r
67 ProblemParam = NULL;\r
68 ShellStatus = SHELL_SUCCESS;\r
69\r
70 //\r
71 // initialize the shell lib (we must be in non-auto-init...)\r
72 //\r
73 Status = ShellInitialize();\r
74 ASSERT_EFI_ERROR(Status);\r
75\r
76 //\r
77 // Make sure globals are good...\r
78 //\r
79 Status = CommandInit();\r
80 ASSERT_EFI_ERROR(Status);\r
81\r
82 //\r
83 // parse the command line\r
84 //\r
85 Status = ShellCommandLineParse (SetParamList, &Package, &ProblemParam, TRUE);\r
86 if (EFI_ERROR(Status)) {\r
87 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
ba0014b9 88 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"set", ProblemParam);\r
a405b86d 89 FreePool(ProblemParam);\r
90 return (SHELL_INVALID_PARAMETER);\r
91 } else {\r
92 ASSERT(FALSE);\r
93 }\r
94 } else {\r
95 //\r
96 // check for "-?"\r
97 //\r
98 if (ShellCommandLineGetFlag(Package, L"-?")) {\r
99 ASSERT(FALSE);\r
100 } else if (ShellCommandLineGetRawValue(Package, 3) != NULL) {\r
ba0014b9 101 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"set");\r
a405b86d 102 ShellStatus = SHELL_INVALID_PARAMETER;\r
103 } else if (ShellCommandLineGetRawValue(Package, 1) != NULL && ShellCommandLineGetFlag(Package, L"-d")) {\r
ba0014b9 104 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"set");\r
a405b86d 105 ShellStatus = SHELL_INVALID_PARAMETER;\r
106 } else if (ShellCommandLineGetFlag(Package, L"-d")) {\r
107 //\r
108 // delete a environment variable\r
109 //\r
110 KeyName = ShellCommandLineGetValue(Package, L"-d");\r
111 if (KeyName == NULL) {\r
ba0014b9 112 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"set", L"-d");\r
a405b86d 113 ShellStatus = SHELL_INVALID_PARAMETER;\r
114 } else {\r
115 Status = ShellSetEnvironmentVariable(KeyName, L"", ShellCommandLineGetFlag(Package, L"-v"));\r
116 if (EFI_ERROR(Status)) {\r
ba0014b9 117 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SET_ND), gShellLevel2HiiHandle, L"set", KeyName);\r
a405b86d 118 ShellStatus = SHELL_DEVICE_ERROR;\r
119 }\r
120 }\r
121 } else if (ShellCommandLineGetRawValue(Package, 1) == NULL) {\r
122 //\r
123 // print out all current environment variables\r
124 //\r
125 return(PrintAllShellEnvVars());\r
126 } else {\r
127 //\r
128 // we are either printing one or assigning one\r
129 //\r
130 KeyName = ShellCommandLineGetRawValue(Package, 1);\r
131 Value = ShellCommandLineGetRawValue(Package, 2);\r
132 if (KeyName != NULL && Value != NULL) {\r
133 //\r
134 // assigning one\r
135 //\r
136 Status = ShellSetEnvironmentVariable(KeyName, Value, ShellCommandLineGetFlag(Package, L"-v"));\r
938d65a5
QS
137 if (EFI_ERROR(Status)) {\r
138 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SET_ERROR_SET), gShellLevel2HiiHandle, L"set", KeyName);\r
139 ShellStatus = (SHELL_STATUS) (Status & (~MAX_BIT));\r
140 }\r
ba0014b9 141\r
a405b86d 142 } else {\r
143 if (KeyName != NULL) {\r
144 //\r
145 // print out value for this one only.\r
146 //\r
147 Value = ShellGetEnvironmentVariable(KeyName);\r
148 if (Value == NULL) {\r
ba0014b9 149 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SET_NF), gShellLevel2HiiHandle, L"set", KeyName);\r
a405b86d 150 ShellStatus = SHELL_SUCCESS;\r
151 } else {\r
152 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SET_DISP), gShellLevel2HiiHandle, KeyName, Value);\r
153 ShellStatus = SHELL_SUCCESS;\r
154 }\r
155 } else {\r
156 ASSERT(FALSE);\r
157 }\r
158 }\r
159 }\r
160 }\r
161\r
162 //\r
163 // free the command line package\r
164 //\r
165 ShellCommandLineFreeVarList (Package);\r
166\r
167 return (ShellStatus);\r
168}\r