/** @file | |
Provides interface to shell internal functions for shell commands. | |
This library is for use ONLY by shell commands linked into the shell application. | |
This library will not funciton if it is used for UEFI Shell 2.0 Applications. | |
(C) Copyright 2013-2014 Hewlett-Packard Development Company, L.P.<BR> | |
Copyright (c) 2009 - 2014, 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 | |
http://opensource.org/licenses/bsd-license.php. | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#ifndef _SHELL_COMMAND_LIB_ | |
#define _SHELL_COMMAND_LIB_ | |
#include <Uefi.h> | |
#include <ShellBase.h> | |
#include <Protocol/EfiShell.h> | |
#include <Protocol/EfiShellParameters.h> | |
#include <Protocol/UnicodeCollation.h> | |
#include <Protocol/SimpleFileSystem.h> | |
#include <Library/UefiBootServicesTableLib.h> | |
// | |
// The extern global protocol poionters. | |
// | |
extern EFI_UNICODE_COLLATION_PROTOCOL *gUnicodeCollation; | |
extern CONST CHAR16* SupportLevel[]; | |
// | |
// The map list objects. | |
// | |
typedef struct { | |
LIST_ENTRY Link; | |
EFI_DEVICE_PATH_PROTOCOL *DevicePath; | |
CHAR16 *MapName; | |
CHAR16 *CurrentDirectoryPath; | |
UINT64 Flags; | |
} SHELL_MAP_LIST; | |
/// List of Mappings - DeviceName and Drive Letter(ism). | |
extern SHELL_MAP_LIST gShellMapList; | |
/// Pointer to node of current directory in the mMapList. | |
extern SHELL_MAP_LIST *gShellCurDir; | |
/** | |
Returns the help MAN fileName for a given shell command. | |
@retval !NULL The unicode string of the MAN filename. | |
@retval NULL An error ocurred. | |
**/ | |
typedef | |
CONST CHAR16 * | |
(EFIAPI *SHELL_GET_MAN_FILENAME)( | |
VOID | |
); | |
/** | |
Runs a shell command on a given command line. | |
The specific operation of a given shell command is specified in the UEFI Shell | |
Specification 2.0, or in the source of the given command. | |
Upon completion of the command run the shell protocol and environment variables | |
may have been updated due to the operation. | |
@param[in] ImageHandle The ImageHandle to the app, or NULL if | |
the command built into shell. | |
@param[in] SystemTable The pointer to the system table. | |
@retval RETURN_SUCCESS The shell command was sucessful. | |
@retval RETURN_UNSUPPORTED The command is not supported. | |
**/ | |
typedef | |
SHELL_STATUS | |
(EFIAPI *SHELL_RUN_COMMAND)( | |
IN EFI_HANDLE ImageHandle, | |
IN EFI_SYSTEM_TABLE *SystemTable | |
); | |
/** | |
Registers the handlers of type SHELL_RUN_COMMAND and | |
SHELL_GET_MAN_FILENAME for each shell command. | |
If the ShellSupportLevel is greater than the value of | |
PcdShellSupportLevel, then return RETURN_UNSUPPORTED. | |
Registers the the handlers specified by GetHelpInfoHandler and CommandHandler | |
with the command specified by CommandString. If the command named by | |
CommandString has already been registered, then return | |
RETURN_ALREADY_STARTED. | |
If there are not enough resources available to register the handlers, then | |
RETURN_OUT_OF_RESOURCES is returned. | |
If CommandString is NULL, then ASSERT(). | |
If GetHelpInfoHandler is NULL, then ASSERT(). | |
If CommandHandler is NULL, then ASSERT(). | |
If ProfileName is NULL, then ASSERT(). | |
@param[in] CommandString The pointer to the command name. This is the | |
name to look for on the command line in | |
the shell. | |
@param[in] CommandHandler The pointer to a function that runs the | |
specified command. | |
@param[in] GetManFileName The pointer to a function that provides man | |
filename. | |
@param[in] ShellMinSupportLevel The minimum Shell Support Level which has this | |
function. | |
@param[in] ProfileName The profile name to require for support of this | |
function. | |
@param[in] CanAffectLE Indicates whether this command's return value | |
can change the LASTERROR environment variable. | |
@param[in] HiiHandle The handle of this command's HII entry. | |
@param[in] ManFormatHelp The HII locator for the help text. | |
@retval RETURN_SUCCESS The handlers were registered. | |
@retval RETURN_OUT_OF_RESOURCES There are not enough resources available to | |
register the shell command. | |
@retval RETURN_UNSUPPORTED The ShellMinSupportLevel was higher than the | |
currently allowed support level. | |
@retval RETURN_ALREADY_STARTED The CommandString represents a command that | |
is already registered. Only one handler set for | |
a given command is allowed. | |
@sa SHELL_GET_MAN_FILENAME | |
@sa SHELL_RUN_COMMAND | |
**/ | |
RETURN_STATUS | |
EFIAPI | |
ShellCommandRegisterCommandName ( | |
IN CONST CHAR16 *CommandString, | |
IN SHELL_RUN_COMMAND CommandHandler, | |
IN SHELL_GET_MAN_FILENAME GetManFileName, | |
IN UINT32 ShellMinSupportLevel, | |
IN CONST CHAR16 *ProfileName, | |
IN CONST BOOLEAN CanAffectLE, | |
IN CONST EFI_HANDLE HiiHandle, | |
IN CONST EFI_STRING_ID ManFormatHelp | |
); | |
/** | |
Checks if a command string has been registered for CommandString, and if so, it runs | |
the previously registered handler for that command with the command line. | |
If CommandString is NULL, then ASSERT(). | |
If Sections is specified, then each section name listed will be compared in a case sensitive | |
manner to the section names described in Appendix B UEFI Shell 2.0 Specification. If the section exists, | |
it is appended to the returned help text. If the section does not exist, no | |
information is returned. If Sections is NULL, then all help text information | |
available is returned. | |
@param[in] CommandString The pointer to the command name. This is the name | |
found on the command line in the shell. | |
@param[in, out] RetVal The pointer to the return value from the command handler. | |
@param[in, out] CanAffectLE Indicates whether this command's return value | |
needs to be placed into LASTERROR environment variable. | |
@retval RETURN_SUCCESS The handler was run. | |
@retval RETURN_NOT_FOUND The CommandString did not match a registered | |
command name. | |
@sa SHELL_RUN_COMMAND | |
**/ | |
RETURN_STATUS | |
EFIAPI | |
ShellCommandRunCommandHandler ( | |
IN CONST CHAR16 *CommandString, | |
IN OUT SHELL_STATUS *RetVal, | |
IN OUT BOOLEAN *CanAffectLE OPTIONAL | |
); | |
/** | |
Checks if a command string has been registered for CommandString, and if so, it | |
returns the MAN filename specified for that command. | |
If CommandString is NULL, then ASSERT(). | |
@param[in] CommandString The pointer to the command name. This is the name | |
found on the command line in the shell. | |
@retval NULL The CommandString was not a registered command. | |
@retval other The name of the MAN file. | |
@sa SHELL_GET_MAN_FILENAME | |
**/ | |
CONST CHAR16* | |
EFIAPI | |
ShellCommandGetManFileNameHandler ( | |
IN CONST CHAR16 *CommandString | |
); | |
typedef struct { | |
LIST_ENTRY Link; | |
CHAR16 *CommandString; | |
} COMMAND_LIST; | |
/** | |
Get the list of all available shell internal commands. This is a linked list, | |
via the LIST_ENTRY structure. Enumerate through it using the BaseLib linked | |
list functions. Do not modify the values. | |
@param[in] Sort TRUE to alphabetically sort the values first. FALSE otherwise. | |
@return A linked list of all available shell commands. | |
**/ | |
CONST COMMAND_LIST* | |
EFIAPI | |
ShellCommandGetCommandList ( | |
IN CONST BOOLEAN Sort | |
); | |
typedef struct { | |
LIST_ENTRY Link; | |
CHAR16 *CommandString; | |
CHAR16 *Alias; | |
} ALIAS_LIST; | |
/** | |
Registers aliases to be set as part of the initialization of the shell application. | |
If Command is NULL, then ASSERT(). | |
If Alias is NULL, then ASSERT(). | |
@param[in] Command The pointer to the Command. | |
@param[in] Alias The pointer to Alias. | |
@retval RETURN_SUCCESS The handlers were registered. | |
@retval RETURN_OUT_OF_RESOURCES There are not enough resources available to | |
register the shell command. | |
**/ | |
RETURN_STATUS | |
EFIAPI | |
ShellCommandRegisterAlias ( | |
IN CONST CHAR16 *Command, | |
IN CONST CHAR16 *Alias | |
); | |
/** | |
Get the list of all shell alias commands. This is a linked list, | |
via LIST_ENTRY structure. Enumerate through it using the BaseLib linked | |
list functions. Do not modify the values. | |
@return A linked list of all requested shell aliases. | |
**/ | |
CONST ALIAS_LIST* | |
EFIAPI | |
ShellCommandGetInitAliasList ( | |
VOID | |
); | |
/** | |
Determine if a given alias is on the list of built in aliases. | |
@param[in] Alias The alias to test for. | |
@retval TRUE The alias is a built in alias. | |
@retval FALSE The alias is not a built in alias. | |
**/ | |
BOOLEAN | |
EFIAPI | |
ShellCommandIsOnAliasList ( | |
IN CONST CHAR16 *Alias | |
); | |
/** | |
Checks if a command is already on the list. | |
@param[in] CommandString The command string to check for on the list. | |
@retval TRUE CommandString represents a registered command. | |
@retval FALSE CommandString does not represent a registered command. | |
**/ | |
BOOLEAN | |
EFIAPI | |
ShellCommandIsCommandOnList ( | |
IN CONST CHAR16 *CommandString | |
); | |
/** | |
Get the help text for a command. | |
@param[in] CommandString The command name. | |
@retval NULL No help text was found. | |
@return The string of the help text. The caller required to free. | |
**/ | |
CHAR16* | |
EFIAPI | |
ShellCommandGetCommandHelp ( | |
IN CONST CHAR16 *CommandString | |
); | |
/** | |
Function to make sure that the above pointers are valid. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
CommandInit ( | |
VOID | |
); | |
/** | |
Function to determine current state of ECHO. Echo determines if lines from scripts | |
and ECHO commands are enabled. | |
@retval TRUE Echo is currently enabled. | |
@retval FALSE Echo is currently disabled. | |
**/ | |
BOOLEAN | |
EFIAPI | |
ShellCommandGetEchoState ( | |
VOID | |
); | |
/** | |
Function to set current state of ECHO. Echo determines if lines from scripts | |
and ECHO commands are enabled. | |
@param[in] State TRUE to enable Echo, FALSE otherwise. | |
**/ | |
VOID | |
EFIAPI | |
ShellCommandSetEchoState ( | |
IN BOOLEAN State | |
); | |
/** | |
Indicate that the current shell or script should exit. | |
@param[in] ScriptOnly TRUE if exiting a script; FALSE otherwise. | |
@param[in] ErrorCode The 64 bit error code to return. | |
**/ | |
VOID | |
EFIAPI | |
ShellCommandRegisterExit ( | |
IN BOOLEAN ScriptOnly, | |
IN CONST UINT64 ErrorCode | |
); | |
/** | |
Retrieve the Exit code. | |
@return the value passed into RegisterExit. | |
**/ | |
UINT64 | |
EFIAPI | |
ShellCommandGetExitCode ( | |
VOID | |
); | |
/** | |
Retrieve the Exit indicator. | |
@retval TRUE Exit was indicated. | |
@retval FALSE Exit was not indicated. | |
**/ | |
BOOLEAN | |
EFIAPI | |
ShellCommandGetExit ( | |
VOID | |
); | |
/** | |
Retrieve the Exit script indicator. | |
If ShellCommandGetExit returns FALSE, then the return from this is undefined. | |
@retval TRUE ScriptOnly was indicated. | |
@retval FALSE ScriptOnly was not indicated. | |
**/ | |
BOOLEAN | |
EFIAPI | |
ShellCommandGetScriptExit ( | |
VOID | |
); | |
typedef struct { | |
LIST_ENTRY Link; ///< List enumerator items. | |
UINTN Line; ///< What line of the script file this was on. | |
CHAR16 *Cl; ///< The original command line. | |
VOID *Data; ///< The data structure format dependant upon Command. (not always used) | |
BOOLEAN Reset; ///< Reset the command (it must be treated like a initial run (but it may have data already)) | |
} SCRIPT_COMMAND_LIST; | |
typedef struct { | |
CHAR16 *ScriptName; ///< The filename of this script. | |
CHAR16 **Argv; ///< The parmameters to the script file. | |
UINTN Argc; ///< The count of parameters. | |
LIST_ENTRY CommandList; ///< The script converted to a list of commands (SCRIPT_COMMAND_LIST objects). | |
SCRIPT_COMMAND_LIST *CurrentCommand; ///< The command currently being operated. If !=NULL must be a member of CommandList. | |
LIST_ENTRY SubstList; ///< A list of current script loop alias' (ALIAS_LIST objects) (Used for the for %-based replacement). | |
} SCRIPT_FILE; | |
/** | |
Function to return a pointer to the currently running script file object. | |
@retval NULL A script file is not currently running. | |
@return A pointer to the current script file object. | |
**/ | |
SCRIPT_FILE* | |
EFIAPI | |
ShellCommandGetCurrentScriptFile ( | |
VOID | |
); | |
/** | |
Function to set a new script as the currently running one. | |
This function will correctly stack and unstack nested scripts. | |
@param[in] Script The pointer to new script information structure. If NULL, | |
it removes and de-allocates the topmost Script structure. | |
@return A pointer to the current running script file after this | |
change. It is NULL if removing the final script. | |
**/ | |
SCRIPT_FILE* | |
EFIAPI | |
ShellCommandSetNewScript ( | |
IN SCRIPT_FILE *Script OPTIONAL | |
); | |
/** | |
Function to cleanup all memory from a SCRIPT_FILE structure. | |
@param[in] Script The pointer to the structure to cleanup. | |
**/ | |
VOID | |
EFIAPI | |
DeleteScriptFileStruct ( | |
IN SCRIPT_FILE *Script | |
); | |
/** | |
Function to get the current Profile string. | |
This is used to retrieve what profiles were installed. | |
@retval NULL There are no installed profiles. | |
@return A semicolon-delimited list of profiles. | |
**/ | |
CONST CHAR16 * | |
EFIAPI | |
ShellCommandGetProfileList ( | |
VOID | |
); | |
typedef enum { | |
MappingTypeFileSystem, | |
MappingTypeBlockIo, | |
MappingTypeMax | |
} SHELL_MAPPING_TYPE; | |
/** | |
Function to generate the next default mapping name. | |
If the return value is not NULL then it must be callee freed. | |
@param Type What kind of mapping name to make. | |
@retval NULL a memory allocation failed. | |
@return a new map name string | |
**/ | |
CHAR16* | |
EFIAPI | |
ShellCommandCreateNewMappingName( | |
IN CONST SHELL_MAPPING_TYPE Type | |
); | |
/** | |
Function to initialize the table for creating consistent map names. | |
@param[out] Table The pointer to pointer to pointer to DevicePathProtocol object. | |
@retval EFI_SUCCESS The table was created successfully. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
ShellCommandConsistMappingInitialize ( | |
EFI_DEVICE_PATH_PROTOCOL ***Table | |
); | |
/** | |
Function to uninitialize the table for creating consistent map names. | |
The parameter must have been received from ShellCommandConsistMappingInitialize. | |
@param[out] Table The pointer to pointer to DevicePathProtocol object. | |
@retval EFI_SUCCESS The table was deleted successfully. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
ShellCommandConsistMappingUnInitialize ( | |
EFI_DEVICE_PATH_PROTOCOL **Table | |
); | |
/** | |
Create a consistent mapped name for the device specified by DevicePath | |
based on the Table. | |
This must be called after ShellCommandConsistMappingInitialize() and | |
before ShellCommandConsistMappingUnInitialize() is called. | |
@param[in] DevicePath The pointer to the dev path for the device. | |
@param[in] Table The Table of mapping information. | |
@retval NULL A consistent mapped name could not be created. | |
@return A pointer to a string allocated from pool with the device name. | |
**/ | |
CHAR16* | |
EFIAPI | |
ShellCommandConsistMappingGenMappingName ( | |
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, | |
IN EFI_DEVICE_PATH_PROTOCOL **Table | |
); | |
/** | |
Function to search the list of mappings for the first matching node on the | |
list based on the MapKey. | |
@param[in] MapKey The pointer to the string key to search for in the map. | |
@return the node on the list. | |
**/ | |
SHELL_MAP_LIST* | |
EFIAPI | |
ShellCommandFindMapItem ( | |
IN CONST CHAR16 *MapKey | |
); | |
/** | |
Function to add a map node to the list of map items and update the "path" environment variable (optionally). | |
If Path is TRUE (during initialization only), the path environment variable will also be updated to include | |
default paths on the new map name... | |
Path should be FALSE when this function is called from the protocol SetMap function. | |
@param[in] Name The human readable mapped name. | |
@param[in] DevicePath The Device Path for this map. | |
@param[in] Flags The Flags attribute for this map item. | |
@param[in] Path TRUE to update path, FALSE to skip this step (should only be TRUE during initialization). | |
@retval EFI_SUCCESS The addition was sucessful. | |
@retval EFI_OUT_OF_RESOURCES A memory allocation failed. | |
@retval EFI_INVALID_PARAMETER A parameter was invalid. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
ShellCommandAddMapItemAndUpdatePath( | |
IN CONST CHAR16 *Name, | |
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, | |
IN CONST UINT64 Flags, | |
IN CONST BOOLEAN Path | |
); | |
/** | |
Creates the default map names for each device path in the system with | |
a protocol depending on the Type. | |
Also sets up the default path environment variable if Type is FileSystem. | |
@retval EFI_SUCCESS All map names were created sucessfully. | |
@retval EFI_NOT_FOUND No protocols were found in the system. | |
@return Error returned from gBS->LocateHandle(). | |
@sa LocateHandle | |
**/ | |
EFI_STATUS | |
EFIAPI | |
ShellCommandCreateInitialMappingsAndPaths( | |
VOID | |
); | |
/** | |
Add mappings for any devices without one. Do not change any existing maps. | |
@retval EFI_SUCCESS The operation was successful. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
ShellCommandUpdateMapping ( | |
VOID | |
); | |
/** | |
Converts a SHELL_FILE_HANDLE to an EFI_FILE_PROTOCOL*. | |
@param[in] Handle The SHELL_FILE_HANDLE to convert. | |
@return a EFI_FILE_PROTOCOL* representing the same file. | |
**/ | |
EFI_FILE_PROTOCOL* | |
EFIAPI | |
ConvertShellHandleToEfiFileProtocol( | |
IN CONST SHELL_FILE_HANDLE Handle | |
); | |
/** | |
Remove a SHELL_FILE_HANDLE frmo the list of SHELL_FILE_HANDLES. | |
@param[in] Handle The SHELL_FILE_HANDLE to remove. | |
@retval TRUE The item was removed. | |
@retval FALSE The item was not found. | |
**/ | |
BOOLEAN | |
EFIAPI | |
ShellFileHandleRemove( | |
IN CONST SHELL_FILE_HANDLE Handle | |
); | |
/** | |
Converts a EFI_FILE_PROTOCOL* to an SHELL_FILE_HANDLE. | |
@param[in] Handle The pointer to EFI_FILE_PROTOCOL to convert. | |
@param[in] Path The path to the file for verification. | |
@return a SHELL_FILE_HANDLE representing the same file. | |
**/ | |
SHELL_FILE_HANDLE | |
EFIAPI | |
ConvertEfiFileProtocolToShellHandle( | |
IN CONST EFI_FILE_PROTOCOL *Handle, | |
IN CONST CHAR16 *Path | |
); | |
/** | |
Find the path that was logged with the specified SHELL_FILE_HANDLE. | |
@param[in] Handle The SHELL_FILE_HANDLE to query on. | |
@return A pointer to the path for the file. | |
**/ | |
CONST CHAR16* | |
EFIAPI | |
ShellFileHandleGetPath( | |
IN CONST SHELL_FILE_HANDLE Handle | |
); | |
/** | |
Function to determine if a SHELL_FILE_HANDLE is at the end of the file. | |
This will NOT work on directories. | |
If Handle is NULL, then ASSERT. | |
@param[in] Handle the file handle | |
@retval TRUE the position is at the end of the file | |
@retval FALSE the position is not at the end of the file | |
**/ | |
BOOLEAN | |
EFIAPI | |
ShellFileHandleEof( | |
IN SHELL_FILE_HANDLE Handle | |
); | |
typedef struct { | |
LIST_ENTRY Link; | |
void *Buffer; | |
} BUFFER_LIST; | |
/** | |
Frees any BUFFER_LIST defined type. | |
@param[in] List The pointer to the list head. | |
**/ | |
VOID | |
EFIAPI | |
FreeBufferList ( | |
IN BUFFER_LIST *List | |
); | |
#endif //_SHELL_COMMAND_LIB_ |