ShellPkg: Properly set lasterror environment variable

- Set lasterror value based on platform width
- Use “lasterror” rather than “Lasterror” for variable name to match Shell Specification
- Set lasterror value when a binary or script file is not found

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@14816 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Chris Phillips
2013-10-29 16:30:25 +00:00
committed by jcarsey
parent 8924aecd47
commit 5b5cd144f3

View File

@ -1593,10 +1593,15 @@ RunCommand(
if (!EFI_ERROR(Status)) { if (!EFI_ERROR(Status)) {
Status = ShellCommandRunCommandHandler(ShellInfoObject.NewShellParametersProtocol->Argv[0], &ShellStatus, &LastError); Status = ShellCommandRunCommandHandler(ShellInfoObject.NewShellParametersProtocol->Argv[0], &ShellStatus, &LastError);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);
UnicodeSPrint(LeString, sizeof(LeString), L"0x%08Lx", ShellStatus);
DEBUG_CODE(InternalEfiShellSetEnv(L"DebugLasterror", LeString, TRUE);); if (sizeof(EFI_STATUS) == sizeof(UINT64)) {
UnicodeSPrint(LeString, sizeof(LeString), L"0x%Lx", ShellStatus);
} else {
UnicodeSPrint(LeString, sizeof(LeString), L"0x%x", ShellStatus);
}
DEBUG_CODE(InternalEfiShellSetEnv(L"debuglasterror", LeString, TRUE););
if (LastError) { if (LastError) {
InternalEfiShellSetEnv(L"Lasterror", LeString, TRUE); InternalEfiShellSetEnv(L"lasterror", LeString, TRUE);
} }
// //
// Pass thru the exitcode from the app. // Pass thru the exitcode from the app.
@ -1622,6 +1627,14 @@ RunCommand(
} }
if (CommandWithPath == NULL || ShellIsDirectory(CommandWithPath) == EFI_SUCCESS) { if (CommandWithPath == NULL || ShellIsDirectory(CommandWithPath) == EFI_SUCCESS) {
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, ShellInfoObject.NewShellParametersProtocol->Argv[0]); ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, ShellInfoObject.NewShellParametersProtocol->Argv[0]);
if (sizeof(EFI_STATUS) == sizeof(UINT64)) {
UnicodeSPrint(LeString, sizeof(LeString), L"0x%Lx", EFI_NOT_FOUND);
} else {
UnicodeSPrint(LeString, sizeof(LeString), L"0x%x", EFI_NOT_FOUND);
}
DEBUG_CODE(InternalEfiShellSetEnv(L"debuglasterror", LeString, TRUE););
InternalEfiShellSetEnv(L"lasterror", LeString, TRUE);
} else { } else {
// //
// Check if it's a NSH (script) file. // Check if it's a NSH (script) file.
@ -1642,11 +1655,15 @@ RunCommand(
); );
// //
// Updatet last error status. // Update last error status.
// //
UnicodeSPrint(LeString, sizeof(LeString), L"0x%08Lx", StatusCode); if (sizeof(EFI_STATUS) == sizeof(UINT64)) {
DEBUG_CODE(InternalEfiShellSetEnv(L"DebugLasterror", LeString, TRUE);); UnicodeSPrint(LeString, sizeof(LeString), L"0x%Lx", StatusCode);
InternalEfiShellSetEnv(L"Lasterror", LeString, TRUE); } else {
UnicodeSPrint(LeString, sizeof(LeString), L"0x%x", StatusCode);
}
DEBUG_CODE(InternalEfiShellSetEnv(L"debuglasterror", LeString, TRUE););
InternalEfiShellSetEnv(L"lasterror", LeString, TRUE);
} }
} }
} }
@ -1952,9 +1969,12 @@ RunScriptFileHandle (
} }
if (ShellCommandGetScriptExit()) { if (ShellCommandGetScriptExit()) {
//
// ShellCommandGetExitCode() always returns a UINT64
//
UnicodeSPrint(LeString, sizeof(LeString), L"0x%Lx", ShellCommandGetExitCode()); UnicodeSPrint(LeString, sizeof(LeString), L"0x%Lx", ShellCommandGetExitCode());
DEBUG_CODE(InternalEfiShellSetEnv(L"DebugLasterror", LeString, TRUE);); DEBUG_CODE(InternalEfiShellSetEnv(L"debuglasterror", LeString, TRUE););
InternalEfiShellSetEnv(L"Lasterror", LeString, TRUE); InternalEfiShellSetEnv(L"lasterror", LeString, TRUE);
ShellCommandRegisterExit(FALSE, 0); ShellCommandRegisterExit(FALSE, 0);
Status = EFI_SUCCESS; Status = EFI_SUCCESS;