b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync/** @file
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Main file for Alias shell level 3 function.
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved. <BR>
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync This program and the accompanying materials
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync are licensed and made available under the terms and conditions of the BSD License
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync which accompanies this distribution. The full text of the license may be found at
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync http://opensource.org/licenses/bsd-license.php
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync**/
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#include "UefiShellLevel3CommandsLib.h"
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#include <Library/ShellLib.h>
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync/**
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Print out each alias registered with the Shell.
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync @retval STATUS_SUCCESS the printout was sucessful
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync @return any return code from GetNextVariableName except EFI_NOT_FOUND
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync**/
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncSHELL_STATUS
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncEFIAPI
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncPrintAllShellAlias(
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync VOID
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync )
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync{
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync CONST CHAR16 *ConstAllAliasList;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync CHAR16 *Alias;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync CONST CHAR16 *Command;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync CHAR16 *Walker;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync BOOLEAN Volatile;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Volatile = FALSE;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ConstAllAliasList = gEfiShellProtocol->GetAlias(NULL, NULL);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync if (ConstAllAliasList == NULL) {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync return (SHELL_SUCCESS);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync }
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Alias = AllocateZeroPool(StrSize(ConstAllAliasList));
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync if (Alias == NULL) {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync return (SHELL_OUT_OF_RESOURCES);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync }
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Walker = (CHAR16*)ConstAllAliasList;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync do {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync CopyMem(Alias, Walker, StrSize(Walker));
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Walker = StrStr(Alias, L";");
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync if (Walker != NULL) {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Walker[0] = CHAR_NULL;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Walker = Walker + 1;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync }
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Command = gEfiShellProtocol->GetAlias(Alias, &Volatile);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync if (ShellCommandIsOnAliasList(Alias)) {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Volatile = FALSE;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync }
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_ALIAS_OUTPUT), gShellLevel3HiiHandle, !Volatile?L' ':L'*', Alias, Command);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync } while (Walker != NULL && Walker[0] != CHAR_NULL);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync FreePool(Alias);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync return (SHELL_SUCCESS);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync}
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncSTATIC CONST SHELL_PARAM_ITEM ParamList[] = {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync {L"-v", TypeFlag},
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync {L"-d", TypeFlag},
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync {NULL, TypeMax}
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync };
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync/**
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Function for 'alias' command.
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync @param[in] ImageHandle Handle to the Image (NULL if Internal).
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync @param[in] SystemTable Pointer to the System Table (NULL if Internal).
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync**/
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncSHELL_STATUS
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncEFIAPI
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncShellCommandRunAlias (
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync IN EFI_HANDLE ImageHandle,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync IN EFI_SYSTEM_TABLE *SystemTable
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync )
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync{
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync EFI_STATUS Status;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync LIST_ENTRY *Package;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync CHAR16 *ProblemParam;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync SHELL_STATUS ShellStatus;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync CONST CHAR16 *Param1;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync CONST CHAR16 *Param2;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ProblemParam = NULL;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ShellStatus = SHELL_SUCCESS;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync //
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync // initialize the shell lib (we must be in non-auto-init...)
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync //
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Status = ShellInitialize();
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ASSERT_EFI_ERROR(Status);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Status = CommandInit();
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ASSERT_EFI_ERROR(Status);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync //
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync // parse the command line
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync //
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync if (EFI_ERROR(Status)) {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, ProblemParam);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync FreePool(ProblemParam);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync } else {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ASSERT(FALSE);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync }
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync } else {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Param1 = ShellCommandLineGetRawValue(Package, 1);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Param2 = ShellCommandLineGetRawValue(Package, 2);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync //
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync // check for "-?"
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync //
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync if (ShellCommandLineGetFlag(Package, L"-?")) {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ASSERT(FALSE);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync }
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync if (ShellCommandLineGetCount(Package) == 1) {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync //
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync // print out alias'
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync //
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Status = PrintAllShellAlias();
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync } else if (ShellCommandLineGetFlag(Package, L"-d")) {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync //
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync // delete an alias
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync //
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Status = gEfiShellProtocol->SetAlias(Param1, NULL, TRUE, FALSE);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync } else if (ShellCommandLineGetCount(Package) == 3) {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync //
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync // must be adding an alias
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync //
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync Status = gEfiShellProtocol->SetAlias(Param2, Param1, FALSE, ShellCommandLineGetFlag(Package, L"-v"));
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync if (EFI_ERROR(Status)) {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync if (Status == EFI_ACCESS_DENIED) {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel3HiiHandle);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ShellStatus = SHELL_ACCESS_DENIED;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync } else {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel3HiiHandle, Status);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ShellStatus = SHELL_DEVICE_ERROR;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync }
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync }
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync } else if (ShellCommandLineGetCount(Package) == 2) {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync } else {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync }
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync //
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync // free the command line package
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync //
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync ShellCommandLineFreeVarList (Package);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync }
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync return (ShellStatus);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync}
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync