2 Main file for NULL named library for level 2 shell command functions.
22 * functions are non-interactive only
24 Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
25 Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
26 This program and the accompanying materials
27 are licensed and made available under the terms and conditions of the BSD License
28 which accompanies this distribution. The full text of the license may be found at
29 http://opensource.org/licenses/bsd-license.php
31 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
32 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
35 #include "UefiShellLevel2CommandsLib.h"
37 CONST CHAR16 mFileName
[] = L
"ShellCommands";
38 EFI_HANDLE gShellLevel2HiiHandle
= NULL
;
41 Get the filename to get help text from if not using HII.
47 ShellCommandGetManFileNameLevel2 (
55 Constructor for the Shell Level 2 Commands library.
57 Install the handlers for level 2 UEFI Shell 2.0 commands.
59 @param ImageHandle the image handle of the process
60 @param SystemTable the EFI System Table pointer
62 @retval EFI_SUCCESS the shell command handlers were installed sucessfully
63 @retval EFI_UNSUPPORTED the shell level required was not found.
67 ShellLevel2CommandsLibConstructor (
68 IN EFI_HANDLE ImageHandle
,
69 IN EFI_SYSTEM_TABLE
*SystemTable
73 // if shell level is less than 2 do nothing
75 if (PcdGet8(PcdShellSupportLevel
) < 2) {
79 gShellLevel2HiiHandle
= HiiAddPackages (&gShellLevel2HiiGuid
, gImageHandle
, UefiShellLevel2CommandsLibStrings
, NULL
);
80 if (gShellLevel2HiiHandle
== NULL
) {
81 return (EFI_DEVICE_ERROR
);
85 // install our shell command handlers that are always installed
87 ShellCommandRegisterCommandName(L
"attrib", ShellCommandRunAttrib
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_ATTRIB
) );
88 ShellCommandRegisterCommandName(L
"cd", ShellCommandRunCd
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_CD
) );
89 ShellCommandRegisterCommandName(L
"cp", ShellCommandRunCp
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_CP
) );
90 ShellCommandRegisterCommandName(L
"load", ShellCommandRunLoad
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_LOAD
) );
91 ShellCommandRegisterCommandName(L
"map", ShellCommandRunMap
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_MAP
) );
92 ShellCommandRegisterCommandName(L
"mkdir", ShellCommandRunMkDir
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_MKDIR
) );
93 ShellCommandRegisterCommandName(L
"mv", ShellCommandRunMv
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_MV
) );
94 ShellCommandRegisterCommandName(L
"parse", ShellCommandRunParse
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_PARSE
) );
95 ShellCommandRegisterCommandName(L
"reset", ShellCommandRunReset
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_RESET
) );
96 ShellCommandRegisterCommandName(L
"set", ShellCommandRunSet
, ShellCommandGetManFileNameLevel2
, 2, L
"",FALSE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_SET
) );
97 ShellCommandRegisterCommandName(L
"ls", ShellCommandRunLs
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_LS
) );
98 ShellCommandRegisterCommandName(L
"rm", ShellCommandRunRm
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_RM
) );
99 ShellCommandRegisterCommandName(L
"vol", ShellCommandRunVol
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_VOL
) );
102 // support for permenant (built in) aliases
104 ShellCommandRegisterAlias(L
"rm", L
"del");
105 ShellCommandRegisterAlias(L
"ls", L
"dir");
106 ShellCommandRegisterAlias(L
"cp", L
"copy");
107 ShellCommandRegisterAlias(L
"mkdir", L
"md");
108 ShellCommandRegisterAlias(L
"cd ..", L
"cd..");
109 ShellCommandRegisterAlias(L
"cd \\", L
"cd\\");
110 ShellCommandRegisterAlias(L
"mv", L
"ren");
111 ShellCommandRegisterAlias(L
"mv", L
"move");
112 ShellCommandRegisterAlias(L
"map", L
"mount");
114 // These are installed in level 2 or 3...
116 if (PcdGet8(PcdShellSupportLevel
) == 2 || PcdGet8(PcdShellSupportLevel
) == 3) {
117 ShellCommandRegisterCommandName(L
"date", ShellCommandRunDate
, ShellCommandGetManFileNameLevel2
, PcdGet8(PcdShellSupportLevel
), L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_DATE
) );
118 ShellCommandRegisterCommandName(L
"time", ShellCommandRunTime
, ShellCommandGetManFileNameLevel2
, PcdGet8(PcdShellSupportLevel
), L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_TIME
) );
119 ShellCommandRegisterCommandName(L
"timezone", ShellCommandRunTimeZone
, ShellCommandGetManFileNameLevel2
, PcdGet8(PcdShellSupportLevel
), L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_TIMEZONE
));
123 // we want to be able to test these so install them under a different name in debug mode...
125 ShellCommandRegisterCommandName(L
"l2date", ShellCommandRunDate
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_DATE
) );
126 ShellCommandRegisterCommandName(L
"l2time", ShellCommandRunTime
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_TIME
) );
127 ShellCommandRegisterCommandName(L
"l2timezone", ShellCommandRunTimeZone
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_TIMEZONE
));
131 return (EFI_SUCCESS
);
135 Destructor for the library. free any resources.
137 @param ImageHandle The image handle of the process.
138 @param SystemTable The EFI System Table pointer.
140 @retval EFI_SUCCESS Always returned.
144 ShellLevel2CommandsLibDestructor (
145 IN EFI_HANDLE ImageHandle
,
146 IN EFI_SYSTEM_TABLE
*SystemTable
149 if (gShellLevel2HiiHandle
!= NULL
) {
150 HiiRemovePackages(gShellLevel2HiiHandle
);
152 return (EFI_SUCCESS
);
156 returns a fully qualified directory (contains a map drive at the begining)
157 path from a unknown directory path.
159 If Path is already fully qualified this will return a duplicat otherwise this
160 will use get the current directory and use that to build the fully qualified
163 if the return value is not NULL it must be caller freed.
165 @param[in] Path The unknown Path Value
167 @retval NULL A memory allocation failed
168 @retval NULL A fully qualified path could not be discovered.
169 @retval other An allocated pointer to a fuly qualified path.
173 GetFullyQualifiedPath(
174 IN CONST CHAR16
* Path
177 CHAR16
*PathToReturn
;
179 CONST CHAR16
*CurDir
;
184 ASSERT((PathToReturn
== NULL
&& Size
== 0) || (PathToReturn
!= NULL
));
186 // convert a local path to an absolute path
188 if (StrStr(Path
, L
":") == NULL
) {
189 CurDir
= gEfiShellProtocol
->GetCurDir(NULL
);
190 StrnCatGrow(&PathToReturn
, &Size
, CurDir
, 0);
191 if (*Path
== L
'\\') {
195 StrnCatGrow(&PathToReturn
, &Size
, Path
, 0);
197 PathCleanUpDirectories(PathToReturn
);
199 if (PathToReturn
== NULL
) {
203 while (PathToReturn
[StrLen(PathToReturn
)-1] == L
'*') {
204 PathToReturn
[StrLen(PathToReturn
)-1] = CHAR_NULL
;
207 return (PathToReturn
);
211 Function to verify all intermediate directories in the path.
213 @param[in] Path The pointer to the path to fix.
215 @retval EFI_SUCCESS The operation was successful.
219 VerifyIntermediateDirectories (
220 IN CONST CHAR16
*Path
226 SHELL_FILE_HANDLE FileHandle
;
228 ASSERT(Path
!= NULL
);
230 Status
= EFI_SUCCESS
;
232 PathCopy
= StrnCatGrow(&PathCopy
, NULL
, Path
, 0);
235 if (PathCopy
== NULL
) {
236 return (EFI_OUT_OF_RESOURCES
);
239 for (TempSpot
= &PathCopy
[StrLen(PathCopy
)-1] ; *TempSpot
!= CHAR_NULL
&& *TempSpot
!= L
'\\' ; TempSpot
= &PathCopy
[StrLen(PathCopy
)-1]){
240 *TempSpot
= CHAR_NULL
;
242 if (*TempSpot
== L
'\\') {
243 *TempSpot
= CHAR_NULL
;
246 if (PathCopy
!= NULL
&& *PathCopy
!= CHAR_NULL
) {
247 Status
= VerifyIntermediateDirectories(PathCopy
);
249 if (PathCopy
[StrLen(PathCopy
)-1] != L
':') {
250 if (!EFI_ERROR(Status
)) {
251 Status
= ShellOpenFileByName(PathCopy
, &FileHandle
, EFI_FILE_MODE_READ
, 0);
252 if (FileHandle
!= NULL
) {
253 ShellCloseFile(&FileHandle
);
259 SHELL_FREE_NON_NULL(PathCopy
);
265 Be lazy and borrow from baselib.
267 @param[in] Char The character to convert to upper case.
269 @return Char as an upper case character.
273 InternalCharToUpper (
278 String comparison without regard to case for a limited number of characters.
280 @param[in] Source The first item to compare.
281 @param[in] Target The second item to compare.
282 @param[in] Count How many characters to compare.
284 @retval NULL Source and Target are identical strings without regard to case.
285 @return The location in Source where there is a difference.
290 IN CONST CHAR16
*Source
,
291 IN CONST CHAR16
*Target
,
299 ASSERT(Source
!= NULL
);
300 ASSERT(Target
!= NULL
);
302 for (LoopCount
= 0 ; LoopCount
< Count
; LoopCount
++) {
303 Char1
= InternalCharToUpper(Source
[LoopCount
]);
304 Char2
= InternalCharToUpper(Target
[LoopCount
]);
305 if (Char1
!= Char2
) {
306 return (&Source
[LoopCount
]);
314 Cleans off all the quotes in the string.
316 @param[in] OriginalString pointer to the string to be cleaned.
317 @param[out] CleanString The new string with all quotes removed.
318 Memory allocated in the function and free
321 @retval EFI_SUCCESS The operation was successful.
325 ShellLevel2StripQuotes (
326 IN CONST CHAR16
*OriginalString
,
327 OUT CHAR16
**CleanString
332 if (OriginalString
== NULL
|| CleanString
== NULL
) {
333 return EFI_INVALID_PARAMETER
;
336 *CleanString
= AllocateCopyPool (StrSize (OriginalString
), OriginalString
);
337 if (*CleanString
== NULL
) {
338 return EFI_OUT_OF_RESOURCES
;
341 for (Walker
= *CleanString
; Walker
!= NULL
&& *Walker
!= CHAR_NULL
; Walker
++) {
342 if (*Walker
== L
'\"') {
343 CopyMem(Walker
, Walker
+1, StrSize(Walker
) - sizeof(Walker
[0]));