ShellPkg: Expand special output file to include "NULL" and case insensitive

As per ECR 1349 change in UEFI Shell Specification 2.2, expanding
a special output file name to include "NULL". Previously it only
supported "NUL" as a special output file and it was case sensitive.
With this change both "NUL" and "NULL" are special output file and
checked as case insensitive.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Tapan Shah <tapandshah@hpe.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
This commit is contained in:
Tapan Shah 2016-09-22 12:12:47 -07:00 committed by Jaben Carsey
parent 38707d76fc
commit 583448b441
5 changed files with 23 additions and 4 deletions

View File

@ -2,6 +2,7 @@
Member functions of EFI_SHELL_PARAMETERS_PROTOCOL and functions for creation, Member functions of EFI_SHELL_PARAMETERS_PROTOCOL and functions for creation,
manipulation, and initialization of EFI_SHELL_PARAMETERS_PROTOCOL. manipulation, and initialization of EFI_SHELL_PARAMETERS_PROTOCOL.
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
Copyright (C) 2014, Red Hat, Inc. Copyright (C) 2014, Red Hat, Inc.
(C) Copyright 2013 Hewlett-Packard Development Company, L.P.<BR> (C) Copyright 2013 Hewlett-Packard Development Company, L.P.<BR>
Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR> Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
@ -1174,7 +1175,7 @@ UpdateStdInStdOutStdErr(
if (TempHandle == NULL) { if (TempHandle == NULL) {
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
} else { } else {
if (StrStr(StdOutFileName, L"NUL")==StdOutFileName) { if (gUnicodeCollation->MetaiMatch (gUnicodeCollation, StdOutFileName, L"NUL")) {
//no-op //no-op
} else if (!OutAppend && OutUnicode && !EFI_ERROR(Status)) { } else if (!OutAppend && OutUnicode && !EFI_ERROR(Status)) {
Status = WriteFileTag (TempHandle); Status = WriteFileTag (TempHandle);

View File

@ -3,6 +3,7 @@
manipulation, and initialization of EFI_SHELL_PROTOCOL. manipulation, and initialization of EFI_SHELL_PROTOCOL.
(C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR> (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR> Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
@ -1287,9 +1288,10 @@ EfiShellOpenFileByName(
} }
// //
// Is this for NUL file // Is this for NUL / NULL file
// //
if (StrCmp(FileName, L"NUL") == 0) { if ((gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16*)FileName, L"NUL") == 0) ||
(gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16*)FileName, L"NULL") == 0)) {
*FileHandle = &FileInterfaceNulFile; *FileHandle = &FileInterfaceNulFile;
return (EFI_SUCCESS); return (EFI_SUCCESS);
} }

View File

@ -1,6 +1,7 @@
/** @file /** @file
Provides interface to shell functionality for shell commands and applications. Provides interface to shell functionality for shell commands and applications.
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
Copyright 2016 Dell Inc. Copyright 2016 Dell Inc.
Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR> Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
@ -36,6 +37,7 @@ EFI_SHELL_PROTOCOL *gEfiShellProtocol;
EFI_SHELL_PARAMETERS_PROTOCOL *gEfiShellParametersProtocol; EFI_SHELL_PARAMETERS_PROTOCOL *gEfiShellParametersProtocol;
EFI_HANDLE mEfiShellEnvironment2Handle; EFI_HANDLE mEfiShellEnvironment2Handle;
FILE_HANDLE_FUNCTION_MAP FileFunctionMap; FILE_HANDLE_FUNCTION_MAP FileFunctionMap;
EFI_UNICODE_COLLATION_PROTOCOL *mUnicodeCollationProtocol;
/** /**
Check if a Unicode character is a hexadecimal character. Check if a Unicode character is a hexadecimal character.
@ -290,12 +292,19 @@ ShellLibConstructor (
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status;
mEfiShellEnvironment2 = NULL; mEfiShellEnvironment2 = NULL;
gEfiShellProtocol = NULL; gEfiShellProtocol = NULL;
gEfiShellParametersProtocol = NULL; gEfiShellParametersProtocol = NULL;
mEfiShellInterface = NULL; mEfiShellInterface = NULL;
mEfiShellEnvironment2Handle = NULL; mEfiShellEnvironment2Handle = NULL;
if (mUnicodeCollationProtocol == NULL) {
Status = gBS->LocateProtocol (&gEfiUnicodeCollation2ProtocolGuid, NULL, (VOID**)&mUnicodeCollationProtocol);
ASSERT_EFI_ERROR (Status);
}
// //
// verify that auto initialize is not set false // verify that auto initialize is not set false
// //
@ -720,7 +729,10 @@ ShellOpenFileByName(
Status = gEfiShellProtocol->OpenFileByName(FileName, Status = gEfiShellProtocol->OpenFileByName(FileName,
FileHandle, FileHandle,
OpenMode); OpenMode);
if (StrCmp(FileName, L"NUL") != 0 && !EFI_ERROR(Status) && ((OpenMode & EFI_FILE_MODE_CREATE) != 0)){
if ((mUnicodeCollationProtocol->StriColl (mUnicodeCollationProtocol, (CHAR16*)FileName, L"NUL") != 0) &&
(mUnicodeCollationProtocol->StriColl (mUnicodeCollationProtocol, (CHAR16*)FileName, L"NULL") != 0) &&
!EFI_ERROR(Status) && ((OpenMode & EFI_FILE_MODE_CREATE) != 0)){
FileInfo = FileFunctionMap.GetFileInfo(*FileHandle); FileInfo = FileFunctionMap.GetFileInfo(*FileHandle);
ASSERT(FileInfo != NULL); ASSERT(FileInfo != NULL);
FileInfo->Attribute = Attributes; FileInfo->Attribute = Attributes;

View File

@ -1,6 +1,7 @@
/** @file /** @file
Provides interface to shell functionality for shell commands and applications. Provides interface to shell functionality for shell commands and applications.
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR> Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
@ -25,6 +26,7 @@
#include <Protocol/EfiShellEnvironment2.h> #include <Protocol/EfiShellEnvironment2.h>
#include <Protocol/EfiShell.h> #include <Protocol/EfiShell.h>
#include <Protocol/EfiShellParameters.h> #include <Protocol/EfiShellParameters.h>
#include <Protocol/UnicodeCollation.h>
#include <Library/UefiBootServicesTableLib.h> #include <Library/UefiBootServicesTableLib.h>
#include <Library/BaseLib.h> #include <Library/BaseLib.h>

View File

@ -1,6 +1,7 @@
## @file ## @file
# Provides interface to shell functionality for shell commands and applications. # Provides interface to shell functionality for shell commands and applications.
# #
# (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
# Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved. <BR> # Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved. <BR>
# #
# This program and the accompanying materials # This program and the accompanying materials
@ -51,6 +52,7 @@
[Protocols] [Protocols]
gEfiSimpleFileSystemProtocolGuid ## SOMETIMES_CONSUMES gEfiSimpleFileSystemProtocolGuid ## SOMETIMES_CONSUMES
gEfiUnicodeCollation2ProtocolGuid ## CONSUMES
# shell 2.0 # shell 2.0
gEfiShellProtocolGuid ## SOMETIMES_CONSUMES gEfiShellProtocolGuid ## SOMETIMES_CONSUMES