2010-09-14 05:18:09 +00:00
/** @file
Member functions of EFI_SHELL_PARAMETERS_PROTOCOL and functions for creation,
manipulation, and initialization of EFI_SHELL_PARAMETERS_PROTOCOL.
2016-09-22 12:12:47 -07:00
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
2014-07-31 15:44:30 +00:00
Copyright (C) 2014, Red Hat, Inc.
2015-02-04 22:25:01 +00:00
(C) Copyright 2013 Hewlett-Packard Development Company, L.P.<BR>
2018-06-27 21:13:38 +08:00
Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
2019-04-03 16:07:06 -07:00
SPDX-License-Identifier: BSD-2-Clause-Patent
2010-09-14 05:18:09 +00:00
**/
2012-11-13 22:39:09 +00:00
#include "Shell.h"
2010-09-14 05:18:09 +00:00
2015-10-15 02:43:31 +00:00
BOOLEAN AsciiRedirection = FALSE ;
2016-08-23 10:40:55 +08:00
/**
Return the next parameter's end from a command line string.
@param[in] String the string to parse
**/
CONST CHAR16 *
FindEndOfParameter (
IN CONST CHAR16 * String
)
{
CONST CHAR16 * First ;
CONST CHAR16 * CloseQuote ;
First = FindFirstCharacter ( String , L " \" " , L '^' );
//
// nothing, all one parameter remaining
//
if ( * First == CHAR_NULL ) {
return ( First );
}
//
// If space before a quote (or neither found, i.e. both CHAR_NULL),
// then that's the end.
//
if ( * First == L ' ' ) {
return ( First );
}
CloseQuote = FindFirstCharacter ( First + 1 , L " \" " , L '^' );
//
// We did not find a terminator...
//
if ( * CloseQuote == CHAR_NULL ) {
return ( NULL );
}
return ( FindEndOfParameter ( CloseQuote + 1 ));
}
/**
Return the next parameter from a command line string.
This function moves the next parameter from Walker into TempParameter and moves
Walker up past that parameter for recursive calling. When the final parameter
is moved *Walker will be set to NULL;
Temp Parameter must be large enough to hold the parameter before calling this
function.
This will also remove all remaining ^ characters after processing.
@param[in, out] Walker pointer to string of command line. Adjusted to
2020-02-07 02:08:20 +01:00
remaining command line on return
2016-08-23 10:40:55 +08:00
@param[in, out] TempParameter pointer to string of command line item extracted.
@param[in] Length buffer size of TempParameter.
@param[in] StripQuotation if TRUE then strip the quotation marks surrounding
the parameters.
2020-02-07 02:08:20 +01:00
@return EFI_INVALID_PARAMETER A required parameter was NULL or pointed to a NULL or empty string.
2016-08-23 10:40:55 +08:00
@return EFI_NOT_FOUND A closing " could not be found on the specified string
**/
EFI_STATUS
GetNextParameter (
IN OUT CHAR16 ** Walker ,
IN OUT CHAR16 ** TempParameter ,
IN CONST UINTN Length ,
IN BOOLEAN StripQuotation
)
{
CONST CHAR16 * NextDelim ;
if ( ( Walker == NULL )
|| ( * Walker == NULL )
|| ( TempParameter == NULL )
|| ( * TempParameter == NULL )
)
{
return ( EFI_INVALID_PARAMETER );
}
//
// make sure we dont have any leading spaces
//
while (( * Walker )[ 0 ] == L ' ' ) {
( * Walker ) ++ ;
}
//
// make sure we still have some params now...
//
if ( StrLen ( * Walker ) == 0 ) {
DEBUG_CODE_BEGIN ();
* Walker = NULL ;
DEBUG_CODE_END ();
return ( EFI_INVALID_PARAMETER );
}
NextDelim = FindEndOfParameter ( * Walker );
if ( NextDelim == NULL ) {
DEBUG_CODE_BEGIN ();
* Walker = NULL ;
DEBUG_CODE_END ();
return ( EFI_NOT_FOUND );
}
StrnCpyS ( * TempParameter , Length / sizeof ( CHAR16 ), ( * Walker ), NextDelim - * Walker );
//
2020-02-07 02:08:20 +01:00
// Add a CHAR_NULL if we didn't get one via the copy
2016-08-23 10:40:55 +08:00
//
if ( * NextDelim != CHAR_NULL ) {
( * TempParameter )[ NextDelim - * Walker ] = CHAR_NULL ;
}
//
// Update Walker for the next iteration through the function
//
* Walker = ( CHAR16 * ) NextDelim ;
//
// Remove any non-escaped quotes in the string
// Remove any remaining escape characters in the string
//
2018-06-27 21:13:38 +08:00
for ( NextDelim = FindFirstCharacter ( * TempParameter , L " \" ^" , CHAR_NULL )
; * NextDelim != CHAR_NULL
2016-08-23 10:40:55 +08:00
; NextDelim = FindFirstCharacter ( NextDelim , L " \" ^" , CHAR_NULL )
)
{
if ( * NextDelim == L '^' ) {
//
// eliminate the escape ^
//
CopyMem (( CHAR16 * ) NextDelim , NextDelim + 1 , StrSize ( NextDelim + 1 ));
NextDelim ++ ;
} else if ( * NextDelim == L '\"' ) {
//
// eliminate the unescaped quote
//
if ( StripQuotation ) {
CopyMem (( CHAR16 * ) NextDelim , NextDelim + 1 , StrSize ( NextDelim + 1 ));
2018-06-27 21:13:38 +08:00
} else {
2016-08-23 10:40:55 +08:00
NextDelim ++ ;
2018-06-27 21:13:38 +08:00
}
2016-08-23 10:40:55 +08:00
}
}
return EFI_SUCCESS ;
}
2010-09-14 05:18:09 +00:00
/**
2011-03-25 22:23:05 +00:00
Function to populate Argc and Argv.
2010-09-14 05:18:09 +00:00
This function parses the CommandLine and divides it into standard C style Argc/Argv
parameters for inclusion in EFI_SHELL_PARAMETERS_PROTOCOL. this supports space
delimited and quote surrounded parameter definition.
2018-06-27 21:13:38 +08:00
All special character processing (alias, environment variable, redirection,
2015-01-27 18:56:36 +00:00
etc... must be complete before calling this API.
2015-11-09 02:29:31 +00:00
@param[in] CommandLine String of command line to parse
@param[in] StripQuotation if TRUE then strip the quotation marks surrounding
the parameters.
@param[in, out] Argv pointer to array of strings; one for each parameter
@param[in, out] Argc pointer to number of strings in Argv array
2010-09-14 05:18:09 +00:00
2020-02-07 02:08:20 +01:00
@return EFI_SUCCESS the operation was successful
2019-12-03 01:40:50 +08:00
@return EFI_INVALID_PARAMETER some parameters are invalid
2010-09-14 05:18:09 +00:00
@return EFI_OUT_OF_RESOURCES a memory allocation failed.
**/
EFI_STATUS
ParseCommandLineToArgs (
IN CONST CHAR16 * CommandLine ,
2015-11-09 02:29:31 +00:00
IN BOOLEAN StripQuotation ,
IN OUT CHAR16 *** Argv ,
IN OUT UINTN * Argc
2010-09-14 05:18:09 +00:00
)
{
UINTN Count ;
CHAR16 * TempParameter ;
CHAR16 * Walker ;
CHAR16 * NewParam ;
2015-09-18 01:08:31 +00:00
CHAR16 * NewCommandLine ;
2010-09-14 05:18:09 +00:00
UINTN Size ;
2015-09-18 01:08:31 +00:00
EFI_STATUS Status ;
2010-09-14 05:18:09 +00:00
ASSERT ( Argc != NULL );
ASSERT ( Argv != NULL );
if (( CommandLine == NULL ) || ( StrLen ( CommandLine ) == 0 )) {
( * Argc ) = 0 ;
( * Argv ) = NULL ;
return ( EFI_SUCCESS );
}
2015-09-18 01:08:31 +00:00
NewCommandLine = AllocateCopyPool ( StrSize ( CommandLine ), CommandLine );
if ( NewCommandLine == NULL ) {
return ( EFI_OUT_OF_RESOURCES );
}
TrimSpaces ( & NewCommandLine );
Size = StrSize ( NewCommandLine );
2010-09-14 05:18:09 +00:00
TempParameter = AllocateZeroPool ( Size );
if ( TempParameter == NULL ) {
2015-09-18 01:08:31 +00:00
SHELL_FREE_NON_NULL ( NewCommandLine );
2010-09-14 05:18:09 +00:00
return ( EFI_OUT_OF_RESOURCES );
}
for ( Count = 0 ,
2015-09-18 01:08:31 +00:00
Walker = ( CHAR16 * ) NewCommandLine
2010-09-14 05:18:09 +00:00
; Walker != NULL && * Walker != CHAR_NULL
2015-01-27 18:56:36 +00:00
; Count ++
)
{
2016-08-23 10:40:55 +08:00
if ( EFI_ERROR ( GetNextParameter ( & Walker , & TempParameter , Size , TRUE ))) {
2015-01-27 18:56:36 +00:00
break ;
}
}
2010-09-14 05:18:09 +00:00
//
// lets allocate the pointer array
//
( * Argv ) = AllocateZeroPool (( Count ) * sizeof ( CHAR16 * ));
if ( * Argv == NULL ) {
2015-09-18 01:08:31 +00:00
Status = EFI_OUT_OF_RESOURCES ;
goto Done ;
2010-09-14 05:18:09 +00:00
}
* Argc = 0 ;
2015-09-18 01:08:31 +00:00
Walker = ( CHAR16 * ) NewCommandLine ;
2010-09-14 05:18:09 +00:00
while ( Walker != NULL && * Walker != CHAR_NULL ) {
SetMem16 ( TempParameter , Size , CHAR_NULL );
2016-08-23 10:40:55 +08:00
if ( EFI_ERROR ( GetNextParameter ( & Walker , & TempParameter , Size , StripQuotation ))) {
2015-09-18 01:08:31 +00:00
Status = EFI_INVALID_PARAMETER ;
goto Done ;
2015-01-27 18:56:36 +00:00
}
2014-09-02 20:17:38 +00:00
NewParam = AllocateCopyPool ( StrSize ( TempParameter ), TempParameter );
if ( NewParam == NULL ) {
2015-09-18 01:08:31 +00:00
Status = EFI_OUT_OF_RESOURCES ;
goto Done ;
2014-09-02 20:17:38 +00:00
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
(( CHAR16 ** )( * Argv ))[( * Argc )] = NewParam ;
( * Argc ) ++ ;
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
ASSERT ( Count >= ( * Argc ));
2015-09-18 01:08:31 +00:00
Status = EFI_SUCCESS ;
2018-06-27 21:13:38 +08:00
2015-09-18 01:08:31 +00:00
Done :
2012-11-13 16:08:52 +00:00
SHELL_FREE_NON_NULL ( TempParameter );
2015-09-18 01:08:31 +00:00
SHELL_FREE_NON_NULL ( NewCommandLine );
return ( Status );
2010-09-14 05:18:09 +00:00
}
/**
creates a new EFI_SHELL_PARAMETERS_PROTOCOL instance and populates it and then
installs it on our handle and if there is an existing version of the protocol
that one is cached for removal later.
2011-09-02 08:05:34 +00:00
@param[in, out] NewShellParameters on a successful return, a pointer to pointer
2010-09-14 05:18:09 +00:00
to the newly installed interface.
2011-09-02 08:05:34 +00:00
@param[in, out] RootShellInstance on a successful return, pointer to boolean.
2010-09-14 05:18:09 +00:00
TRUE if this is the root shell instance.
@retval EFI_SUCCESS the operation completed successfully.
@return other the operation failed.
@sa ReinstallProtocolInterface
@sa InstallProtocolInterface
@sa ParseCommandLineToArgs
**/
EFI_STATUS
CreatePopulateInstallShellParametersProtocol (
IN OUT EFI_SHELL_PARAMETERS_PROTOCOL ** NewShellParameters ,
IN OUT BOOLEAN * RootShellInstance
)
{
EFI_STATUS Status ;
EFI_LOADED_IMAGE_PROTOCOL * LoadedImage ;
CHAR16 * FullCommandLine ;
UINTN Size ;
Size = 0 ;
FullCommandLine = NULL ;
LoadedImage = NULL ;
//
// Assert for valid parameters
//
ASSERT ( NewShellParameters != NULL );
ASSERT ( RootShellInstance != NULL );
//
// See if we have a shell parameters placed on us
//
Status = gBS -> OpenProtocol (
gImageHandle ,
& gEfiShellParametersProtocolGuid ,
( VOID ** ) & ShellInfoObject . OldShellParameters ,
gImageHandle ,
NULL ,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
//
// if we don't then we must be the root shell (error is expected)
//
if ( EFI_ERROR ( Status )) {
* RootShellInstance = TRUE ;
}
//
// Allocate the new structure
//
* NewShellParameters = AllocateZeroPool ( sizeof ( EFI_SHELL_PARAMETERS_PROTOCOL ));
2010-10-04 16:24:30 +00:00
if (( * NewShellParameters ) == NULL ) {
return ( EFI_OUT_OF_RESOURCES );
}
2010-09-14 05:18:09 +00:00
//
// get loaded image protocol
//
Status = gBS -> OpenProtocol (
gImageHandle ,
& gEfiLoadedImageProtocolGuid ,
( VOID ** ) & LoadedImage ,
gImageHandle ,
NULL ,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
ASSERT_EFI_ERROR ( Status );
//
// Build the full command line
//
2013-01-17 19:04:36 +00:00
Status = SHELL_GET_ENVIRONMENT_VARIABLE ( L "ShellOpt" , & Size , FullCommandLine );
2010-09-14 05:18:09 +00:00
if ( Status == EFI_BUFFER_TOO_SMALL ) {
FullCommandLine = AllocateZeroPool ( Size + LoadedImage -> LoadOptionsSize );
2024-10-03 10:30:15 -07:00
if ( FullCommandLine == NULL ) {
return EFI_OUT_OF_RESOURCES ;
}
Status = SHELL_GET_ENVIRONMENT_VARIABLE ( L "ShellOpt" , & Size , FullCommandLine );
2010-09-14 05:18:09 +00:00
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if ( Status == EFI_NOT_FOUND ) {
//
// no parameters via environment... ok
//
} else {
2010-10-04 16:24:30 +00:00
if ( EFI_ERROR ( Status )) {
return ( Status );
}
2010-09-14 05:18:09 +00:00
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if (( Size == 0 ) && ( LoadedImage -> LoadOptionsSize != 0 )) {
2010-10-04 16:24:30 +00:00
ASSERT ( FullCommandLine == NULL );
2010-09-14 05:18:09 +00:00
//
// Now we need to include a NULL terminator in the size.
//
Size = LoadedImage -> LoadOptionsSize + sizeof ( FullCommandLine [ 0 ]);
FullCommandLine = AllocateZeroPool ( Size );
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if ( FullCommandLine != NULL ) {
2013-10-22 01:14:54 +00:00
CopyMem ( FullCommandLine , LoadedImage -> LoadOptions , LoadedImage -> LoadOptionsSize );
2010-09-14 05:18:09 +00:00
//
// Populate Argc and Argv
//
Status = ParseCommandLineToArgs (
FullCommandLine ,
2015-11-09 02:29:31 +00:00
TRUE ,
2010-09-14 05:18:09 +00:00
& ( * NewShellParameters ) -> Argv ,
& ( * NewShellParameters ) -> Argc
);
FreePool ( FullCommandLine );
ASSERT_EFI_ERROR ( Status );
} else {
( * NewShellParameters ) -> Argv = NULL ;
( * NewShellParameters ) -> Argc = 0 ;
}
//
// Populate the 3 faked file systems...
//
if ( * RootShellInstance ) {
( * NewShellParameters ) -> StdIn = & FileInterfaceStdIn ;
( * NewShellParameters ) -> StdOut = & FileInterfaceStdOut ;
( * NewShellParameters ) -> StdErr = & FileInterfaceStdErr ;
Status = gBS -> InstallProtocolInterface (
& gImageHandle ,
& gEfiShellParametersProtocolGuid ,
EFI_NATIVE_INTERFACE ,
( VOID * )( * NewShellParameters )
);
} else {
//
// copy from the existing ones
//
( * NewShellParameters ) -> StdIn = ShellInfoObject . OldShellParameters -> StdIn ;
( * NewShellParameters ) -> StdOut = ShellInfoObject . OldShellParameters -> StdOut ;
( * NewShellParameters ) -> StdErr = ShellInfoObject . OldShellParameters -> StdErr ;
Status = gBS -> ReinstallProtocolInterface (
gImageHandle ,
& gEfiShellParametersProtocolGuid ,
( VOID * ) ShellInfoObject . OldShellParameters ,
( VOID * )( * NewShellParameters )
);
}
return ( Status );
}
/**
2020-02-07 02:08:20 +01:00
frees all memory used by creation and installation of shell parameters protocol
2010-09-14 05:18:09 +00:00
and if there was an old version installed it will restore that one.
@param NewShellParameters the interface of EFI_SHELL_PARAMETERS_PROTOCOL that is
being cleaned up.
@retval EFI_SUCCESS the cleanup was successful
@return other the cleanup failed
@sa ReinstallProtocolInterface
@sa UninstallProtocolInterface
**/
EFI_STATUS
CleanUpShellParametersProtocol (
IN OUT EFI_SHELL_PARAMETERS_PROTOCOL * NewShellParameters
)
{
EFI_STATUS Status ;
UINTN LoopCounter ;
//
// If the old exists we need to restore it
//
if ( ShellInfoObject . OldShellParameters != NULL ) {
Status = gBS -> ReinstallProtocolInterface (
gImageHandle ,
& gEfiShellParametersProtocolGuid ,
( VOID * ) NewShellParameters ,
( VOID * ) ShellInfoObject . OldShellParameters
);
DEBUG_CODE (
ShellInfoObject . OldShellParameters = NULL ;
);
} else {
//
// No old one, just uninstall us...
//
Status = gBS -> UninstallProtocolInterface (
gImageHandle ,
& gEfiShellParametersProtocolGuid ,
( VOID * ) NewShellParameters
);
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if ( NewShellParameters -> Argv != NULL ) {
for ( LoopCounter = 0
; LoopCounter < NewShellParameters -> Argc
; LoopCounter ++
)
{
FreePool ( NewShellParameters -> Argv [ LoopCounter ]);
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
FreePool ( NewShellParameters -> Argv );
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
FreePool ( NewShellParameters );
return ( Status );
}
2011-04-01 22:16:01 +00:00
/**
2020-02-07 02:08:20 +01:00
Determine if a file name represents a unicode file.
2011-04-01 22:16:01 +00:00
@param[in] FileName Pointer to the filename to open.
@retval EFI_SUCCESS The file is a unicode file.
@return An error upon failure.
**/
2011-03-25 22:23:05 +00:00
EFI_STATUS
IsUnicodeFile (
IN CONST CHAR16 * FileName
)
{
SHELL_FILE_HANDLE Handle ;
EFI_STATUS Status ;
UINT64 OriginalFilePosition ;
UINTN CharSize ;
CHAR16 CharBuffer ;
Status = gEfiShellProtocol -> OpenFileByName ( FileName , & Handle , EFI_FILE_MODE_READ );
if ( EFI_ERROR ( Status )) {
return ( Status );
}
2021-12-05 14:54:13 -08:00
2011-03-25 22:23:05 +00:00
gEfiShellProtocol -> GetFilePosition ( Handle , & OriginalFilePosition );
gEfiShellProtocol -> SetFilePosition ( Handle , 0 );
CharSize = sizeof ( CHAR16 );
Status = gEfiShellProtocol -> ReadFile ( Handle , & CharSize , & CharBuffer );
if ( EFI_ERROR ( Status ) || ( CharBuffer != gUnicodeFileTag )) {
Status = EFI_BUFFER_TOO_SMALL ;
}
2021-12-05 14:54:13 -08:00
2011-03-25 22:23:05 +00:00
gEfiShellProtocol -> SetFilePosition ( Handle , OriginalFilePosition );
gEfiShellProtocol -> CloseFile ( Handle );
2018-06-27 21:13:38 +08:00
return ( Status );
2011-03-25 22:23:05 +00:00
}
2011-03-30 21:04:57 +00:00
/**
Strips out quotes sections of a string.
All of the characters between quotes is replaced with spaces.
2011-04-05 20:55:45 +00:00
2011-09-02 08:05:34 +00:00
@param[in, out] TheString A pointer to the string to update.
2011-03-30 21:04:57 +00:00
**/
VOID
StripQuotes (
IN OUT CHAR16 * TheString
)
{
BOOLEAN RemoveNow ;
for ( RemoveNow = FALSE ; TheString != NULL && * TheString != CHAR_NULL ; TheString ++ ) {
if (( * TheString == L '^' ) && ( * ( TheString + 1 ) == L '\"' )) {
TheString ++ ;
} else if ( * TheString == L '\"' ) {
RemoveNow = ( BOOLEAN ) ! RemoveNow ;
} else if ( RemoveNow ) {
* TheString = L ' ' ;
}
}
}
2011-10-13 23:05:08 +00:00
/**
2020-02-07 02:08:20 +01:00
Calculate the 32-bit CRC in a EFI table using the service provided by the
2011-10-13 23:05:08 +00:00
gRuntime service.
@param Hdr Pointer to an EFI standard header
**/
VOID
CalculateEfiHdrCrc (
IN OUT EFI_TABLE_HEADER * Hdr
)
{
UINT32 Crc ;
Hdr -> CRC32 = 0 ;
//
// If gBS->CalculateCrce32 () == CoreEfiNotAvailableYet () then
// Crc will come back as zero if we set it to zero here
//
Crc = 0 ;
gBS -> CalculateCrc32 (( UINT8 * ) Hdr , Hdr -> HeaderSize , & Crc );
Hdr -> CRC32 = Crc ;
}
2011-11-11 16:52:09 +00:00
/**
Fix a string to only have the file name, removing starting at the first space of whatever is quoted.
@param[in] FileName The filename to start with.
@retval NULL FileName was invalid.
@return The modified FileName.
**/
CHAR16 *
FixFileName (
IN CHAR16 * FileName
)
{
CHAR16 * Copy ;
CHAR16 * TempLocation ;
if ( FileName == NULL ) {
return ( NULL );
}
if ( FileName [ 0 ] == L '\"' ) {
Copy = FileName + 1 ;
if (( TempLocation = StrStr ( Copy , L " \" " )) != NULL ) {
TempLocation [ 0 ] = CHAR_NULL ;
2018-06-27 21:13:38 +08:00
}
2011-11-11 16:52:09 +00:00
} else {
Copy = FileName ;
2012-01-27 20:51:14 +00:00
while ( Copy [ 0 ] == L ' ' ) {
Copy ++ ;
}
2021-12-05 14:54:13 -08:00
2011-11-11 16:52:09 +00:00
if (( TempLocation = StrStr ( Copy , L " " )) != NULL ) {
TempLocation [ 0 ] = CHAR_NULL ;
2018-06-27 21:13:38 +08:00
}
2011-11-11 16:52:09 +00:00
}
if ( Copy [ 0 ] == CHAR_NULL ) {
return ( NULL );
}
return ( Copy );
}
2013-11-15 18:39:26 +00:00
/**
Fix a string to only have the environment variable name, removing starting at the first space of whatever is quoted and removing the leading and trailing %.
@param[in] FileName The filename to start with.
@retval NULL FileName was invalid.
@return The modified FileName.
**/
CHAR16 *
FixVarName (
IN CHAR16 * FileName
)
{
CHAR16 * Copy ;
CHAR16 * TempLocation ;
Copy = FileName ;
if ( FileName [ 0 ] == L '%' ) {
Copy = FileName + 1 ;
if (( TempLocation = StrStr ( Copy , L "%" )) != NULL ) {
TempLocation [ 0 ] = CHAR_NULL ;
2018-06-27 21:13:38 +08:00
}
2013-11-15 18:39:26 +00:00
}
return ( FixFileName ( Copy ));
}
2014-07-31 15:44:30 +00:00
/**
Write the unicode file tag to the specified file.
It is the caller's responsibility to ensure that
ShellInfoObject.NewEfiShellProtocol has been initialized before calling this
function.
@param[in] FileHandle The file to write the unicode file tag to.
@return Status code from ShellInfoObject.NewEfiShellProtocol->WriteFile.
**/
EFI_STATUS
WriteFileTag (
IN SHELL_FILE_HANDLE FileHandle
)
{
CHAR16 FileTag ;
UINTN Size ;
EFI_STATUS Status ;
FileTag = gUnicodeFileTag ;
Size = sizeof FileTag ;
Status = ShellInfoObject . NewEfiShellProtocol -> WriteFile (
FileHandle ,
& Size ,
& FileTag
);
ASSERT ( EFI_ERROR ( Status ) || Size == sizeof FileTag );
return Status ;
}
2010-09-14 05:18:09 +00:00
/**
2020-02-07 02:08:20 +01:00
Function will replace the current StdIn and StdOut in the ShellParameters protocol
2010-09-14 05:18:09 +00:00
structure by parsing NewCommandLine. The current values are returned to the
user.
2010-11-16 22:31:47 +00:00
This will also update the system table.
2010-09-14 05:18:09 +00:00
2011-09-02 08:05:34 +00:00
@param[in, out] ShellParameters Pointer to parameter structure to modify.
@param[in] NewCommandLine The new command line to parse and use.
@param[out] OldStdIn Pointer to old StdIn.
@param[out] OldStdOut Pointer to old StdOut.
@param[out] OldStdErr Pointer to old StdErr.
@param[out] SystemTableInfo Pointer to old system table information.
2010-09-14 05:18:09 +00:00
2020-02-07 02:08:20 +01:00
@retval EFI_SUCCESS Operation was successful, Argv and Argc are valid.
2010-09-14 05:18:09 +00:00
@retval EFI_OUT_OF_RESOURCES A memory allocation failed.
**/
EFI_STATUS
UpdateStdInStdOutStdErr (
IN OUT EFI_SHELL_PARAMETERS_PROTOCOL * ShellParameters ,
2011-03-30 21:04:57 +00:00
IN CHAR16 * NewCommandLine ,
2010-09-14 05:18:09 +00:00
OUT SHELL_FILE_HANDLE * OldStdIn ,
OUT SHELL_FILE_HANDLE * OldStdOut ,
2010-11-16 22:31:47 +00:00
OUT SHELL_FILE_HANDLE * OldStdErr ,
OUT SYSTEM_TABLE_INFO * SystemTableInfo
2010-09-14 05:18:09 +00:00
)
{
CHAR16 * CommandLineCopy ;
CHAR16 * CommandLineWalker ;
CHAR16 * StdErrFileName ;
CHAR16 * StdOutFileName ;
CHAR16 * StdInFileName ;
CHAR16 * StdInVarName ;
CHAR16 * StdOutVarName ;
CHAR16 * StdErrVarName ;
EFI_STATUS Status ;
SHELL_FILE_HANDLE TempHandle ;
UINT64 FileSize ;
BOOLEAN OutUnicode ;
BOOLEAN InUnicode ;
BOOLEAN ErrUnicode ;
BOOLEAN OutAppend ;
BOOLEAN ErrAppend ;
UINTN Size ;
SPLIT_LIST * Split ;
2011-03-30 21:04:57 +00:00
CHAR16 * FirstLocation ;
2016-07-08 15:18:14 +08:00
BOOLEAN Volatile ;
2010-09-14 05:18:09 +00:00
OutUnicode = TRUE ;
InUnicode = TRUE ;
2015-10-15 02:43:31 +00:00
AsciiRedirection = FALSE ;
2010-09-14 05:18:09 +00:00
ErrUnicode = TRUE ;
StdInVarName = NULL ;
StdOutVarName = NULL ;
StdErrVarName = NULL ;
StdErrFileName = NULL ;
StdInFileName = NULL ;
StdOutFileName = NULL ;
ErrAppend = FALSE ;
OutAppend = FALSE ;
CommandLineCopy = NULL ;
2011-04-01 16:11:59 +00:00
FirstLocation = NULL ;
2024-10-03 10:30:15 -07:00
TempHandle = NULL ;
2010-09-14 05:18:09 +00:00
2010-11-16 22:31:47 +00:00
if (( ShellParameters == NULL ) || ( SystemTableInfo == NULL ) || ( OldStdIn == NULL ) || ( OldStdOut == NULL ) || ( OldStdErr == NULL )) {
return ( EFI_INVALID_PARAMETER );
2010-09-14 05:18:09 +00:00
}
2010-11-16 22:31:47 +00:00
SystemTableInfo -> ConIn = gST -> ConIn ;
SystemTableInfo -> ConInHandle = gST -> ConsoleInHandle ;
SystemTableInfo -> ConOut = gST -> ConOut ;
SystemTableInfo -> ConOutHandle = gST -> ConsoleOutHandle ;
2012-08-17 03:58:17 +00:00
SystemTableInfo -> ErrOut = gST -> StdErr ;
SystemTableInfo -> ErrOutHandle = gST -> StandardErrorHandle ;
2010-11-16 22:31:47 +00:00
* OldStdIn = ShellParameters -> StdIn ;
* OldStdOut = ShellParameters -> StdOut ;
* OldStdErr = ShellParameters -> StdErr ;
2010-09-14 05:18:09 +00:00
if ( NewCommandLine == NULL ) {
return ( EFI_SUCCESS );
}
CommandLineCopy = StrnCatGrow ( & CommandLineCopy , NULL , NewCommandLine , 0 );
2011-10-14 19:21:13 +00:00
if ( CommandLineCopy == NULL ) {
return ( EFI_OUT_OF_RESOURCES );
}
2010-09-14 05:18:09 +00:00
2011-03-30 21:04:57 +00:00
Status = EFI_SUCCESS ;
2010-09-14 05:18:09 +00:00
Split = NULL ;
2011-03-30 21:04:57 +00:00
FirstLocation = CommandLineCopy + StrLen ( CommandLineCopy );
2011-04-01 16:11:59 +00:00
StripQuotes ( CommandLineCopy );
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if ( ! IsListEmpty ( & ShellInfoObject . SplitList . Link )) {
Split = ( SPLIT_LIST * ) GetFirstNode ( & ShellInfoObject . SplitList . Link );
if (( Split != NULL ) && ( Split -> SplitStdIn != NULL )) {
ShellParameters -> StdIn = Split -> SplitStdIn ;
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if (( Split != NULL ) && ( Split -> SplitStdOut != NULL )) {
ShellParameters -> StdOut = Split -> SplitStdOut ;
}
}
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " 2>>v " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 12 , L ' ' );
2010-09-14 05:18:09 +00:00
StdErrVarName = CommandLineWalker += 6 ;
ErrAppend = TRUE ;
if ( StrStr ( CommandLineWalker , L " 2>>v " ) != NULL ) {
2011-03-25 22:23:05 +00:00
Status = EFI_NOT_FOUND ;
}
2010-09-14 05:18:09 +00:00
}
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " 1>>v " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 12 , L ' ' );
2010-09-14 05:18:09 +00:00
StdOutVarName = CommandLineWalker += 6 ;
OutAppend = TRUE ;
if ( StrStr ( CommandLineWalker , L " 1>>v " ) != NULL ) {
2011-03-25 22:23:05 +00:00
Status = EFI_NOT_FOUND ;
2021-12-05 14:54:13 -08:00
}
2010-09-14 05:18:09 +00:00
} else if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " >>v " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 10 , L ' ' );
2010-09-14 05:18:09 +00:00
StdOutVarName = CommandLineWalker += 5 ;
OutAppend = TRUE ;
if ( StrStr ( CommandLineWalker , L " >>v " ) != NULL ) {
2011-03-25 22:23:05 +00:00
Status = EFI_NOT_FOUND ;
2021-12-05 14:54:13 -08:00
}
2010-09-14 05:18:09 +00:00
} else if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " >v " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 8 , L ' ' );
2010-09-14 05:18:09 +00:00
StdOutVarName = CommandLineWalker += 4 ;
OutAppend = FALSE ;
if ( StrStr ( CommandLineWalker , L " >v " ) != NULL ) {
2011-03-25 22:23:05 +00:00
Status = EFI_NOT_FOUND ;
2021-12-05 14:54:13 -08:00
}
}
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " 1>>a " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 12 , L ' ' );
2010-09-14 05:18:09 +00:00
StdOutFileName = CommandLineWalker += 6 ;
OutAppend = TRUE ;
OutUnicode = FALSE ;
if ( StrStr ( CommandLineWalker , L " 1>>a " ) != NULL ) {
2011-03-25 22:23:05 +00:00
Status = EFI_NOT_FOUND ;
2021-12-05 14:54:13 -08:00
}
}
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " 1>> " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 10 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdOutFileName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
2021-12-05 14:54:13 -08:00
} else {
2010-09-14 05:18:09 +00:00
StdOutFileName = CommandLineWalker += 5 ;
OutAppend = TRUE ;
2021-12-05 14:54:13 -08:00
}
2010-09-14 05:18:09 +00:00
if ( StrStr ( CommandLineWalker , L " 1>> " ) != NULL ) {
2011-03-25 22:23:05 +00:00
Status = EFI_NOT_FOUND ;
2021-12-05 14:54:13 -08:00
}
}
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " >> " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 8 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdOutFileName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
2021-12-05 14:54:13 -08:00
} else {
2010-09-14 05:18:09 +00:00
StdOutFileName = CommandLineWalker += 4 ;
OutAppend = TRUE ;
2021-12-05 14:54:13 -08:00
}
2010-09-14 05:18:09 +00:00
if ( StrStr ( CommandLineWalker , L " >> " ) != NULL ) {
2011-03-25 22:23:05 +00:00
Status = EFI_NOT_FOUND ;
2021-12-05 14:54:13 -08:00
}
}
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " >>a " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 10 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdOutFileName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
2021-12-05 14:54:13 -08:00
} else {
2010-09-14 05:18:09 +00:00
StdOutFileName = CommandLineWalker += 5 ;
OutAppend = TRUE ;
OutUnicode = FALSE ;
2021-12-05 14:54:13 -08:00
}
2010-09-14 05:18:09 +00:00
if ( StrStr ( CommandLineWalker , L " >>a " ) != NULL ) {
2011-03-25 22:23:05 +00:00
Status = EFI_NOT_FOUND ;
2021-12-05 14:54:13 -08:00
}
}
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " 1>a " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 10 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdOutFileName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
2021-12-05 14:54:13 -08:00
} else {
2010-09-14 05:18:09 +00:00
StdOutFileName = CommandLineWalker += 5 ;
OutAppend = FALSE ;
OutUnicode = FALSE ;
2021-12-05 14:54:13 -08:00
}
2010-09-14 05:18:09 +00:00
if ( StrStr ( CommandLineWalker , L " 1>a " ) != NULL ) {
2011-03-25 22:23:05 +00:00
Status = EFI_NOT_FOUND ;
2021-12-05 14:54:13 -08:00
}
}
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " >a " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 8 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdOutFileName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
2021-12-05 14:54:13 -08:00
} else {
2010-09-14 05:18:09 +00:00
StdOutFileName = CommandLineWalker += 4 ;
OutAppend = FALSE ;
OutUnicode = FALSE ;
2021-12-05 14:54:13 -08:00
}
2010-09-14 05:18:09 +00:00
if ( StrStr ( CommandLineWalker , L " >a " ) != NULL ) {
2011-03-25 22:23:05 +00:00
Status = EFI_NOT_FOUND ;
2021-12-05 14:54:13 -08:00
}
}
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " 2>> " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 10 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdErrFileName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
2021-12-05 14:54:13 -08:00
} else {
2010-09-14 05:18:09 +00:00
StdErrFileName = CommandLineWalker += 5 ;
ErrAppend = TRUE ;
2021-12-05 14:54:13 -08:00
}
2010-09-14 05:18:09 +00:00
if ( StrStr ( CommandLineWalker , L " 2>> " ) != NULL ) {
2011-03-25 22:23:05 +00:00
Status = EFI_NOT_FOUND ;
2021-12-05 14:54:13 -08:00
}
}
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " 2>v " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 10 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdErrVarName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
} else {
StdErrVarName = CommandLineWalker += 5 ;
ErrAppend = FALSE ;
}
2021-12-05 14:54:13 -08:00
2011-03-25 22:23:05 +00:00
if ( StrStr ( CommandLineWalker , L " 2>v " ) != NULL ) {
Status = EFI_NOT_FOUND ;
}
2010-09-14 05:18:09 +00:00
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " 1>v " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 10 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdOutVarName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
} else {
StdOutVarName = CommandLineWalker += 5 ;
OutAppend = FALSE ;
}
2021-12-05 14:54:13 -08:00
2011-03-25 22:23:05 +00:00
if ( StrStr ( CommandLineWalker , L " 1>v " ) != NULL ) {
Status = EFI_NOT_FOUND ;
}
2010-09-14 05:18:09 +00:00
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " 2>a " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 10 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdErrFileName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
} else {
StdErrFileName = CommandLineWalker += 5 ;
ErrAppend = FALSE ;
ErrUnicode = FALSE ;
}
2021-12-05 14:54:13 -08:00
2011-03-25 22:23:05 +00:00
if ( StrStr ( CommandLineWalker , L " 2>a " ) != NULL ) {
Status = EFI_NOT_FOUND ;
}
2010-09-14 05:18:09 +00:00
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " 2> " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 8 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdErrFileName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
} else {
StdErrFileName = CommandLineWalker += 4 ;
ErrAppend = FALSE ;
}
2021-12-05 14:54:13 -08:00
2011-03-25 22:23:05 +00:00
if ( StrStr ( CommandLineWalker , L " 2> " ) != NULL ) {
Status = EFI_NOT_FOUND ;
}
2010-09-14 05:18:09 +00:00
}
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " 1> " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 8 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdOutFileName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
} else {
StdOutFileName = CommandLineWalker += 4 ;
OutAppend = FALSE ;
}
2021-12-05 14:54:13 -08:00
2011-03-25 22:23:05 +00:00
if ( StrStr ( CommandLineWalker , L " 1> " ) != NULL ) {
Status = EFI_NOT_FOUND ;
}
2010-09-14 05:18:09 +00:00
}
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " > " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 6 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdOutFileName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
} else {
StdOutFileName = CommandLineWalker += 3 ;
OutAppend = FALSE ;
}
2021-12-05 14:54:13 -08:00
2011-03-25 22:23:05 +00:00
if ( StrStr ( CommandLineWalker , L " > " ) != NULL ) {
Status = EFI_NOT_FOUND ;
}
2010-09-14 05:18:09 +00:00
}
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " < " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 6 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdInFileName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
} else {
StdInFileName = CommandLineWalker += 3 ;
2011-03-25 22:23:05 +00:00
}
2021-12-05 14:54:13 -08:00
2011-03-25 22:23:05 +00:00
if ( StrStr ( CommandLineWalker , L " < " ) != NULL ) {
Status = EFI_NOT_FOUND ;
2010-09-14 05:18:09 +00:00
}
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " <a " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 8 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdInFileName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
} else {
2011-03-25 22:23:05 +00:00
StdInFileName = CommandLineWalker += 4 ;
InUnicode = FALSE ;
2015-10-15 02:43:31 +00:00
AsciiRedirection = TRUE ;
2011-03-25 22:23:05 +00:00
}
2021-12-05 14:54:13 -08:00
2011-03-25 22:23:05 +00:00
if ( StrStr ( CommandLineWalker , L " <a " ) != NULL ) {
Status = EFI_NOT_FOUND ;
2010-09-14 05:18:09 +00:00
}
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status ) && (( CommandLineWalker = StrStr ( CommandLineCopy , L " <v " )) != NULL )) {
2011-03-30 21:04:57 +00:00
FirstLocation = MIN ( CommandLineWalker , FirstLocation );
2011-03-25 22:23:05 +00:00
SetMem16 ( CommandLineWalker , 8 , L ' ' );
2010-09-14 05:18:09 +00:00
if ( StdInVarName != NULL ) {
Status = EFI_INVALID_PARAMETER ;
} else {
StdInVarName = CommandLineWalker += 4 ;
2011-03-25 22:23:05 +00:00
}
2021-12-05 14:54:13 -08:00
2011-03-25 22:23:05 +00:00
if ( StrStr ( CommandLineWalker , L " <v " ) != NULL ) {
Status = EFI_NOT_FOUND ;
2010-09-14 05:18:09 +00:00
}
}
2011-11-11 16:52:09 +00:00
//
// re-populate the string to support any filenames that were in quotes.
//
2015-06-30 03:18:31 +00:00
StrnCpyS ( CommandLineCopy , StrSize ( CommandLineCopy ) / sizeof ( CHAR16 ), NewCommandLine , StrLen ( NewCommandLine ));
2011-11-11 16:52:09 +00:00
2011-04-01 16:11:59 +00:00
if ( ( FirstLocation != CommandLineCopy + StrLen ( CommandLineCopy ))
2017-01-23 14:38:43 +08:00
&& ((( UINTN ) FirstLocation - ( UINTN ) CommandLineCopy ) / sizeof ( CHAR16 ) < StrLen ( NewCommandLine ))
2011-03-30 21:04:57 +00:00
)
{
2017-01-23 14:38:43 +08:00
* ( NewCommandLine + (( UINTN ) FirstLocation - ( UINTN ) CommandLineCopy ) / sizeof ( CHAR16 )) = CHAR_NULL ;
2011-03-30 21:04:57 +00:00
}
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status )) {
2011-11-11 16:52:09 +00:00
if ( StdErrFileName != NULL ) {
if (( StdErrFileName = FixFileName ( StdErrFileName )) == NULL ) {
Status = EFI_INVALID_PARAMETER ;
}
2010-09-14 05:18:09 +00:00
}
2021-12-05 14:54:13 -08:00
2011-11-11 16:52:09 +00:00
if ( StdOutFileName != NULL ) {
if (( StdOutFileName = FixFileName ( StdOutFileName )) == NULL ) {
Status = EFI_INVALID_PARAMETER ;
}
2010-09-14 05:18:09 +00:00
}
2021-12-05 14:54:13 -08:00
2011-11-11 16:52:09 +00:00
if ( StdInFileName != NULL ) {
if (( StdInFileName = FixFileName ( StdInFileName )) == NULL ) {
Status = EFI_INVALID_PARAMETER ;
}
2010-09-14 05:18:09 +00:00
}
2021-12-05 14:54:13 -08:00
2011-11-11 16:52:09 +00:00
if ( StdErrVarName != NULL ) {
2013-11-15 18:39:26 +00:00
if (( StdErrVarName = FixVarName ( StdErrVarName )) == NULL ) {
2011-11-11 16:52:09 +00:00
Status = EFI_INVALID_PARAMETER ;
}
2010-09-14 05:18:09 +00:00
}
2021-12-05 14:54:13 -08:00
2011-11-11 16:52:09 +00:00
if ( StdOutVarName != NULL ) {
2013-11-15 18:39:26 +00:00
if (( StdOutVarName = FixVarName ( StdOutVarName )) == NULL ) {
2011-11-11 16:52:09 +00:00
Status = EFI_INVALID_PARAMETER ;
}
2010-09-14 05:18:09 +00:00
}
2021-12-05 14:54:13 -08:00
2011-11-11 16:52:09 +00:00
if ( StdInVarName != NULL ) {
2013-11-15 18:39:26 +00:00
if (( StdInVarName = FixVarName ( StdInVarName )) == NULL ) {
2011-11-11 16:52:09 +00:00
Status = EFI_INVALID_PARAMETER ;
}
2010-09-14 05:18:09 +00:00
}
2011-03-30 21:05:25 +00:00
//
// Verify not the same and not duplicating something from a split
//
2011-03-25 22:23:05 +00:00
if (
//
// Check that no 2 filenames are the same
//
2011-03-30 21:04:57 +00:00
(( StdErrFileName != NULL ) && ( StdOutFileName != NULL ) && ( StringNoCaseCompare ( & StdErrFileName , & StdOutFileName ) == 0 ))
2010-09-14 05:18:09 +00:00
|| (( StdErrFileName != NULL ) && ( StdInFileName != NULL ) && ( StringNoCaseCompare ( & StdErrFileName , & StdInFileName ) == 0 ))
|| (( StdOutFileName != NULL ) && ( StdInFileName != NULL ) && ( StringNoCaseCompare ( & StdOutFileName , & StdInFileName ) == 0 ))
2011-03-25 22:23:05 +00:00
//
// Check that no 2 variable names are the same
//
2010-09-14 05:18:09 +00:00
|| (( StdErrVarName != NULL ) && ( StdInVarName != NULL ) && ( StringNoCaseCompare ( & StdErrVarName , & StdInVarName ) == 0 ))
|| (( StdOutVarName != NULL ) && ( StdInVarName != NULL ) && ( StringNoCaseCompare ( & StdOutVarName , & StdInVarName ) == 0 ))
|| (( StdErrVarName != NULL ) && ( StdOutVarName != NULL ) && ( StringNoCaseCompare ( & StdErrVarName , & StdOutVarName ) == 0 ))
2011-03-25 22:23:05 +00:00
//
// When a split (using | operator) is in place some are not allowed
//
2010-09-14 05:18:09 +00:00
|| (( Split != NULL ) && ( Split -> SplitStdIn != NULL ) && (( StdInVarName != NULL ) || ( StdInFileName != NULL )))
|| (( Split != NULL ) && ( Split -> SplitStdOut != NULL ) && (( StdOutVarName != NULL ) || ( StdOutFileName != NULL )))
2011-03-25 22:23:05 +00:00
//
// Check that nothing is trying to be output to 2 locations.
//
2010-09-14 05:18:09 +00:00
|| (( StdErrFileName != NULL ) && ( StdErrVarName != NULL ))
|| (( StdOutFileName != NULL ) && ( StdOutVarName != NULL ))
|| (( StdInFileName != NULL ) && ( StdInVarName != NULL ))
2011-03-25 22:23:05 +00:00
//
// Check for no volatile environment variables
//
2016-07-08 15:18:14 +08:00
|| (( StdErrVarName != NULL ) && ! EFI_ERROR ( IsVolatileEnv ( StdErrVarName , & Volatile )) && ! Volatile )
|| (( StdOutVarName != NULL ) && ! EFI_ERROR ( IsVolatileEnv ( StdOutVarName , & Volatile )) && ! Volatile )
2011-03-25 22:23:05 +00:00
//
// Cant redirect during a reconnect operation.
//
2018-06-27 21:13:38 +08:00
|| ( ( StrStr ( NewCommandLine , L "connect -r" ) != NULL )
2010-10-04 16:24:30 +00:00
&& (( StdOutVarName != NULL ) || ( StdOutFileName != NULL ) || ( StdErrFileName != NULL ) || ( StdErrVarName != NULL )))
2011-03-25 22:23:05 +00:00
//
// Check that filetypes (Unicode/Ascii) do not change during an append
//
|| (( StdOutFileName != NULL ) && OutUnicode && OutAppend && ( ! EFI_ERROR ( ShellFileExists ( StdOutFileName )) && EFI_ERROR ( IsUnicodeFile ( StdOutFileName ))))
|| (( StdErrFileName != NULL ) && ErrUnicode && ErrAppend && ( ! EFI_ERROR ( ShellFileExists ( StdErrFileName )) && EFI_ERROR ( IsUnicodeFile ( StdErrFileName ))))
|| (( StdOutFileName != NULL ) && ! OutUnicode && OutAppend && ( ! EFI_ERROR ( ShellFileExists ( StdOutFileName )) && ! EFI_ERROR ( IsUnicodeFile ( StdOutFileName ))))
|| (( StdErrFileName != NULL ) && ! ErrUnicode && ErrAppend && ( ! EFI_ERROR ( ShellFileExists ( StdErrFileName )) && ! EFI_ERROR ( IsUnicodeFile ( StdErrFileName ))))
2010-09-14 05:18:09 +00:00
)
{
Status = EFI_INVALID_PARAMETER ;
2011-06-15 22:25:14 +00:00
ShellParameters -> StdIn = * OldStdIn ;
ShellParameters -> StdOut = * OldStdOut ;
ShellParameters -> StdErr = * OldStdErr ;
2011-03-30 21:04:57 +00:00
} else if ( ! EFI_ERROR ( Status )) {
2010-09-14 05:18:09 +00:00
//
// Open the Std<Whatever> and we should not have conflicts here...
//
//
// StdErr to a file
//
if ( StdErrFileName != NULL ) {
if ( ! ErrAppend ) {
//
// delete existing file.
//
ShellInfoObject . NewEfiShellProtocol -> DeleteFileByName ( StdErrFileName );
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
Status = ShellOpenFileByName ( StdErrFileName , & TempHandle , EFI_FILE_MODE_WRITE | EFI_FILE_MODE_READ | EFI_FILE_MODE_CREATE , 0 );
if ( ! ErrAppend && ErrUnicode && ! EFI_ERROR ( Status )) {
2014-07-31 15:44:30 +00:00
Status = WriteFileTag ( TempHandle );
2010-09-14 05:18:09 +00:00
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if ( ! ErrUnicode && ! EFI_ERROR ( Status )) {
TempHandle = CreateFileInterfaceFile ( TempHandle , FALSE );
2024-10-03 10:30:15 -07:00
if ( TempHandle == NULL ) {
ASSERT ( TempHandle != NULL );
Status = EFI_OUT_OF_RESOURCES ;
}
2010-09-14 05:18:09 +00:00
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status )) {
ShellParameters -> StdErr = TempHandle ;
2013-10-24 17:47:57 +00:00
gST -> StdErr = CreateSimpleTextOutOnFile ( TempHandle , & gST -> StandardErrorHandle , gST -> StdErr );
2010-09-14 05:18:09 +00:00
}
}
//
// StdOut to a file
//
if ( ! EFI_ERROR ( Status ) && ( StdOutFileName != NULL )) {
if ( ! OutAppend ) {
//
// delete existing file.
//
ShellInfoObject . NewEfiShellProtocol -> DeleteFileByName ( StdOutFileName );
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
Status = ShellOpenFileByName ( StdOutFileName , & TempHandle , EFI_FILE_MODE_WRITE | EFI_FILE_MODE_READ | EFI_FILE_MODE_CREATE , 0 );
2010-10-04 16:24:30 +00:00
if ( TempHandle == NULL ) {
Status = EFI_INVALID_PARAMETER ;
} else {
2016-09-22 12:12:47 -07:00
if ( gUnicodeCollation -> MetaiMatch ( gUnicodeCollation , StdOutFileName , L "NUL" )) {
2011-03-25 22:23:05 +00:00
// no-op
} else if ( ! OutAppend && OutUnicode && ! EFI_ERROR ( Status )) {
2014-07-31 15:44:30 +00:00
Status = WriteFileTag ( TempHandle );
2010-10-04 16:24:30 +00:00
} else if ( OutAppend ) {
Status = ShellInfoObject . NewEfiShellProtocol -> GetFileSize ( TempHandle , & FileSize );
if ( ! EFI_ERROR ( Status )) {
2014-07-31 15:44:43 +00:00
//
// When appending to a new unicode file, write the file tag.
// Otherwise (ie. when appending to a new ASCII file, or an
// existent file with any encoding), just seek to the end.
//
Status = ( FileSize == 0 && OutUnicode ) ?
WriteFileTag ( TempHandle ) :
ShellInfoObject . NewEfiShellProtocol -> SetFilePosition (
TempHandle ,
FileSize
);
2010-10-04 16:24:30 +00:00
}
}
2021-12-05 14:54:13 -08:00
2010-10-04 16:24:30 +00:00
if ( ! OutUnicode && ! EFI_ERROR ( Status )) {
TempHandle = CreateFileInterfaceFile ( TempHandle , FALSE );
2024-10-03 10:30:15 -07:00
if ( TempHandle == NULL ) {
ASSERT ( TempHandle != NULL );
Status = EFI_OUT_OF_RESOURCES ;
}
2010-10-04 16:24:30 +00:00
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if ( ! EFI_ERROR ( Status )) {
2010-10-04 16:24:30 +00:00
ShellParameters -> StdOut = TempHandle ;
2013-10-24 17:47:57 +00:00
gST -> ConOut = CreateSimpleTextOutOnFile ( TempHandle , & gST -> ConsoleOutHandle , gST -> ConOut );
2010-09-14 05:18:09 +00:00
}
}
}
//
// StdOut to a var
//
if ( ! EFI_ERROR ( Status ) && ( StdOutVarName != NULL )) {
if ( ! OutAppend ) {
//
// delete existing variable.
//
SHELL_SET_ENVIRONMENT_VARIABLE_V ( StdOutVarName , 0 , L "" );
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
TempHandle = CreateFileInterfaceEnv ( StdOutVarName );
2024-10-03 10:30:15 -07:00
if ( TempHandle == NULL ) {
ASSERT ( TempHandle != NULL );
Status = EFI_OUT_OF_RESOURCES ;
} else {
ShellParameters -> StdOut = TempHandle ;
gST -> ConOut = CreateSimpleTextOutOnFile ( TempHandle , & gST -> ConsoleOutHandle , gST -> ConOut );
}
2010-09-14 05:18:09 +00:00
}
//
// StdErr to a var
//
if ( ! EFI_ERROR ( Status ) && ( StdErrVarName != NULL )) {
if ( ! ErrAppend ) {
//
// delete existing variable.
//
SHELL_SET_ENVIRONMENT_VARIABLE_V ( StdErrVarName , 0 , L "" );
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
TempHandle = CreateFileInterfaceEnv ( StdErrVarName );
2024-10-03 10:30:15 -07:00
if ( TempHandle == NULL ) {
ASSERT ( TempHandle != NULL );
Status = EFI_OUT_OF_RESOURCES ;
} else {
ShellParameters -> StdErr = TempHandle ;
gST -> StdErr = CreateSimpleTextOutOnFile ( TempHandle , & gST -> StandardErrorHandle , gST -> StdErr );
}
2010-09-14 05:18:09 +00:00
}
//
// StdIn from a var
//
if ( ! EFI_ERROR ( Status ) && ( StdInVarName != NULL )) {
TempHandle = CreateFileInterfaceEnv ( StdInVarName );
2011-10-14 19:21:13 +00:00
if ( TempHandle == NULL ) {
Status = EFI_OUT_OF_RESOURCES ;
2010-09-14 05:18:09 +00:00
} else {
2011-10-14 19:21:13 +00:00
if ( ! InUnicode ) {
TempHandle = CreateFileInterfaceFile ( TempHandle , FALSE );
}
2021-12-05 14:54:13 -08:00
2011-10-14 19:21:13 +00:00
Size = 0 ;
2011-10-22 04:10:30 +00:00
if (( TempHandle == NULL ) || ((( EFI_FILE_PROTOCOL * ) TempHandle ) -> Read ( TempHandle , & Size , NULL ) != EFI_BUFFER_TOO_SMALL )) {
2011-10-14 19:21:13 +00:00
Status = EFI_INVALID_PARAMETER ;
} else {
ShellParameters -> StdIn = TempHandle ;
gST -> ConIn = CreateSimpleTextInOnFile ( TempHandle , & gST -> ConsoleInHandle );
}
2010-09-14 05:18:09 +00:00
}
}
//
// StdIn from a file
//
if ( ! EFI_ERROR ( Status ) && ( StdInFileName != NULL )) {
Status = ShellOpenFileByName (
StdInFileName ,
& TempHandle ,
EFI_FILE_MODE_READ ,
0
);
if ( ! EFI_ERROR ( Status )) {
2016-03-08 20:51:43 +08:00
if ( ! InUnicode ) {
//
// Create the ASCII->Unicode conversion layer
//
TempHandle = CreateFileInterfaceFile ( TempHandle , FALSE );
}
2021-12-05 14:54:13 -08:00
2024-10-03 10:30:15 -07:00
if ( TempHandle == NULL ) {
Status = EFI_OUT_OF_RESOURCES ;
} else {
ShellParameters -> StdIn = TempHandle ;
gST -> ConIn = CreateSimpleTextInOnFile ( TempHandle , & gST -> ConsoleInHandle );
}
2010-09-14 05:18:09 +00:00
}
}
}
}
2010-11-16 22:31:47 +00:00
2011-10-13 23:05:08 +00:00
FreePool ( CommandLineCopy );
CalculateEfiHdrCrc ( & gST -> Hdr );
2021-12-05 14:54:13 -08:00
2010-11-16 22:31:47 +00:00
if (( gST -> ConIn == NULL ) || ( gST -> ConOut == NULL )) {
2013-12-13 23:53:59 +00:00
Status = EFI_OUT_OF_RESOURCES ;
2010-11-16 22:31:47 +00:00
}
2013-12-13 23:53:59 +00:00
if ( Status == EFI_NOT_FOUND ) {
ShellPrintHiiEx ( - 1 , - 1 , NULL , STRING_TOKEN ( STR_SHELL_REDUNDA_REDIR ), ShellInfoObject . HiiHandle );
} else if ( EFI_ERROR ( Status )) {
ShellPrintHiiEx ( - 1 , - 1 , NULL , STRING_TOKEN ( STR_SHELL_INVALID_REDIR ), ShellInfoObject . HiiHandle );
}
2010-09-14 05:18:09 +00:00
return ( Status );
}
/**
2020-02-07 02:08:20 +01:00
Function will replace the current StdIn and StdOut in the ShellParameters protocol
2010-09-14 05:18:09 +00:00
structure with StdIn and StdOut. The current values are de-allocated.
2011-09-02 08:05:34 +00:00
@param[in, out] ShellParameters Pointer to parameter structure to modify.
@param[in] OldStdIn Pointer to old StdIn.
@param[in] OldStdOut Pointer to old StdOut.
@param[in] OldStdErr Pointer to old StdErr.
@param[in] SystemTableInfo Pointer to old system table information.
2010-09-14 05:18:09 +00:00
**/
EFI_STATUS
RestoreStdInStdOutStdErr (
IN OUT EFI_SHELL_PARAMETERS_PROTOCOL * ShellParameters ,
2010-11-16 22:31:47 +00:00
IN SHELL_FILE_HANDLE * OldStdIn ,
IN SHELL_FILE_HANDLE * OldStdOut ,
IN SHELL_FILE_HANDLE * OldStdErr ,
IN SYSTEM_TABLE_INFO * SystemTableInfo
2010-09-14 05:18:09 +00:00
)
{
SPLIT_LIST * Split ;
2010-11-16 22:31:47 +00:00
2018-06-27 21:13:38 +08:00
if ( ( ShellParameters == NULL )
2010-11-16 22:31:47 +00:00
|| ( OldStdIn == NULL )
|| ( OldStdOut == NULL )
|| ( OldStdErr == NULL )
|| ( SystemTableInfo == NULL ))
{
return ( EFI_INVALID_PARAMETER );
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
if ( ! IsListEmpty ( & ShellInfoObject . SplitList . Link )) {
Split = ( SPLIT_LIST * ) GetFirstNode ( & ShellInfoObject . SplitList . Link );
} else {
Split = NULL ;
}
2021-12-05 14:54:13 -08:00
2010-11-16 22:31:47 +00:00
if ( ShellParameters -> StdIn != * OldStdIn ) {
2010-09-14 05:18:09 +00:00
if ((( Split != NULL ) && ( Split -> SplitStdIn != ShellParameters -> StdIn )) || ( Split == NULL )) {
gEfiShellProtocol -> CloseFile ( ShellParameters -> StdIn );
}
2021-12-05 14:54:13 -08:00
2010-11-16 22:31:47 +00:00
ShellParameters -> StdIn = * OldStdIn ;
2010-09-14 05:18:09 +00:00
}
2021-12-05 14:54:13 -08:00
2010-11-16 22:31:47 +00:00
if ( ShellParameters -> StdOut != * OldStdOut ) {
2010-09-14 05:18:09 +00:00
if ((( Split != NULL ) && ( Split -> SplitStdOut != ShellParameters -> StdOut )) || ( Split == NULL )) {
gEfiShellProtocol -> CloseFile ( ShellParameters -> StdOut );
}
2021-12-05 14:54:13 -08:00
2010-11-16 22:31:47 +00:00
ShellParameters -> StdOut = * OldStdOut ;
2010-09-14 05:18:09 +00:00
}
2021-12-05 14:54:13 -08:00
2010-11-16 22:31:47 +00:00
if ( ShellParameters -> StdErr != * OldStdErr ) {
gEfiShellProtocol -> CloseFile ( ShellParameters -> StdErr );
ShellParameters -> StdErr = * OldStdErr ;
}
if ( gST -> ConIn != SystemTableInfo -> ConIn ) {
CloseSimpleTextInOnFile ( gST -> ConIn );
gST -> ConIn = SystemTableInfo -> ConIn ;
gST -> ConsoleInHandle = SystemTableInfo -> ConInHandle ;
}
if ( gST -> ConOut != SystemTableInfo -> ConOut ) {
CloseSimpleTextOutOnFile ( gST -> ConOut );
gST -> ConOut = SystemTableInfo -> ConOut ;
gST -> ConsoleOutHandle = SystemTableInfo -> ConOutHandle ;
2021-12-05 14:54:13 -08:00
}
2012-08-17 03:58:17 +00:00
if ( gST -> StdErr != SystemTableInfo -> ErrOut ) {
2010-11-16 22:31:47 +00:00
CloseSimpleTextOutOnFile ( gST -> StdErr );
2012-08-17 03:58:17 +00:00
gST -> StdErr = SystemTableInfo -> ErrOut ;
gST -> StandardErrorHandle = SystemTableInfo -> ErrOutHandle ;
2021-12-05 14:54:13 -08:00
}
2011-10-13 23:05:08 +00:00
CalculateEfiHdrCrc ( & gST -> Hdr );
2010-09-14 05:18:09 +00:00
return ( EFI_SUCCESS );
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
/**
2020-02-07 02:08:20 +01:00
Function will replace the current Argc and Argv in the ShellParameters protocol
2010-09-14 05:18:09 +00:00
structure by parsing NewCommandLine. The current values are returned to the
user.
If OldArgv or OldArgc is NULL then that value is not returned.
2011-09-02 08:05:34 +00:00
@param[in, out] ShellParameters Pointer to parameter structure to modify.
@param[in] NewCommandLine The new command line to parse and use.
2015-11-09 02:29:31 +00:00
@param[in] Type The type of operation.
2011-09-02 08:05:34 +00:00
@param[out] OldArgv Pointer to old list of parameters.
@param[out] OldArgc Pointer to old number of items in Argv list.
2010-09-14 05:18:09 +00:00
2019-12-03 01:40:51 +08:00
2020-02-07 02:08:20 +01:00
@retval EFI_SUCCESS Operation was successful, Argv and Argc are valid.
2019-12-03 01:40:51 +08:00
@return EFI_INVALID_PARAMETER Some parameters are invalid.
2010-09-14 05:18:09 +00:00
@retval EFI_OUT_OF_RESOURCES A memory allocation failed.
**/
EFI_STATUS
UpdateArgcArgv (
IN OUT EFI_SHELL_PARAMETERS_PROTOCOL * ShellParameters ,
IN CONST CHAR16 * NewCommandLine ,
2015-11-09 02:29:31 +00:00
IN SHELL_OPERATION_TYPES Type ,
2010-09-14 05:18:09 +00:00
OUT CHAR16 *** OldArgv OPTIONAL ,
OUT UINTN * OldArgc OPTIONAL
)
{
2015-11-09 02:29:31 +00:00
BOOLEAN StripParamQuotation ;
2018-06-27 21:13:38 +08:00
2010-09-14 05:18:09 +00:00
ASSERT ( ShellParameters != NULL );
2015-11-09 02:29:31 +00:00
StripParamQuotation = TRUE ;
2010-09-14 05:18:09 +00:00
if ( OldArgc != NULL ) {
* OldArgc = ShellParameters -> Argc ;
}
2021-12-05 14:54:13 -08:00
2024-07-25 10:31:14 +02:00
if ( OldArgv != NULL ) {
2010-09-14 05:18:09 +00:00
* OldArgv = ShellParameters -> Argv ;
}
2015-11-09 02:29:31 +00:00
if ( Type == Script_File_Name ) {
StripParamQuotation = FALSE ;
}
2018-06-27 21:13:38 +08:00
return ParseCommandLineToArgs (
NewCommandLine ,
StripParamQuotation ,
& ( ShellParameters -> Argv ),
2015-11-09 02:29:31 +00:00
& ( ShellParameters -> Argc )
);
2010-09-14 05:18:09 +00:00
}
/**
2020-02-07 02:08:20 +01:00
Function will replace the current Argc and Argv in the ShellParameters protocol
2010-09-14 05:18:09 +00:00
structure with Argv and Argc. The current values are de-allocated and the
OldArgv must not be deallocated by the caller.
2011-09-02 08:05:34 +00:00
@param[in, out] ShellParameters pointer to parameter structure to modify
@param[in] OldArgv pointer to old list of parameters
@param[in] OldArgc pointer to old number of items in Argv list
2010-09-14 05:18:09 +00:00
**/
VOID
RestoreArgcArgv (
IN OUT EFI_SHELL_PARAMETERS_PROTOCOL * ShellParameters ,
IN CHAR16 *** OldArgv ,
IN UINTN * OldArgc
)
{
UINTN LoopCounter ;
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
ASSERT ( ShellParameters != NULL );
ASSERT ( OldArgv != NULL );
ASSERT ( OldArgc != NULL );
if ( ShellParameters -> Argv != NULL ) {
for ( LoopCounter = 0
; LoopCounter < ShellParameters -> Argc
; LoopCounter ++
)
{
FreePool ( ShellParameters -> Argv [ LoopCounter ]);
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
FreePool ( ShellParameters -> Argv );
}
2021-12-05 14:54:13 -08:00
2010-09-14 05:18:09 +00:00
ShellParameters -> Argv = * OldArgv ;
* OldArgv = NULL ;
ShellParameters -> Argc = * OldArgc ;
* OldArgc = 0 ;
}