Home | History | Annotate | Download | only in Shell
      1 /** @file
      2   function definitions for internal to shell functions.
      3 
      4   (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>
      5   Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions of the BSD License
      8   which accompanies this distribution.  The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #ifndef _SHELL_INTERNAL_HEADER_
     17 #define _SHELL_INTERNAL_HEADER_
     18 
     19 #include <Uefi.h>
     20 #include <ShellBase.h>
     21 
     22 #include <Guid/ShellVariableGuid.h>
     23 #include <Guid/ShellAliasGuid.h>
     24 
     25 #include <Protocol/LoadedImage.h>
     26 #include <Protocol/SimpleTextOut.h>
     27 #include <Protocol/EfiShell.h>
     28 #include <Protocol/EfiShellInterface.h>
     29 #include <Protocol/EfiShellEnvironment2.h>
     30 #include <Protocol/EfiShellParameters.h>
     31 #include <Protocol/BlockIo.h>
     32 
     33 #include <Library/BaseLib.h>
     34 #include <Library/UefiApplicationEntryPoint.h>
     35 #include <Library/UefiLib.h>
     36 #include <Library/DebugLib.h>
     37 #include <Library/MemoryAllocationLib.h>
     38 #include <Library/ShellCommandLib.h>
     39 #include <Library/UefiRuntimeServicesTableLib.h>
     40 #include <Library/UefiBootServicesTableLib.h>
     41 #include <Library/DevicePathLib.h>
     42 #include <Library/BaseMemoryLib.h>
     43 #include <Library/PcdLib.h>
     44 #include <Library/ShellLib.h>
     45 #include <Library/SortLib.h>
     46 #include <Library/HiiLib.h>
     47 #include <Library/PrintLib.h>
     48 #include <Library/HandleParsingLib.h>
     49 #include <Library/FileHandleLib.h>
     50 
     51 #include "ShellParametersProtocol.h"
     52 #include "ShellProtocol.h"
     53 #include "ShellEnvVar.h"
     54 #include "ConsoleLogger.h"
     55 #include "ShellManParser.h"
     56 #include "ConsoleWrappers.h"
     57 #include "FileHandleWrappers.h"
     58 
     59 typedef struct {
     60   LIST_ENTRY        Link;           ///< Standard linked list handler.
     61   SHELL_FILE_HANDLE *SplitStdOut;   ///< ConsoleOut for use in the split.
     62   SHELL_FILE_HANDLE *SplitStdIn;    ///< ConsoleIn for use in the split.
     63 } SPLIT_LIST;
     64 
     65 typedef struct {
     66   UINT32  Startup:1;      ///< Was "-startup"       found on command line.
     67   UINT32  NoStartup:1;    ///< Was "-nostartup"     found on command line.
     68   UINT32  NoConsoleOut:1; ///< Was "-noconsoleout"  found on command line.
     69   UINT32  NoConsoleIn:1;  ///< Was "-noconsolein"   found on command line.
     70   UINT32  NoInterrupt:1;  ///< Was "-nointerrupt"   found on command line.
     71   UINT32  NoMap:1;        ///< Was "-nomap"         found on command line.
     72   UINT32  NoVersion:1;    ///< Was "-noversion"     found on command line.
     73   UINT32  Delay:1;        ///< Was "-delay[:n]      found on command line
     74   UINT32  Exit:1;         ///< Was "-_exit"          found on command line
     75   UINT32  Reserved:7;     ///< Extra bits
     76 } SHELL_BITS;
     77 
     78 typedef union {
     79   SHELL_BITS  Bits;
     80   UINT16      AllBits;
     81 } SHELL_BIT_UNION;
     82 
     83 typedef struct {
     84   SHELL_BIT_UNION BitUnion;
     85   UINTN           Delay;          ///< Seconds of delay default:5.
     86   CHAR16          *FileName;      ///< Filename to run upon successful initialization.
     87   CHAR16          *FileOptions;   ///< Options to pass to FileName.
     88 } SHELL_INIT_SETTINGS;
     89 
     90 typedef struct {
     91   BUFFER_LIST                 CommandHistory;
     92   UINTN                       VisibleRowNumber;
     93   UINTN                       OriginalVisibleRowNumber;
     94   BOOLEAN                     InsertMode;           ///< Is the current typing mode insert (FALSE = overwrite).
     95 } SHELL_VIEWING_SETTINGS;
     96 
     97 typedef struct {
     98   EFI_SHELL_PARAMETERS_PROTOCOL *NewShellParametersProtocol;
     99   EFI_SHELL_PROTOCOL            *NewEfiShellProtocol;
    100   BOOLEAN                       PageBreakEnabled;
    101   BOOLEAN                       RootShellInstance;
    102   SHELL_INIT_SETTINGS           ShellInitSettings;
    103   BUFFER_LIST                   BufferToFreeList;     ///< List of buffers that were returned to the user to free.
    104   SHELL_VIEWING_SETTINGS        ViewingSettings;
    105   EFI_HII_HANDLE                HiiHandle;            ///< Handle from HiiLib.
    106   UINTN                         LogScreenCount;       ///< How many screens of log information to save.
    107   EFI_EVENT                     UserBreakTimer;       ///< Timer event for polling for CTRL-C.
    108   EFI_DEVICE_PATH_PROTOCOL      *ImageDevPath;        ///< DevicePath for ourselves.
    109   EFI_DEVICE_PATH_PROTOCOL      *FileDevPath;         ///< DevicePath for ourselves.
    110   CONSOLE_LOGGER_PRIVATE_DATA   *ConsoleInfo;         ///< Pointer for ConsoleInformation.
    111   EFI_SHELL_PARAMETERS_PROTOCOL *OldShellParameters;  ///< old shell parameters to reinstall upon exiting.
    112   SHELL_PROTOCOL_HANDLE_LIST    OldShellList;         ///< List of other instances to reinstall when closing.
    113   SPLIT_LIST                    SplitList;            ///< List of Splits in FILO stack.
    114   VOID                          *CtrlCNotifyHandle1;  ///< The NotifyHandle returned from SimpleTextInputEx.RegisterKeyNotify.
    115   VOID                          *CtrlCNotifyHandle2;  ///< The NotifyHandle returned from SimpleTextInputEx.RegisterKeyNotify.
    116   VOID                          *CtrlCNotifyHandle3;  ///< The NotifyHandle returned from SimpleTextInputEx.RegisterKeyNotify.
    117   VOID                          *CtrlCNotifyHandle4;  ///< The NotifyHandle returned from SimpleTextInputEx.RegisterKeyNotify.
    118   VOID                          *CtrlSNotifyHandle1;  ///< The NotifyHandle returned from SimpleTextInputEx.RegisterKeyNotify.
    119   VOID                          *CtrlSNotifyHandle2;  ///< The NotifyHandle returned from SimpleTextInputEx.RegisterKeyNotify.
    120   VOID                          *CtrlSNotifyHandle3;  ///< The NotifyHandle returned from SimpleTextInputEx.RegisterKeyNotify.
    121   VOID                          *CtrlSNotifyHandle4;  ///< The NotifyHandle returned from SimpleTextInputEx.RegisterKeyNotify.
    122   BOOLEAN                       HaltOutput;           ///< TRUE to start a CTRL-S halt.
    123 } SHELL_INFO;
    124 
    125 extern SHELL_INFO ShellInfoObject;
    126 
    127 /**
    128   Converts the command line to it's post-processed form.  this replaces variables and alias' per UEFI Shell spec.
    129 
    130   @param[in,out] CmdLine        pointer to the command line to update
    131 
    132   @retval EFI_SUCCESS           The operation was successful
    133   @retval EFI_OUT_OF_RESOURCES  A memory allocation failed.
    134   @return                       some other error occurred
    135 **/
    136 EFI_STATUS
    137 EFIAPI
    138 ProcessCommandLineToFinal(
    139   IN OUT CHAR16 **CmdLine
    140   );
    141 
    142 /**
    143   Function to update the shell variable "lasterror".
    144 
    145   @param[in] ErrorCode      the error code to put into lasterror
    146 **/
    147 EFI_STATUS
    148 EFIAPI
    149 SetLastError(
    150   IN CONST SHELL_STATUS   ErrorCode
    151   );
    152 
    153 /**
    154   Sets all the alias' that were registered with the ShellCommandLib library.
    155 
    156   @retval EFI_SUCCESS           all init commands were run successfully.
    157 **/
    158 EFI_STATUS
    159 EFIAPI
    160 SetBuiltInAlias(
    161   VOID
    162   );
    163 
    164 /**
    165   This function will populate the 2 device path protocol parameters based on the
    166   global gImageHandle.  the DevPath will point to the device path for the handle that has
    167   loaded image protocol installed on it.  the FilePath will point to the device path
    168   for the file that was loaded.
    169 
    170   @param[in, out] DevPath       on a successful return the device path to the loaded image
    171   @param[in, out] FilePath      on a successful return the device path to the file
    172 
    173   @retval EFI_SUCCESS           the 2 device paths were successfully returned.
    174   @return other                 a error from gBS->HandleProtocol
    175 
    176   @sa HandleProtocol
    177 **/
    178 EFI_STATUS
    179 EFIAPI
    180 GetDevicePathsForImageAndFile (
    181   IN OUT EFI_DEVICE_PATH_PROTOCOL **DevPath,
    182   IN OUT EFI_DEVICE_PATH_PROTOCOL **FilePath
    183   );
    184 
    185 /**
    186   Process all Uefi Shell 2.0 command line options.
    187 
    188   see Uefi Shell 2.0 section 3.2 for full details.
    189 
    190   the command line should resemble the following:
    191 
    192   shell.efi [ShellOpt-options] [options] [file-name [file-name-options]]
    193 
    194   ShellOpt options  Options which control the initialization behavior of the shell.
    195                     These options are read from the EFI global variable "ShellOpt"
    196                     and are processed before options or file-name.
    197 
    198   options           Options which control the initialization behavior of the shell.
    199 
    200   file-name         The name of a UEFI shell application or script to be executed
    201                     after initialization is complete. By default, if file-name is
    202                     specified, then -nostartup is implied. Scripts are not supported
    203                     by level 0.
    204 
    205   file-nameoptions  The command-line options that are passed to file-name when it
    206                     is invoked.
    207 
    208   This will initialize the ShellInitSettings global variable.
    209 
    210   @retval EFI_SUCCESS           the variable is initialized.
    211 **/
    212 EFI_STATUS
    213 EFIAPI
    214 ProcessCommandLine(
    215   VOID
    216   );
    217 
    218 /**
    219   Handles all interaction with the default startup script.
    220 
    221   this will check that the correct command line parameters were passed, handle the delay, and then start running the script.
    222 
    223   @param[in] ImagePath          The path to the image for shell.  The first place to look for the startup script.
    224   @param[in] FilePath           The path to the file for shell.  The second place to look for the startup script.
    225 
    226   @retval EFI_SUCCESS           The variable is initialized.
    227 **/
    228 EFI_STATUS
    229 EFIAPI
    230 DoStartupScript(
    231   IN EFI_DEVICE_PATH_PROTOCOL *ImagePath,
    232   IN EFI_DEVICE_PATH_PROTOCOL *FilePath
    233   );
    234 
    235 /**
    236   Function to perform the shell prompt looping.  It will do a single prompt,
    237   dispatch the result, and then return.  It is expected that the caller will
    238   call this function in a loop many times.
    239 
    240   @retval EFI_SUCCESS
    241   @retval RETURN_ABORTED
    242 **/
    243 EFI_STATUS
    244 EFIAPI
    245 DoShellPrompt (
    246   VOID
    247   );
    248 
    249 /**
    250   Add a buffer to the Buffer To Free List for safely returning buffers to other
    251   places without risking letting them modify internal shell information.
    252 
    253   @param Buffer   Something to pass to FreePool when the shell is exiting.
    254 **/
    255 VOID*
    256 EFIAPI
    257 AddBufferToFreeList(
    258   VOID *Buffer
    259   );
    260 
    261 /**
    262   Add a buffer to the Command History List.
    263 
    264   @param Buffer[in]     The line buffer to add.
    265 **/
    266 VOID
    267 EFIAPI
    268 AddLineToCommandHistory(
    269   IN CONST CHAR16 *Buffer
    270   );
    271 
    272 /**
    273   Function will process and run a command line.
    274 
    275   This will determine if the command line represents an internal shell command or dispatch an external application.
    276 
    277   @param[in] CmdLine  the command line to parse
    278 
    279   @retval EFI_SUCCESS     the command was completed
    280   @retval EFI_ABORTED     the command's operation was aborted
    281 **/
    282 EFI_STATUS
    283 EFIAPI
    284 RunCommand(
    285   IN CONST CHAR16   *CmdLine
    286   );
    287 
    288 /**
    289   Function will process and run a command line.
    290 
    291   This will determine if the command line represents an internal shell
    292   command or dispatch an external application.
    293 
    294   @param[in] CmdLine      The command line to parse.
    295   @param[out] CommandStatus   The status from the command line.
    296 
    297   @retval EFI_SUCCESS     The command was completed.
    298   @retval EFI_ABORTED     The command's operation was aborted.
    299 **/
    300 EFI_STATUS
    301 EFIAPI
    302 RunShellCommand(
    303   IN CONST CHAR16   *CmdLine,
    304   OUT EFI_STATUS    *CommandStatus
    305   );
    306 
    307 /**
    308   Function determines if the CommandName COULD be a valid command.  It does not determine whether
    309   this is a valid command.  It only checks for invalid characters.
    310 
    311   @param[in] CommandName    The name to check
    312 
    313   @retval TRUE              CommandName could be a command name
    314   @retval FALSE             CommandName could not be a valid command name
    315 **/
    316 BOOLEAN
    317 EFIAPI
    318 IsValidCommandName(
    319   IN CONST CHAR16     *CommandName
    320   );
    321 
    322 /**
    323   Function to process a NSH script file via SHELL_FILE_HANDLE.
    324 
    325   @param[in] Handle             The handle to the already opened file.
    326   @param[in] Name               The name of the script file.
    327 
    328   @retval EFI_SUCCESS           the script completed successfully
    329 **/
    330 EFI_STATUS
    331 EFIAPI
    332 RunScriptFileHandle (
    333   IN SHELL_FILE_HANDLE  Handle,
    334   IN CONST CHAR16       *Name
    335   );
    336 
    337 /**
    338   Function to process a NSH script file.
    339 
    340   @param[in] ScriptPath         Pointer to the script file name (including file system path).
    341   @param[in] Handle             the handle of the script file already opened.
    342   @param[in] CmdLine            the command line to run.
    343   @param[in] ParamProtocol      the shell parameters protocol pointer
    344 
    345   @retval EFI_SUCCESS           the script completed successfully
    346 **/
    347 EFI_STATUS
    348 EFIAPI
    349 RunScriptFile (
    350   IN CONST CHAR16                   *ScriptPath,
    351   IN SHELL_FILE_HANDLE              Handle OPTIONAL,
    352   IN CONST CHAR16                   *CmdLine,
    353   IN EFI_SHELL_PARAMETERS_PROTOCOL  *ParamProtocol
    354   );
    355 
    356 /**
    357   Return the pointer to the first occurrence of any character from a list of characters.
    358 
    359   @param[in] String           the string to parse
    360   @param[in] CharacterList    the list of character to look for
    361   @param[in] EscapeCharacter  An escape character to skip
    362 
    363   @return the location of the first character in the string
    364   @retval CHAR_NULL no instance of any character in CharacterList was found in String
    365 **/
    366 CONST CHAR16*
    367 EFIAPI
    368 FindFirstCharacter(
    369   IN CONST CHAR16 *String,
    370   IN CONST CHAR16 *CharacterList,
    371   IN CONST CHAR16 EscapeCharacter
    372   );
    373 
    374 /**
    375   Cleans off leading and trailing spaces and tabs.
    376 
    377   @param[in] String pointer to the string to trim them off.
    378 **/
    379 EFI_STATUS
    380 EFIAPI
    381 TrimSpaces(
    382   IN CHAR16 **String
    383   );
    384 
    385 /**
    386 
    387   Create a new buffer list and stores the old one to OldBufferList
    388 
    389   @param OldBufferList   The temporary list head used to store the nodes in BufferToFreeList.
    390 **/
    391 VOID
    392 SaveBufferList (
    393   OUT LIST_ENTRY     *OldBufferList
    394   );
    395 
    396 /**
    397   Restore previous nodes into BufferToFreeList .
    398 
    399   @param OldBufferList   The temporary list head used to store the nodes in BufferToFreeList.
    400 **/
    401 VOID
    402 RestoreBufferList (
    403   IN OUT LIST_ENTRY     *OldBufferList
    404   );
    405 
    406 
    407 
    408 #endif //_SHELL_INTERNAL_HEADER_
    409 
    410