ShellPkg: Fixes for the ‘ls’ command:

- Better output to print header and file not found text
- Fix file attribute argument handling
- Fix so path ending with ‘\’ or ‘*’ is handled correctly

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Chris Phillips <chrisp@hp.com>
reviewed-by: Jaben Carsey <jaben.carsey@intel.com>


git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14786 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Chris Phillips 2013-10-18 18:53:16 +00:00 committed by jcarsey
parent abbea36e3e
commit 58b7301ec9
2 changed files with 48 additions and 36 deletions

View File

@ -1,6 +1,7 @@
/** @file
Main file for ls shell level 2 function.
Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
@ -72,6 +73,26 @@ PrintLsOutput(
PathCleanUpDirectories(CorrectedPath);
if (!Sfo) {
//
// get directory name from path...
//
DirectoryName = GetFullyQualifiedPath(CorrectedPath);
//
// print header
//
ShellPrintHiiEx (
0,
gST->ConOut->Mode->CursorRow,
NULL,
STRING_TOKEN (STR_LS_HEADER_LINE1),
gShellLevel2HiiHandle,
DirectoryName
);
FreePool(DirectoryName);
}
Status = ShellOpenFileMetaArg((CHAR16*)CorrectedPath, EFI_FILE_MODE_READ, &ListHead);
if (EFI_ERROR(Status)) {
SHELL_FREE_NON_NULL(CorrectedPath);
@ -192,25 +213,6 @@ PrintLsOutput(
}
}
if (!Sfo) {
//
// get directory name from path...
//
DirectoryName = GetFullyQualifiedPath(CorrectedPath);
//
// print header
//
ShellPrintHiiEx (
0,
gST->ConOut->Mode->CursorRow,
NULL,
STRING_TOKEN (STR_LS_HEADER_LINE1),
gShellLevel2HiiHandle,
DirectoryName
);
FreePool(DirectoryName);
}
for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode(&ListHead->Link)
; !IsNull(&ListHead->Link, &Node->Link)
; Node = (EFI_SHELL_FILE_INFO *)GetNextNode(&ListHead->Link, &Node->Link)
@ -230,22 +232,18 @@ PrintLsOutput(
){
continue;
}
} else if (Attribs != EFI_FILE_VALID_ATTR) {
if (Count == 1) {
} else if ((Attribs != EFI_FILE_VALID_ATTR) ||
(Count == 5)) {
//
// the bit must match
// Only matches the bits which "Attribs" contains, not
// all files/directories with any of the bits.
// Count == 5 is used to tell the difference between a user
// specifying all bits (EX: -arhsda) and just specifying
// -a (means display all files with any attribute).
//
if ( (Node->Info->Attribute & Attribs) != Attribs) {
continue;
}
} else {
//
// exact match on all bits
//
if ( (Node->Info->Attribute|EFI_FILE_ARCHIVE) != (Attribs|EFI_FILE_ARCHIVE)) {
continue;
}
}
}
if (Sfo) {
@ -543,7 +541,21 @@ ShellCommandRunLs (
ASSERT((FullPath == NULL && Size == 0) || (FullPath != NULL));
StrnCatGrow(&FullPath, &Size, PathName, 0);
if (ShellIsDirectory(PathName) == EFI_SUCCESS) {
StrnCatGrow(&FullPath, &Size, L"\\*", 0);
if (PathName[StrLen (PathName) - 1] == '\\') {
//
// For path ending with '\', just append '*'.
//
StrnCatGrow (&FullPath, &Size, L"*", 0);
} else if (PathName[StrLen (PathName) - 1] == '*') {
//
// For path ending with '*', do nothing.
//
} else {
//
// Otherwise, append '\*' to directory name.
//
StrnCatGrow (&FullPath, &Size, L"\\*", 0);
}
}
}
} else {
@ -568,7 +580,7 @@ ShellCommandRunLs (
(INT16)(TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:TheTime.TimeZone)
);
if (ShellStatus == SHELL_NOT_FOUND) {
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_FILES), gShellLevel2HiiHandle);
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_LS_FILE_NOT_FOUND), gShellLevel2HiiHandle);
} else if (ShellStatus == SHELL_INVALID_PARAMETER) {
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle);
} else if (ShellStatus == SHELL_ABORTED) {