4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Main file for ls shell level 2 function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "UefiShellLevel2CommandsLib.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Guid/FileSystemInfo.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync print out the list of files and directories from the LS command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Rec TRUE to automatically recurse into each found directory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FALSE to only list the specified directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Attribs List of required Attribute for display.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If 0 then all non-system and non-hidden files will be printed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Sfo TRUE to use Standard Format Output, FALSE otherwise
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Path String with starting path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] First TRUE for the original and FALSE for any recursion spawned instances.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Count The count of bits enabled in Attribs.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] TimeZone The current time zone offset.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_SUCCESS the printing was sucessful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPrintLsOutput(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN Rec,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT64 Attribs,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN Sfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Path,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN First,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINTN Count,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST INT16 TimeZone
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SHELL_FILE_INFO *ListHead;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SHELL_FILE_INFO *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_STATUS ShellStatus;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 FileCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 DirCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 FileSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *DirectoryName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN LongestPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_SYSTEM_INFO *SysInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN SysInfoSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FILE_HANDLE ShellFileHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *CorrectedPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_PROTOCOL *EfiFpHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DirCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ListHead = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LongestPath = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CorrectedPath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CorrectedPath = StrnCatGrow(&CorrectedPath, NULL, Path, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CorrectedPath != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PathCleanUpDirectories(CorrectedPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellOpenFileMetaArg((CHAR16*)CorrectedPath, EFI_FILE_MODE_READ, &ListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_DEVICE_ERROR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ListHead == NULL || IsListEmpty(&ListHead->Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // On the first one only we expect to find something...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // do we find the . and .. directories otherwise?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (First) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Sfo && First) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the first valid handle (directories)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode(&ListHead->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull(&ListHead->Link, &Node->Link) && Node->Handle == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode(&ListHead->Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Node->Handle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DirectoryName = GetFullyQualifiedPath(((EFI_SHELL_FILE_INFO *)GetFirstNode(&ListHead->Link))->FullName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We need to open something up to get system information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gEfiShellProtocol->OpenFileByName(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DirectoryName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ShellFileHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_MODE_READ);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(DirectoryName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the Volume Info from ShellFileHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfo = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfoSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiFpHandle = ConvertShellHandleToEfiFileProtocol(ShellFileHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EfiFpHandle->GetInfo(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiFpHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiFileSystemInfoGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &SysInfoSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfo = AllocateZeroPool(SysInfoSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EfiFpHandle->GetInfo(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiFpHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiFileSystemInfoGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &SysInfoSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellProtocol->CloseFile(ShellFileHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the Volume Info from Node->Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfo = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfoSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiFpHandle = ConvertShellHandleToEfiFileProtocol(Node->Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EfiFpHandle->GetInfo(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiFpHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiFileSystemInfoGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &SysInfoSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfo = AllocateZeroPool(SysInfoSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EfiFpHandle->GetInfo(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiFpHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiFileSystemInfoGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &SysInfoSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_GEN_SFO_HEADER),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel2HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"ls");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // print VolumeInfo table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(SysInfo != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->Mode->CursorRow,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_LS_SFO_VOLINFO),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel2HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfo->VolumeLabel,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfo->VolumeSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfo->ReadOnly?L"TRUE":L"FALSE",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfo->FreeSpace,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SysInfo->BlockSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SysInfo != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(SysInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!Sfo) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // get directory name from path...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DirectoryName = GetFullyQualifiedPath(CorrectedPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // print header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->Mode->CursorRow,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_LS_HEADER_LINE1),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel2HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DirectoryName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(DirectoryName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode(&ListHead->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull(&ListHead->Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode(&ListHead->Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Node != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LongestPath < StrSize(Node->FullName)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LongestPath = StrSize(Node->FullName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Node->Info != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT((Node->Info->Attribute & EFI_FILE_VALID_ATTR) == Node->Info->Attribute);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Attribs == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // NOT system & NOT hidden
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( (Node->Info->Attribute & EFI_FILE_SYSTEM)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (Node->Info->Attribute & EFI_FILE_HIDDEN)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Attribs != EFI_FILE_VALID_ATTR) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Count == 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the bit must match
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( (Node->Info->Attribute & Attribs) != Attribs) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // exact match on all bits
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( (Node->Info->Attribute|EFI_FILE_ARCHIVE) != (Attribs|EFI_FILE_ARCHIVE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Sfo) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Print the FileInfo Table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->Mode->CursorRow,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_LS_SFO_FILEINFO),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel2HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->FullName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->FileSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->PhysicalSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Node->Info->Attribute & EFI_FILE_ARCHIVE) != 0?L"a":L"",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Node->Info->Attribute & EFI_FILE_DIRECTORY) != 0?L"d":L"",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Node->Info->Attribute & EFI_FILE_HIDDEN) != 0?L"h":L"",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Node->Info->Attribute & EFI_FILE_READ_ONLY) != 0?L"r":L"",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Node->Info->Attribute & EFI_FILE_SYSTEM) != 0?L"s":L"",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->CreateTime.Hour,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->CreateTime.Minute,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->CreateTime.Second,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->CreateTime.Day,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->CreateTime.Month,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->CreateTime.Year,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->LastAccessTime.Hour,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->LastAccessTime.Minute,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->LastAccessTime.Second,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->LastAccessTime.Day,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->LastAccessTime.Month,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->LastAccessTime.Year,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->ModificationTime.Hour,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->ModificationTime.Minute,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->ModificationTime.Second,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->ModificationTime.Day,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->ModificationTime.Month,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->ModificationTime.Year
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // print this one out...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // first print the universal start, next print the type specific name format, last print the CRLF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_LS_LINE_START_ALL),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel2HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Node->Info->ModificationTime,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Node->Info->Attribute & EFI_FILE_DIRECTORY) != 0?L"<DIR>":L"",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Node->Info->Attribute & EFI_FILE_READ_ONLY) != 0?L'r':L' ',
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Info->FileSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Node->Info->Attribute & EFI_FILE_DIRECTORY) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DirCount++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_LS_LINE_END_DIR),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel2HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->FileName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileCount++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileSize += Node->Info->FileSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)L".nsh", (CHAR16*)&(Node->FileName[StrLen (Node->FileName) - 4])) == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)L".efi", (CHAR16*)&(Node->FileName[StrLen (Node->FileName) - 4])) == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_LS_LINE_END_EXE),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel2HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->FileName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_LS_LINE_END_FILE),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel2HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->FileName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!Sfo) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // print footer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_LS_FOOTER_LINE),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellLevel2HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DirCount
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Rec){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DirectoryName = AllocateZeroPool(LongestPath + 2*sizeof(CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DirectoryName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode(&ListHead->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull(&ListHead->Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode(&ListHead->Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // recurse on any directory except the traversing ones...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((Node->Info->Attribute & EFI_FILE_DIRECTORY) == EFI_FILE_DIRECTORY)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && StrCmp(Node->FileName, L".") != 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && StrCmp(Node->FileName, L"..") != 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(DirectoryName, Node->FullName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat(DirectoryName, L"\\*");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintLsOutput(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Rec,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Attribs,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Sfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DirectoryName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FALSE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TimeZone);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(DirectoryName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(CorrectedPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFileMetaArg(&ListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(ListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (ShellStatus);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC CONST SHELL_PARAM_ITEM LsParamList[] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {L"-r", TypeFlag},
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {L"-a", TypeStart},
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {L"-sfo", TypeFlag},
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {NULL, TypeMax}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function for 'ls' command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle Handle to the Image (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SystemTable Pointer to the System Table (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandRunLs (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Package;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *ProblemParam;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *Attribs;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_STATUS ShellStatus;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 RequiredAttributes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *PathName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *CurDir;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *FullPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_TIME TheTime;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN SfoMode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FullPath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProblemParam = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Attribs = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RequiredAttributes = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PathName = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurDir = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // initialize the shell lib (we must be in non-auto-init...)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellInitialize();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fix local copies of the protocol pointers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = CommandInit();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // parse the command line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellCommandLineParse (LsParamList, &Package, &ProblemParam, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(ProblemParam);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for "-?"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellCommandLineGetFlag(Package, L"-?")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellCommandLineGetCount(Package) > 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for -a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellCommandLineGetFlag(Package, L"-a")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Attribs = ShellCommandLineGetValue(Package, L"-a")
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Attribs != NULL && *Attribs != CHAR_NULL && ShellStatus == SHELL_SUCCESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Attribs++
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (*Attribs) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'a':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'A':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RequiredAttributes |= EFI_FILE_ARCHIVE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L's':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'S':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RequiredAttributes |= EFI_FILE_SYSTEM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'h':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'H':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RequiredAttributes |= EFI_FILE_HIDDEN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'r':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'R':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RequiredAttributes |= EFI_FILE_READ_ONLY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'd':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'D':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RequiredAttributes |= EFI_FILE_DIRECTORY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ATTRIBUTE), gShellLevel2HiiHandle, ShellCommandLineGetValue(Package, L"-a"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } // switch
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } // for loop
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if nothing is specified all are specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RequiredAttributes == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RequiredAttributes = EFI_FILE_VALID_ATTR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } // if -a present
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellStatus == SHELL_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PathName = ShellCommandLineGetRawValue(Package, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PathName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurDir = gEfiShellProtocol->GetCurDir(NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurDir == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PathName != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrStr(PathName, L":") == NULL && gEfiShellProtocol->GetCurDir(NULL) == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT((FullPath == NULL && Size == 0) || (FullPath != NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&FullPath, &Size, PathName, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellIsDirectory(PathName) == EFI_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&FullPath, &Size, L"\\*", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FullPath == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&FullPath, NULL, L"*", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetTime(&TheTime, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"gRT->GetTime", Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TheTime.TimeZone = EFI_UNSPECIFIED_TIMEZONE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SfoMode = ShellCommandLineGetFlag(Package, L"-sfo");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellStatus == SHELL_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = PrintLsOutput(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCommandLineGetFlag(Package, L"-r"),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RequiredAttributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SfoMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FullPath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TRUE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (INT16)(TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:TheTime.TimeZone)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellStatus == SHELL_NOT_FOUND) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_FILES), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (ShellStatus == SHELL_INVALID_PARAMETER) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (ShellStatus != SHELL_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FullPath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(FullPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // free the command line package
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCommandLineFreeVarList (Package);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (ShellStatus);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}