1 /** @file
2   Main file for NULL named library for level 2 shell command functions.
3 
4   these functions are:
5   attrib,   cd,   cp,   date*,  time*,  rm,   reset,
6   load,     ls,   map,  mkdir,  mv,     parse,  set,  timezone*
7 
8 
9   * functions are non-interactive only
10 
11 
12   Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
13   This program and the accompanying materials
14   are licensed and made available under the terms and conditions of the BSD License
15   which accompanies this distribution.  The full text of the license may be found at
16   http://opensource.org/licenses/bsd-license.php
17 
18   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
19   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
20 
21 **/
22 
23 #ifndef _UEFI_SHELL_LEVEL2_COMMANDS_LIB_H_
24 #define _UEFI_SHELL_LEVEL2_COMMANDS_LIB_H_
25 
26 #include <Uefi.h>
27 
28 #include <Guid/GlobalVariable.h>
29 #include <Guid/ShellLibHiiGuid.h>
30 
31 #include <Protocol/Shell.h>
32 #include <Protocol/ShellParameters.h>
33 #include <Protocol/DevicePath.h>
34 #include <Protocol/LoadedImage.h>
35 #include <Protocol/UnicodeCollation.h>
36 
37 #include <Library/BaseLib.h>
38 #include <Library/BaseMemoryLib.h>
39 #include <Library/DebugLib.h>
40 #include <Library/MemoryAllocationLib.h>
41 #include <Library/PcdLib.h>
42 #include <Library/ShellCommandLib.h>
43 #include <Library/ShellLib.h>
44 #include <Library/UefiLib.h>
45 #include <Library/UefiRuntimeServicesTableLib.h>
46 #include <Library/UefiBootServicesTableLib.h>
47 #include <Library/HiiLib.h>
48 #include <Library/SortLib.h>
49 #include <Library/FileHandleLib.h>
50 
51 extern CONST  CHAR16                            mFileName[];
52 extern        EFI_HANDLE                        gShellLevel2HiiHandle;
53 
54 /**
55   Function for 'attrib' command.
56 
57   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
58   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
59 **/
60 SHELL_STATUS
61 EFIAPI
62 ShellCommandRunAttrib (
63   IN EFI_HANDLE        ImageHandle,
64   IN EFI_SYSTEM_TABLE  *SystemTable
65   );
66 
67 /**
68   Function for 'date' command.
69 
70   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
71   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
72 **/
73 SHELL_STATUS
74 EFIAPI
75 ShellCommandRunDate (
76   IN EFI_HANDLE        ImageHandle,
77   IN EFI_SYSTEM_TABLE  *SystemTable
78   );
79 
80 /**
81   Function for 'time' command.
82 
83   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
84   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
85 **/
86 SHELL_STATUS
87 EFIAPI
88 ShellCommandRunTime (
89   IN EFI_HANDLE        ImageHandle,
90   IN EFI_SYSTEM_TABLE  *SystemTable
91   );
92 
93 /**
94   Function for 'load' command.
95 
96   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
97   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
98 **/
99 SHELL_STATUS
100 EFIAPI
101 ShellCommandRunLoad (
102   IN EFI_HANDLE        ImageHandle,
103   IN EFI_SYSTEM_TABLE  *SystemTable
104   );
105 
106 /**
107   Function for 'ls' command.
108 
109   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
110   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
111 **/
112 SHELL_STATUS
113 EFIAPI
114 ShellCommandRunLs (
115   IN EFI_HANDLE        ImageHandle,
116   IN EFI_SYSTEM_TABLE  *SystemTable
117   );
118 
119 /**
120   Function for 'map' command.
121 
122   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
123   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
124 **/
125 SHELL_STATUS
126 EFIAPI
127 ShellCommandRunMap (
128   IN EFI_HANDLE        ImageHandle,
129   IN EFI_SYSTEM_TABLE  *SystemTable
130   );
131 
132 /**
133   Function for 'reset' command.
134 
135   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
136   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
137 **/
138 SHELL_STATUS
139 EFIAPI
140 ShellCommandRunReset (
141   IN EFI_HANDLE        ImageHandle,
142   IN EFI_SYSTEM_TABLE  *SystemTable
143   );
144 
145 /**
146   Function for 'timezone' command.
147 
148   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
149   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
150 **/
151 SHELL_STATUS
152 EFIAPI
153 ShellCommandRunTimeZone (
154   IN EFI_HANDLE        ImageHandle,
155   IN EFI_SYSTEM_TABLE  *SystemTable
156   );
157 
158 /**
159   Function for 'set' command.
160 
161   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
162   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
163 **/
164 SHELL_STATUS
165 EFIAPI
166 ShellCommandRunSet (
167   IN EFI_HANDLE        ImageHandle,
168   IN EFI_SYSTEM_TABLE  *SystemTable
169   );
170 
171 /**
172   Function for 'mkdir' command.
173 
174   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
175   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
176 **/
177 SHELL_STATUS
178 EFIAPI
179 ShellCommandRunMkDir (
180   IN EFI_HANDLE        ImageHandle,
181   IN EFI_SYSTEM_TABLE  *SystemTable
182   );
183 
184 /**
185   Function for 'cd' command.
186 
187   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
188   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
189 **/
190 SHELL_STATUS
191 EFIAPI
192 ShellCommandRunCd (
193   IN EFI_HANDLE        ImageHandle,
194   IN EFI_SYSTEM_TABLE  *SystemTable
195   );
196 
197 /**
198   Function for 'cp' command.
199 
200   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
201   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
202 **/
203 SHELL_STATUS
204 EFIAPI
205 ShellCommandRunCp (
206   IN EFI_HANDLE        ImageHandle,
207   IN EFI_SYSTEM_TABLE  *SystemTable
208   );
209 
210 /**
211   Function for 'parse' command.
212 
213   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
214   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
215 **/
216 SHELL_STATUS
217 EFIAPI
218 ShellCommandRunParse (
219   IN EFI_HANDLE        ImageHandle,
220   IN EFI_SYSTEM_TABLE  *SystemTable
221   );
222 
223 /**
224   Function for 'rm' command.
225 
226   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
227   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
228 **/
229 SHELL_STATUS
230 EFIAPI
231 ShellCommandRunRm (
232   IN EFI_HANDLE        ImageHandle,
233   IN EFI_SYSTEM_TABLE  *SystemTable
234   );
235 
236 /**
237   Function for 'mv' command.
238 
239   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
240   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
241 **/
242 SHELL_STATUS
243 EFIAPI
244 ShellCommandRunMv (
245   IN EFI_HANDLE        ImageHandle,
246   IN EFI_SYSTEM_TABLE  *SystemTable
247   );
248 
249 /**
250   returns a fully qualified directory (contains a map drive at the begining)
251   path from a unknown directory path.
252 
253   If Path is already fully qualified this will return a duplicat otherwise this
254   will use get the current directory and use that to build the fully qualified
255   version.
256 
257   if the return value is not NULL it must be caller freed.
258 
259   @param[in] Path         The unknown Path Value
260 
261   @retval NULL            A memory allocation failed
262   @retval NULL            a fully qualified path could not be discovered.
263   @retval other           pointer to a fuly qualified path.
264 **/
265 CHAR16*
266 GetFullyQualifiedPath(
267   IN CONST CHAR16* Path
268   );
269 
270 /**
271   Function to verify all intermediate directories in the path.
272 
273   @param[in] Path       The pointer to the path to fix.
274 
275   @retval EFI_SUCCESS   The operation was successful.
276 **/
277 EFI_STATUS
278 VerifyIntermediateDirectories (
279   IN CONST CHAR16 *Path
280   );
281 
282 /**
283   CaseInsensitive length limited string comparison.
284 
285   @param[in] Source   Pointer to first string.
286   @param[in] Target   Pointer to second string.
287   @param[in] Count    Number of characters to compare.
288 
289   @retval 0   The strings are the same.
290   @return     non-zero if the strings are different.
291 **/
292 CONST CHAR16*
293 StrniCmp(
294   IN CONST CHAR16 *Source,
295   IN CONST CHAR16 *Target,
296   IN CONST UINTN  Count
297   );
298 
299 /**
300   Cleans off all the quotes in the string.
301 
302   @param[in]     OriginalString   pointer to the string to be cleaned.
303   @param[out]   CleanString      The new string with all quotes removed.
304                                                   Memory allocated in the function and free
305                                                   by caller.
306 
307   @retval EFI_SUCCESS   The operation was successful.
308 **/
309 EFI_STATUS
310 ShellLevel2StripQuotes (
311   IN  CONST CHAR16     *OriginalString,
312   OUT CHAR16           **CleanString
313   );
314 
315 /**
316   Function for 'Vol' command.
317 
318   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
319   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
320 **/
321 SHELL_STATUS
322 EFIAPI
323 ShellCommandRunVol (
324   IN EFI_HANDLE        ImageHandle,
325   IN EFI_SYSTEM_TABLE  *SystemTable
326   );
327 
328 /**
329   Function to Copy one file to another location
330 
331   If the destination exists the user will be prompted and the result put into *resp
332 
333   @param[in] Source     pointer to source file name
334   @param[in] Dest       pointer to destination file name
335   @param[out] Resp      pointer to response from question.  Pass back on looped calling
336   @param[in] SilentMode whether to run in quiet mode or not
337   @param[in] CmdName    Source command name requesting single file copy
338 
339   @retval SHELL_SUCCESS   The source file was copied to the destination
340 **/
341 SHELL_STATUS
342 CopySingleFile(
343   IN CONST CHAR16 *Source,
344   IN CONST CHAR16 *Dest,
345   OUT VOID        **Resp,
346   IN BOOLEAN      SilentMode,
347   IN CONST CHAR16 *CmdName
348   );
349 
350 /**
351   Delete a node and all nodes under it (including sub directories).
352 
353   @param[in] Node   The node to start deleting with.
354   @param[in] Quiet  TRUE to print no messages.
355 
356   @retval SHELL_SUCCESS       The operation was successful.
357   @retval SHELL_ACCESS_DENIED A file was read only.
358   @retval SHELL_ABORTED       The abort message was received.
359   @retval SHELL_DEVICE_ERROR  A device error occured reading this Node.
360 **/
361 SHELL_STATUS
362 CascadeDelete(
363   IN EFI_SHELL_FILE_INFO  *Node,
364   IN CONST BOOLEAN        Quiet
365   );
366 
367 #endif
368 
369