2 Main file for EfiCompress shell Debug1 function.
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include "UefiShellDebug1CommandsLib.h"
14 Function for 'compress' command.
16 @param[in] ImageHandle Handle to the Image (NULL if Internal).
17 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
21 ShellCommandRunEfiCompress (
22 IN EFI_HANDLE ImageHandle
,
23 IN EFI_SYSTEM_TABLE
*SystemTable
29 SHELL_STATUS ShellStatus
;
30 SHELL_FILE_HANDLE InShellFileHandle
;
31 SHELL_FILE_HANDLE OutShellFileHandle
;
39 CONST CHAR16
*OutFileName
;
40 CONST CHAR16
*TempParam
;
45 ShellStatus
= SHELL_SUCCESS
;
48 InShellFileHandle
= NULL
;
49 OutShellFileHandle
= NULL
;
53 // initialize the shell lib (we must be in non-auto-init...)
55 Status
= ShellInitialize();
56 ASSERT_EFI_ERROR(Status
);
58 Status
= CommandInit();
59 ASSERT_EFI_ERROR(Status
);
62 // parse the command line
64 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
65 if (EFI_ERROR(Status
)) {
66 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
67 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, L
"eficompress", ProblemParam
);
68 FreePool(ProblemParam
);
69 ShellStatus
= SHELL_INVALID_PARAMETER
;
74 if (ShellCommandLineGetCount(Package
) > 3) {
75 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
, L
"eficompress");
76 ShellStatus
= SHELL_INVALID_PARAMETER
;
77 } else if (ShellCommandLineGetCount(Package
) < 3) {
78 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
, L
"eficompress");
79 ShellStatus
= SHELL_INVALID_PARAMETER
;
81 TempParam
= ShellCommandLineGetRawValue(Package
, 1);
82 ASSERT(TempParam
!= NULL
);
83 InFileName
= ShellFindFilePath(TempParam
);
84 OutFileName
= ShellCommandLineGetRawValue(Package
, 2);
85 if (InFileName
== NULL
) {
86 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_FIND_FAIL
), gShellDebug1HiiHandle
, L
"eficompress", TempParam
);
87 ShellStatus
= SHELL_NOT_FOUND
;
89 if (ShellIsDirectory(InFileName
) == EFI_SUCCESS
){
90 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, L
"eficompress", InFileName
);
91 ShellStatus
= SHELL_INVALID_PARAMETER
;
93 if (ShellIsDirectory(OutFileName
) == EFI_SUCCESS
){
94 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, L
"eficompress", OutFileName
);
95 ShellStatus
= SHELL_INVALID_PARAMETER
;
97 if (ShellStatus
== SHELL_SUCCESS
) {
98 Status
= ShellOpenFileByName(InFileName
, &InShellFileHandle
, EFI_FILE_MODE_READ
, 0);
99 if (EFI_ERROR(Status
)) {
100 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, L
"eficompress", ShellCommandLineGetRawValue(Package
, 1));
101 ShellStatus
= SHELL_NOT_FOUND
;
103 Status
= ShellOpenFileByName(OutFileName
, &OutShellFileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
104 if (EFI_ERROR(Status
)) {
105 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, L
"eficompress", ShellCommandLineGetRawValue(Package
, 2));
106 ShellStatus
= SHELL_NOT_FOUND
;
109 if (ShellStatus
== SHELL_SUCCESS
) {
110 Status
= gEfiShellProtocol
->GetFileSize(InShellFileHandle
, &InSize
);
111 ASSERT_EFI_ERROR(Status
);
112 InBuffer
= AllocateZeroPool((UINTN
)InSize
);
113 if (InBuffer
== NULL
) {
114 Status
= EFI_OUT_OF_RESOURCES
;
116 InSize2
= (UINTN
) InSize
;
117 Status
= gEfiShellProtocol
->ReadFile (InShellFileHandle
, &InSize2
, InBuffer
);
119 ASSERT_EFI_ERROR (Status
);
120 Status
= Compress (InBuffer
, InSize
, OutBuffer
, &OutSize
);
121 if (Status
== EFI_BUFFER_TOO_SMALL
) {
122 OutBuffer
= AllocateZeroPool ((UINTN
) OutSize
);
123 if (OutBuffer
== NULL
) {
124 Status
= EFI_OUT_OF_RESOURCES
;
126 Status
= Compress (InBuffer
, InSize
, OutBuffer
, &OutSize
);
130 if (EFI_ERROR(Status
)) {
131 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_EFI_COMPRESS_FAIL
), gShellDebug1HiiHandle
, Status
);
132 ShellStatus
= ((Status
== EFI_OUT_OF_RESOURCES
) ? SHELL_OUT_OF_RESOURCES
: SHELL_DEVICE_ERROR
);
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
;
145 ShellCommandLineFreeVarList (Package
);
147 if (InShellFileHandle
!= NULL
) {
148 gEfiShellProtocol
->CloseFile(InShellFileHandle
);
150 if (OutShellFileHandle
!= NULL
) {
151 gEfiShellProtocol
->CloseFile(OutShellFileHandle
);
153 SHELL_FREE_NON_NULL(InFileName
);
154 SHELL_FREE_NON_NULL(InBuffer
);
155 SHELL_FREE_NON_NULL(OutBuffer
);
157 return (ShellStatus
);