mirror of https://github.com/acidanthera/audk.git
127 lines
3.4 KiB
C
127 lines
3.4 KiB
C
|
/** @file
|
||
|
Script command allows the execution of commands from a text file
|
||
|
|
||
|
Copyright (c) 2007, Intel Corporation<BR>
|
||
|
Portions copyright (c) 2008-2009, Apple Inc. All rights reserved.
|
||
|
|
||
|
All rights reserved. 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.
|
||
|
|
||
|
Module Name: EfiDevice.c
|
||
|
|
||
|
**/
|
||
|
|
||
|
#include "Ebl.h"
|
||
|
|
||
|
|
||
|
/**
|
||
|
Execute the passed in file like a series of commands. The ; can be used on
|
||
|
a single line to indicate multiple commands per line. The Ascii text file
|
||
|
can contain any number of lines. The following line termination forms are
|
||
|
supported:
|
||
|
LF : Unix, Mac OS X*, BeOS
|
||
|
CR+LF: MS-DOS*, Microsoft Windows*
|
||
|
CR : Commodore, Apple II, and realy Mac OS
|
||
|
LF+CR: for simplicity and completeness
|
||
|
|
||
|
Argv[0] - "script"
|
||
|
Argv[1] - Device Name:path for the file to load
|
||
|
|
||
|
script fv1:\script.txt
|
||
|
|
||
|
@param Argc Number of command arguments in Argv
|
||
|
@param Argv Array of strings that represent the parsed command line.
|
||
|
Argv[0] is the comamnd name
|
||
|
|
||
|
@return EFI_SUCCESS
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EblScriptCmd (
|
||
|
IN UINTN Argc,
|
||
|
IN CHAR8 **Argv
|
||
|
)
|
||
|
{
|
||
|
EFI_STATUS Status;
|
||
|
EFI_OPEN_FILE *File;
|
||
|
VOID *Address;
|
||
|
UINTN Size;
|
||
|
CHAR8 *Ptr;
|
||
|
CHAR8 *ScanPtr;
|
||
|
UINTN CmdLineSize;
|
||
|
|
||
|
|
||
|
|
||
|
if (Argc < 2) {
|
||
|
// file name required
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
File = EfiOpen (Argv[1], EFI_FILE_MODE_READ, 0);
|
||
|
if (File == NULL) {
|
||
|
AsciiPrint (" %a is not a valid path\n", Argv[1]);
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
Status = EfiReadAllocatePool (File, &Address, &Size);
|
||
|
if (!EFI_ERROR (Status)) {
|
||
|
// Loop through each line in the text file
|
||
|
for (Ptr = (CHAR8 *)Address; (Ptr < (((CHAR8 *)Address) + Size)) && !EFI_ERROR (Status); Ptr += CmdLineSize) {
|
||
|
for (CmdLineSize = 0, ScanPtr = Ptr; ; CmdLineSize++, ScanPtr++) {
|
||
|
// look for the end of the line
|
||
|
if ((*ScanPtr == EBL_CR) || (*ScanPtr == EBL_LF)) {
|
||
|
// convert to NULL as this is what input routine would do
|
||
|
*ScanPtr = 0;
|
||
|
if ((*(ScanPtr + 1) == EBL_CR) || (*(ScanPtr + 1) == EBL_LF)) {
|
||
|
// if its a set get the 2nd EOL char
|
||
|
CmdLineSize++;
|
||
|
*(ScanPtr + 1) = 0;
|
||
|
}
|
||
|
CmdLineSize++;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
Status = ProcessCmdLine (Ptr, CmdLineSize);
|
||
|
}
|
||
|
|
||
|
FreePool (Address);
|
||
|
}
|
||
|
|
||
|
EfiClose (File);
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
GLOBAL_REMOVE_IF_UNREFERENCED const EBL_COMMAND_TABLE mScriptTemplate[] = {
|
||
|
{
|
||
|
"script",
|
||
|
" device:path; load an ascii file and execute it like commands",
|
||
|
NULL,
|
||
|
EblScriptCmd
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
/**
|
||
|
Initialize the commands in this in this file
|
||
|
**/
|
||
|
|
||
|
VOID
|
||
|
EblInitializeScriptCmd (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
if (FeaturePcdGet (PcdEmbeddedScriptCmd)) {
|
||
|
EblAddCommands (mScriptTemplate, sizeof (mScriptTemplate)/sizeof (EBL_COMMAND_TABLE));
|
||
|
}
|
||
|
}
|
||
|
|