]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Application/Shell/ShellParametersProtocol.c
ShellPkg: Document UpdateArgcArgv returns EFI_INVALID_PARAMETER
[mirror_edk2.git] / ShellPkg / Application / Shell / ShellParametersProtocol.c
index c638583a3758a7161f3ecb0c9346afc52d1a52b2..7e0c8ce42e110fe3dcb9a4feba957ba4b3365992 100644 (file)
@@ -2,16 +2,11 @@
   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
@@ -25,7 +20,6 @@ BOOLEAN AsciiRedirection = FALSE;
   @param[in] String        the string to parse\r
 **/\r
 CONST CHAR16*\r
-EFIAPI\r
 FindEndOfParameter(\r
   IN CONST CHAR16 *String\r
   )\r
@@ -75,17 +69,16 @@ FindEndOfParameter(
   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
+                                  remaining 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_INVALID_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
@@ -133,7 +126,7 @@ DEBUG_CODE_END();
   StrnCpyS(*TempParameter, Length / sizeof(CHAR16), (*Walker), NextDelim - *Walker);\r
 \r
   //\r
-  // Add a CHAR_NULL if we didnt get one via the copy\r
+  // Add a CHAR_NULL if we didn't get one via the copy\r
   //\r
   if (*NextDelim != CHAR_NULL) {\r
     (*TempParameter)[NextDelim - *Walker] = CHAR_NULL;\r
@@ -148,8 +141,8 @@ DEBUG_CODE_END();
   // 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
@@ -166,9 +159,9 @@ DEBUG_CODE_END();
       //\r
       if (StripQuotation) {\r
         CopyMem ((CHAR16*)NextDelim, NextDelim + 1, StrSize (NextDelim + 1));\r
-         } else{\r
+    } else{\r
         NextDelim++;\r
-         }\r
+    }\r
     }\r
   }\r
 \r
@@ -182,7 +175,7 @@ DEBUG_CODE_END();
   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
@@ -191,11 +184,11 @@ DEBUG_CODE_END();
   @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_SUCCESS           the operation was successful\r
+  @return EFI_INVALID_PARAMETER some parameters are invalid\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 BOOLEAN      StripQuotation,\r
@@ -271,7 +264,7 @@ ParseCommandLineToArgs(
   }\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
@@ -295,7 +288,6 @@ Done:
   @sa ParseCommandLineToArgs\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 CreatePopulateInstallShellParametersProtocol (\r
   IN OUT EFI_SHELL_PARAMETERS_PROTOCOL  **NewShellParameters,\r
   IN OUT BOOLEAN                        *RootShellInstance\r
@@ -425,7 +417,7 @@ CreatePopulateInstallShellParametersProtocol (
 }\r
 \r
 /**\r
-  frees all memory used by createion and installation of shell parameters protocol\r
+  frees all memory used by creation and installation of shell parameters protocol\r
   and if there was an old version installed it will restore that one.\r
 \r
   @param NewShellParameters the interface of EFI_SHELL_PARAMETERS_PROTOCOL that is\r
@@ -437,7 +429,6 @@ CreatePopulateInstallShellParametersProtocol (
   @sa UninstallProtocolInterface\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 CleanUpShellParametersProtocol (\r
   IN OUT EFI_SHELL_PARAMETERS_PROTOCOL  *NewShellParameters\r
   )\r
@@ -476,7 +467,7 @@ CleanUpShellParametersProtocol (
 }\r
 \r
 /**\r
-  Determin if a file name represents a unicode file.\r
+  Determine if a file name represents a unicode file.\r
 \r
   @param[in] FileName     Pointer to the filename to open.\r
 \r
@@ -484,7 +475,6 @@ CleanUpShellParametersProtocol (
   @return An error upon failure.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 IsUnicodeFile(\r
   IN CONST CHAR16 *FileName\r
   )\r
@@ -508,7 +498,7 @@ IsUnicodeFile(
   }\r
   gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);\r
   gEfiShellProtocol->CloseFile(Handle);\r
-  return (Status);  \r
+  return (Status);\r
 }\r
 \r
 /**\r
@@ -519,7 +509,6 @@ IsUnicodeFile(
   @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
@@ -538,7 +527,7 @@ StripQuotes (
 }\r
 \r
 /**\r
-  Calcualte the 32-bit CRC in a EFI table using the service provided by the\r
+  Calculate the 32-bit CRC in a EFI table using the service provided by the\r
   gRuntime service.\r
 \r
   @param  Hdr                    Pointer to an EFI standard header\r
@@ -571,7 +560,6 @@ CalculateEfiHdrCrc (
   @return       The modified FileName.\r
 **/\r
 CHAR16*\r
-EFIAPI\r
 FixFileName (\r
   IN CHAR16 *FileName\r
   )\r
@@ -587,7 +575,7 @@ FixFileName (
     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
@@ -595,7 +583,7 @@ FixFileName (
     }\r
     if ((TempLocation = StrStr(Copy , L" ")) != NULL) {\r
       TempLocation[0] = CHAR_NULL;\r
-    }    \r
+    }\r
   }\r
 \r
   if (Copy[0] == CHAR_NULL) {\r
@@ -614,7 +602,6 @@ FixFileName (
   @return       The modified FileName.\r
 **/\r
 CHAR16*\r
-EFIAPI\r
 FixVarName (\r
   IN CHAR16 *FileName\r
   )\r
@@ -628,37 +615,12 @@ FixVarName (
     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
@@ -690,7 +652,7 @@ WriteFileTag (
 \r
 \r
 /**\r
-  Funcion will replace the current StdIn and StdOut in the ShellParameters protocol\r
+  Function will replace the current StdIn and StdOut in the ShellParameters protocol\r
   structure by parsing NewCommandLine.  The current values are returned to the\r
   user.\r
 \r
@@ -703,11 +665,10 @@ WriteFileTag (
   @param[out] OldStdErr                  Pointer to old StdErr.\r
   @param[out] SystemTableInfo            Pointer to old system table information.\r
 \r
-  @retval   EFI_SUCCESS                 Operation was sucessful, Argv and Argc are valid.\r
+  @retval   EFI_SUCCESS                 Operation was successful, Argv and Argc are valid.\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
@@ -736,6 +697,7 @@ UpdateStdInStdOutStdErr(
   UINTN             Size;\r
   SPLIT_LIST        *Split;\r
   CHAR16            *FirstLocation;\r
+  BOOLEAN           Volatile;\r
 \r
   OutUnicode      = TRUE;\r
   InUnicode       = TRUE;\r
@@ -846,7 +808,7 @@ UpdateStdInStdOutStdErr(
     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
@@ -873,7 +835,7 @@ UpdateStdInStdOutStdErr(
     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
@@ -887,7 +849,7 @@ UpdateStdInStdOutStdErr(
     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
@@ -1043,9 +1005,9 @@ UpdateStdInStdOutStdErr(
   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
@@ -1111,12 +1073,12 @@ UpdateStdInStdOutStdErr(
       //\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
@@ -1173,7 +1135,7 @@ UpdateStdInStdOutStdErr(
         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
@@ -1266,12 +1228,12 @@ UpdateStdInStdOutStdErr(
           EFI_FILE_MODE_READ,\r
           0);\r
         if (!EFI_ERROR(Status)) {\r
-          if (!InUnicode) {
-            //
-            // Create the ASCII->Unicode conversion layer
-            //
-            TempHandle = CreateFileInterfaceFile(TempHandle, FALSE);
-          }
+          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
@@ -1296,7 +1258,7 @@ UpdateStdInStdOutStdErr(
 }\r
 \r
 /**\r
-  Funcion will replace the current StdIn and StdOut in the ShellParameters protocol\r
+  Function will replace the current StdIn and StdOut in the ShellParameters protocol\r
   structure with StdIn and StdOut.  The current values are de-allocated.\r
 \r
   @param[in, out] ShellParameters      Pointer to parameter structure to modify.\r
@@ -1306,7 +1268,6 @@ UpdateStdInStdOutStdErr(
   @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
@@ -1317,7 +1278,7 @@ RestoreStdInStdOutStdErr (
 {\r
   SPLIT_LIST        *Split;\r
 \r
-  if (ShellParameters == NULL \r
+  if (ShellParameters == NULL\r
     ||OldStdIn        == NULL\r
     ||OldStdOut       == NULL\r
     ||OldStdErr       == NULL\r
@@ -1367,7 +1328,7 @@ RestoreStdInStdOutStdErr (
   return (EFI_SUCCESS);\r
 }\r
 /**\r
-  Funcion will replace the current Argc and Argv in the ShellParameters protocol\r
+  Function will replace the current Argc and Argv in the ShellParameters protocol\r
   structure by parsing NewCommandLine.  The current values are returned to the\r
   user.\r
 \r
@@ -1379,11 +1340,12 @@ RestoreStdInStdOutStdErr (
   @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_SUCCESS                 Operation was sucessful, Argv and Argc are valid.\r
+\r
+  @retval   EFI_SUCCESS                 Operation was successful, Argv and Argc are valid.\r
+  @return   EFI_INVALID_PARAMETER       Some parameters are invalid.\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
@@ -1393,7 +1355,7 @@ UpdateArgcArgv(
   )\r
 {\r
   BOOLEAN                 StripParamQuotation;\r
-  \r
+\r
   ASSERT(ShellParameters != NULL);\r
   StripParamQuotation = TRUE;\r
 \r
@@ -1407,16 +1369,16 @@ UpdateArgcArgv(
   if (Type == Script_File_Name) {\r
     StripParamQuotation = FALSE;\r
   }\r
-  \r
-  return ParseCommandLineToArgs( NewCommandLine, \r
-                                 StripParamQuotation, \r
-                                 &(ShellParameters->Argv), \r
+\r
+  return ParseCommandLineToArgs( NewCommandLine,\r
+                                 StripParamQuotation,\r
+                                 &(ShellParameters->Argv),\r
                                  &(ShellParameters->Argc)\r
                                 );\r
 }\r
 \r
 /**\r
-  Funcion will replace the current Argc and Argv in the ShellParameters protocol\r
+  Function will replace the current Argc and Argv in the ShellParameters protocol\r
   structure with Argv and Argc.  The current values are de-allocated and the\r
   OldArgv must not be deallocated by the caller.\r
 \r
@@ -1425,7 +1387,6 @@ UpdateArgcArgv(
   @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