]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c
ShellPkg: Fixes for the ‘ls’ command:
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Ls.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for ls shell level 2 function.\r
3\r
58b7301e 4 Copyright (c) 2013 Hewlett-Packard Development Company, L.P.\r
a7224eef 5 Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>\r
a405b86d 6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "UefiShellLevel2CommandsLib.h"\r
17#include <Guid/FileSystemInfo.h>\r
18\r
19/**\r
20 print out the list of files and directories from the LS command\r
21\r
22 @param[in] Rec TRUE to automatically recurse into each found directory\r
23 FALSE to only list the specified directory.\r
24 @param[in] Attribs List of required Attribute for display.\r
25 If 0 then all non-system and non-hidden files will be printed.\r
26 @param[in] Sfo TRUE to use Standard Format Output, FALSE otherwise\r
27 @param[in] Path String with starting path.\r
28 @param[in] First TRUE for the original and FALSE for any recursion spawned instances.\r
29 @param[in] Count The count of bits enabled in Attribs.\r
30 @param[in] TimeZone The current time zone offset.\r
31\r
32 @retval SHELL_SUCCESS the printing was sucessful.\r
33**/\r
34SHELL_STATUS\r
35EFIAPI\r
36PrintLsOutput(\r
37 IN CONST BOOLEAN Rec,\r
38 IN CONST UINT64 Attribs,\r
39 IN CONST BOOLEAN Sfo,\r
40 IN CONST CHAR16 *Path,\r
41 IN CONST BOOLEAN First,\r
42 IN CONST UINTN Count,\r
43 IN CONST INT16 TimeZone\r
44 )\r
45{\r
46 EFI_STATUS Status;\r
47 EFI_SHELL_FILE_INFO *ListHead;\r
48 EFI_SHELL_FILE_INFO *Node;\r
49 SHELL_STATUS ShellStatus;\r
50 UINT64 FileCount;\r
51 UINT64 DirCount;\r
52 UINT64 FileSize;\r
53 CHAR16 *DirectoryName;\r
54 UINTN LongestPath;\r
55 EFI_FILE_SYSTEM_INFO *SysInfo;\r
56 UINTN SysInfoSize;\r
57 SHELL_FILE_HANDLE ShellFileHandle;\r
58 CHAR16 *CorrectedPath;\r
59 EFI_FILE_PROTOCOL *EfiFpHandle;\r
60\r
61 FileCount = 0;\r
62 DirCount = 0;\r
63 FileSize = 0;\r
64 ListHead = NULL;\r
65 ShellStatus = SHELL_SUCCESS;\r
66 LongestPath = 0;\r
67 CorrectedPath = NULL;\r
68\r
69 CorrectedPath = StrnCatGrow(&CorrectedPath, NULL, Path, 0);\r
74fa83fd 70 if (CorrectedPath == NULL) {\r
71 return (SHELL_OUT_OF_RESOURCES);\r
72 }\r
73\r
ab94587a 74 PathCleanUpDirectories(CorrectedPath);\r
a405b86d 75\r
58b7301e
CP
76 if (!Sfo) {\r
77 //\r
78 // get directory name from path...\r
79 //\r
80 DirectoryName = GetFullyQualifiedPath(CorrectedPath);\r
81\r
82 //\r
83 // print header\r
84 //\r
85 ShellPrintHiiEx (\r
86 0,\r
87 gST->ConOut->Mode->CursorRow,\r
88 NULL,\r
89 STRING_TOKEN (STR_LS_HEADER_LINE1),\r
90 gShellLevel2HiiHandle,\r
91 DirectoryName\r
92 );\r
93 FreePool(DirectoryName);\r
94 }\r
95\r
a405b86d 96 Status = ShellOpenFileMetaArg((CHAR16*)CorrectedPath, EFI_FILE_MODE_READ, &ListHead);\r
97 if (EFI_ERROR(Status)) {\r
74fa83fd 98 SHELL_FREE_NON_NULL(CorrectedPath);\r
99 if(Status == EFI_NOT_FOUND){\r
100 return (SHELL_NOT_FOUND);\r
101 }\r
a405b86d 102 return (SHELL_DEVICE_ERROR);\r
103 }\r
104 if (ListHead == NULL || IsListEmpty(&ListHead->Link)) {\r
74fa83fd 105 SHELL_FREE_NON_NULL(CorrectedPath);\r
a405b86d 106 //\r
107 // On the first one only we expect to find something...\r
108 // do we find the . and .. directories otherwise?\r
109 //\r
110 if (First) {\r
111 return (SHELL_NOT_FOUND);\r
112 }\r
113 return (SHELL_SUCCESS);\r
114 }\r
115\r
116 if (Sfo && First) {\r
117 //\r
118 // Get the first valid handle (directories)\r
119 //\r
120 for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode(&ListHead->Link)\r
121 ; !IsNull(&ListHead->Link, &Node->Link) && Node->Handle == NULL\r
122 ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode(&ListHead->Link, &Node->Link)\r
123 );\r
124\r
125 if (Node->Handle == NULL) {\r
126 DirectoryName = GetFullyQualifiedPath(((EFI_SHELL_FILE_INFO *)GetFirstNode(&ListHead->Link))->FullName);\r
127\r
128 //\r
129 // We need to open something up to get system information\r
130 //\r
131 Status = gEfiShellProtocol->OpenFileByName(\r
132 DirectoryName,\r
133 &ShellFileHandle,\r
134 EFI_FILE_MODE_READ);\r
135\r
136 ASSERT_EFI_ERROR(Status);\r
137 FreePool(DirectoryName);\r
138\r
139 //\r
140 // Get the Volume Info from ShellFileHandle\r
141 //\r
142 SysInfo = NULL;\r
143 SysInfoSize = 0;\r
144 EfiFpHandle = ConvertShellHandleToEfiFileProtocol(ShellFileHandle);\r
145 Status = EfiFpHandle->GetInfo(\r
146 EfiFpHandle,\r
147 &gEfiFileSystemInfoGuid,\r
148 &SysInfoSize,\r
149 SysInfo);\r
150\r
151 if (Status == EFI_BUFFER_TOO_SMALL) {\r
152 SysInfo = AllocateZeroPool(SysInfoSize);\r
153 Status = EfiFpHandle->GetInfo(\r
154 EfiFpHandle,\r
155 &gEfiFileSystemInfoGuid,\r
156 &SysInfoSize,\r
157 SysInfo);\r
158 }\r
159\r
160 ASSERT_EFI_ERROR(Status);\r
161\r
162 gEfiShellProtocol->CloseFile(ShellFileHandle);\r
163 } else {\r
164 //\r
165 // Get the Volume Info from Node->Handle\r
166 //\r
167 SysInfo = NULL;\r
168 SysInfoSize = 0;\r
169 EfiFpHandle = ConvertShellHandleToEfiFileProtocol(Node->Handle);\r
170 Status = EfiFpHandle->GetInfo(\r
171 EfiFpHandle,\r
172 &gEfiFileSystemInfoGuid,\r
173 &SysInfoSize,\r
174 SysInfo);\r
175\r
176 if (Status == EFI_BUFFER_TOO_SMALL) {\r
177 SysInfo = AllocateZeroPool(SysInfoSize);\r
178 Status = EfiFpHandle->GetInfo(\r
179 EfiFpHandle,\r
180 &gEfiFileSystemInfoGuid,\r
181 &SysInfoSize,\r
182 SysInfo);\r
183 }\r
184\r
185 ASSERT_EFI_ERROR(Status);\r
186 }\r
187\r
188 ShellPrintHiiEx (\r
189 -1,\r
190 -1,\r
191 NULL,\r
192 STRING_TOKEN (STR_GEN_SFO_HEADER),\r
193 gShellLevel2HiiHandle,\r
194 L"ls");\r
195 //\r
196 // print VolumeInfo table\r
197 //\r
198 ASSERT(SysInfo != NULL);\r
199 ShellPrintHiiEx (\r
200 0,\r
201 gST->ConOut->Mode->CursorRow,\r
202 NULL,\r
203 STRING_TOKEN (STR_LS_SFO_VOLINFO),\r
204 gShellLevel2HiiHandle,\r
205 SysInfo->VolumeLabel,\r
206 SysInfo->VolumeSize,\r
207 SysInfo->ReadOnly?L"TRUE":L"FALSE",\r
208 SysInfo->FreeSpace,\r
209 SysInfo->BlockSize\r
210 );\r
211 if (SysInfo != NULL) {\r
212 FreePool(SysInfo);\r
213 }\r
214 }\r
215\r
a405b86d 216 for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode(&ListHead->Link)\r
217 ; !IsNull(&ListHead->Link, &Node->Link)\r
218 ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode(&ListHead->Link, &Node->Link)\r
219 ){\r
220 ASSERT(Node != NULL);\r
221 if (LongestPath < StrSize(Node->FullName)) {\r
222 LongestPath = StrSize(Node->FullName);\r
223 }\r
224 ASSERT(Node->Info != NULL);\r
225 ASSERT((Node->Info->Attribute & EFI_FILE_VALID_ATTR) == Node->Info->Attribute);\r
226 if (Attribs == 0) {\r
227 //\r
228 // NOT system & NOT hidden\r
229 //\r
230 if ( (Node->Info->Attribute & EFI_FILE_SYSTEM)\r
231 || (Node->Info->Attribute & EFI_FILE_HIDDEN)\r
232 ){\r
233 continue;\r
234 }\r
58b7301e
CP
235 } else if ((Attribs != EFI_FILE_VALID_ATTR) ||\r
236 (Count == 5)) {\r
237 //\r
238 // Only matches the bits which "Attribs" contains, not\r
239 // all files/directories with any of the bits.\r
240 // Count == 5 is used to tell the difference between a user\r
241 // specifying all bits (EX: -arhsda) and just specifying\r
242 // -a (means display all files with any attribute).\r
243 //\r
244 if ( (Node->Info->Attribute & Attribs) != Attribs) {\r
245 continue;\r
a405b86d 246 }\r
247 }\r
248\r
249 if (Sfo) {\r
250 //\r
251 // Print the FileInfo Table\r
252 //\r
253 ShellPrintHiiEx (\r
254 0,\r
255 gST->ConOut->Mode->CursorRow,\r
256 NULL,\r
257 STRING_TOKEN (STR_LS_SFO_FILEINFO),\r
258 gShellLevel2HiiHandle,\r
259 Node->FullName,\r
260 Node->Info->FileSize,\r
261 Node->Info->PhysicalSize,\r
262 (Node->Info->Attribute & EFI_FILE_ARCHIVE) != 0?L"a":L"",\r
263 (Node->Info->Attribute & EFI_FILE_DIRECTORY) != 0?L"d":L"",\r
264 (Node->Info->Attribute & EFI_FILE_HIDDEN) != 0?L"h":L"",\r
265 (Node->Info->Attribute & EFI_FILE_READ_ONLY) != 0?L"r":L"",\r
266 (Node->Info->Attribute & EFI_FILE_SYSTEM) != 0?L"s":L"",\r
267 Node->Info->CreateTime.Hour,\r
268 Node->Info->CreateTime.Minute,\r
269 Node->Info->CreateTime.Second,\r
270 Node->Info->CreateTime.Day,\r
271 Node->Info->CreateTime.Month,\r
272 Node->Info->CreateTime.Year,\r
273 Node->Info->LastAccessTime.Hour,\r
274 Node->Info->LastAccessTime.Minute,\r
275 Node->Info->LastAccessTime.Second,\r
276 Node->Info->LastAccessTime.Day,\r
277 Node->Info->LastAccessTime.Month,\r
278 Node->Info->LastAccessTime.Year,\r
279 Node->Info->ModificationTime.Hour,\r
280 Node->Info->ModificationTime.Minute,\r
281 Node->Info->ModificationTime.Second,\r
282 Node->Info->ModificationTime.Day,\r
283 Node->Info->ModificationTime.Month,\r
284 Node->Info->ModificationTime.Year\r
285 );\r
286 } else {\r
287 //\r
288 // print this one out...\r
289 // first print the universal start, next print the type specific name format, last print the CRLF\r
290 //\r
291 ShellPrintHiiEx (\r
292 -1,\r
293 -1,\r
294 NULL,\r
295 STRING_TOKEN (STR_LS_LINE_START_ALL),\r
296 gShellLevel2HiiHandle,\r
297 &Node->Info->ModificationTime,\r
298 (Node->Info->Attribute & EFI_FILE_DIRECTORY) != 0?L"<DIR>":L"",\r
299 (Node->Info->Attribute & EFI_FILE_READ_ONLY) != 0?L'r':L' ',\r
300 Node->Info->FileSize\r
301 );\r
302 if (Node->Info->Attribute & EFI_FILE_DIRECTORY) {\r
303 DirCount++;\r
304 ShellPrintHiiEx (\r
305 -1,\r
306 -1,\r
307 NULL,\r
308 STRING_TOKEN (STR_LS_LINE_END_DIR),\r
309 gShellLevel2HiiHandle,\r
310 Node->FileName\r
311 );\r
312 } else {\r
313 FileCount++;\r
314 FileSize += Node->Info->FileSize;\r
315 if ( (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)L".nsh", (CHAR16*)&(Node->FileName[StrLen (Node->FileName) - 4])) == 0)\r
316 || (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)L".efi", (CHAR16*)&(Node->FileName[StrLen (Node->FileName) - 4])) == 0)\r
317 ){\r
318 ShellPrintHiiEx (\r
319 -1,\r
320 -1,\r
321 NULL,\r
322 STRING_TOKEN (STR_LS_LINE_END_EXE),\r
323 gShellLevel2HiiHandle,\r
324 Node->FileName\r
325 );\r
326 } else {\r
327 ShellPrintHiiEx (\r
328 -1,\r
329 -1,\r
330 NULL,\r
331 STRING_TOKEN (STR_LS_LINE_END_FILE),\r
332 gShellLevel2HiiHandle,\r
333 Node->FileName\r
334 );\r
335 }\r
336 }\r
337 }\r
338 }\r
339\r
340 if (!Sfo) {\r
341 //\r
342 // print footer\r
343 //\r
344 ShellPrintHiiEx (\r
345 -1,\r
346 -1,\r
347 NULL,\r
348 STRING_TOKEN (STR_LS_FOOTER_LINE),\r
349 gShellLevel2HiiHandle,\r
350 FileCount,\r
351 FileSize,\r
352 DirCount\r
353 );\r
354 }\r
355\r
356 if (Rec){\r
b54fd049 357 DirectoryName = AllocateZeroPool(LongestPath + 2*sizeof(CHAR16));\r
9ea69f8a 358 if (DirectoryName == NULL) {\r
359 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellLevel2HiiHandle);\r
360 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
361 } else {\r
362 for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode(&ListHead->Link)\r
a7224eef 363 ; !IsNull(&ListHead->Link, &Node->Link) && ShellStatus == SHELL_SUCCESS\r
9ea69f8a 364 ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode(&ListHead->Link, &Node->Link)\r
365 ){\r
a7224eef 366 if (ShellGetExecutionBreakFlag ()) {\r
367 ShellStatus = SHELL_ABORTED;\r
368 break;\r
369 }\r
370\r
9ea69f8a 371 //\r
372 // recurse on any directory except the traversing ones...\r
373 //\r
374 if (((Node->Info->Attribute & EFI_FILE_DIRECTORY) == EFI_FILE_DIRECTORY)\r
375 && StrCmp(Node->FileName, L".") != 0\r
376 && StrCmp(Node->FileName, L"..") != 0\r
377 ){\r
378 StrCpy(DirectoryName, Node->FullName);\r
379 StrCat(DirectoryName, L"\\*");\r
a7224eef 380 ShellStatus = PrintLsOutput(\r
9ea69f8a 381 Rec,\r
382 Attribs,\r
383 Sfo,\r
384 DirectoryName,\r
385 FALSE,\r
386 Count,\r
387 TimeZone);\r
388 }\r
a405b86d 389 }\r
9ea69f8a 390 FreePool(DirectoryName);\r
a405b86d 391 }\r
a405b86d 392 }\r
393\r
394 FreePool(CorrectedPath);\r
395 ShellCloseFileMetaArg(&ListHead);\r
396 FreePool(ListHead);\r
397 return (ShellStatus);\r
398}\r
399\r
400STATIC CONST SHELL_PARAM_ITEM LsParamList[] = {\r
401 {L"-r", TypeFlag},\r
402 {L"-a", TypeStart},\r
403 {L"-sfo", TypeFlag},\r
404 {NULL, TypeMax}\r
405 };\r
406\r
407/**\r
408 Function for 'ls' command.\r
409\r
410 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
411 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
412**/\r
413SHELL_STATUS\r
414EFIAPI\r
415ShellCommandRunLs (\r
416 IN EFI_HANDLE ImageHandle,\r
417 IN EFI_SYSTEM_TABLE *SystemTable\r
418 )\r
419{\r
420 EFI_STATUS Status;\r
421 LIST_ENTRY *Package;\r
422 CHAR16 *ProblemParam;\r
423 CONST CHAR16 *Attribs;\r
424 SHELL_STATUS ShellStatus;\r
425 UINT64 RequiredAttributes;\r
426 CONST CHAR16 *PathName;\r
427 CONST CHAR16 *CurDir;\r
428 UINTN Count;\r
429 CHAR16 *FullPath;\r
430 UINTN Size;\r
b54fd049 431 EFI_TIME TheTime;\r
a405b86d 432 BOOLEAN SfoMode;\r
433\r
434 Size = 0;\r
435 FullPath = NULL;\r
436 ProblemParam = NULL;\r
437 Attribs = NULL;\r
438 ShellStatus = SHELL_SUCCESS;\r
439 RequiredAttributes = 0;\r
440 PathName = NULL;\r
441 CurDir = NULL;\r
442 Count = 0;\r
443\r
444 //\r
445 // initialize the shell lib (we must be in non-auto-init...)\r
446 //\r
447 Status = ShellInitialize();\r
448 ASSERT_EFI_ERROR(Status);\r
449\r
450 //\r
451 // Fix local copies of the protocol pointers\r
452 //\r
453 Status = CommandInit();\r
454 ASSERT_EFI_ERROR(Status);\r
455\r
456 //\r
457 // parse the command line\r
458 //\r
459 Status = ShellCommandLineParse (LsParamList, &Package, &ProblemParam, TRUE);\r
460 if (EFI_ERROR(Status)) {\r
461 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
462 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
463 FreePool(ProblemParam);\r
464 ShellStatus = SHELL_INVALID_PARAMETER;\r
465 } else {\r
466 ASSERT(FALSE);\r
467 }\r
468 } else {\r
469 //\r
470 // check for "-?"\r
471 //\r
472 if (ShellCommandLineGetFlag(Package, L"-?")) {\r
473 ASSERT(FALSE);\r
474 }\r
475\r
476 if (ShellCommandLineGetCount(Package) > 2) {\r
477 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
478 ShellStatus = SHELL_INVALID_PARAMETER;\r
479 } else {\r
480 //\r
481 // check for -a\r
482 //\r
483 if (ShellCommandLineGetFlag(Package, L"-a")) {\r
484 for ( Attribs = ShellCommandLineGetValue(Package, L"-a")\r
485 ; Attribs != NULL && *Attribs != CHAR_NULL && ShellStatus == SHELL_SUCCESS\r
486 ; Attribs++\r
487 ){\r
488 switch (*Attribs) {\r
489 case L'a':\r
490 case L'A':\r
491 RequiredAttributes |= EFI_FILE_ARCHIVE;\r
492 Count++;\r
493 continue;\r
494 case L's':\r
495 case L'S':\r
496 RequiredAttributes |= EFI_FILE_SYSTEM;\r
497 Count++;\r
498 continue;\r
499 case L'h':\r
500 case L'H':\r
501 RequiredAttributes |= EFI_FILE_HIDDEN;\r
502 Count++;\r
503 continue;\r
504 case L'r':\r
505 case L'R':\r
506 RequiredAttributes |= EFI_FILE_READ_ONLY;\r
507 Count++;\r
508 continue;\r
509 case L'd':\r
510 case L'D':\r
511 RequiredAttributes |= EFI_FILE_DIRECTORY;\r
512 Count++;\r
513 continue;\r
514 default:\r
515 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ATTRIBUTE), gShellLevel2HiiHandle, ShellCommandLineGetValue(Package, L"-a"));\r
516 ShellStatus = SHELL_INVALID_PARAMETER;\r
517 break;\r
518 } // switch\r
519 } // for loop\r
520 //\r
521 // if nothing is specified all are specified\r
522 //\r
523 if (RequiredAttributes == 0) {\r
524 RequiredAttributes = EFI_FILE_VALID_ATTR;\r
525 }\r
526 } // if -a present\r
527 if (ShellStatus == SHELL_SUCCESS) {\r
528 PathName = ShellCommandLineGetRawValue(Package, 1);\r
529 if (PathName == NULL) {\r
530 CurDir = gEfiShellProtocol->GetCurDir(NULL);\r
531 if (CurDir == NULL) {\r
532 ShellStatus = SHELL_NOT_FOUND;\r
533 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle);\r
534 }\r
535 }\r
536 if (PathName != NULL) {\r
2ec013ce 537 if (StrStr(PathName, L":") == NULL && gEfiShellProtocol->GetCurDir(NULL) == NULL) {\r
538 ShellStatus = SHELL_NOT_FOUND;\r
539 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle);\r
540 } else {\r
541 ASSERT((FullPath == NULL && Size == 0) || (FullPath != NULL));\r
542 StrnCatGrow(&FullPath, &Size, PathName, 0);\r
543 if (ShellIsDirectory(PathName) == EFI_SUCCESS) {\r
58b7301e
CP
544 if (PathName[StrLen (PathName) - 1] == '\\') {\r
545 //\r
546 // For path ending with '\', just append '*'.\r
547 //\r
548 StrnCatGrow (&FullPath, &Size, L"*", 0);\r
549 } else if (PathName[StrLen (PathName) - 1] == '*') {\r
550 //\r
551 // For path ending with '*', do nothing.\r
552 //\r
553 } else {\r
554 //\r
555 // Otherwise, append '\*' to directory name.\r
556 //\r
557 StrnCatGrow (&FullPath, &Size, L"\\*", 0);\r
558 }\r
2ec013ce 559 }\r
a405b86d 560 }\r
561 } else {\r
562 ASSERT(FullPath == NULL);\r
563 StrnCatGrow(&FullPath, NULL, L"*", 0);\r
564 }\r
b54fd049 565 Status = gRT->GetTime(&TheTime, NULL);\r
2e8e9ed5 566 if (EFI_ERROR(Status)) {\r
567 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"gRT->GetTime", Status);\r
568 TheTime.TimeZone = EFI_UNSPECIFIED_TIMEZONE;\r
569 }\r
570\r
a405b86d 571 SfoMode = ShellCommandLineGetFlag(Package, L"-sfo");\r
572 if (ShellStatus == SHELL_SUCCESS) {\r
573 ShellStatus = PrintLsOutput(\r
574 ShellCommandLineGetFlag(Package, L"-r"),\r
575 RequiredAttributes,\r
576 SfoMode,\r
577 FullPath,\r
578 TRUE,\r
579 Count,\r
2e8e9ed5 580 (INT16)(TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:TheTime.TimeZone)\r
a405b86d 581 );\r
582 if (ShellStatus == SHELL_NOT_FOUND) {\r
58b7301e 583 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_LS_FILE_NOT_FOUND), gShellLevel2HiiHandle);\r
a405b86d 584 } else if (ShellStatus == SHELL_INVALID_PARAMETER) {\r
585 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle);\r
a7224eef 586 } else if (ShellStatus == SHELL_ABORTED) {\r
587 //\r
588 // Ignore aborting.\r
589 //\r
a405b86d 590 } else if (ShellStatus != SHELL_SUCCESS) {\r
591 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle);\r
592 }\r
593 }\r
594 }\r
595 }\r
596 }\r
597\r
598 if (FullPath != NULL) {\r
599 FreePool(FullPath);\r
600 }\r
601 //\r
602 // free the command line package\r
603 //\r
604 ShellCommandLineFreeVarList (Package);\r
605\r
606 return (ShellStatus);\r
607}\r