From af1a266670d040d2f4083ff309d732d648afba2a Mon Sep 17 00:00:00 2001 From: Angelos Mouzakitis Date: Tue, 10 Oct 2023 14:33:42 +0000 Subject: Add submodule dependency files Change-Id: Iaf8d18082d3991dec7c0ebbea540f092188eb4ec --- .../Library/UefiShellLevel2CommandsLib/Vol.c | 307 +++++++++++++++++++++ 1 file changed, 307 insertions(+) create mode 100644 roms/edk2/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c (limited to 'roms/edk2/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c') diff --git a/roms/edk2/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c b/roms/edk2/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c new file mode 100644 index 000000000..2ed97666b --- /dev/null +++ b/roms/edk2/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c @@ -0,0 +1,307 @@ +/** @file + Main file for vol shell level 2 function. + + (C) Copyright 2015 Hewlett-Packard Development Company, L.P.
+ Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "UefiShellLevel2CommandsLib.h" +#include +#include + +/** + Print the info or change the volume info. + + @param[in] Path String with starting path. + @param[in] Delete TRUE to delete the volume label. FALSE otherwise. + @param[in] Name New name to set to the volume label. + + @retval SHELL_SUCCESS The operation was sucessful. +**/ +SHELL_STATUS +HandleVol( + IN CONST CHAR16 *Path, + IN CONST BOOLEAN Delete, + IN CONST CHAR16 *Name OPTIONAL + ) +{ + EFI_STATUS Status; + SHELL_STATUS ShellStatus; + EFI_FILE_SYSTEM_INFO *SysInfo; + UINTN SysInfoSize; + SHELL_FILE_HANDLE ShellFileHandle; + EFI_FILE_PROTOCOL *EfiFpHandle; + UINTN Size1; + UINTN Size2; + + ShellStatus = SHELL_SUCCESS; + + if ( + Name != NULL && ( + StrStr(Name, L"%") != NULL || + StrStr(Name, L"^") != NULL || + StrStr(Name, L"*") != NULL || + StrStr(Name, L"+") != NULL || + StrStr(Name, L"=") != NULL || + StrStr(Name, L"[") != NULL || + StrStr(Name, L"]") != NULL || + StrStr(Name, L"|") != NULL || + StrStr(Name, L":") != NULL || + StrStr(Name, L";") != NULL || + StrStr(Name, L"\"") != NULL || + StrStr(Name, L"<") != NULL || + StrStr(Name, L">") != NULL || + StrStr(Name, L"?") != NULL || + StrStr(Name, L"/") != NULL || + StrStr(Name, L" ") != NULL ) + ){ + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"vol", Name); + return (SHELL_INVALID_PARAMETER); + } + + Status = gEfiShellProtocol->OpenFileByName( + Path, + &ShellFileHandle, + Name != NULL?EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE:EFI_FILE_MODE_READ); + + if (EFI_ERROR(Status) || ShellFileHandle == NULL) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"vol", Path); + return (SHELL_ACCESS_DENIED); + } + + // + // Get the Volume Info from ShellFileHandle + // + SysInfo = NULL; + SysInfoSize = 0; + EfiFpHandle = ConvertShellHandleToEfiFileProtocol(ShellFileHandle); + Status = EfiFpHandle->GetInfo( + EfiFpHandle, + &gEfiFileSystemInfoGuid, + &SysInfoSize, + SysInfo); + + if (Status == EFI_BUFFER_TOO_SMALL) { + SysInfo = AllocateZeroPool(SysInfoSize); + Status = EfiFpHandle->GetInfo( + EfiFpHandle, + &gEfiFileSystemInfoGuid, + &SysInfoSize, + SysInfo); + } + + ASSERT(SysInfo != NULL); + + if (Delete) { + *((CHAR16 *) SysInfo->VolumeLabel) = CHAR_NULL; + SysInfo->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize(SysInfo->VolumeLabel); + Status = EfiFpHandle->SetInfo( + EfiFpHandle, + &gEfiFileSystemInfoGuid, + (UINTN)SysInfo->Size, + SysInfo); + } else if (Name != NULL) { + Size1 = StrSize(Name); + Size2 = StrSize(SysInfo->VolumeLabel); + if (Size1 > Size2) { + SysInfo = ReallocatePool((UINTN)SysInfo->Size, (UINTN)SysInfo->Size + Size1 - Size2, SysInfo); + if (SysInfo == NULL) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"vol"); + ShellStatus = SHELL_OUT_OF_RESOURCES; + } + } + if (SysInfo != NULL) { + StrCpyS ( (CHAR16 *) SysInfo->VolumeLabel, + (Size1>Size2? Size1/sizeof(CHAR16) : Size2/sizeof(CHAR16)), + Name + ); + SysInfo->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + Size1; + Status = EfiFpHandle->SetInfo( + EfiFpHandle, + &gEfiFileSystemInfoGuid, + (UINTN)SysInfo->Size, + SysInfo); + } + } + + FreePool(SysInfo); + + if (Delete || Name != NULL) { + if (EFI_ERROR(Status)) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"vol", Path); + ShellStatus = SHELL_ACCESS_DENIED; + } + } + + SysInfoSize = 0; + SysInfo = NULL; + + Status = EfiFpHandle->GetInfo( + EfiFpHandle, + &gEfiFileSystemInfoGuid, + &SysInfoSize, + SysInfo); + + if (Status == EFI_BUFFER_TOO_SMALL) { + SysInfo = AllocateZeroPool(SysInfoSize); + Status = EfiFpHandle->GetInfo( + EfiFpHandle, + &gEfiFileSystemInfoGuid, + &SysInfoSize, + SysInfo); + } + + gEfiShellProtocol->CloseFile(ShellFileHandle); + + ASSERT(SysInfo != NULL); + + if (SysInfo != NULL) { + // + // print VolumeInfo table + // + ShellPrintHiiEx ( + 0, + gST->ConOut->Mode->CursorRow, + NULL, + STRING_TOKEN (STR_VOL_VOLINFO), + gShellLevel2HiiHandle, + SysInfo->VolumeLabel, + SysInfo->ReadOnly?L"r":L"rw", + SysInfo->VolumeSize, + SysInfo->FreeSpace, + SysInfo->BlockSize + ); + SHELL_FREE_NON_NULL(SysInfo); + } + + return (ShellStatus); +} + +STATIC CONST SHELL_PARAM_ITEM ParamList[] = { + {L"-d", TypeFlag}, + {L"-n", TypeValue}, + {NULL, TypeMax} + }; + +/** + Function for 'Vol' 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 +ShellCommandRunVol ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + CONST CHAR16 *PathName; + CONST CHAR16 *CurDir; + BOOLEAN DeleteMode; + CHAR16 *FullPath; + CHAR16 *TempSpot; + UINTN Length; + CONST CHAR16 *NewName; + + Length = 0; + ProblemParam = NULL; + ShellStatus = SHELL_SUCCESS; + PathName = NULL; + CurDir = NULL; + FullPath = NULL; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize(); + ASSERT_EFI_ERROR(Status); + + // + // Fix local copies of the protocol pointers + // + Status = CommandInit(); + ASSERT_EFI_ERROR(Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR(Status)) { + if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"vol", ProblemParam); + FreePool(ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT(FALSE); + } + } else { + // + // check for "-?" + // + if (ShellCommandLineGetFlag(Package, L"-?")) { + ASSERT(FALSE); + } + + if (ShellCommandLineGetCount(Package) > 2) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"vol"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + PathName = ShellCommandLineGetRawValue(Package, 1); + if (PathName == NULL) { + CurDir = gEfiShellProtocol->GetCurDir(NULL); + if (CurDir == NULL) { + ShellStatus = SHELL_NOT_FOUND; + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"vol"); + } else { + PathName = CurDir; + } + } + if (PathName != NULL) { + TempSpot = StrStr(PathName, L":"); + if (TempSpot != NULL) { + *TempSpot = CHAR_NULL; + } + TempSpot = StrStr(PathName, L"\\"); + if (TempSpot != NULL) { + *TempSpot = CHAR_NULL; + } + StrnCatGrow(&FullPath, &Length, PathName, 0); + StrnCatGrow(&FullPath, &Length, L":\\", 0); + DeleteMode = ShellCommandLineGetFlag(Package, L"-d"); + NewName = ShellCommandLineGetValue(Package, L"-n"); + if (DeleteMode && ShellCommandLineGetFlag(Package, L"-n")) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellLevel2HiiHandle, L"vol", L"-d", L"-n"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else if (ShellCommandLineGetFlag(Package, L"-n") && NewName == NULL) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"vol", L"-n"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else if (NewName != NULL && StrLen(NewName) > 11) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"vol", NewName, L"-n"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else if (ShellStatus == SHELL_SUCCESS) { + ShellStatus = HandleVol( + FullPath, + DeleteMode, + NewName + ); + } + } + } + } + + SHELL_FREE_NON_NULL(FullPath); + + // + // free the command line package + // + ShellCommandLineFreeVarList (Package); + + return (ShellStatus); +} -- cgit