ShellPkg: Fix shell not able to run startup.nsh

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Chen A Chen <chen.a.chen@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
This commit is contained in:
Chen A Chen 2017-03-21 14:41:18 +08:00 committed by Ruiyu Ni
parent 89648826ee
commit aaf51f08ee
1 changed files with 56 additions and 58 deletions

View File

@ -1131,6 +1131,58 @@ ProcessCommandLine(
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/**
Function try to find location of the Startup.nsh file.
The buffer is callee allocated and should be freed by the caller.
@param ImagePath The path to the image for shell. first place to look for the startup script
@param FilePath The path to the file for shell. second place to look for the startup script.
@retval NULL No Startup.nsh file was found.
@return !=NULL Pointer to NULL-terminated path.
**/
CHAR16 *
LocateStartupScript (
IN EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath,
IN EFI_DEVICE_PATH_PROTOCOL *FileDevicePath
)
{
CHAR16 *StartupScriptPath;
CHAR16 *TempSpot;
CONST CHAR16 *MapName;
UINTN Size;
StartupScriptPath = NULL;
Size = 0;
//
// Try to find 'Startup.nsh' in the directory where the shell itself was launched.
//
MapName = ShellInfoObject.NewEfiShellProtocol->GetMapFromDevicePath (&ImageDevicePath);
if (MapName != NULL) {
StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, MapName, 0);
TempSpot = StrStr (StartupScriptPath, L";");
if (TempSpot != NULL) {
*TempSpot = CHAR_NULL;
}
StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, ((FILEPATH_DEVICE_PATH *)FileDevicePath)->PathName, 0);
PathRemoveLastItem (StartupScriptPath);
StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, mStartupScript, 0);
}
//
// Try to find 'Startup.nsh' in the execution path defined by the envrionment variable PATH.
//
if ((StartupScriptPath == NULL) || EFI_ERROR (ShellIsFile (StartupScriptPath))) {
SHELL_FREE_NON_NULL (StartupScriptPath);
StartupScriptPath = ShellFindFilePath (mStartupScript);
}
return StartupScriptPath;
}
/** /**
Handles all interaction with the default startup script. Handles all interaction with the default startup script.
@ -1151,17 +1203,11 @@ DoStartupScript(
EFI_STATUS CalleeStatus; EFI_STATUS CalleeStatus;
UINTN Delay; UINTN Delay;
EFI_INPUT_KEY Key; EFI_INPUT_KEY Key;
SHELL_FILE_HANDLE FileHandle;
EFI_DEVICE_PATH_PROTOCOL *NewPath;
EFI_DEVICE_PATH_PROTOCOL *NamePath;
CHAR16 *FileStringPath; CHAR16 *FileStringPath;
CHAR16 *TempSpot;
UINTN NewSize; UINTN NewSize;
CONST CHAR16 *MapName;
Key.UnicodeChar = CHAR_NULL; Key.UnicodeChar = CHAR_NULL;
Key.ScanCode = 0; Key.ScanCode = 0;
FileHandle = NULL;
if (!ShellInfoObject.ShellInitSettings.BitUnion.Bits.Startup && ShellInfoObject.ShellInitSettings.FileName != NULL) { if (!ShellInfoObject.ShellInitSettings.BitUnion.Bits.Startup && ShellInfoObject.ShellInitSettings.FileName != NULL) {
// //
@ -1223,59 +1269,11 @@ DoStartupScript(
return (EFI_SUCCESS); return (EFI_SUCCESS);
} }
// FileStringPath = LocateStartupScript (ImagePath, FilePath);
// Try the first location (must be file system) if (FileStringPath != NULL) {
// Status = RunScriptFile (FileStringPath, NULL, L"", ShellInfoObject.NewShellParametersProtocol);
MapName = ShellInfoObject.NewEfiShellProtocol->GetMapFromDevicePath(&ImagePath); FreePool (FileStringPath);
if (MapName != NULL) {
FileStringPath = NULL;
NewSize = 0;
FileStringPath = StrnCatGrow(&FileStringPath, &NewSize, MapName, 0);
if (FileStringPath == NULL) {
Status = EFI_OUT_OF_RESOURCES;
} else {
TempSpot = StrStr(FileStringPath, L";");
if (TempSpot != NULL) {
*TempSpot = CHAR_NULL;
}
FileStringPath = StrnCatGrow(&FileStringPath, &NewSize, ((FILEPATH_DEVICE_PATH*)FilePath)->PathName, 0);
PathRemoveLastItem(FileStringPath);
FileStringPath = StrnCatGrow(&FileStringPath, &NewSize, mStartupScript, 0);
Status = ShellInfoObject.NewEfiShellProtocol->OpenFileByName(FileStringPath, &FileHandle, EFI_FILE_MODE_READ);
FreePool(FileStringPath);
}
} }
if (EFI_ERROR(Status)) {
NamePath = FileDevicePath (NULL, mStartupScript);
NewPath = AppendDevicePathNode (ImagePath, NamePath);
FreePool(NamePath);
//
// Try the location
//
Status = InternalOpenFileDevicePath(NewPath, &FileHandle, EFI_FILE_MODE_READ, 0);
FreePool(NewPath);
}
//
// If we got a file, run it
//
if (!EFI_ERROR(Status) && FileHandle != NULL) {
Status = RunScriptFile (mStartupScript, FileHandle, L"", ShellInfoObject.NewShellParametersProtocol);
ShellInfoObject.NewEfiShellProtocol->CloseFile(FileHandle);
} else {
FileStringPath = ShellFindFilePath(mStartupScript);
if (FileStringPath == NULL) {
//
// we return success since we don't need to have a startup script
//
Status = EFI_SUCCESS;
ASSERT(FileHandle == NULL);
} else {
Status = RunScriptFile(FileStringPath, NULL, L"", ShellInfoObject.NewShellParametersProtocol);
FreePool(FileStringPath);
}
}
return (Status); return (Status);
} }