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