mirror of https://github.com/acidanthera/audk.git
ShellPkg: Add optional 'tftp' EFI Shell command
This 'tftp' command allows to download a file from a TFTP server. A specific network interface can be chosen in case there are multiple interfaces. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ronald Cron <Ronald.Cron@arm.com> Reviewed-by: Olivier Martin <Olivier.Martin@arm.com> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18015 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
8f7b315b1c
commit
6807426071
|
@ -54,6 +54,12 @@
|
||||||
{ \
|
{ \
|
||||||
0xf3d301bb, 0xf4a5, 0x45a8, { 0xb0, 0xb7, 0xfa, 0x99, 0x9c, 0x62, 0x37, 0xae } \
|
0xf3d301bb, 0xf4a5, 0x45a8, { 0xb0, 0xb7, 0xfa, 0x99, 0x9c, 0x62, 0x37, 0xae } \
|
||||||
}
|
}
|
||||||
|
#define SHELL_TFTP_HII_GUID \
|
||||||
|
{ \
|
||||||
|
0x738a9314, 0x82c1, 0x4592, { 0x8f, 0xf7, 0xc1, 0xbd, 0xf1, 0xb2, 0x0e, 0xd4 } \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#define SHELL_BCFG_HII_GUID \
|
#define SHELL_BCFG_HII_GUID \
|
||||||
{ \
|
{ \
|
||||||
0x5f5f605d, 0x1583, 0x4a2d, {0xa6, 0xb2, 0xeb, 0x12, 0xda, 0xb4, 0xa2, 0xb6 } \
|
0x5f5f605d, 0x1583, 0x4a2d, {0xa6, 0xb2, 0xeb, 0x12, 0xda, 0xb4, 0xa2, 0xb6 } \
|
||||||
|
@ -67,6 +73,7 @@ extern EFI_GUID gShellLevel1HiiGuid;
|
||||||
extern EFI_GUID gShellLevel2HiiGuid;
|
extern EFI_GUID gShellLevel2HiiGuid;
|
||||||
extern EFI_GUID gShellLevel3HiiGuid;
|
extern EFI_GUID gShellLevel3HiiGuid;
|
||||||
extern EFI_GUID gShellNetwork1HiiGuid;
|
extern EFI_GUID gShellNetwork1HiiGuid;
|
||||||
|
extern EFI_GUID gShellTftpHiiGuid;
|
||||||
extern EFI_GUID gShellBcfgHiiGuid;
|
extern EFI_GUID gShellBcfgHiiGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,880 @@
|
||||||
|
/** @file
|
||||||
|
The implementation for the 'tftp' Shell command.
|
||||||
|
|
||||||
|
Copyright (c) 2015, ARM Ltd. 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.
|
||||||
|
**/
|
||||||
|
|
||||||
|
#include "UefiShellTftpCommandLib.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
Constant strings and definitions related to the message indicating the amount of
|
||||||
|
progress in the dowloading of a TFTP file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Frame for the progression slider
|
||||||
|
STATIC CONST CHAR16 mTftpProgressFrame[] = L"[ ]";
|
||||||
|
|
||||||
|
// Number of steps in the progression slider
|
||||||
|
#define TFTP_PROGRESS_SLIDER_STEPS ((sizeof (mTftpProgressFrame) / sizeof (CHAR16)) - 3)
|
||||||
|
|
||||||
|
// Size in number of characters plus one (final zero) of the message to
|
||||||
|
// indicate the progress of a TFTP download. The format is "[(progress slider:
|
||||||
|
// 40 characters)] (nb of KBytes downloaded so far: 7 characters) Kb". There
|
||||||
|
// are thus the number of characters in mTftpProgressFrame[] plus 11 characters
|
||||||
|
// (2 // spaces, "Kb" and seven characters for the number of KBytes).
|
||||||
|
#define TFTP_PROGRESS_MESSAGE_SIZE ((sizeof (mTftpProgressFrame) / sizeof (CHAR16)) + 12)
|
||||||
|
|
||||||
|
// String to delete the TFTP progress message to be able to update it :
|
||||||
|
// (TFTP_PROGRESS_MESSAGE_SIZE-1) '\b'
|
||||||
|
STATIC CONST CHAR16 mTftpProgressDelete[] = L"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b";
|
||||||
|
|
||||||
|
STATIC BOOLEAN StringToUint16 (
|
||||||
|
IN CONST CHAR16 *ValueStr,
|
||||||
|
OUT UINT16 *Value
|
||||||
|
);
|
||||||
|
|
||||||
|
STATIC EFI_STATUS GetNicName (
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN UINTN Index,
|
||||||
|
OUT CHAR16 *NicName
|
||||||
|
);
|
||||||
|
|
||||||
|
STATIC EFI_STATUS CreateServiceChildAndOpenProtocol (
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN EFI_GUID *ServiceBindingProtocolGuid,
|
||||||
|
IN EFI_GUID *ProtocolGuid,
|
||||||
|
OUT EFI_HANDLE *ChildHandle,
|
||||||
|
OUT VOID **Interface
|
||||||
|
);
|
||||||
|
|
||||||
|
STATIC VOID CloseProtocolAndDestroyServiceChild (
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN EFI_GUID *ServiceBindingProtocolGuid,
|
||||||
|
IN EFI_GUID *ProtocolGuid,
|
||||||
|
IN EFI_HANDLE ChildHandle
|
||||||
|
);
|
||||||
|
|
||||||
|
STATIC EFI_STATUS GetFileSize (
|
||||||
|
IN EFI_MTFTP4_PROTOCOL *Mtftp4,
|
||||||
|
IN CONST CHAR8 *FilePath,
|
||||||
|
OUT UINTN *FileSize
|
||||||
|
);
|
||||||
|
|
||||||
|
STATIC EFI_STATUS DownloadFile (
|
||||||
|
IN EFI_MTFTP4_PROTOCOL *Mtftp4,
|
||||||
|
IN CONST CHAR16 *FilePath,
|
||||||
|
IN CONST CHAR8 *AsciiFilePath,
|
||||||
|
IN UINTN FileSize,
|
||||||
|
OUT VOID **Data
|
||||||
|
);
|
||||||
|
|
||||||
|
STATIC EFI_STATUS CheckPacket (
|
||||||
|
IN EFI_MTFTP4_PROTOCOL *This,
|
||||||
|
IN EFI_MTFTP4_TOKEN *Token,
|
||||||
|
IN UINT16 PacketLen,
|
||||||
|
IN EFI_MTFTP4_PACKET *Packet
|
||||||
|
);
|
||||||
|
|
||||||
|
EFI_MTFTP4_CONFIG_DATA DefaultMtftp4ConfigData = {
|
||||||
|
TRUE, // Use default setting
|
||||||
|
{ { 0, 0, 0, 0 } }, // StationIp - Not relevant as UseDefaultSetting=TRUE
|
||||||
|
{ { 0, 0, 0, 0 } }, // SubnetMask - Not relevant as UseDefaultSetting=TRUE
|
||||||
|
0, // LocalPort - Automatically assigned port number.
|
||||||
|
{ { 0, 0, 0, 0 } }, // GatewayIp - Not relevant as UseDefaultSetting=TRUE
|
||||||
|
{ { 0, 0, 0, 0 } }, // ServerIp - Not known yet
|
||||||
|
69, // InitialServerPort - Standard TFTP server port
|
||||||
|
6, // TryCount - Max number of retransmissions.
|
||||||
|
4 // TimeoutValue - Retransmission timeout in seconds.
|
||||||
|
};
|
||||||
|
|
||||||
|
STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
|
||||||
|
{L"-i", TypeValue},
|
||||||
|
{L"-l", TypeValue},
|
||||||
|
{L"-r", TypeValue},
|
||||||
|
{L"-c", TypeValue},
|
||||||
|
{L"-t", TypeValue},
|
||||||
|
{NULL , TypeMax}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Function for 'tftp' command.
|
||||||
|
|
||||||
|
@param[in] ImageHandle Handle to the Image (NULL if Internal).
|
||||||
|
@param[in] SystemTable Pointer to the System Table (NULL if Internal).
|
||||||
|
|
||||||
|
@return SHELL_SUCCESS The 'tftp' command completed successfully.
|
||||||
|
@return SHELL_ABORTED The Shell Library initialization failed.
|
||||||
|
@return SHELL_INVALID_PARAMETER At least one of the command's arguments is
|
||||||
|
not valid.
|
||||||
|
@return SHELL_OUT_OF_RESOURCES A memory allocation failed.
|
||||||
|
@return SHELL_NOT_FOUND Network Interface Card not found or server
|
||||||
|
error or file error.
|
||||||
|
|
||||||
|
**/
|
||||||
|
SHELL_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ShellCommandRunTftp (
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
|
)
|
||||||
|
{
|
||||||
|
SHELL_STATUS ShellStatus;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
LIST_ENTRY *CheckPackage;
|
||||||
|
CHAR16 *ProblemParam;
|
||||||
|
UINTN ParamCount;
|
||||||
|
CONST CHAR16 *UserNicName;
|
||||||
|
BOOLEAN NicFound;
|
||||||
|
CONST CHAR16 *ValueStr;
|
||||||
|
CONST CHAR16 *RemoteFilePath;
|
||||||
|
CHAR8 *AsciiRemoteFilePath;
|
||||||
|
CONST CHAR16 *Walker;
|
||||||
|
CONST CHAR16 *LocalFilePath;
|
||||||
|
EFI_MTFTP4_CONFIG_DATA Mtftp4ConfigData;
|
||||||
|
EFI_HANDLE *Handles;
|
||||||
|
UINTN HandleCount;
|
||||||
|
UINTN NicNumber;
|
||||||
|
CHAR16 NicName[IP4_NIC_NAME_LENGTH];
|
||||||
|
EFI_HANDLE ControllerHandle;
|
||||||
|
EFI_HANDLE Mtftp4ChildHandle;
|
||||||
|
EFI_MTFTP4_PROTOCOL *Mtftp4;
|
||||||
|
UINTN FileSize;
|
||||||
|
VOID *Data;
|
||||||
|
SHELL_FILE_HANDLE FileHandle;
|
||||||
|
|
||||||
|
ShellStatus = SHELL_INVALID_PARAMETER;
|
||||||
|
ProblemParam = NULL;
|
||||||
|
NicFound = FALSE;
|
||||||
|
AsciiRemoteFilePath = NULL;
|
||||||
|
Handles = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize the Shell library (we must be in non-auto-init...)
|
||||||
|
//
|
||||||
|
Status = ShellInitialize ();
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
return SHELL_ABORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Parse the command line.
|
||||||
|
//
|
||||||
|
Status = ShellCommandLineParse (ParamList, &CheckPackage, &ProblemParam, TRUE);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
if ((Status == EFI_VOLUME_CORRUPTED) &&
|
||||||
|
(ProblemParam != NULL) ) {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellTftpHiiHandle,
|
||||||
|
L"tftp", ProblemParam
|
||||||
|
);
|
||||||
|
FreePool (ProblemParam);
|
||||||
|
} else {
|
||||||
|
ASSERT (FALSE);
|
||||||
|
}
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check the number of parameters
|
||||||
|
//
|
||||||
|
ParamCount = ShellCommandLineGetCount (CheckPackage);
|
||||||
|
if (ParamCount > 4) {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY),
|
||||||
|
gShellTftpHiiHandle, L"tftp"
|
||||||
|
);
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
if (ParamCount < 3) {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW),
|
||||||
|
gShellTftpHiiHandle, L"tftp"
|
||||||
|
);
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
Mtftp4ConfigData = DefaultMtftp4ConfigData;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check the host IPv4 address
|
||||||
|
//
|
||||||
|
ValueStr = ShellCommandLineGetRawValue (CheckPackage, 1);
|
||||||
|
Status = NetLibStrToIp4 (ValueStr, &Mtftp4ConfigData.ServerIp);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV),
|
||||||
|
gShellTftpHiiHandle, L"tftp", ValueStr
|
||||||
|
);
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
RemoteFilePath = ShellCommandLineGetRawValue (CheckPackage, 2);
|
||||||
|
AsciiRemoteFilePath = AllocatePool (
|
||||||
|
(StrLen (RemoteFilePath) + 1) * sizeof (CHAR8)
|
||||||
|
);
|
||||||
|
if (AsciiRemoteFilePath == NULL) {
|
||||||
|
ShellStatus = SHELL_OUT_OF_RESOURCES;
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
UnicodeStrToAsciiStr (RemoteFilePath, AsciiRemoteFilePath);
|
||||||
|
|
||||||
|
if (ParamCount == 4) {
|
||||||
|
LocalFilePath = ShellCommandLineGetRawValue (CheckPackage, 3);
|
||||||
|
} else {
|
||||||
|
Walker = RemoteFilePath + StrLen (RemoteFilePath);
|
||||||
|
while ((--Walker) >= RemoteFilePath) {
|
||||||
|
if ((*Walker == L'\\') ||
|
||||||
|
(*Walker == L'/' ) ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LocalFilePath = Walker + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get the name of the Network Interface Card to be used if any.
|
||||||
|
//
|
||||||
|
UserNicName = ShellCommandLineGetValue (CheckPackage, L"-i");
|
||||||
|
|
||||||
|
ValueStr = ShellCommandLineGetValue (CheckPackage, L"-l");
|
||||||
|
if (ValueStr != NULL) {
|
||||||
|
if (!StringToUint16 (ValueStr, &Mtftp4ConfigData.LocalPort)) {
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueStr = ShellCommandLineGetValue (CheckPackage, L"-r");
|
||||||
|
if (ValueStr != NULL) {
|
||||||
|
if (!StringToUint16 (ValueStr, &Mtftp4ConfigData.InitialServerPort)) {
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueStr = ShellCommandLineGetValue (CheckPackage, L"-c");
|
||||||
|
if (ValueStr != NULL) {
|
||||||
|
if (!StringToUint16 (ValueStr, &Mtftp4ConfigData.TryCount)) {
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueStr = ShellCommandLineGetValue (CheckPackage, L"-t");
|
||||||
|
if (ValueStr != NULL) {
|
||||||
|
if (!StringToUint16 (ValueStr, &Mtftp4ConfigData.TimeoutValue)) {
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
if (Mtftp4ConfigData.TimeoutValue == 0) {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV),
|
||||||
|
gShellTftpHiiHandle, L"tftp", ValueStr
|
||||||
|
);
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Locate all MTFTP4 Service Binding protocols
|
||||||
|
//
|
||||||
|
ShellStatus = SHELL_NOT_FOUND;
|
||||||
|
Status = gBS->LocateHandleBuffer (
|
||||||
|
ByProtocol,
|
||||||
|
&gEfiManagedNetworkServiceBindingProtocolGuid,
|
||||||
|
NULL,
|
||||||
|
&HandleCount,
|
||||||
|
&Handles
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status) || (HandleCount == 0)) {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_TFTP_ERR_NO_NIC),
|
||||||
|
gShellTftpHiiHandle
|
||||||
|
);
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (NicNumber = 0;
|
||||||
|
(NicNumber < HandleCount) && (ShellStatus != SHELL_SUCCESS);
|
||||||
|
NicNumber++) {
|
||||||
|
ControllerHandle = Handles[NicNumber];
|
||||||
|
Data = NULL;
|
||||||
|
|
||||||
|
Status = GetNicName (ControllerHandle, NicNumber, NicName);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_TFTP_ERR_NIC_NAME),
|
||||||
|
gShellTftpHiiHandle, NicNumber, Status
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UserNicName != NULL) {
|
||||||
|
if (StrCmp (NicName, UserNicName) != 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
NicFound = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = CreateServiceChildAndOpenProtocol (
|
||||||
|
ControllerHandle,
|
||||||
|
&gEfiMtftp4ServiceBindingProtocolGuid,
|
||||||
|
&gEfiMtftp4ProtocolGuid,
|
||||||
|
&Mtftp4ChildHandle,
|
||||||
|
(VOID**)&Mtftp4
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_TFTP_ERR_OPEN_PROTOCOL),
|
||||||
|
gShellTftpHiiHandle, NicName, Status
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = Mtftp4->Configure (Mtftp4, &Mtftp4ConfigData);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_TFTP_ERR_CONFIGURE),
|
||||||
|
gShellTftpHiiHandle, NicName, Status
|
||||||
|
);
|
||||||
|
goto NextHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = GetFileSize (Mtftp4, AsciiRemoteFilePath, &FileSize);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_TFTP_ERR_FILE_SIZE),
|
||||||
|
gShellTftpHiiHandle, RemoteFilePath, NicName, Status
|
||||||
|
);
|
||||||
|
goto NextHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = DownloadFile (Mtftp4, RemoteFilePath, AsciiRemoteFilePath, FileSize, &Data);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_TFTP_ERR_DOWNLOAD),
|
||||||
|
gShellTftpHiiHandle, RemoteFilePath, NicName, Status
|
||||||
|
);
|
||||||
|
goto NextHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!EFI_ERROR (ShellFileExists (LocalFilePath))) {
|
||||||
|
ShellDeleteFileByName (LocalFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = ShellOpenFileByName (
|
||||||
|
LocalFilePath,
|
||||||
|
&FileHandle,
|
||||||
|
EFI_FILE_MODE_CREATE |
|
||||||
|
EFI_FILE_MODE_WRITE |
|
||||||
|
EFI_FILE_MODE_READ,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL),
|
||||||
|
gShellTftpHiiHandle, L"tftp", LocalFilePath
|
||||||
|
);
|
||||||
|
goto NextHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = ShellWriteFile (FileHandle, &FileSize, Data);
|
||||||
|
if (!EFI_ERROR (Status)) {
|
||||||
|
ShellStatus = SHELL_SUCCESS;
|
||||||
|
} else {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_TFTP_ERR_WRITE),
|
||||||
|
gShellTftpHiiHandle, LocalFilePath, Status
|
||||||
|
);
|
||||||
|
}
|
||||||
|
ShellCloseFile (&FileHandle);
|
||||||
|
|
||||||
|
NextHandle:
|
||||||
|
|
||||||
|
if (Data != NULL) {
|
||||||
|
gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)Data, EFI_SIZE_TO_PAGES (FileSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseProtocolAndDestroyServiceChild (
|
||||||
|
ControllerHandle,
|
||||||
|
&gEfiMtftp4ServiceBindingProtocolGuid,
|
||||||
|
&gEfiMtftp4ProtocolGuid,
|
||||||
|
Mtftp4ChildHandle
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((UserNicName != NULL) && (NicFound == FALSE)) {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_TFTP_ERR_NIC_NOT_FOUND),
|
||||||
|
gShellTftpHiiHandle, UserNicName
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Error:
|
||||||
|
|
||||||
|
ShellCommandLineFreeVarList (CheckPackage);
|
||||||
|
if (AsciiRemoteFilePath != NULL) {
|
||||||
|
FreePool (AsciiRemoteFilePath);
|
||||||
|
}
|
||||||
|
if (Handles != NULL) {
|
||||||
|
FreePool (Handles);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ShellStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Check and convert the UINT16 option values of the 'tftp' command
|
||||||
|
|
||||||
|
@param[in] ValueStr Value as an Unicode encoded string
|
||||||
|
@param[out] Value UINT16 value
|
||||||
|
|
||||||
|
@return TRUE The value was returned.
|
||||||
|
@return FALSE A parsing error occured.
|
||||||
|
**/
|
||||||
|
STATIC
|
||||||
|
BOOLEAN
|
||||||
|
StringToUint16 (
|
||||||
|
IN CONST CHAR16 *ValueStr,
|
||||||
|
OUT UINT16 *Value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN Val;
|
||||||
|
|
||||||
|
Val = ShellStrToUintn (ValueStr);
|
||||||
|
if (Val > MAX_UINT16) {
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV),
|
||||||
|
gShellTftpHiiHandle, L"tftp", ValueStr
|
||||||
|
);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*Value = Val;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Get the name of the NIC.
|
||||||
|
|
||||||
|
@param[in] ControllerHandle The network physical device handle.
|
||||||
|
@param[in] NicNumber The network physical device number.
|
||||||
|
@param[out] NicName Address where to store the NIC name.
|
||||||
|
The memory area has to be at least
|
||||||
|
IP4_NIC_NAME_LENGTH bytes wide.
|
||||||
|
|
||||||
|
@return EFI_SUCCESS The name of the NIC was returned.
|
||||||
|
@return Others The creation of the child for the Managed
|
||||||
|
Network Service failed or the opening of
|
||||||
|
the Managed Network Protocol failed or
|
||||||
|
the operational parameters for the
|
||||||
|
Managed Network Protocol could not be
|
||||||
|
read.
|
||||||
|
**/
|
||||||
|
STATIC
|
||||||
|
EFI_STATUS
|
||||||
|
GetNicName (
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN UINTN NicNumber,
|
||||||
|
OUT CHAR16 *NicName
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_HANDLE MnpHandle;
|
||||||
|
EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
|
||||||
|
EFI_SIMPLE_NETWORK_MODE SnpMode;
|
||||||
|
|
||||||
|
Status = CreateServiceChildAndOpenProtocol (
|
||||||
|
ControllerHandle,
|
||||||
|
&gEfiManagedNetworkServiceBindingProtocolGuid,
|
||||||
|
&gEfiManagedNetworkProtocolGuid,
|
||||||
|
&MnpHandle,
|
||||||
|
(VOID**)&Mnp
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);
|
||||||
|
if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
UnicodeSPrint (
|
||||||
|
NicName,
|
||||||
|
IP4_NIC_NAME_LENGTH,
|
||||||
|
SnpMode.IfType == NET_IFTYPE_ETHERNET ?
|
||||||
|
L"eth%d" :
|
||||||
|
L"unk%d" ,
|
||||||
|
NicNumber
|
||||||
|
);
|
||||||
|
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
|
Error:
|
||||||
|
|
||||||
|
if (MnpHandle != NULL) {
|
||||||
|
CloseProtocolAndDestroyServiceChild (
|
||||||
|
ControllerHandle,
|
||||||
|
&gEfiManagedNetworkServiceBindingProtocolGuid,
|
||||||
|
&gEfiManagedNetworkProtocolGuid,
|
||||||
|
MnpHandle
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Create a child for the service identified by its service binding protocol GUID
|
||||||
|
and get from the child the interface of the protocol identified by its GUID.
|
||||||
|
|
||||||
|
@param[in] ControllerHandle Controller handle.
|
||||||
|
@param[in] ServiceBindingProtocolGuid Service binding protocol GUID of the
|
||||||
|
service to be created.
|
||||||
|
@param[in] ProtocolGuid GUID of the protocol to be open.
|
||||||
|
@param[out] ChildHandle Address where the handler of the
|
||||||
|
created child is returned. NULL is
|
||||||
|
returned in case of error.
|
||||||
|
@param[out] Interface Address where a pointer to the
|
||||||
|
protocol interface is returned in
|
||||||
|
case of success.
|
||||||
|
|
||||||
|
@return EFI_SUCCESS The child was created and the protocol opened.
|
||||||
|
@return Others Either the creation of the child or the opening
|
||||||
|
of the protocol failed.
|
||||||
|
**/
|
||||||
|
STATIC
|
||||||
|
EFI_STATUS
|
||||||
|
CreateServiceChildAndOpenProtocol (
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN EFI_GUID *ServiceBindingProtocolGuid,
|
||||||
|
IN EFI_GUID *ProtocolGuid,
|
||||||
|
OUT EFI_HANDLE *ChildHandle,
|
||||||
|
OUT VOID **Interface
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
*ChildHandle = NULL;
|
||||||
|
Status = NetLibCreateServiceChild (
|
||||||
|
ControllerHandle,
|
||||||
|
gImageHandle,
|
||||||
|
ServiceBindingProtocolGuid,
|
||||||
|
ChildHandle
|
||||||
|
);
|
||||||
|
if (!EFI_ERROR (Status)) {
|
||||||
|
Status = gBS->OpenProtocol (
|
||||||
|
*ChildHandle,
|
||||||
|
ProtocolGuid,
|
||||||
|
Interface,
|
||||||
|
gImageHandle,
|
||||||
|
ControllerHandle,
|
||||||
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
NetLibDestroyServiceChild (
|
||||||
|
ControllerHandle,
|
||||||
|
gImageHandle,
|
||||||
|
ServiceBindingProtocolGuid,
|
||||||
|
*ChildHandle
|
||||||
|
);
|
||||||
|
*ChildHandle = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Close the protocol identified by its GUID on the child handle of the service
|
||||||
|
identified by its service binding protocol GUID, then destroy the child
|
||||||
|
handle.
|
||||||
|
|
||||||
|
@param[in] ControllerHandle Controller handle.
|
||||||
|
@param[in] ServiceBindingProtocolGuid Service binding protocol GUID of the
|
||||||
|
service to be destroyed.
|
||||||
|
@param[in] ProtocolGuid GUID of the protocol to be closed.
|
||||||
|
@param[in] ChildHandle Handle of the child to be destroyed.
|
||||||
|
|
||||||
|
**/
|
||||||
|
STATIC
|
||||||
|
VOID
|
||||||
|
CloseProtocolAndDestroyServiceChild (
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN EFI_GUID *ServiceBindingProtocolGuid,
|
||||||
|
IN EFI_GUID *ProtocolGuid,
|
||||||
|
IN EFI_HANDLE ChildHandle
|
||||||
|
)
|
||||||
|
{
|
||||||
|
gBS->CloseProtocol (
|
||||||
|
ChildHandle,
|
||||||
|
ProtocolGuid,
|
||||||
|
gImageHandle,
|
||||||
|
ControllerHandle
|
||||||
|
);
|
||||||
|
|
||||||
|
NetLibDestroyServiceChild (
|
||||||
|
ControllerHandle,
|
||||||
|
gImageHandle,
|
||||||
|
ServiceBindingProtocolGuid,
|
||||||
|
ChildHandle
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Worker function that gets the size in numbers of bytes of a file from a TFTP
|
||||||
|
server before to download the file.
|
||||||
|
|
||||||
|
@param[in] Mtftp4 MTFTP4 protocol interface
|
||||||
|
@param[in] FilePath Path of the file, ASCII encoded
|
||||||
|
@param[out] FileSize Address where to store the file size in number of
|
||||||
|
bytes.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The size of the file was returned.
|
||||||
|
@retval EFI_UNSUPPORTED The server does not support the "tsize" option.
|
||||||
|
@retval Others Error when retrieving the information from the server
|
||||||
|
(see EFI_MTFTP4_PROTOCOL.GetInfo() status codes)
|
||||||
|
or error when parsing the response of the server.
|
||||||
|
**/
|
||||||
|
STATIC
|
||||||
|
EFI_STATUS
|
||||||
|
GetFileSize (
|
||||||
|
IN EFI_MTFTP4_PROTOCOL *Mtftp4,
|
||||||
|
IN CONST CHAR8 *FilePath,
|
||||||
|
OUT UINTN *FileSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_MTFTP4_OPTION ReqOpt[1];
|
||||||
|
EFI_MTFTP4_PACKET *Packet;
|
||||||
|
UINT32 PktLen;
|
||||||
|
EFI_MTFTP4_OPTION *TableOfOptions;
|
||||||
|
EFI_MTFTP4_OPTION *Option;
|
||||||
|
UINT32 OptCnt;
|
||||||
|
UINT8 OptBuf[128];
|
||||||
|
|
||||||
|
ReqOpt[0].OptionStr = (UINT8*)"tsize";
|
||||||
|
OptBuf[0] = '0';
|
||||||
|
OptBuf[1] = 0;
|
||||||
|
ReqOpt[0].ValueStr = OptBuf;
|
||||||
|
|
||||||
|
Status = Mtftp4->GetInfo (
|
||||||
|
Mtftp4,
|
||||||
|
NULL,
|
||||||
|
(UINT8*)FilePath,
|
||||||
|
NULL,
|
||||||
|
1,
|
||||||
|
ReqOpt,
|
||||||
|
&PktLen,
|
||||||
|
&Packet
|
||||||
|
);
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = Mtftp4->ParseOptions (
|
||||||
|
Mtftp4,
|
||||||
|
PktLen,
|
||||||
|
Packet,
|
||||||
|
(UINT32 *) &OptCnt,
|
||||||
|
&TableOfOptions
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
Option = TableOfOptions;
|
||||||
|
while (OptCnt != 0) {
|
||||||
|
if (AsciiStrnCmp ((CHAR8 *)Option->OptionStr, "tsize", 5) == 0) {
|
||||||
|
*FileSize = AsciiStrDecimalToUintn ((CHAR8 *)Option->ValueStr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
OptCnt--;
|
||||||
|
Option++;
|
||||||
|
}
|
||||||
|
FreePool (TableOfOptions);
|
||||||
|
|
||||||
|
if (OptCnt == 0) {
|
||||||
|
Status = EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
Error :
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Worker function that download the data of a file from a TFTP server given
|
||||||
|
the path of the file and its size.
|
||||||
|
|
||||||
|
@param[in] Mtftp4 MTFTP4 protocol interface
|
||||||
|
@param[in] FilePath Path of the file, Unicode encoded
|
||||||
|
@param[in] AsciiFilePath Path of the file, ASCII encoded
|
||||||
|
@param[in] FileSize Size of the file in number of bytes
|
||||||
|
@param[out] Data Address where to store the address of the buffer
|
||||||
|
where the data of the file were downloaded in
|
||||||
|
case of success.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The file was downloaded.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES A memory allocation failed.
|
||||||
|
@retval Others The downloading of the file from the server failed
|
||||||
|
(see EFI_MTFTP4_PROTOCOL.ReadFile() status codes).
|
||||||
|
|
||||||
|
**/
|
||||||
|
STATIC
|
||||||
|
EFI_STATUS
|
||||||
|
DownloadFile (
|
||||||
|
IN EFI_MTFTP4_PROTOCOL *Mtftp4,
|
||||||
|
IN CONST CHAR16 *FilePath,
|
||||||
|
IN CONST CHAR8 *AsciiFilePath,
|
||||||
|
IN UINTN FileSize,
|
||||||
|
OUT VOID **Data
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_PHYSICAL_ADDRESS PagesAddress;
|
||||||
|
VOID *Buffer;
|
||||||
|
DOWNLOAD_CONTEXT *TftpContext;
|
||||||
|
EFI_MTFTP4_TOKEN Mtftp4Token;
|
||||||
|
|
||||||
|
// Downloaded file can be large. BS.AllocatePages() is more faster
|
||||||
|
// than AllocatePool() and avoid fragmentation.
|
||||||
|
// The downloaded file could be an EFI application. Marking the
|
||||||
|
// allocated page as EfiBootServicesCode would allow to execute a
|
||||||
|
// potential downloaded EFI application.
|
||||||
|
Status = gBS->AllocatePages (
|
||||||
|
AllocateAnyPages,
|
||||||
|
EfiBootServicesCode,
|
||||||
|
EFI_SIZE_TO_PAGES (FileSize),
|
||||||
|
&PagesAddress
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Buffer = (VOID*)(UINTN)PagesAddress;
|
||||||
|
TftpContext = AllocatePool (sizeof (DOWNLOAD_CONTEXT));
|
||||||
|
if (TftpContext == NULL) {
|
||||||
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto Error;
|
||||||
|
}
|
||||||
|
TftpContext->FileSize = FileSize;
|
||||||
|
TftpContext->DownloadedNbOfBytes = 0;
|
||||||
|
TftpContext->LastReportedNbOfBytes = 0;
|
||||||
|
|
||||||
|
ZeroMem (&Mtftp4Token, sizeof (EFI_MTFTP4_TOKEN));
|
||||||
|
Mtftp4Token.Filename = (UINT8*)AsciiFilePath;
|
||||||
|
Mtftp4Token.BufferSize = FileSize;
|
||||||
|
Mtftp4Token.Buffer = Buffer;
|
||||||
|
Mtftp4Token.CheckPacket = CheckPacket;
|
||||||
|
Mtftp4Token.Context = (VOID*)TftpContext;
|
||||||
|
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_TFTP_DOWNLOADING),
|
||||||
|
gShellTftpHiiHandle, FilePath
|
||||||
|
);
|
||||||
|
|
||||||
|
Status = Mtftp4->ReadFile (Mtftp4, &Mtftp4Token);
|
||||||
|
ShellPrintHiiEx (
|
||||||
|
-1, -1, NULL, STRING_TOKEN (STR_GEN_CRLF),
|
||||||
|
gShellTftpHiiHandle
|
||||||
|
);
|
||||||
|
|
||||||
|
Error :
|
||||||
|
|
||||||
|
if (TftpContext == NULL) {
|
||||||
|
FreePool (TftpContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
gBS->FreePages (PagesAddress, EFI_SIZE_TO_PAGES (FileSize));
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
*Data = Buffer;
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Update the progress of a file download
|
||||||
|
This procedure is called each time a new TFTP packet is received.
|
||||||
|
|
||||||
|
@param[in] This MTFTP4 protocol interface
|
||||||
|
@param[in] Token Parameters for the download of the file
|
||||||
|
@param[in] PacketLen Length of the packet
|
||||||
|
@param[in] Packet Address of the packet
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS All packets are accepted.
|
||||||
|
|
||||||
|
**/
|
||||||
|
STATIC
|
||||||
|
EFI_STATUS
|
||||||
|
CheckPacket (
|
||||||
|
IN EFI_MTFTP4_PROTOCOL *This,
|
||||||
|
IN EFI_MTFTP4_TOKEN *Token,
|
||||||
|
IN UINT16 PacketLen,
|
||||||
|
IN EFI_MTFTP4_PACKET *Packet
|
||||||
|
)
|
||||||
|
{
|
||||||
|
DOWNLOAD_CONTEXT *Context;
|
||||||
|
CHAR16 Progress[TFTP_PROGRESS_MESSAGE_SIZE];
|
||||||
|
UINT64 NbOfKb;
|
||||||
|
UINTN Index;
|
||||||
|
UINTN LastStep;
|
||||||
|
UINTN Step;
|
||||||
|
|
||||||
|
if ((NTOHS (Packet->OpCode)) != EFI_MTFTP4_OPCODE_DATA) {
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
Context = (DOWNLOAD_CONTEXT*)Token->Context;
|
||||||
|
if (Context->DownloadedNbOfBytes == 0) {
|
||||||
|
ShellPrintEx (-1, -1, L"%s 0 Kb", mTftpProgressFrame);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// The data in the packet are prepended with two UINT16 :
|
||||||
|
// . OpCode = EFI_MTFTP4_OPCODE_DATA
|
||||||
|
// . Block = the number of this block of data
|
||||||
|
//
|
||||||
|
Context->DownloadedNbOfBytes += PacketLen - sizeof (Packet->OpCode)
|
||||||
|
- sizeof (Packet->Data.Block);
|
||||||
|
NbOfKb = Context->DownloadedNbOfBytes / 1024;
|
||||||
|
|
||||||
|
Progress[0] = L'\0';
|
||||||
|
LastStep = (Context->LastReportedNbOfBytes * TFTP_PROGRESS_SLIDER_STEPS) /
|
||||||
|
Context->FileSize;
|
||||||
|
Step = (Context->DownloadedNbOfBytes * TFTP_PROGRESS_SLIDER_STEPS) /
|
||||||
|
Context->FileSize;
|
||||||
|
if (Step <= LastStep) {
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
ShellPrintEx (-1, -1, L"%s", mTftpProgressDelete);
|
||||||
|
|
||||||
|
StrCpy (Progress, mTftpProgressFrame);
|
||||||
|
for (Index = 1; Index < Step; Index++) {
|
||||||
|
Progress[Index] = L'=';
|
||||||
|
}
|
||||||
|
Progress[Step] = L'>';
|
||||||
|
|
||||||
|
UnicodeSPrint (
|
||||||
|
Progress + (sizeof (mTftpProgressFrame) / sizeof (CHAR16)) - 1,
|
||||||
|
sizeof (Progress) - sizeof (mTftpProgressFrame),
|
||||||
|
L" %7d Kb",
|
||||||
|
NbOfKb
|
||||||
|
);
|
||||||
|
Context->LastReportedNbOfBytes = Context->DownloadedNbOfBytes;
|
||||||
|
|
||||||
|
ShellPrintEx (-1, -1, L"%s", Progress);
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
|
@ -0,0 +1,97 @@
|
||||||
|
/** @file
|
||||||
|
Main file for NULL named library for 'tftp' Shell command functions.
|
||||||
|
|
||||||
|
Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
|
||||||
|
Copyright (c) 2015, ARM Ltd. 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
#include "UefiShellTftpCommandLib.h"
|
||||||
|
|
||||||
|
CONST CHAR16 gShellTftpFileName[] = L"ShellCommand";
|
||||||
|
EFI_HANDLE gShellTftpHiiHandle = NULL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Return the file name of the help text file if not using HII.
|
||||||
|
|
||||||
|
@return The string pointer to the file name.
|
||||||
|
**/
|
||||||
|
CONST CHAR16*
|
||||||
|
EFIAPI
|
||||||
|
ShellCommandGetManFileNameTftp (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return gShellTftpFileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Constructor for the Shell Tftp Command library.
|
||||||
|
|
||||||
|
Install the handlers for Tftp UEFI Shell command.
|
||||||
|
|
||||||
|
@param ImageHandle The image handle of the process.
|
||||||
|
@param SystemTable The EFI System Table pointer.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The Shell command handlers were installed sucessfully.
|
||||||
|
@retval EFI_UNSUPPORTED The Shell level required was not found.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ShellTftpCommandLibConstructor (
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
|
)
|
||||||
|
{
|
||||||
|
gShellTftpHiiHandle = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// check our bit of the profiles mask
|
||||||
|
//
|
||||||
|
if ((PcdGet8 (PcdShellProfileMask) & BIT3) == 0) {
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
gShellTftpHiiHandle = HiiAddPackages (
|
||||||
|
&gShellTftpHiiGuid, gImageHandle,
|
||||||
|
UefiShellTftpCommandLibStrings, NULL
|
||||||
|
);
|
||||||
|
if (gShellTftpHiiHandle == NULL) {
|
||||||
|
return EFI_DEVICE_ERROR;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Install our Shell command handler
|
||||||
|
//
|
||||||
|
ShellCommandRegisterCommandName (
|
||||||
|
L"tftp", ShellCommandRunTftp, ShellCommandGetManFileNameTftp, 0,
|
||||||
|
L"tftp", TRUE , gShellTftpHiiHandle, STRING_TOKEN (STR_GET_HELP_TFTP)
|
||||||
|
);
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Destructor for the library. free any resources.
|
||||||
|
|
||||||
|
@param ImageHandle The image handle of the process.
|
||||||
|
@param SystemTable The EFI System Table pointer.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ShellTftpCommandLibDestructor (
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (gShellTftpHiiHandle != NULL) {
|
||||||
|
HiiRemovePackages (gShellTftpHiiHandle);
|
||||||
|
}
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/** @file
|
||||||
|
header file for NULL named library for 'tftp' Shell command functions.
|
||||||
|
|
||||||
|
Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
|
||||||
|
Copyright (c) 2015, ARM Ltd. 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 _UEFI_SHELL_TFTP_COMMAND_LIB_H_
|
||||||
|
#define _UEFI_SHELL_TFTP_COMMAND_LIB_H_
|
||||||
|
|
||||||
|
#include <Uefi.h>
|
||||||
|
#include <ShellBase.h>
|
||||||
|
|
||||||
|
#include <Guid/ShellLibHiiGuid.h>
|
||||||
|
#include <Guid/NicIp4ConfigNvData.h>
|
||||||
|
|
||||||
|
#include <Protocol/ServiceBinding.h>
|
||||||
|
#include <Protocol/Mtftp4.h>
|
||||||
|
|
||||||
|
#include <Library/BaseLib.h>
|
||||||
|
#include <Library/BaseMemoryLib.h>
|
||||||
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/MemoryAllocationLib.h>
|
||||||
|
#include <Library/ShellCommandLib.h>
|
||||||
|
#include <Library/ShellLib.h>
|
||||||
|
#include <Library/UefiLib.h>
|
||||||
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||||
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
#include <Library/HiiLib.h>
|
||||||
|
#include <Library/NetLib.h>
|
||||||
|
#include <Library/PrintLib.h>
|
||||||
|
|
||||||
|
extern EFI_HANDLE gShellTftpHiiHandle;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT64 FileSize;
|
||||||
|
UINT64 DownloadedNbOfBytes;
|
||||||
|
UINT64 LastReportedNbOfBytes;
|
||||||
|
} DOWNLOAD_CONTEXT;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Function for 'tftp' command.
|
||||||
|
|
||||||
|
@param[in] ImageHandle Handle to the Image (NULL if Internal).
|
||||||
|
@param[in] SystemTable Pointer to the System Table (NULL if Internal).
|
||||||
|
**/
|
||||||
|
SHELL_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ShellCommandRunTftp (
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif /* _UEFI_SHELL_TFTP_COMMAND_LIB_H_ */
|
|
@ -0,0 +1,61 @@
|
||||||
|
## @file
|
||||||
|
# Provides Shell 'tftp' command functions
|
||||||
|
#
|
||||||
|
# Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved. <BR>
|
||||||
|
# Copyright (c) 2015, ARM Ltd. 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.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
##
|
||||||
|
|
||||||
|
[Defines]
|
||||||
|
INF_VERSION = 0x00010006
|
||||||
|
BASE_NAME = UefiShellTftpCommandLib
|
||||||
|
FILE_GUID = D2B61A25-9835-4E5D-906A-15615E1FF668
|
||||||
|
MODULE_TYPE = UEFI_DRIVER
|
||||||
|
VERSION_STRING = 1.0
|
||||||
|
LIBRARY_CLASS = NULL|UEFI_APPLICATION UEFI_DRIVER
|
||||||
|
CONSTRUCTOR = ShellTftpCommandLibConstructor
|
||||||
|
DESTRUCTOR = ShellTftpCommandLibDestructor
|
||||||
|
|
||||||
|
[Sources.common]
|
||||||
|
UefiShellTftpCommandLib.uni
|
||||||
|
UefiShellTftpCommandLib.c
|
||||||
|
UefiShellTftpCommandLib.h
|
||||||
|
Tftp.c
|
||||||
|
|
||||||
|
[Packages]
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
ShellPkg/ShellPkg.dec
|
||||||
|
MdeModulePkg/MdeModulePkg.dec
|
||||||
|
|
||||||
|
[LibraryClasses]
|
||||||
|
MemoryAllocationLib
|
||||||
|
BaseLib
|
||||||
|
BaseMemoryLib
|
||||||
|
DebugLib
|
||||||
|
ShellCommandLib
|
||||||
|
ShellLib
|
||||||
|
UefiLib
|
||||||
|
UefiRuntimeServicesTableLib
|
||||||
|
UefiBootServicesTableLib
|
||||||
|
PcdLib
|
||||||
|
HiiLib
|
||||||
|
FileHandleLib
|
||||||
|
NetLib
|
||||||
|
|
||||||
|
[Pcd]
|
||||||
|
gEfiShellPkgTokenSpaceGuid.PcdShellProfileMask ## CONSUMES
|
||||||
|
|
||||||
|
[Protocols]
|
||||||
|
gEfiManagedNetworkServiceBindingProtocolGuid ## CONSUMES
|
||||||
|
gEfiMtftp4ServiceBindingProtocolGuid ## CONSUMES
|
||||||
|
|
||||||
|
[Guids]
|
||||||
|
gShellTftpHiiGuid ## CONSUMES ## HII
|
Binary file not shown.
|
@ -53,6 +53,7 @@
|
||||||
gShellLevel2HiiGuid = {0xf95a7ccc, 0x4c55, 0x4426, {0xa7, 0xb4, 0xdc, 0x89, 0x61, 0x95, 0xb, 0xae}}
|
gShellLevel2HiiGuid = {0xf95a7ccc, 0x4c55, 0x4426, {0xa7, 0xb4, 0xdc, 0x89, 0x61, 0x95, 0xb, 0xae}}
|
||||||
gShellLevel3HiiGuid = {0x4344558d, 0x4ef9, 0x4725, {0xb1, 0xe4, 0x33, 0x76, 0xe8, 0xd6, 0x97, 0x4f}}
|
gShellLevel3HiiGuid = {0x4344558d, 0x4ef9, 0x4725, {0xb1, 0xe4, 0x33, 0x76, 0xe8, 0xd6, 0x97, 0x4f}}
|
||||||
gShellNetwork1HiiGuid = {0xf3d301bb, 0xf4a5, 0x45a8, {0xb0, 0xb7, 0xfa, 0x99, 0x9c, 0x62, 0x37, 0xae}}
|
gShellNetwork1HiiGuid = {0xf3d301bb, 0xf4a5, 0x45a8, {0xb0, 0xb7, 0xfa, 0x99, 0x9c, 0x62, 0x37, 0xae}}
|
||||||
|
gShellTftpHiiGuid = {0x738a9314, 0x82c1, 0x4592, {0x8f, 0xf7, 0xc1, 0xbd, 0xf1, 0xb2, 0x0e, 0xd4}}
|
||||||
gShellBcfgHiiGuid = {0x5f5f605d, 0x1583, 0x4a2d, {0xa6, 0xb2, 0xeb, 0x12, 0xda, 0xb4, 0xa2, 0xb6}}
|
gShellBcfgHiiGuid = {0x5f5f605d, 0x1583, 0x4a2d, {0xa6, 0xb2, 0xeb, 0x12, 0xda, 0xb4, 0xa2, 0xb6}}
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
|
|
|
@ -98,6 +98,9 @@
|
||||||
!ifdef $(INCLUDE_DP)
|
!ifdef $(INCLUDE_DP)
|
||||||
NULL|ShellPkg/Library/UefiDpLib/UefiDpLib.inf
|
NULL|ShellPkg/Library/UefiDpLib/UefiDpLib.inf
|
||||||
!endif #$(INCLUDE_DP)
|
!endif #$(INCLUDE_DP)
|
||||||
|
!ifdef $(INCLUDE_TFTP_COMMAND)
|
||||||
|
NULL|ShellPkg/Library/UefiShellTftpCommandLib/UefiShellTftpCommandLib.inf
|
||||||
|
!endif #$(INCLUDE_TFTP_COMMAND)
|
||||||
!endif #$(NO_SHELL_PROFILES)
|
!endif #$(NO_SHELL_PROFILES)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue