2 Main file for Comp shell Debug1 function.
4 Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UefiShellDebug1CommandsLib.h"
18 Function for 'comp' command.
20 @param[in] ImageHandle Handle to the Image (NULL if Internal).
21 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
26 IN EFI_HANDLE ImageHandle
,
27 IN EFI_SYSTEM_TABLE
*SystemTable
33 SHELL_STATUS ShellStatus
;
35 SHELL_FILE_HANDLE FileHandle1
;
36 SHELL_FILE_HANDLE FileHandle2
;
48 UINTN DataSizeFromFile1
;
49 UINTN DataSizeFromFile2
;
54 ShellStatus
= SHELL_SUCCESS
;
63 // initialize the shell lib (we must be in non-auto-init...)
65 Status
= ShellInitialize();
66 ASSERT_EFI_ERROR(Status
);
68 Status
= CommandInit();
69 ASSERT_EFI_ERROR(Status
);
72 // parse the command line
74 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
75 if (EFI_ERROR(Status
)) {
76 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
77 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
78 FreePool(ProblemParam
);
79 ShellStatus
= SHELL_INVALID_PARAMETER
;
84 if (ShellCommandLineGetCount(Package
) > 3) {
85 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
86 ShellStatus
= SHELL_INVALID_PARAMETER
;
87 } else if (ShellCommandLineGetCount(Package
) < 3) {
88 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
89 ShellStatus
= SHELL_INVALID_PARAMETER
;
91 FileName1
= ShellFindFilePath(ShellCommandLineGetRawValue(Package
, 1));
92 if (FileName1
== NULL
) {
93 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_FIND_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 1));
94 ShellStatus
= SHELL_NOT_FOUND
;
96 Status
= ShellOpenFileByName(FileName1
, &FileHandle1
, EFI_FILE_MODE_READ
, 0);
97 if (EFI_ERROR(Status
)) {
98 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 1), Status
);
99 ShellStatus
= SHELL_NOT_FOUND
;
102 FileName2
= ShellFindFilePath(ShellCommandLineGetRawValue(Package
, 2));
103 if (FileName2
== NULL
) {
104 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_FIND_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 2));
105 ShellStatus
= SHELL_NOT_FOUND
;
107 Status
= ShellOpenFileByName(FileName2
, &FileHandle2
, EFI_FILE_MODE_READ
, 0);
108 if (EFI_ERROR(Status
)) {
109 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 2), Status
);
110 ShellStatus
= SHELL_NOT_FOUND
;
113 if (ShellStatus
== SHELL_SUCCESS
) {
114 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_HEADER
), gShellDebug1HiiHandle
, FileName1
, FileName2
);
115 Status
= gEfiShellProtocol
->GetFileSize(FileHandle1
, &Size1
);
116 ASSERT_EFI_ERROR(Status
);
117 Status
= gEfiShellProtocol
->GetFileSize(FileHandle2
, &Size2
);
118 ASSERT_EFI_ERROR(Status
);
119 if (Size1
!= Size2
) {
120 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_SIZE_FAIL
), gShellDebug1HiiHandle
);
122 ShellStatus
= SHELL_NOT_EQUAL
;
125 if (ShellStatus
== SHELL_SUCCESS
) {
126 for (LoopVar
= 0 ; LoopVar
< Size1
&& ErrorCount
<= 10 ; LoopVar
++) {
127 DataSizeFromFile1
= 1;
128 DataSizeFromFile2
= 1;
129 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &DataFromFile1
);
130 ASSERT_EFI_ERROR(Status
);
131 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &DataFromFile2
);
132 ASSERT_EFI_ERROR(Status
);
133 if (DataFromFile1
!= DataFromFile2
) {
140 if (LoopVar
+ 1 < Size1
) {
142 DataSizeFromFile1
= 1;
143 DataSizeFromFile2
= 1;
144 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File11
);
145 ASSERT_EFI_ERROR(Status
);
146 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File21
);
147 ASSERT_EFI_ERROR(Status
);
148 if (LoopVar
+ 1 < Size1
) {
150 DataSizeFromFile1
= 1;
151 DataSizeFromFile2
= 1;
152 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File12
);
153 ASSERT_EFI_ERROR(Status
);
154 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File22
);
155 ASSERT_EFI_ERROR(Status
);
156 if (LoopVar
+ 1 < Size1
) {
158 DataSizeFromFile1
= 1;
159 DataSizeFromFile2
= 1;
160 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File13
);
161 ASSERT_EFI_ERROR(Status
);
162 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File23
);
163 ASSERT_EFI_ERROR(Status
);
167 if (ADF_File13
!= ADF_File23
) {
172 STRING_TOKEN (STR_COMP_SPOT_FAIL4
),
173 gShellDebug1HiiHandle
,
177 DataFromFile1
, ADF_File11
, ADF_File12
, ADF_File13
,
178 DataFromFile1
, ADF_File11
, ADF_File12
, ADF_File13
,
181 DataFromFile2
, ADF_File21
, ADF_File22
, ADF_File23
,
182 DataFromFile2
, ADF_File21
, ADF_File22
, ADF_File23
184 } else if (ADF_File12
!= ADF_File22
) {
189 STRING_TOKEN (STR_COMP_SPOT_FAIL3
),
190 gShellDebug1HiiHandle
,
194 DataFromFile1
, ADF_File11
, ADF_File12
,
195 DataFromFile1
, ADF_File11
, ADF_File12
,
198 DataFromFile2
, ADF_File21
, ADF_File22
,
199 DataFromFile2
, ADF_File21
, ADF_File22
201 } else if (ADF_File11
!= ADF_File21
) {
206 STRING_TOKEN (STR_COMP_SPOT_FAIL2
),
207 gShellDebug1HiiHandle
,
211 DataFromFile1
, ADF_File11
,
212 DataFromFile1
, ADF_File11
,
215 DataFromFile2
, ADF_File21
,
216 DataFromFile2
, ADF_File21
223 STRING_TOKEN (STR_COMP_SPOT_FAIL1
),
224 gShellDebug1HiiHandle
,
236 ShellStatus
= SHELL_NOT_EQUAL
;
239 if (ErrorCount
== 0) {
240 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_FOOTER_PASS
), gShellDebug1HiiHandle
);
242 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_FOOTER_FAIL
), gShellDebug1HiiHandle
);
247 ShellCommandLineFreeVarList (Package
);
249 SHELL_FREE_NON_NULL(FileName1
);
250 SHELL_FREE_NON_NULL(FileName2
);
252 if (FileHandle1
!= NULL
) {
253 gEfiShellProtocol
->CloseFile(FileHandle1
);
255 if (FileHandle2
!= NULL
) {
256 gEfiShellProtocol
->CloseFile(FileHandle2
);
259 return (ShellStatus
);