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
diff --git a/ShellPkg/Application/Shell/Shell.c b/ShellPkg/Application/Shell/Shell.c
index e5a6488..0ce1665 100644
--- a/ShellPkg/Application/Shell/Shell.c
+++ b/ShellPkg/Application/Shell/Shell.c
@@ -1593,10 +1593,15 @@
         if (!EFI_ERROR(Status))  {

           Status = ShellCommandRunCommandHandler(ShellInfoObject.NewShellParametersProtocol->Argv[0], &ShellStatus, &LastError);

           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) {

-            InternalEfiShellSetEnv(L"Lasterror", LeString, TRUE);

+            InternalEfiShellSetEnv(L"lasterror", LeString, TRUE);

           }

           //

           // Pass thru the exitcode from the app.

@@ -1622,6 +1627,14 @@
         }

         if (CommandWithPath == NULL || ShellIsDirectory(CommandWithPath) == EFI_SUCCESS) {

           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 {

           //

           // Check if it's a NSH (script) file.

@@ -1642,11 +1655,15 @@
              );

 

             //

-            // Updatet last error status.

+            // Update last error status.

             //

-            UnicodeSPrint(LeString, sizeof(LeString), L"0x%08Lx", StatusCode);

-            DEBUG_CODE(InternalEfiShellSetEnv(L"DebugLasterror", LeString, TRUE););

-            InternalEfiShellSetEnv(L"Lasterror", LeString, TRUE);

+            if (sizeof(EFI_STATUS) == sizeof(UINT64)) {

+              UnicodeSPrint(LeString, sizeof(LeString), L"0x%Lx", StatusCode);

+            } 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 @@
         }

 

         if (ShellCommandGetScriptExit()) {

+          //

+          // ShellCommandGetExitCode() always returns a UINT64

+          //

           UnicodeSPrint(LeString, sizeof(LeString), L"0x%Lx", ShellCommandGetExitCode());

-          DEBUG_CODE(InternalEfiShellSetEnv(L"DebugLasterror", LeString, TRUE););

-          InternalEfiShellSetEnv(L"Lasterror", LeString, TRUE);

+          DEBUG_CODE(InternalEfiShellSetEnv(L"debuglasterror", LeString, TRUE););

+          InternalEfiShellSetEnv(L"lasterror", LeString, TRUE);

 

           ShellCommandRegisterExit(FALSE, 0);

           Status = EFI_SUCCESS;