]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.c
ShellPkg: stop using EFI_HANDLE in place of EFI_HII_HANDLE
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / UefiShellLevel2CommandsLib.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for NULL named library for level 2 shell command functions.\r
3\r
4 these functions are:\r
5 attrib,\r
6 cd,\r
7 cp,\r
8 date*,\r
9 time*,\r
10 load,\r
11 ls,\r
12 map,\r
13 mkdir,\r
14 mv,\r
15 parse,\r
16 rm,\r
17 reset,\r
18 set,\r
b54fd049 19 timezone*,\r
20 vol\r
a405b86d 21\r
22 * functions are non-interactive only\r
23\r
41921ad5 24 Copyright (c) 2014 Hewlett-Packard Development Company, L.P.\r
630cb850 25 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
56ba3746 26 SPDX-License-Identifier: BSD-2-Clause-Patent\r
a405b86d 27\r
28**/\r
29#include "UefiShellLevel2CommandsLib.h"\r
30\r
31CONST CHAR16 mFileName[] = L"ShellCommands";\r
c44501b3 32EFI_HII_HANDLE gShellLevel2HiiHandle = NULL;\r
a405b86d 33\r
b54fd049 34/**\r
35 Get the filename to get help text from if not using HII.\r
36\r
37 @retval The filename.\r
38**/\r
a405b86d 39CONST CHAR16*\r
40EFIAPI\r
41ShellCommandGetManFileNameLevel2 (\r
42 VOID\r
43 )\r
44{\r
45 return (mFileName);\r
46}\r
47\r
48/**\r
49 Constructor for the Shell Level 2 Commands library.\r
50\r
51 Install the handlers for level 2 UEFI Shell 2.0 commands.\r
52\r
53 @param ImageHandle the image handle of the process\r
54 @param SystemTable the EFI System Table pointer\r
55\r
56 @retval EFI_SUCCESS the shell command handlers were installed sucessfully\r
57 @retval EFI_UNSUPPORTED the shell level required was not found.\r
58**/\r
59EFI_STATUS\r
60EFIAPI\r
61ShellLevel2CommandsLibConstructor (\r
62 IN EFI_HANDLE ImageHandle,\r
63 IN EFI_SYSTEM_TABLE *SystemTable\r
64 )\r
65{\r
66 //\r
67 // if shell level is less than 2 do nothing\r
68 //\r
69 if (PcdGet8(PcdShellSupportLevel) < 2) {\r
82571fb5 70 return (EFI_SUCCESS);\r
a405b86d 71 }\r
72\r
73 gShellLevel2HiiHandle = HiiAddPackages (&gShellLevel2HiiGuid, gImageHandle, UefiShellLevel2CommandsLibStrings, NULL);\r
74 if (gShellLevel2HiiHandle == NULL) {\r
75 return (EFI_DEVICE_ERROR);\r
76 }\r
77\r
78 //\r
79 // install our shell command handlers that are always installed\r
80 //\r
81 ShellCommandRegisterCommandName(L"attrib", ShellCommandRunAttrib , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_ATTRIB) );\r
82 ShellCommandRegisterCommandName(L"cd", ShellCommandRunCd , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_CD) );\r
83 ShellCommandRegisterCommandName(L"cp", ShellCommandRunCp , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_CP) );\r
84 ShellCommandRegisterCommandName(L"load", ShellCommandRunLoad , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_LOAD) );\r
85 ShellCommandRegisterCommandName(L"map", ShellCommandRunMap , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_MAP) );\r
86 ShellCommandRegisterCommandName(L"mkdir", ShellCommandRunMkDir , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_MKDIR) );\r
87 ShellCommandRegisterCommandName(L"mv", ShellCommandRunMv , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_MV) );\r
88 ShellCommandRegisterCommandName(L"parse", ShellCommandRunParse , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_PARSE) );\r
89 ShellCommandRegisterCommandName(L"reset", ShellCommandRunReset , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_RESET) );\r
1eb5cf94 90 ShellCommandRegisterCommandName(L"set", ShellCommandRunSet , ShellCommandGetManFileNameLevel2, 2, L"",FALSE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_SET) );\r
a405b86d 91 ShellCommandRegisterCommandName(L"ls", ShellCommandRunLs , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_LS) );\r
92 ShellCommandRegisterCommandName(L"rm", ShellCommandRunRm , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_RM) );\r
b54fd049 93 ShellCommandRegisterCommandName(L"vol", ShellCommandRunVol , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_VOL) );\r
a405b86d 94\r
95 //\r
268d3445 96 // support for permanent (built in) aliases\r
a405b86d 97 //\r
98 ShellCommandRegisterAlias(L"rm", L"del");\r
99 ShellCommandRegisterAlias(L"ls", L"dir");\r
100 ShellCommandRegisterAlias(L"cp", L"copy");\r
101 ShellCommandRegisterAlias(L"mkdir", L"md");\r
102 ShellCommandRegisterAlias(L"cd ..", L"cd..");\r
103 ShellCommandRegisterAlias(L"cd \\", L"cd\\");\r
41921ad5 104 ShellCommandRegisterAlias(L"mv", L"ren");\r
9b5268c8
TS
105 ShellCommandRegisterAlias(L"mv", L"move");\r
106 ShellCommandRegisterAlias(L"map", L"mount");\r
a405b86d 107 //\r
108 // These are installed in level 2 or 3...\r
109 //\r
110 if (PcdGet8(PcdShellSupportLevel) == 2 || PcdGet8(PcdShellSupportLevel) == 3) {\r
111 ShellCommandRegisterCommandName(L"date", ShellCommandRunDate , ShellCommandGetManFileNameLevel2, PcdGet8(PcdShellSupportLevel), L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_DATE) );\r
112 ShellCommandRegisterCommandName(L"time", ShellCommandRunTime , ShellCommandGetManFileNameLevel2, PcdGet8(PcdShellSupportLevel), L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_TIME) );\r
113 ShellCommandRegisterCommandName(L"timezone", ShellCommandRunTimeZone, ShellCommandGetManFileNameLevel2, PcdGet8(PcdShellSupportLevel), L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_TIMEZONE));\r
114 } else {\r
115 DEBUG_CODE_BEGIN();\r
116 //\r
117 // we want to be able to test these so install them under a different name in debug mode...\r
118 //\r
119 ShellCommandRegisterCommandName(L"l2date", ShellCommandRunDate , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_DATE) );\r
120 ShellCommandRegisterCommandName(L"l2time", ShellCommandRunTime , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_TIME) );\r
121 ShellCommandRegisterCommandName(L"l2timezone", ShellCommandRunTimeZone, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_TIMEZONE));\r
122 DEBUG_CODE_END();\r
123 }\r
124\r
125 return (EFI_SUCCESS);\r
126}\r
127\r
128/**\r
129 Destructor for the library. free any resources.\r
130\r
131 @param ImageHandle The image handle of the process.\r
132 @param SystemTable The EFI System Table pointer.\r
133\r
134 @retval EFI_SUCCESS Always returned.\r
135**/\r
136EFI_STATUS\r
137EFIAPI\r
138ShellLevel2CommandsLibDestructor (\r
139 IN EFI_HANDLE ImageHandle,\r
140 IN EFI_SYSTEM_TABLE *SystemTable\r
141 )\r
142{\r
143 if (gShellLevel2HiiHandle != NULL) {\r
144 HiiRemovePackages(gShellLevel2HiiHandle);\r
145 }\r
146 return (EFI_SUCCESS);\r
147}\r
148\r
a405b86d 149/**\r
150 returns a fully qualified directory (contains a map drive at the begining)\r
151 path from a unknown directory path.\r
152\r
153 If Path is already fully qualified this will return a duplicat otherwise this\r
154 will use get the current directory and use that to build the fully qualified\r
155 version.\r
156\r
157 if the return value is not NULL it must be caller freed.\r
158\r
159 @param[in] Path The unknown Path Value\r
160\r
161 @retval NULL A memory allocation failed\r
c8c22591 162 @retval NULL A fully qualified path could not be discovered.\r
163 @retval other An allocated pointer to a fuly qualified path.\r
a405b86d 164**/\r
165CHAR16*\r
a405b86d 166GetFullyQualifiedPath(\r
167 IN CONST CHAR16* Path\r
168 )\r
169{\r
170 CHAR16 *PathToReturn;\r
171 UINTN Size;\r
172 CONST CHAR16 *CurDir;\r
173\r
174 PathToReturn = NULL;\r
175 Size = 0;\r
176\r
177 ASSERT((PathToReturn == NULL && Size == 0) || (PathToReturn != NULL));\r
178 //\r
179 // convert a local path to an absolute path\r
180 //\r
181 if (StrStr(Path, L":") == NULL) {\r
182 CurDir = gEfiShellProtocol->GetCurDir(NULL);\r
183 StrnCatGrow(&PathToReturn, &Size, CurDir, 0);\r
fbd2dfad 184 StrnCatGrow(&PathToReturn, &Size, L"\\", 0);\r
a405b86d 185 if (*Path == L'\\') {\r
186 Path++;\r
187 }\r
188 }\r
189 StrnCatGrow(&PathToReturn, &Size, Path, 0);\r
190\r
ab94587a 191 PathCleanUpDirectories(PathToReturn);\r
a405b86d 192\r
d6c06dd7 193 if (PathToReturn == NULL) {\r
c8c22591 194 return NULL;\r
195 }\r
196\r
a405b86d 197 while (PathToReturn[StrLen(PathToReturn)-1] == L'*') {\r
198 PathToReturn[StrLen(PathToReturn)-1] = CHAR_NULL;\r
199 }\r
200\r
201 return (PathToReturn);\r
202}\r
203\r
204/**\r
205 Function to verify all intermediate directories in the path.\r
206\r
207 @param[in] Path The pointer to the path to fix.\r
208\r
209 @retval EFI_SUCCESS The operation was successful.\r
210**/\r
211EFI_STATUS\r
a405b86d 212VerifyIntermediateDirectories (\r
213 IN CONST CHAR16 *Path\r
214 )\r
215{\r
216 EFI_STATUS Status;\r
217 CHAR16 *PathCopy;\r
218 CHAR16 *TempSpot;\r
219 SHELL_FILE_HANDLE FileHandle;\r
220\r
221 ASSERT(Path != NULL);\r
222\r
223 Status = EFI_SUCCESS;\r
224 PathCopy = NULL;\r
225 PathCopy = StrnCatGrow(&PathCopy, NULL, Path, 0);\r
226 FileHandle = NULL;\r
227\r
532691c8 228 if (PathCopy == NULL) {\r
229 return (EFI_OUT_OF_RESOURCES);\r
230 }\r
231\r
a405b86d 232 for (TempSpot = &PathCopy[StrLen(PathCopy)-1] ; *TempSpot != CHAR_NULL && *TempSpot != L'\\' ; TempSpot = &PathCopy[StrLen(PathCopy)-1]){\r
233 *TempSpot = CHAR_NULL;\r
234 }\r
235 if (*TempSpot == L'\\') {\r
236 *TempSpot = CHAR_NULL;\r
237 }\r
238\r
239 if (PathCopy != NULL && *PathCopy != CHAR_NULL) {\r
240 Status = VerifyIntermediateDirectories(PathCopy);\r
241\r
242 if (PathCopy[StrLen(PathCopy)-1] != L':') {\r
243 if (!EFI_ERROR(Status)) {\r
244 Status = ShellOpenFileByName(PathCopy, &FileHandle, EFI_FILE_MODE_READ, 0);\r
245 if (FileHandle != NULL) {\r
246 ShellCloseFile(&FileHandle);\r
247 }\r
248 }\r
249 }\r
250 }\r
251\r
252 SHELL_FREE_NON_NULL(PathCopy);\r
253\r
254 return (Status);\r
255}\r
256\r
b54fd049 257/**\r
258 String comparison without regard to case for a limited number of characters.\r
259\r
260 @param[in] Source The first item to compare.\r
261 @param[in] Target The second item to compare.\r
262 @param[in] Count How many characters to compare.\r
263\r
630cb850
RN
264 @retval 0 Source and Target are identical strings without regard to case.\r
265 @retval !=0 Source is not identical to Target.\r
ba0014b9 266\r
b54fd049 267**/\r
630cb850 268INTN\r
a405b86d 269StrniCmp(\r
270 IN CONST CHAR16 *Source,\r
271 IN CONST CHAR16 *Target,\r
272 IN CONST UINTN Count\r
273 )\r
274{\r
630cb850
RN
275 CHAR16 *SourceCopy;\r
276 CHAR16 *TargetCopy;\r
277 UINTN SourceLength;\r
278 UINTN TargetLength;\r
279 INTN Result;\r
280\r
281 if (Count == 0) {\r
282 return 0;\r
283 }\r
284\r
285 SourceLength = StrLen (Source);\r
286 TargetLength = StrLen (Target);\r
287 SourceLength = MIN (SourceLength, Count);\r
288 TargetLength = MIN (TargetLength, Count);\r
289 SourceCopy = AllocateCopyPool ((SourceLength + 1) * sizeof (CHAR16), Source);\r
290 if (SourceCopy == NULL) {\r
291 return -1;\r
292 }\r
293 TargetCopy = AllocateCopyPool ((TargetLength + 1) * sizeof (CHAR16), Target);\r
294 if (TargetCopy == NULL) {\r
295 FreePool (SourceCopy);\r
296 return -1;\r
a405b86d 297 }\r
ba0014b9 298\r
630cb850
RN
299 SourceCopy[SourceLength] = L'\0';\r
300 TargetCopy[TargetLength] = L'\0';\r
301 Result = gUnicodeCollation->StriColl (gUnicodeCollation, SourceCopy, TargetCopy);\r
302 FreePool (SourceCopy);\r
303 FreePool (TargetCopy);\r
304 return Result;\r
a405b86d 305}\r
306\r
0960ba17
QS
307\r
308/**\r
309 Cleans off all the quotes in the string.\r
310\r
311 @param[in] OriginalString pointer to the string to be cleaned.\r
ba0014b9
LG
312 @param[out] CleanString The new string with all quotes removed.\r
313 Memory allocated in the function and free\r
0960ba17
QS
314 by caller.\r
315\r
316 @retval EFI_SUCCESS The operation was successful.\r
317**/\r
318EFI_STATUS\r
0960ba17
QS
319ShellLevel2StripQuotes (\r
320 IN CONST CHAR16 *OriginalString,\r
321 OUT CHAR16 **CleanString\r
322 )\r
323{\r
324 CHAR16 *Walker;\r
ba0014b9 325\r
0960ba17
QS
326 if (OriginalString == NULL || CleanString == NULL) {\r
327 return EFI_INVALID_PARAMETER;\r
328 }\r
329\r
330 *CleanString = AllocateCopyPool (StrSize (OriginalString), OriginalString);\r
331 if (*CleanString == NULL) {\r
332 return EFI_OUT_OF_RESOURCES;\r
333 }\r
334\r
335 for (Walker = *CleanString; Walker != NULL && *Walker != CHAR_NULL ; Walker++) {\r
336 if (*Walker == L'\"') {\r
337 CopyMem(Walker, Walker+1, StrSize(Walker) - sizeof(Walker[0]));\r
338 }\r
339 }\r
340\r
341 return EFI_SUCCESS;\r
342}\r
343\r
344\r