2 Main file for Comp shell Debug1 function.
4 Copyright (c) 2010, 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"
20 IN EFI_HANDLE ImageHandle
,
21 IN EFI_SYSTEM_TABLE
*SystemTable
27 SHELL_STATUS ShellStatus
;
29 SHELL_FILE_HANDLE FileHandle1
;
30 SHELL_FILE_HANDLE FileHandle2
;
42 UINTN DataSizeFromFile1
;
43 UINTN DataSizeFromFile2
;
48 ShellStatus
= SHELL_SUCCESS
;
57 // initialize the shell lib (we must be in non-auto-init...)
59 Status
= ShellInitialize();
60 ASSERT_EFI_ERROR(Status
);
62 Status
= CommandInit();
63 ASSERT_EFI_ERROR(Status
);
66 // parse the command line
68 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
69 if (EFI_ERROR(Status
)) {
70 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
71 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
72 FreePool(ProblemParam
);
73 ShellStatus
= SHELL_INVALID_PARAMETER
;
78 if (ShellCommandLineGetCount(Package
) > 3) {
79 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
80 ShellStatus
= SHELL_INVALID_PARAMETER
;
81 } else if (ShellCommandLineGetCount(Package
) < 3) {
82 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
83 ShellStatus
= SHELL_INVALID_PARAMETER
;
85 FileName1
= ShellFindFilePath(ShellCommandLineGetRawValue(Package
, 1));
86 FileName2
= ShellFindFilePath(ShellCommandLineGetRawValue(Package
, 2));
87 Status
= ShellOpenFileByName(FileName1
, &FileHandle1
, EFI_FILE_MODE_READ
, 0);
88 if (EFI_ERROR(Status
)) {
89 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 1), Status
);
90 ShellStatus
= SHELL_NOT_FOUND
;
92 Status
= ShellOpenFileByName(FileName2
, &FileHandle2
, EFI_FILE_MODE_READ
, 0);
93 if (EFI_ERROR(Status
)) {
94 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, ShellCommandLineGetRawValue(Package
, 2), Status
);
95 ShellStatus
= SHELL_NOT_FOUND
;
97 if (FileHandleIsDirectory(FileHandle1
) == EFI_SUCCESS
){
98 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, FileName1
);
99 ShellStatus
= SHELL_INVALID_PARAMETER
;
101 if (FileHandleIsDirectory(FileHandle2
) == EFI_SUCCESS
){
102 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_NOT_DIR
), gShellDebug1HiiHandle
, FileName2
);
103 ShellStatus
= SHELL_INVALID_PARAMETER
;
105 if (ShellStatus
== SHELL_SUCCESS
) {
106 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_HEADER
), gShellDebug1HiiHandle
, FileName1
, FileName2
);
107 Status
= gEfiShellProtocol
->GetFileSize(FileHandle1
, &Size1
);
108 ASSERT_EFI_ERROR(Status
);
109 Status
= gEfiShellProtocol
->GetFileSize(FileHandle2
, &Size2
);
110 ASSERT_EFI_ERROR(Status
);
111 if (Size1
!= Size2
) {
112 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_SIZE_FAIL
), gShellDebug1HiiHandle
);
114 ShellStatus
= SHELL_NOT_EQUAL
;
117 if (ShellStatus
== SHELL_SUCCESS
) {
118 for (LoopVar
= 0 ; LoopVar
< Size1
&& ErrorCount
<= 10 ; LoopVar
++) {
119 DataSizeFromFile1
= 1;
120 DataSizeFromFile2
= 1;
121 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &DataFromFile1
);
122 ASSERT_EFI_ERROR(Status
);
123 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &DataFromFile2
);
124 ASSERT_EFI_ERROR(Status
);
125 if (DataFromFile1
!= DataFromFile2
) {
132 if (LoopVar
+ 1 < Size1
) {
134 DataSizeFromFile1
= 1;
135 DataSizeFromFile2
= 1;
136 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File11
);
137 ASSERT_EFI_ERROR(Status
);
138 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File21
);
139 ASSERT_EFI_ERROR(Status
);
140 if (LoopVar
+ 1 < Size1
) {
142 DataSizeFromFile1
= 1;
143 DataSizeFromFile2
= 1;
144 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File12
);
145 ASSERT_EFI_ERROR(Status
);
146 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File22
);
147 ASSERT_EFI_ERROR(Status
);
148 if (LoopVar
+ 1 < Size1
) {
150 DataSizeFromFile1
= 1;
151 DataSizeFromFile2
= 1;
152 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File13
);
153 ASSERT_EFI_ERROR(Status
);
154 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File23
);
155 ASSERT_EFI_ERROR(Status
);
159 if (ADF_File13
!= ADF_File23
) {
164 STRING_TOKEN (STR_COMP_SPOT_FAIL4
),
165 gShellDebug1HiiHandle
,
169 DataFromFile1
, ADF_File11
, ADF_File12
, ADF_File13
,
170 DataFromFile1
, ADF_File11
, ADF_File12
, ADF_File13
,
173 DataFromFile2
, ADF_File21
, ADF_File22
, ADF_File23
,
174 DataFromFile2
, ADF_File21
, ADF_File22
, ADF_File23
176 } else if (ADF_File12
!= ADF_File22
) {
181 STRING_TOKEN (STR_COMP_SPOT_FAIL3
),
182 gShellDebug1HiiHandle
,
186 DataFromFile1
, ADF_File11
, ADF_File12
,
187 DataFromFile1
, ADF_File11
, ADF_File12
,
190 DataFromFile2
, ADF_File21
, ADF_File22
,
191 DataFromFile2
, ADF_File21
, ADF_File22
193 } else if (ADF_File11
!= ADF_File21
) {
198 STRING_TOKEN (STR_COMP_SPOT_FAIL2
),
199 gShellDebug1HiiHandle
,
203 DataFromFile1
, ADF_File11
,
204 DataFromFile1
, ADF_File11
,
207 DataFromFile2
, ADF_File21
,
208 DataFromFile2
, ADF_File21
215 STRING_TOKEN (STR_COMP_SPOT_FAIL1
),
216 gShellDebug1HiiHandle
,
228 ShellStatus
= SHELL_NOT_EQUAL
;
232 if (ErrorCount
== 0) {
233 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_FOOTER_PASS
), gShellDebug1HiiHandle
);
235 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_FOOTER_FAIL
), gShellDebug1HiiHandle
);
239 ShellCommandLineFreeVarList (Package
);
241 if (FileName1
!= NULL
) {
244 if (FileName2
!= NULL
) {
247 if (FileHandle1
!= NULL
) {
248 gEfiShellProtocol
->CloseFile(FileHandle1
);
250 if (FileHandle2
!= NULL
) {
251 gEfiShellProtocol
->CloseFile(FileHandle2
);
254 return (ShellStatus
);