]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.c
Update code to ensure the pointer ‘CurrentName’ in function ‘PerformSingleMappingDisp...
[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
24\r
b54fd049 25 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
a405b86d 26 This program and the accompanying materials\r
27 are licensed and made available under the terms and conditions of the BSD License\r
28 which accompanies this distribution. The full text of the license may be found at\r
29 http://opensource.org/licenses/bsd-license.php\r
30\r
31 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
32 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
33\r
34**/\r
35#include "UefiShellLevel2CommandsLib.h"\r
36\r
37CONST CHAR16 mFileName[] = L"ShellCommands";\r
38EFI_HANDLE gShellLevel2HiiHandle = NULL;\r
a405b86d 39\r
b54fd049 40/**\r
41 Get the filename to get help text from if not using HII.\r
42\r
43 @retval The filename.\r
44**/\r
a405b86d 45CONST CHAR16*\r
46EFIAPI\r
47ShellCommandGetManFileNameLevel2 (\r
48 VOID\r
49 )\r
50{\r
51 return (mFileName);\r
52}\r
53\r
54/**\r
55 Constructor for the Shell Level 2 Commands library.\r
56\r
57 Install the handlers for level 2 UEFI Shell 2.0 commands.\r
58\r
59 @param ImageHandle the image handle of the process\r
60 @param SystemTable the EFI System Table pointer\r
61\r
62 @retval EFI_SUCCESS the shell command handlers were installed sucessfully\r
63 @retval EFI_UNSUPPORTED the shell level required was not found.\r
64**/\r
65EFI_STATUS\r
66EFIAPI\r
67ShellLevel2CommandsLibConstructor (\r
68 IN EFI_HANDLE ImageHandle,\r
69 IN EFI_SYSTEM_TABLE *SystemTable\r
70 )\r
71{\r
72 //\r
73 // if shell level is less than 2 do nothing\r
74 //\r
75 if (PcdGet8(PcdShellSupportLevel) < 2) {\r
82571fb5 76 return (EFI_SUCCESS);\r
a405b86d 77 }\r
78\r
79 gShellLevel2HiiHandle = HiiAddPackages (&gShellLevel2HiiGuid, gImageHandle, UefiShellLevel2CommandsLibStrings, NULL);\r
80 if (gShellLevel2HiiHandle == NULL) {\r
81 return (EFI_DEVICE_ERROR);\r
82 }\r
83\r
84 //\r
85 // install our shell command handlers that are always installed\r
86 //\r
87 ShellCommandRegisterCommandName(L"attrib", ShellCommandRunAttrib , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_ATTRIB) );\r
88 ShellCommandRegisterCommandName(L"cd", ShellCommandRunCd , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_CD) );\r
89 ShellCommandRegisterCommandName(L"cp", ShellCommandRunCp , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_CP) );\r
90 ShellCommandRegisterCommandName(L"load", ShellCommandRunLoad , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_LOAD) );\r
91 ShellCommandRegisterCommandName(L"map", ShellCommandRunMap , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_MAP) );\r
92 ShellCommandRegisterCommandName(L"mkdir", ShellCommandRunMkDir , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_MKDIR) );\r
93 ShellCommandRegisterCommandName(L"mv", ShellCommandRunMv , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_MV) );\r
94 ShellCommandRegisterCommandName(L"parse", ShellCommandRunParse , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_PARSE) );\r
95 ShellCommandRegisterCommandName(L"reset", ShellCommandRunReset , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_RESET) );\r
96 ShellCommandRegisterCommandName(L"set", ShellCommandRunSet , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_SET) );\r
97 ShellCommandRegisterCommandName(L"ls", ShellCommandRunLs , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_LS) );\r
98 ShellCommandRegisterCommandName(L"rm", ShellCommandRunRm , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_RM) );\r
b54fd049 99 ShellCommandRegisterCommandName(L"vol", ShellCommandRunVol , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_VOL) );\r
a405b86d 100\r
101 //\r
102 // support for permenant (built in) aliases\r
103 //\r
104 ShellCommandRegisterAlias(L"rm", L"del");\r
105 ShellCommandRegisterAlias(L"ls", L"dir");\r
106 ShellCommandRegisterAlias(L"cp", L"copy");\r
107 ShellCommandRegisterAlias(L"mkdir", L"md");\r
108 ShellCommandRegisterAlias(L"cd ..", L"cd..");\r
109 ShellCommandRegisterAlias(L"cd \\", L"cd\\");\r
a49016b1 110 ShellCommandRegisterAlias(L"ren", L"mv");\r
a405b86d 111 //\r
112 // These are installed in level 2 or 3...\r
113 //\r
114 if (PcdGet8(PcdShellSupportLevel) == 2 || PcdGet8(PcdShellSupportLevel) == 3) {\r
115 ShellCommandRegisterCommandName(L"date", ShellCommandRunDate , ShellCommandGetManFileNameLevel2, PcdGet8(PcdShellSupportLevel), L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_DATE) );\r
116 ShellCommandRegisterCommandName(L"time", ShellCommandRunTime , ShellCommandGetManFileNameLevel2, PcdGet8(PcdShellSupportLevel), L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_TIME) );\r
117 ShellCommandRegisterCommandName(L"timezone", ShellCommandRunTimeZone, ShellCommandGetManFileNameLevel2, PcdGet8(PcdShellSupportLevel), L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_TIMEZONE));\r
118 } else {\r
119 DEBUG_CODE_BEGIN();\r
120 //\r
121 // we want to be able to test these so install them under a different name in debug mode...\r
122 //\r
123 ShellCommandRegisterCommandName(L"l2date", ShellCommandRunDate , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_DATE) );\r
124 ShellCommandRegisterCommandName(L"l2time", ShellCommandRunTime , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_TIME) );\r
125 ShellCommandRegisterCommandName(L"l2timezone", ShellCommandRunTimeZone, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_TIMEZONE));\r
126 DEBUG_CODE_END();\r
127 }\r
128\r
129 return (EFI_SUCCESS);\r
130}\r
131\r
132/**\r
133 Destructor for the library. free any resources.\r
134\r
135 @param ImageHandle The image handle of the process.\r
136 @param SystemTable The EFI System Table pointer.\r
137\r
138 @retval EFI_SUCCESS Always returned.\r
139**/\r
140EFI_STATUS\r
141EFIAPI\r
142ShellLevel2CommandsLibDestructor (\r
143 IN EFI_HANDLE ImageHandle,\r
144 IN EFI_SYSTEM_TABLE *SystemTable\r
145 )\r
146{\r
147 if (gShellLevel2HiiHandle != NULL) {\r
148 HiiRemovePackages(gShellLevel2HiiHandle);\r
149 }\r
150 return (EFI_SUCCESS);\r
151}\r
152\r
a405b86d 153/**\r
154 returns a fully qualified directory (contains a map drive at the begining)\r
155 path from a unknown directory path.\r
156\r
157 If Path is already fully qualified this will return a duplicat otherwise this\r
158 will use get the current directory and use that to build the fully qualified\r
159 version.\r
160\r
161 if the return value is not NULL it must be caller freed.\r
162\r
163 @param[in] Path The unknown Path Value\r
164\r
165 @retval NULL A memory allocation failed\r
c8c22591 166 @retval NULL A fully qualified path could not be discovered.\r
167 @retval other An allocated pointer to a fuly qualified path.\r
a405b86d 168**/\r
169CHAR16*\r
170EFIAPI\r
171GetFullyQualifiedPath(\r
172 IN CONST CHAR16* Path\r
173 )\r
174{\r
175 CHAR16 *PathToReturn;\r
176 UINTN Size;\r
177 CONST CHAR16 *CurDir;\r
178\r
179 PathToReturn = NULL;\r
180 Size = 0;\r
181\r
182 ASSERT((PathToReturn == NULL && Size == 0) || (PathToReturn != NULL));\r
183 //\r
184 // convert a local path to an absolute path\r
185 //\r
186 if (StrStr(Path, L":") == NULL) {\r
187 CurDir = gEfiShellProtocol->GetCurDir(NULL);\r
188 StrnCatGrow(&PathToReturn, &Size, CurDir, 0);\r
189 if (*Path == L'\\') {\r
190 Path++;\r
191 }\r
192 }\r
193 StrnCatGrow(&PathToReturn, &Size, Path, 0);\r
194\r
ab94587a 195 PathCleanUpDirectories(PathToReturn);\r
a405b86d 196\r
d6c06dd7 197 if (PathToReturn == NULL) {\r
c8c22591 198 return NULL;\r
199 }\r
200\r
a405b86d 201 while (PathToReturn[StrLen(PathToReturn)-1] == L'*') {\r
202 PathToReturn[StrLen(PathToReturn)-1] = CHAR_NULL;\r
203 }\r
204\r
205 return (PathToReturn);\r
206}\r
207\r
208/**\r
209 Function to verify all intermediate directories in the path.\r
210\r
211 @param[in] Path The pointer to the path to fix.\r
212\r
213 @retval EFI_SUCCESS The operation was successful.\r
214**/\r
215EFI_STATUS\r
216EFIAPI\r
217VerifyIntermediateDirectories (\r
218 IN CONST CHAR16 *Path\r
219 )\r
220{\r
221 EFI_STATUS Status;\r
222 CHAR16 *PathCopy;\r
223 CHAR16 *TempSpot;\r
224 SHELL_FILE_HANDLE FileHandle;\r
225\r
226 ASSERT(Path != NULL);\r
227\r
228 Status = EFI_SUCCESS;\r
229 PathCopy = NULL;\r
230 PathCopy = StrnCatGrow(&PathCopy, NULL, Path, 0);\r
231 FileHandle = NULL;\r
232\r
532691c8 233 if (PathCopy == NULL) {\r
234 return (EFI_OUT_OF_RESOURCES);\r
235 }\r
236\r
a405b86d 237 for (TempSpot = &PathCopy[StrLen(PathCopy)-1] ; *TempSpot != CHAR_NULL && *TempSpot != L'\\' ; TempSpot = &PathCopy[StrLen(PathCopy)-1]){\r
238 *TempSpot = CHAR_NULL;\r
239 }\r
240 if (*TempSpot == L'\\') {\r
241 *TempSpot = CHAR_NULL;\r
242 }\r
243\r
244 if (PathCopy != NULL && *PathCopy != CHAR_NULL) {\r
245 Status = VerifyIntermediateDirectories(PathCopy);\r
246\r
247 if (PathCopy[StrLen(PathCopy)-1] != L':') {\r
248 if (!EFI_ERROR(Status)) {\r
249 Status = ShellOpenFileByName(PathCopy, &FileHandle, EFI_FILE_MODE_READ, 0);\r
250 if (FileHandle != NULL) {\r
251 ShellCloseFile(&FileHandle);\r
252 }\r
253 }\r
254 }\r
255 }\r
256\r
257 SHELL_FREE_NON_NULL(PathCopy);\r
258\r
259 return (Status);\r
260}\r
261\r
b54fd049 262/**\r
263 Be lazy and borrow from baselib.\r
264\r
265 @param[in] Char The character to convert to upper case.\r
266\r
267 @return Char as an upper case character.\r
268**/\r
a405b86d 269CHAR16\r
270EFIAPI\r
271InternalCharToUpper (\r
272 IN CONST CHAR16 Char\r
273 );\r
274\r
b54fd049 275/**\r
276 String comparison without regard to case for a limited number of characters.\r
277\r
278 @param[in] Source The first item to compare.\r
279 @param[in] Target The second item to compare.\r
280 @param[in] Count How many characters to compare.\r
281\r
282 @retval NULL Source and Target are identical strings without regard to case.\r
283 @return The location in Source where there is a difference.\r
284**/\r
a405b86d 285CONST CHAR16*\r
286EFIAPI\r
287StrniCmp(\r
288 IN CONST CHAR16 *Source,\r
289 IN CONST CHAR16 *Target,\r
290 IN CONST UINTN Count\r
291 )\r
292{\r
293 UINTN LoopCount;\r
294 CHAR16 Char1;\r
295 CHAR16 Char2;\r
296\r
297 ASSERT(Source != NULL);\r
298 ASSERT(Target != NULL);\r
299\r
300 for (LoopCount = 0 ; LoopCount < Count ; LoopCount++) {\r
301 Char1 = InternalCharToUpper(Source[LoopCount]);\r
302 Char2 = InternalCharToUpper(Target[LoopCount]);\r
303 if (Char1 != Char2) {\r
304 return (&Source[LoopCount]);\r
305 }\r
306 }\r
307 return (NULL);\r
308}\r
309\r