Member functions of EFI_SHELL_PARAMETERS_PROTOCOL and functions for creation,\r
manipulation, and initialization of EFI_SHELL_PARAMETERS_PROTOCOL.\r
\r
+ (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
Copyright (C) 2014, Red Hat, Inc.\r
(C) Copyright 2013 Hewlett-Packard Development Company, L.P.<BR>\r
- Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
@param[in] String the string to parse\r
**/\r
CONST CHAR16*\r
-EFIAPI\r
FindEndOfParameter(\r
IN CONST CHAR16 *String\r
)\r
\r
This will also remove all remaining ^ characters after processing.\r
\r
- @param[in, out] Walker pointer to string of command line. Adjusted to\r
- reminaing command line on return\r
- @param[in, out] TempParameter pointer to string of command line item extracted.\r
- @param[in] Length buffer size of TempParameter.\r
+ @param[in, out] Walker pointer to string of command line. Adjusted to\r
+ reminaing command line on return\r
+ @param[in, out] TempParameter pointer to string of command line item extracted.\r
+ @param[in] Length buffer size of TempParameter.\r
+ @param[in] StripQuotation if TRUE then strip the quotation marks surrounding\r
+ the parameters.\r
\r
@return EFI_INALID_PARAMETER A required parameter was NULL or pointed to a NULL or empty string.\r
@return EFI_NOT_FOUND A closing " could not be found on the specified string\r
**/\r
EFI_STATUS\r
-EFIAPI\r
GetNextParameter(\r
IN OUT CHAR16 **Walker,\r
IN OUT CHAR16 **TempParameter,\r
- IN CONST UINTN Length\r
+ IN CONST UINTN Length,\r
+ IN BOOLEAN StripQuotation\r
)\r
{\r
CONST CHAR16 *NextDelim;\r
// Remove any non-escaped quotes in the string\r
// Remove any remaining escape characters in the string\r
//\r
- for (NextDelim = FindFirstCharacter(*TempParameter, L"\"^", CHAR_NULL) \r
- ; *NextDelim != CHAR_NULL \r
+ for (NextDelim = FindFirstCharacter(*TempParameter, L"\"^", CHAR_NULL)\r
+ ; *NextDelim != CHAR_NULL\r
; NextDelim = FindFirstCharacter(NextDelim, L"\"^", CHAR_NULL)\r
) {\r
if (*NextDelim == L'^') {\r
//\r
// eliminate the unescaped quote\r
//\r
- CopyMem ((CHAR16*)NextDelim, NextDelim + 1, StrSize (NextDelim + 1));\r
+ if (StripQuotation) {\r
+ CopyMem ((CHAR16*)NextDelim, NextDelim + 1, StrSize (NextDelim + 1));\r
+ } else{\r
+ NextDelim++;\r
+ }\r
}\r
}\r
\r
parameters for inclusion in EFI_SHELL_PARAMETERS_PROTOCOL. this supports space\r
delimited and quote surrounded parameter definition.\r
\r
- All special character processing (alias, environment variable, redirection, \r
+ All special character processing (alias, environment variable, redirection,\r
etc... must be complete before calling this API.\r
\r
- @param[in] CommandLine String of command line to parse\r
- @param[in, out] Argv pointer to array of strings; one for each parameter\r
- @param[in, out] Argc pointer to number of strings in Argv array\r
+ @param[in] CommandLine String of command line to parse\r
+ @param[in] StripQuotation if TRUE then strip the quotation marks surrounding\r
+ the parameters.\r
+ @param[in, out] Argv pointer to array of strings; one for each parameter\r
+ @param[in, out] Argc pointer to number of strings in Argv array\r
\r
@return EFI_SUCCESS the operation was sucessful\r
@return EFI_OUT_OF_RESOURCES a memory allocation failed.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
ParseCommandLineToArgs(\r
IN CONST CHAR16 *CommandLine,\r
- IN OUT CHAR16 ***Argv,\r
- IN OUT UINTN *Argc\r
+ IN BOOLEAN StripQuotation,\r
+ IN OUT CHAR16 ***Argv,\r
+ IN OUT UINTN *Argc\r
)\r
{\r
UINTN Count;\r
; Walker != NULL && *Walker != CHAR_NULL\r
; Count++\r
) {\r
- if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size))) {\r
+ if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size, TRUE))) {\r
break;\r
}\r
}\r
Walker = (CHAR16*)NewCommandLine;\r
while(Walker != NULL && *Walker != CHAR_NULL) {\r
SetMem16(TempParameter, Size, CHAR_NULL);\r
- if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size))) {\r
+ if (EFI_ERROR(GetNextParameter(&Walker, &TempParameter, Size, StripQuotation))) {\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
}\r
ASSERT(Count >= (*Argc));\r
Status = EFI_SUCCESS;\r
- \r
+\r
Done:\r
SHELL_FREE_NON_NULL(TempParameter);\r
SHELL_FREE_NON_NULL(NewCommandLine);\r
@sa ParseCommandLineToArgs\r
**/\r
EFI_STATUS\r
-EFIAPI\r
CreatePopulateInstallShellParametersProtocol (\r
IN OUT EFI_SHELL_PARAMETERS_PROTOCOL **NewShellParameters,\r
IN OUT BOOLEAN *RootShellInstance\r
// Populate Argc and Argv\r
//\r
Status = ParseCommandLineToArgs(FullCommandLine,\r
+ TRUE,\r
&(*NewShellParameters)->Argv,\r
&(*NewShellParameters)->Argc);\r
\r
@sa UninstallProtocolInterface\r
**/\r
EFI_STATUS\r
-EFIAPI\r
CleanUpShellParametersProtocol (\r
IN OUT EFI_SHELL_PARAMETERS_PROTOCOL *NewShellParameters\r
)\r
@return An error upon failure.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
IsUnicodeFile(\r
IN CONST CHAR16 *FileName\r
)\r
}\r
gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);\r
gEfiShellProtocol->CloseFile(Handle);\r
- return (Status); \r
+ return (Status);\r
}\r
\r
/**\r
@param[in, out] TheString A pointer to the string to update.\r
**/\r
VOID\r
-EFIAPI\r
StripQuotes (\r
IN OUT CHAR16 *TheString\r
)\r
@return The modified FileName.\r
**/\r
CHAR16*\r
-EFIAPI\r
FixFileName (\r
IN CHAR16 *FileName\r
)\r
Copy = FileName+1;\r
if ((TempLocation = StrStr(Copy , L"\"")) != NULL) {\r
TempLocation[0] = CHAR_NULL;\r
- } \r
+ }\r
} else {\r
Copy = FileName;\r
while(Copy[0] == L' ') {\r
}\r
if ((TempLocation = StrStr(Copy , L" ")) != NULL) {\r
TempLocation[0] = CHAR_NULL;\r
- } \r
+ }\r
}\r
\r
if (Copy[0] == CHAR_NULL) {\r
@return The modified FileName.\r
**/\r
CHAR16*\r
-EFIAPI\r
FixVarName (\r
IN CHAR16 *FileName\r
)\r
Copy = FileName+1;\r
if ((TempLocation = StrStr(Copy , L"%")) != NULL) {\r
TempLocation[0] = CHAR_NULL;\r
- } \r
+ }\r
}\r
\r
return (FixFileName(Copy));\r
}\r
\r
-/**\r
- Remove the unicode file tag from the begining of the file buffer since that will not be\r
- used by StdIn.\r
- \r
- @param[in] Handle Pointer to the handle of the file to be processed.\r
- \r
- @retval EFI_SUCCESS The unicode file tag has been moved successfully.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-RemoveFileTag(\r
- IN SHELL_FILE_HANDLE *Handle\r
- )\r
-{\r
- UINTN CharSize;\r
- CHAR16 CharBuffer;\r
-\r
- CharSize = sizeof(CHAR16);\r
- CharBuffer = 0;\r
- gEfiShellProtocol->ReadFile(*Handle, &CharSize, &CharBuffer);\r
- if (CharBuffer != gUnicodeFileTag) {\r
- gEfiShellProtocol->SetFilePosition(*Handle, 0);\r
- }\r
- return (EFI_SUCCESS);\r
-}\r
\r
/**\r
Write the unicode file tag to the specified file.\r
@retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
UpdateStdInStdOutStdErr(\r
IN OUT EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters,\r
IN CHAR16 *NewCommandLine,\r
UINTN Size;\r
SPLIT_LIST *Split;\r
CHAR16 *FirstLocation;\r
+ BOOLEAN Volatile;\r
\r
OutUnicode = TRUE;\r
InUnicode = TRUE;\r
if (StrStr(CommandLineWalker, L" 1>> ") != NULL) {\r
Status = EFI_NOT_FOUND;\r
}\r
- } \r
+ }\r
if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" >> ")) != NULL) {\r
FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
SetMem16(CommandLineWalker, 8, L' ');\r
if (StrStr(CommandLineWalker, L" >>a ") != NULL) {\r
Status = EFI_NOT_FOUND;\r
}\r
- } \r
+ }\r
if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" 1>a ")) != NULL) {\r
FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
SetMem16(CommandLineWalker, 10, L' ');\r
if (StrStr(CommandLineWalker, L" 1>a ") != NULL) {\r
Status = EFI_NOT_FOUND;\r
}\r
- } \r
+ }\r
if (!EFI_ERROR(Status) && (CommandLineWalker = StrStr(CommandLineCopy, L" >a ")) != NULL) {\r
FirstLocation = MIN(CommandLineWalker, FirstLocation);\r
SetMem16(CommandLineWalker, 8, L' ');\r
StrnCpyS(CommandLineCopy, StrSize(CommandLineCopy)/sizeof(CHAR16), NewCommandLine, StrLen(NewCommandLine));\r
\r
if (FirstLocation != CommandLineCopy + StrLen(CommandLineCopy)\r
- && ((UINTN)(FirstLocation - CommandLineCopy) < StrLen(NewCommandLine))\r
+ && (((UINTN)FirstLocation - (UINTN)CommandLineCopy)/sizeof(CHAR16) < StrLen(NewCommandLine))\r
){\r
- *(NewCommandLine + (UINTN)(FirstLocation - CommandLineCopy)) = CHAR_NULL;\r
+ *(NewCommandLine + ((UINTN)FirstLocation - (UINTN)CommandLineCopy)/sizeof(CHAR16)) = CHAR_NULL;\r
}\r
\r
if (!EFI_ERROR(Status)) {\r
//\r
// Check for no volatile environment variables\r
//\r
- ||(StdErrVarName != NULL && !IsVolatileEnv(StdErrVarName))\r
- ||(StdOutVarName != NULL && !IsVolatileEnv(StdOutVarName))\r
+ ||(StdErrVarName != NULL && !EFI_ERROR (IsVolatileEnv (StdErrVarName, &Volatile)) && !Volatile)\r
+ ||(StdOutVarName != NULL && !EFI_ERROR (IsVolatileEnv (StdOutVarName, &Volatile)) && !Volatile)\r
//\r
// Cant redirect during a reconnect operation.\r
//\r
- ||(StrStr(NewCommandLine, L"connect -r") != NULL \r
+ ||(StrStr(NewCommandLine, L"connect -r") != NULL\r
&& (StdOutVarName != NULL || StdOutFileName != NULL || StdErrFileName != NULL || StdErrVarName != NULL))\r
//\r
// Check that filetypes (Unicode/Ascii) do not change during an append\r
if (TempHandle == NULL) {\r
Status = EFI_INVALID_PARAMETER;\r
} else {\r
- if (StrStr(StdOutFileName, L"NUL")==StdOutFileName) {\r
+ if (gUnicodeCollation->MetaiMatch (gUnicodeCollation, StdOutFileName, L"NUL")) {\r
//no-op\r
} else if (!OutAppend && OutUnicode && !EFI_ERROR(Status)) {\r
Status = WriteFileTag (TempHandle);\r
&TempHandle,\r
EFI_FILE_MODE_READ,\r
0);\r
- if (InUnicode) {\r
- //\r
- // Chop off the 0xFEFF if it's there...\r
- //\r
- RemoveFileTag(&TempHandle);\r
- } else if (!EFI_ERROR(Status)) {\r
- //\r
- // Create the ASCII->Unicode conversion layer\r
- //\r
- TempHandle = CreateFileInterfaceFile(TempHandle, FALSE);\r
- }\r
if (!EFI_ERROR(Status)) {\r
+ if (!InUnicode) {\r
+ //\r
+ // Create the ASCII->Unicode conversion layer\r
+ //\r
+ TempHandle = CreateFileInterfaceFile(TempHandle, FALSE);\r
+ }\r
ShellParameters->StdIn = TempHandle;\r
gST->ConIn = CreateSimpleTextInOnFile(TempHandle, &gST->ConsoleInHandle);\r
}\r
@param[in] SystemTableInfo Pointer to old system table information.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
RestoreStdInStdOutStdErr (\r
IN OUT EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters,\r
IN SHELL_FILE_HANDLE *OldStdIn,\r
{\r
SPLIT_LIST *Split;\r
\r
- if (ShellParameters == NULL \r
+ if (ShellParameters == NULL\r
||OldStdIn == NULL\r
||OldStdOut == NULL\r
||OldStdErr == NULL\r
\r
@param[in, out] ShellParameters Pointer to parameter structure to modify.\r
@param[in] NewCommandLine The new command line to parse and use.\r
+ @param[in] Type The type of operation.\r
@param[out] OldArgv Pointer to old list of parameters.\r
@param[out] OldArgc Pointer to old number of items in Argv list.\r
\r
@retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
**/\r
EFI_STATUS\r
-EFIAPI\r
UpdateArgcArgv(\r
IN OUT EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters,\r
IN CONST CHAR16 *NewCommandLine,\r
+ IN SHELL_OPERATION_TYPES Type,\r
OUT CHAR16 ***OldArgv OPTIONAL,\r
OUT UINTN *OldArgc OPTIONAL\r
)\r
{\r
+ BOOLEAN StripParamQuotation;\r
+\r
ASSERT(ShellParameters != NULL);\r
+ StripParamQuotation = TRUE;\r
\r
if (OldArgc != NULL) {\r
*OldArgc = ShellParameters->Argc;\r
*OldArgv = ShellParameters->Argv;\r
}\r
\r
- return (ParseCommandLineToArgs(NewCommandLine, &(ShellParameters->Argv), &(ShellParameters->Argc)));\r
+ if (Type == Script_File_Name) {\r
+ StripParamQuotation = FALSE;\r
+ }\r
+\r
+ return ParseCommandLineToArgs( NewCommandLine,\r
+ StripParamQuotation,\r
+ &(ShellParameters->Argv),\r
+ &(ShellParameters->Argc)\r
+ );\r
}\r
\r
/**\r
@param[in] OldArgc pointer to old number of items in Argv list\r
**/\r
VOID\r
-EFIAPI\r
RestoreArgcArgv(\r
IN OUT EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters,\r
IN CHAR16 ***OldArgv,\r