1 /** @file 2 Main file for EfiCompress shell Debug1 function. 3 4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR> 5 Copyright (c) 2005 - 2011, 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 #include "UefiShellDebug1CommandsLib.h" 17 #include "Compress.h" 18 19 /** 20 Function for 'compress' command. 21 22 @param[in] ImageHandle Handle to the Image (NULL if Internal). 23 @param[in] SystemTable Pointer to the System Table (NULL if Internal). 24 **/ 25 SHELL_STATUS 26 EFIAPI 27 ShellCommandRunEfiCompress ( 28 IN EFI_HANDLE ImageHandle, 29 IN EFI_SYSTEM_TABLE *SystemTable 30 ) 31 { 32 EFI_STATUS Status; 33 LIST_ENTRY *Package; 34 CHAR16 *ProblemParam; 35 SHELL_STATUS ShellStatus; 36 SHELL_FILE_HANDLE InShellFileHandle; 37 SHELL_FILE_HANDLE OutShellFileHandle; 38 UINT64 OutSize; 39 UINTN OutSize2; 40 VOID *OutBuffer; 41 UINT64 InSize; 42 UINTN InSize2; 43 VOID *InBuffer; 44 CHAR16 *InFileName; 45 CONST CHAR16 *OutFileName; 46 CONST CHAR16 *TempParam; 47 48 InFileName = NULL; 49 OutFileName = NULL; 50 OutSize = 0; 51 ShellStatus = SHELL_SUCCESS; 52 Status = EFI_SUCCESS; 53 OutBuffer = NULL; 54 InShellFileHandle = NULL; 55 OutShellFileHandle = NULL; 56 InBuffer = NULL; 57 58 // 59 // initialize the shell lib (we must be in non-auto-init...) 60 // 61 Status = ShellInitialize(); 62 ASSERT_EFI_ERROR(Status); 63 64 Status = CommandInit(); 65 ASSERT_EFI_ERROR(Status); 66 67 // 68 // parse the command line 69 // 70 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); 71 if (EFI_ERROR(Status)) { 72 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { 73 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"eficompress", ProblemParam); 74 FreePool(ProblemParam); 75 ShellStatus = SHELL_INVALID_PARAMETER; 76 } else { 77 ASSERT(FALSE); 78 } 79 } else { 80 if (ShellCommandLineGetCount(Package) > 3) { 81 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"eficompress"); 82 ShellStatus = SHELL_INVALID_PARAMETER; 83 } else if (ShellCommandLineGetCount(Package) < 3) { 84 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"eficompress"); 85 ShellStatus = SHELL_INVALID_PARAMETER; 86 } else { 87 TempParam = ShellCommandLineGetRawValue(Package, 1); 88 ASSERT(TempParam != NULL); 89 InFileName = ShellFindFilePath(TempParam); 90 OutFileName = ShellCommandLineGetRawValue(Package, 2); 91 if (InFileName == NULL) { 92 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, L"eficompress", TempParam); 93 ShellStatus = SHELL_NOT_FOUND; 94 } else { 95 if (ShellIsDirectory(InFileName) == EFI_SUCCESS){ 96 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"eficompress", InFileName); 97 ShellStatus = SHELL_INVALID_PARAMETER; 98 } 99 if (ShellIsDirectory(OutFileName) == EFI_SUCCESS){ 100 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"eficompress", OutFileName); 101 ShellStatus = SHELL_INVALID_PARAMETER; 102 } 103 if (ShellStatus == SHELL_SUCCESS) { 104 Status = ShellOpenFileByName(InFileName, &InShellFileHandle, EFI_FILE_MODE_READ, 0); 105 if (EFI_ERROR(Status)) { 106 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"eficompress", ShellCommandLineGetRawValue(Package, 1)); 107 ShellStatus = SHELL_NOT_FOUND; 108 } 109 Status = ShellOpenFileByName(OutFileName, &OutShellFileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0); 110 if (EFI_ERROR(Status)) { 111 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"eficompress", ShellCommandLineGetRawValue(Package, 2)); 112 ShellStatus = SHELL_NOT_FOUND; 113 } 114 } 115 if (ShellStatus == SHELL_SUCCESS) { 116 Status = gEfiShellProtocol->GetFileSize(InShellFileHandle, &InSize); 117 ASSERT_EFI_ERROR(Status); 118 InBuffer = AllocateZeroPool((UINTN)InSize); 119 ASSERT(InBuffer != NULL); 120 InSize2 = (UINTN)InSize; 121 Status = gEfiShellProtocol->ReadFile(InShellFileHandle, &InSize2, InBuffer); 122 InSize = InSize2; 123 ASSERT_EFI_ERROR(Status); 124 Status = Compress(InBuffer, InSize, OutBuffer, &OutSize); 125 if (Status == EFI_BUFFER_TOO_SMALL) { 126 OutBuffer = AllocateZeroPool((UINTN)OutSize); 127 ASSERT(OutBuffer != NULL); 128 Status = Compress(InBuffer, InSize, OutBuffer, &OutSize); 129 } 130 if (EFI_ERROR(Status)) { 131 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_EFI_COMPRESS_FAIL), gShellDebug1HiiHandle, Status); 132 ShellStatus = SHELL_DEVICE_ERROR; 133 } else { 134 OutSize2 = (UINTN)OutSize; 135 Status = gEfiShellProtocol->WriteFile(OutShellFileHandle, &OutSize2, OutBuffer); 136 if (EFI_ERROR(Status)) { 137 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_WRITE_FAIL), gShellDebug1HiiHandle, L"eficompress", OutFileName); 138 ShellStatus = SHELL_DEVICE_ERROR; 139 } 140 } 141 } 142 } 143 } 144 145 ShellCommandLineFreeVarList (Package); 146 } 147 if (InShellFileHandle != NULL) { 148 gEfiShellProtocol->CloseFile(InShellFileHandle); 149 } 150 if (OutShellFileHandle != NULL) { 151 gEfiShellProtocol->CloseFile(OutShellFileHandle); 152 } 153 SHELL_FREE_NON_NULL(InFileName); 154 SHELL_FREE_NON_NULL(InBuffer); 155 SHELL_FREE_NON_NULL(OutBuffer); 156 157 return (ShellStatus); 158 } 159