On 15 March 2016 at 14:17, Qiu Shumin <[email protected]> wrote:
> This patch makes Shell support -nonesting invocation option. This option
> specifies that EFI_SHELL_PROTOCOL.Execute API nesting of a new Shell
> instance is optional and dependent on the 'nonesting' Shell environment
> variable.
>
> Difference with previous patch:
> Do not use "negative" functions names.
>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Jaben Carsey <[email protected]>
> Reviewed-by: Qiu Shumin <[email protected]>
> Reviewed-by: Jim Dailey <[email protected]>
This patch breaks the build for GCC
08:25:14
/home/buildslave/workspace/leg-virt-tianocore-edk2-upstream/edk2/ShellPkg/Application/Shell/ShellProtocol.c:
In function 'EfiShellExecute':
08:25:14
/home/buildslave/workspace/leg-virt-tianocore-edk2-upstream/edk2/ShellPkg/Application/Shell/ShellProtocol.c:1741:14:
error: variable 'CalleeStatusCode' set but not used
[-Werror=unused-but-set-variable]
08:25:14 EFI_STATUS CalleeStatusCode;
Please fix
Regards,
Ard.
> ---
> ShellPkg/Application/Shell/Shell.c | 41 ++++++++-
> ShellPkg/Application/Shell/Shell.h | 7 +-
> ShellPkg/Application/Shell/ShellProtocol.c | 139
> ++++++++++++++++++++++++-----
> 3 files changed, 162 insertions(+), 25 deletions(-)
>
> diff --git a/ShellPkg/Application/Shell/Shell.c
> b/ShellPkg/Application/Shell/Shell.c
> index 40ae68d..bd695a4 100644
> --- a/ShellPkg/Application/Shell/Shell.c
> +++ b/ShellPkg/Application/Shell/Shell.c
> @@ -1,7 +1,7 @@
> /** @file
> This is THE shell (application)
>
> - Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>
> + Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
> (C) Copyright 2013-2014 Hewlett-Packard Development Company, L.P.<BR>
> This program and the accompanying materials
> are licensed and made available under the terms and conditions of the BSD
> License
> @@ -33,6 +33,7 @@ SHELL_INFO ShellInfoObject = {
> 0,
> 0,
> 0,
> + 0,
> 0
> }},
> 0,
> @@ -69,6 +70,9 @@ SHELL_INFO ShellInfoObject = {
> STATIC CONST CHAR16 mScriptExtension[] = L".NSH";
> STATIC CONST CHAR16 mExecutableExtensions[] = L".NSH;.EFI";
> STATIC CONST CHAR16 mStartupScript[] = L"startup.nsh";
> +CONST CHAR16 mNoNestingEnvVarName[] = L"nonesting";
> +CONST CHAR16 mNoNestingTrue[] = L"True";
> +CONST CHAR16 mNoNestingFalse[] = L"False";
>
> /**
> Cleans off leading and trailing spaces and tabs.
> @@ -457,6 +461,29 @@ UefiMain (
> }
>
> //
> + // Set the environment variable for nesting support
> + //
> + Size = 0;
> + TempString = NULL;
> + if (!ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoNest) {
> + //
> + // No change. require nesting in Shell Protocol Execute()
> + //
> + StrnCatGrow(&TempString,
> + &Size,
> + L"False",
> + 0);
> + } else {
> + StrnCatGrow(&TempString,
> + &Size,
> + mNoNestingTrue,
> + 0);
> + }
> + Status = InternalEfiShellSetEnv(mNoNestingEnvVarName, TempString, TRUE);
> + SHELL_FREE_NON_NULL(TempString);
> + Size = 0;
> +
> + //
> // save the device path for the loaded image and the device path for the
> filepath (under loaded image)
> // These are where to look for the startup.nsh file
> //
> @@ -891,6 +918,7 @@ ProcessCommandLine(
> ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoVersion = FALSE;
> ShellInfoObject.ShellInitSettings.BitUnion.Bits.Delay = FALSE;
> ShellInfoObject.ShellInitSettings.BitUnion.Bits.Exit = FALSE;
> + ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoNest = FALSE;
> ShellInfoObject.ShellInitSettings.Delay = 5;
>
> //
> @@ -952,6 +980,13 @@ ProcessCommandLine(
> }
> else if (UnicodeCollation->StriColl (
> UnicodeCollation,
> + L"-nonest",
> + CurrentArg
> + ) == 0) {
> + ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoNest = TRUE;
> + }
> + else if (UnicodeCollation->StriColl (
> + UnicodeCollation,
> L"-delay",
> CurrentArg
> ) == 0) {
> @@ -1324,7 +1359,7 @@ AddLineToCommandHistory(
> BUFFER_LIST *Walker;
> UINT16 MaxHistoryCmdCount;
> UINT16 Count;
> -
> +
> Count = 0;
> MaxHistoryCmdCount = PcdGet16(PcdShellMaxHistoryCommandCount);
>
> @@ -2452,7 +2487,7 @@ SetupAndRunCommandOrFile(
> IN CHAR16 *CmdLine,
> IN CHAR16 *FirstParameter,
> IN EFI_SHELL_PARAMETERS_PROTOCOL *ParamProtocol,
> - OUT EFI_STATUS *CommandStatus
> + OUT EFI_STATUS *CommandStatus
> )
> {
> EFI_STATUS Status;
> diff --git a/ShellPkg/Application/Shell/Shell.h
> b/ShellPkg/Application/Shell/Shell.h
> index a1b7276..29b36b0 100644
> --- a/ShellPkg/Application/Shell/Shell.h
> +++ b/ShellPkg/Application/Shell/Shell.h
> @@ -58,6 +58,10 @@
> #include "ConsoleWrappers.h"
> #include "FileHandleWrappers.h"
>
> +extern CONST CHAR16 mNoNestingEnvVarName[];
> +extern CONST CHAR16 mNoNestingTrue[];
> +extern CONST CHAR16 mNoNestingFalse[];
> +
> typedef struct {
> LIST_ENTRY Link; ///< Standard linked list handler.
> SHELL_FILE_HANDLE *SplitStdOut; ///< ConsoleOut for use in the split.
> @@ -73,7 +77,8 @@ typedef struct {
> UINT32 NoMap:1; ///< Was "-nomap" found on command line.
> UINT32 NoVersion:1; ///< Was "-noversion" found on command line.
> UINT32 Delay:1; ///< Was "-delay[:n] found on command line
> - UINT32 Exit:1; ///< Was "-_exit" found on command line
> + UINT32 Exit:1; ///< Was "-_exit" found on command line
> + UINT32 NoNest:1; ///< Was "-nonest" found on command line
> UINT32 Reserved:7; ///< Extra bits
> } SHELL_BITS;
>
> diff --git a/ShellPkg/Application/Shell/ShellProtocol.c
> b/ShellPkg/Application/Shell/ShellProtocol.c
> index 22d3987..2cb7bef 100644
> --- a/ShellPkg/Application/Shell/ShellProtocol.c
> +++ b/ShellPkg/Application/Shell/ShellProtocol.c
> @@ -3,7 +3,7 @@
> manipulation, and initialization of EFI_SHELL_PROTOCOL.
>
> (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>
> - Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>
> + Copyright (c) 2009 - 2016, 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
> which accompanies this distribution. The full text of the license may be
> found at
> @@ -1588,6 +1588,109 @@ FreeAlloc:
>
> return(Status);
> }
> +
> +/**
> + internal worker function to load and run an image in the current shell.
> +
> + @param CommandLine Points to the NULL-terminated UCS-2 encoded
> string
> + containing the command line. If NULL then
> the command-
> + line will be empty.
> + @param Environment Points to a NULL-terminated array of
> environment
> + variables with the format 'x=y', where x is
> the
> + environment variable name and y is the
> value. If this
> + is NULL, then the current shell environment
> is used.
> +
> + @param[out] StartImageStatus Returned status from the command line.
> +
> + @retval EFI_SUCCESS The command executed successfully. The status
> code
> + returned by the command is pointed to by
> StatusCode.
> + @retval EFI_INVALID_PARAMETER The parameters are invalid.
> + @retval EFI_OUT_OF_RESOURCES Out of resources.
> + @retval EFI_UNSUPPORTED Nested shell invocations are not allowed.
> +**/
> +EFI_STATUS
> +EFIAPI
> +InternalShellExecute(
> + IN CONST CHAR16 *CommandLine OPTIONAL,
> + IN CONST CHAR16 **Environment OPTIONAL,
> + OUT EFI_STATUS *StartImageStatus OPTIONAL
> + )
> +{
> + EFI_STATUS Status;
> + EFI_STATUS CleanupStatus;
> + LIST_ENTRY OrigEnvs;
> +
> + InitializeListHead(&OrigEnvs);
> +
> + //
> + // Save our current environment settings for later restoration if necessary
> + //
> + if (Environment != NULL) {
> + Status = GetEnvironmentVariableList(&OrigEnvs);
> + if (!EFI_ERROR(Status)) {
> + Status = SetEnvironmentVariables(Environment);
> + } else {
> + return Status;
> + }
> + }
> +
> + Status = RunShellCommand(CommandLine, StartImageStatus);
> +
> + // Restore environment variables
> + if (!IsListEmpty(&OrigEnvs)) {
> + CleanupStatus = SetEnvironmentVariableList(&OrigEnvs);
> + ASSERT_EFI_ERROR (CleanupStatus);
> + }
> +
> + return(Status);
> +}
> +
> +/**
> + Determine if the UEFI Shell is currently running with nesting enabled or
> disabled.
> +
> + @retval FALSE nesting is required
> + @retval other nesting is enabled
> +**/
> +STATIC
> +BOOLEAN
> +EFIAPI
> +NestingEnabled(
> +)
> +{
> + EFI_STATUS Status;
> + CHAR16 *Temp;
> + CHAR16 *Temp2;
> + UINTN TempSize;
> + BOOLEAN RetVal;
> +
> + RetVal = TRUE;
> + Temp = NULL;
> + Temp2 = NULL;
> +
> + if (ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoNest) {
> + TempSize = 0;
> + Temp = NULL;
> + Status = SHELL_GET_ENVIRONMENT_VARIABLE(mNoNestingEnvVarName, &TempSize,
> Temp);
> + if (Status == EFI_BUFFER_TOO_SMALL) {
> + Temp = AllocateZeroPool(TempSize + sizeof(CHAR16));
> + if (Temp != NULL) {
> + Status = SHELL_GET_ENVIRONMENT_VARIABLE(mNoNestingEnvVarName,
> &TempSize, Temp);
> + }
> + }
> + Temp2 = StrnCatGrow(&Temp2, NULL, mNoNestingTrue, 0);
> + if (Temp != NULL && Temp2 != NULL && StringNoCaseCompare(&Temp, &Temp2)
> == 0) {
> + //
> + // Use the no nesting method.
> + //
> + RetVal = FALSE;
> + }
> + }
> +
> + SHELL_FREE_NON_NULL(Temp);
> + SHELL_FREE_NON_NULL(Temp2);
> + return (RetVal);
> +}
> +
> /**
> Execute the command line.
>
> @@ -1611,7 +1714,7 @@ FreeAlloc:
> variables with the format 'x=y', where x is the
> environment variable name and y is the value. If
> this
> is NULL, then the current shell environment is
> used.
> - @param StatusCode Points to the status code returned by the
> command.
> + @param StatusCode Points to the status code returned by the
> CommandLine.
>
> @retval EFI_SUCCESS The command executed successfully. The status
> code
> returned by the command is pointed to by
> StatusCode.
> @@ -1643,11 +1746,9 @@ EfiShellExecute(
> return (EFI_UNSUPPORTED);
> }
>
> - if (Environment != NULL) {
> - // If Environment isn't null, load a new image of the shell with its own
> - // environment
> + if (NestingEnabled()) {
> DevPath = AppendDevicePath (ShellInfoObject.ImageDevPath,
> ShellInfoObject.FileDevPath);
> -
> +
> DEBUG_CODE_BEGIN();
> Temp = ConvertDevicePathToText(ShellInfoObject.FileDevPath, TRUE, TRUE);
> FreePool(Temp);
> @@ -1676,19 +1777,10 @@ EfiShellExecute(
> FreePool(DevPath);
> FreePool(Temp);
> } else {
> - // If Environment is NULL, we are free to use and mutate the current
> shell
> - // environment. This is much faster as uses much less memory.
> -
> - if (CommandLine == NULL) {
> - CommandLine = L"";
> - }
> -
> - Status = RunShellCommand (CommandLine, &CalleeStatusCode);
> -
> - // Pass up the command's exit code if the caller wants it
> - if (StatusCode != NULL) {
> - *StatusCode = (EFI_STATUS) CalleeStatusCode;
> - }
> + Status = InternalShellExecute(
> + (CONST CHAR16*)CommandLine,
> + (CONST CHAR16**)Environment,
> + StatusCode);
> }
>
> return(Status);
> @@ -2814,6 +2906,11 @@ EfiShellSetEnv(
> gUnicodeCollation,
> (CHAR16*)Name,
> L"uefiversion") == 0
> + ||(!ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoNest &&
> + gUnicodeCollation->StriColl(
> + gUnicodeCollation,
> + (CHAR16*)Name,
> + (CHAR16*)mNoNestingEnvVarName) == 0)
> ){
> return (EFI_INVALID_PARAMETER);
> }
> @@ -2827,7 +2924,7 @@ EfiShellSetEnv(
> FileSystemMapping is not NULL, it returns the current directory associated
> with the
> FileSystemMapping. In both cases, the returned name includes the file
> system
> mapping (i.e. fs0:\current-dir).
> -
> +
> Note that the current directory string should exclude the tailing
> backslash character.
>
> @param FileSystemMapping A pointer to the file system mapping. If
> NULL,
> @@ -2981,7 +3078,7 @@ EfiShellSetCurDir(
> ASSERT((MapListItem->CurrentDirectoryPath == NULL && Size == 0) ||
> (MapListItem->CurrentDirectoryPath != NULL));
> if (MapListItem->CurrentDirectoryPath != NULL) {
>
> MapListItem->CurrentDirectoryPath[StrLen(MapListItem->CurrentDirectoryPath)-1]
> = CHAR_NULL;
> - }
> + }
> }
> } else {
> //
> --
> 2.7.1.windows.2
>
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel