]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel3CommandsLib/Alias.c
ShellPkg: acpiview: Fix '\n\n' printing in Table Checksum reporting
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel3CommandsLib / Alias.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for Alias shell level 3 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 "UefiShellLevel3CommandsLib.h"\r
11\r
12#include <Library/ShellLib.h>\r
13\r
5ce99ab9
HL
14/**\r
15 Print out single alias registered with the Shell.\r
16\r
17 @param[in] Alias Points to the NULL-terminated shell alias.\r
18 If this parameter is NULL, then all\r
19 aliases will be returned in ReturnedData.\r
20 @retval SHELL_SUCCESS the printout was sucessful\r
21**/\r
22SHELL_STATUS\r
23PrintSingleShellAlias(\r
24 IN CONST CHAR16 *Alias\r
25 )\r
26{\r
27 CONST CHAR16 *ConstAliasVal;\r
28 SHELL_STATUS ShellStatus;\r
29 BOOLEAN Volatile;\r
30\r
31 ShellStatus = SHELL_SUCCESS;\r
32 ConstAliasVal = gEfiShellProtocol->GetAlias (Alias, &Volatile);\r
33 if (ConstAliasVal == NULL) {\r
34 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"alias", Alias);\r
35 ShellStatus = SHELL_INVALID_PARAMETER;\r
36 } else {\r
37 if (ShellCommandIsOnAliasList (Alias)) {\r
38 Volatile = FALSE;\r
39 }\r
40 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_ALIAS_OUTPUT), gShellLevel3HiiHandle, !Volatile ? L' ' : L'*', Alias, ConstAliasVal);\r
41 }\r
42 return ShellStatus;\r
43}\r
44\r
a405b86d 45/**\r
46 Print out each alias registered with the Shell.\r
47\r
48 @retval STATUS_SUCCESS the printout was sucessful\r
49 @return any return code from GetNextVariableName except EFI_NOT_FOUND\r
50**/\r
51SHELL_STATUS\r
a405b86d 52PrintAllShellAlias(\r
53 VOID\r
54 )\r
55{\r
56 CONST CHAR16 *ConstAllAliasList;\r
57 CHAR16 *Alias;\r
a405b86d 58 CHAR16 *Walker;\r
a405b86d 59\r
60 ConstAllAliasList = gEfiShellProtocol->GetAlias(NULL, NULL);\r
61 if (ConstAllAliasList == NULL) {\r
62 return (SHELL_SUCCESS);\r
63 }\r
64 Alias = AllocateZeroPool(StrSize(ConstAllAliasList));\r
9ea69f8a 65 if (Alias == NULL) {\r
66 return (SHELL_OUT_OF_RESOURCES);\r
67 }\r
a405b86d 68 Walker = (CHAR16*)ConstAllAliasList;\r
69\r
70 do {\r
71 CopyMem(Alias, Walker, StrSize(Walker));\r
72 Walker = StrStr(Alias, L";");\r
73 if (Walker != NULL) {\r
74 Walker[0] = CHAR_NULL;\r
75 Walker = Walker + 1;\r
76 }\r
5ce99ab9 77 PrintSingleShellAlias(Alias);\r
a405b86d 78 } while (Walker != NULL && Walker[0] != CHAR_NULL);\r
79\r
80 FreePool(Alias);\r
81\r
82 return (SHELL_SUCCESS);\r
83}\r
84\r
5ce99ab9
HL
85/**\r
86 Changes a shell command alias.\r
87\r
88 This function creates an alias for a shell command or if Alias is NULL it will delete an existing alias.\r
89\r
90\r
91 @param[in] Command Points to the NULL-terminated shell command or existing alias.\r
92 @param[in] Alias Points to the NULL-terminated alias for the shell command. If this is NULL, and\r
93 Command refers to an alias, that alias will be deleted.\r
94 @param[in] Replace If TRUE and the alias already exists, then the existing alias will be replaced. If\r
95 FALSE and the alias already exists, then the existing alias is unchanged and\r
96 EFI_ACCESS_DENIED is returned.\r
97 @param[in] Volatile if TRUE the Alias being set will be stored in a volatile fashion. if FALSE the\r
98 Alias being set will be stored in a non-volatile fashion.\r
99\r
100 @retval SHELL_SUCCESS Alias created or deleted successfully.\r
101 @retval SHELL_NOT_FOUND the Alias intended to be deleted was not found\r
102 @retval SHELL_ACCESS_DENIED The alias is a built-in alias or already existed and Replace was set to\r
103 FALSE.\r
104 @retval SHELL_DEVICE_ERROR Command is null or the empty string.\r
105**/\r
106SHELL_STATUS\r
107ShellLevel3CommandsLibSetAlias(\r
108 IN CONST CHAR16 *Command,\r
109 IN CONST CHAR16 *Alias,\r
110 IN BOOLEAN Replace,\r
111 IN BOOLEAN Volatile\r
112 )\r
113{\r
114 SHELL_STATUS ShellStatus;\r
115 EFI_STATUS Status;\r
116\r
117 ShellStatus = SHELL_SUCCESS;\r
118 Status = gEfiShellProtocol->SetAlias (Command, Alias, Replace, Volatile);\r
119 if (EFI_ERROR(Status)) {\r
120 if (Status == EFI_ACCESS_DENIED) {\r
121 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel3HiiHandle, L"alias");\r
122 ShellStatus = SHELL_ACCESS_DENIED;\r
123 } else if (Status == EFI_NOT_FOUND) {\r
124 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_NOT_FOUND), gShellLevel3HiiHandle, L"alias", Command);\r
125 ShellStatus = SHELL_NOT_FOUND;\r
126 } else {\r
127 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel3HiiHandle, L"alias", Status);\r
128 ShellStatus = SHELL_DEVICE_ERROR;\r
129 }\r
130 }\r
131 return ShellStatus;\r
132}\r
133\r
a405b86d 134STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
135 {L"-v", TypeFlag},\r
5ce99ab9 136 {L"-d", TypeValue},\r
a405b86d 137 {NULL, TypeMax}\r
138 };\r
139\r
140/**\r
141 Function for 'alias' command.\r
142\r
143 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
144 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
145**/\r
146SHELL_STATUS\r
147EFIAPI\r
148ShellCommandRunAlias (\r
149 IN EFI_HANDLE ImageHandle,\r
150 IN EFI_SYSTEM_TABLE *SystemTable\r
151 )\r
152{\r
153 EFI_STATUS Status;\r
154 LIST_ENTRY *Package;\r
155 CHAR16 *ProblemParam;\r
156 SHELL_STATUS ShellStatus;\r
157 CONST CHAR16 *Param1;\r
158 CONST CHAR16 *Param2;\r
5ce99ab9 159 CONST CHAR16 *ParamStrD;\r
0faec4cf 160 CHAR16 *CleanParam2;\r
5ce99ab9
HL
161 BOOLEAN DeleteFlag;\r
162 BOOLEAN VolatileFlag;\r
a405b86d 163\r
164 ProblemParam = NULL;\r
165 ShellStatus = SHELL_SUCCESS;\r
0faec4cf 166 CleanParam2 = NULL;\r
a405b86d 167\r
168 //\r
169 // initialize the shell lib (we must be in non-auto-init...)\r
170 //\r
171 Status = ShellInitialize();\r
172 ASSERT_EFI_ERROR(Status);\r
173\r
174 Status = CommandInit();\r
175 ASSERT_EFI_ERROR(Status);\r
176\r
177 //\r
178 // parse the command line\r
179 //\r
180 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
181 if (EFI_ERROR(Status)) {\r
182 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
ba0014b9 183 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"alias", ProblemParam);\r
a405b86d 184 FreePool(ProblemParam);\r
185 ShellStatus = SHELL_INVALID_PARAMETER;\r
186 } else {\r
187 ASSERT(FALSE);\r
188 }\r
189 } else {\r
190 Param1 = ShellCommandLineGetRawValue(Package, 1);\r
191 Param2 = ShellCommandLineGetRawValue(Package, 2);\r
0faec4cf 192\r
5ce99ab9
HL
193 DeleteFlag = ShellCommandLineGetFlag (Package, L"-d");\r
194 VolatileFlag = ShellCommandLineGetFlag (Package, L"-v");\r
195\r
0faec4cf
QS
196 if (Param2 != NULL) {\r
197 CleanParam2 = AllocateCopyPool (StrSize(Param2), Param2);\r
198 if (CleanParam2 == NULL) {\r
5ce99ab9 199 ShellCommandLineFreeVarList (Package);\r
0faec4cf
QS
200 return SHELL_OUT_OF_RESOURCES;\r
201 }\r
202\r
203 if (CleanParam2[0] == L'\"' && CleanParam2[StrLen(CleanParam2)-1] == L'\"') {\r
204 CleanParam2[StrLen(CleanParam2)-1] = L'\0';\r
205 CopyMem (CleanParam2, CleanParam2 + 1, StrSize(CleanParam2) - sizeof(CleanParam2[0]));\r
206 }\r
207 }\r
208\r
5ce99ab9
HL
209 if (!DeleteFlag && !VolatileFlag) {\r
210 switch (ShellCommandLineGetCount (Package)) {\r
211 case 1:\r
212 //\r
213 // "alias"\r
214 //\r
215 ShellStatus = PrintAllShellAlias ();\r
216 break;\r
217 case 2:\r
218 //\r
219 // "alias Param1"\r
220 //\r
221 ShellStatus = PrintSingleShellAlias (Param1);\r
222 break;\r
223 case 3:\r
224 //\r
225 // "alias Param1 CleanParam2"\r
226 //\r
227 ShellStatus = ShellLevel3CommandsLibSetAlias (CleanParam2, Param1, FALSE, VolatileFlag);\r
228 break;\r
229 default:\r
230 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias");\r
231 ShellStatus = SHELL_INVALID_PARAMETER;\r
7bd5a2c8 232 }\r
5ce99ab9
HL
233 } else if (DeleteFlag) {\r
234 if (VolatileFlag || ShellCommandLineGetCount (Package) > 1) {\r
235 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias");\r
236 ShellStatus = SHELL_INVALID_PARAMETER;\r
237 } else {\r
238 ParamStrD = ShellCommandLineGetValue (Package, L"-d");\r
239 if (ParamStrD == NULL) {\r
240 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle, L"alias");\r
241 ShellStatus = SHELL_INVALID_PARAMETER;\r
a405b86d 242 } else {\r
5ce99ab9
HL
243 //\r
244 // Delete an alias: "alias -d ParamStrD"\r
245 //\r
246 ShellStatus = ShellLevel3CommandsLibSetAlias (ParamStrD, NULL, TRUE, FALSE);\r
a405b86d 247 }\r
248 }\r
5ce99ab9 249 } else {\r
7f9c4a51 250 //\r
5ce99ab9 251 // Set volatile alias.\r
7f9c4a51 252 //\r
5ce99ab9 253 ASSERT (VolatileFlag);\r
ba0014b9 254 ASSERT (!DeleteFlag);\r
5ce99ab9
HL
255 switch (ShellCommandLineGetCount (Package)) {\r
256 case 1:\r
257 case 2:\r
258 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle, L"alias");\r
259 ShellStatus = SHELL_INVALID_PARAMETER;\r
260 break;\r
261 case 3:\r
262 //\r
263 // "alias -v Param1 CleanParam2"\r
264 //\r
265 ShellStatus = ShellLevel3CommandsLibSetAlias (CleanParam2, Param1, FALSE, VolatileFlag);\r
266 break;\r
267 default:\r
268 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias");\r
269 ShellStatus = SHELL_INVALID_PARAMETER;\r
270 }\r
a405b86d 271 }\r
272 //\r
273 // free the command line package\r
274 //\r
275 ShellCommandLineFreeVarList (Package);\r
276 }\r
277\r
0faec4cf 278 SHELL_FREE_NON_NULL (CleanParam2);\r
a405b86d 279 return (ShellStatus);\r
280}\r