]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdeModulePkg/Application/CapsuleApp/AppSupport.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Application / CapsuleApp / AppSupport.c
... / ...
CommitLineData
1/** @file\r
2 A shell application that triggers capsule update process.\r
3\r
4 Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>\r
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
7**/\r
8\r
9#include <Uefi.h>\r
10#include <Library/BaseLib.h>\r
11#include <Library/DebugLib.h>\r
12#include <Library/BaseMemoryLib.h>\r
13#include <Library/MemoryAllocationLib.h>\r
14#include <Library/UefiBootServicesTableLib.h>\r
15#include <Protocol/SimpleFileSystem.h>\r
16#include <Protocol/ShellParameters.h>\r
17#include <Protocol/Shell.h>\r
18#include <Guid/FileInfo.h>\r
19\r
20UINTN Argc;\r
21CHAR16 **Argv;\r
22EFI_SHELL_PROTOCOL *mShellProtocol = NULL;\r
23\r
24/**\r
25\r
26 This function parse application ARG.\r
27\r
28 @return Status\r
29**/\r
30EFI_STATUS\r
31GetArg (\r
32 VOID\r
33 )\r
34{\r
35 EFI_STATUS Status;\r
36 EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters;\r
37\r
38 Status = gBS->HandleProtocol (\r
39 gImageHandle,\r
40 &gEfiShellParametersProtocolGuid,\r
41 (VOID**)&ShellParameters\r
42 );\r
43 if (EFI_ERROR(Status)) {\r
44 return Status;\r
45 }\r
46\r
47 Argc = ShellParameters->Argc;\r
48 Argv = ShellParameters->Argv;\r
49 return EFI_SUCCESS;\r
50}\r
51\r
52/**\r
53 Get shell protocol.\r
54\r
55 @return Pointer to shell protocol.\r
56**/\r
57EFI_SHELL_PROTOCOL *\r
58GetShellProtocol (\r
59 VOID\r
60 )\r
61{\r
62 EFI_STATUS Status;\r
63\r
64 if (mShellProtocol == NULL) {\r
65 Status = gBS->LocateProtocol (\r
66 &gEfiShellProtocolGuid,\r
67 NULL,\r
68 (VOID **) &mShellProtocol\r
69 );\r
70 if (EFI_ERROR (Status)) {\r
71 mShellProtocol = NULL;\r
72 }\r
73 }\r
74\r
75 return mShellProtocol;\r
76}\r
77\r
78/**\r
79 Read a file.\r
80\r
81 @param[in] FileName The file to be read.\r
82 @param[out] BufferSize The file buffer size\r
83 @param[out] Buffer The file buffer\r
84\r
85 @retval EFI_SUCCESS Read file successfully\r
86 @retval EFI_NOT_FOUND Shell protocol or file not found\r
87 @retval others Read file failed\r
88**/\r
89EFI_STATUS\r
90ReadFileToBuffer (\r
91 IN CHAR16 *FileName,\r
92 OUT UINTN *BufferSize,\r
93 OUT VOID **Buffer\r
94 )\r
95{\r
96 EFI_STATUS Status;\r
97 EFI_SHELL_PROTOCOL *ShellProtocol;\r
98 SHELL_FILE_HANDLE Handle;\r
99 UINT64 FileSize;\r
100 UINTN TempBufferSize;\r
101 VOID *TempBuffer;\r
102\r
103 ShellProtocol = GetShellProtocol();\r
104 if (ShellProtocol == NULL) {\r
105 return EFI_NOT_FOUND;\r
106 }\r
107\r
108 //\r
109 // Open file by FileName.\r
110 //\r
111 Status = ShellProtocol->OpenFileByName (\r
112 FileName,\r
113 &Handle,\r
114 EFI_FILE_MODE_READ\r
115 );\r
116 if (EFI_ERROR (Status)) {\r
117 return Status;\r
118 }\r
119\r
120 //\r
121 // Get the file size.\r
122 //\r
123 Status = ShellProtocol->GetFileSize (Handle, &FileSize);\r
124 if (EFI_ERROR (Status)) {\r
125 ShellProtocol->CloseFile (Handle);\r
126 return Status;\r
127 }\r
128\r
129 TempBufferSize = (UINTN) FileSize;\r
130 TempBuffer = AllocateZeroPool (TempBufferSize);\r
131 if (TempBuffer == NULL) {\r
132 ShellProtocol->CloseFile (Handle);\r
133 return EFI_OUT_OF_RESOURCES;\r
134 }\r
135\r
136 //\r
137 // Read the file data to the buffer\r
138 //\r
139 Status = ShellProtocol->ReadFile (\r
140 Handle,\r
141 &TempBufferSize,\r
142 TempBuffer\r
143 );\r
144 if (EFI_ERROR (Status)) {\r
145 ShellProtocol->CloseFile (Handle);\r
146 return Status;\r
147 }\r
148\r
149 ShellProtocol->CloseFile (Handle);\r
150\r
151 *BufferSize = TempBufferSize;\r
152 *Buffer = TempBuffer;\r
153 return EFI_SUCCESS;\r
154}\r
155\r
156/**\r
157 Write a file.\r
158\r
159 @param[in] FileName The file to be written.\r
160 @param[in] BufferSize The file buffer size\r
161 @param[in] Buffer The file buffer\r
162\r
163 @retval EFI_SUCCESS Write file successfully\r
164 @retval EFI_NOT_FOUND Shell protocol not found\r
165 @retval others Write file failed\r
166**/\r
167EFI_STATUS\r
168WriteFileFromBuffer (\r
169 IN CHAR16 *FileName,\r
170 IN UINTN BufferSize,\r
171 IN VOID *Buffer\r
172 )\r
173{\r
174 EFI_STATUS Status;\r
175 EFI_SHELL_PROTOCOL *ShellProtocol;\r
176 SHELL_FILE_HANDLE Handle;\r
177 EFI_FILE_INFO *FileInfo;\r
178 UINTN TempBufferSize;\r
179\r
180 ShellProtocol = GetShellProtocol();\r
181 if (ShellProtocol == NULL) {\r
182 return EFI_NOT_FOUND;\r
183 }\r
184\r
185 //\r
186 // Open file by FileName.\r
187 //\r
188 Status = ShellProtocol->OpenFileByName (\r
189 FileName,\r
190 &Handle,\r
191 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE\r
192 );\r
193 if (EFI_ERROR (Status)) {\r
194 return Status;\r
195 }\r
196\r
197 //\r
198 // Empty the file contents.\r
199 //\r
200 FileInfo = ShellProtocol->GetFileInfo (Handle);\r
201 if (FileInfo == NULL) {\r
202 ShellProtocol->CloseFile (Handle);\r
203 return EFI_DEVICE_ERROR;\r
204 }\r
205\r
206 //\r
207 // If the file size is already 0, then it has been empty.\r
208 //\r
209 if (FileInfo->FileSize != 0) {\r
210 //\r
211 // Set the file size to 0.\r
212 //\r
213 FileInfo->FileSize = 0;\r
214 Status = ShellProtocol->SetFileInfo (Handle, FileInfo);\r
215 if (EFI_ERROR (Status)) {\r
216 FreePool (FileInfo);\r
217 ShellProtocol->CloseFile (Handle);\r
218 return Status;\r
219 }\r
220 }\r
221 FreePool (FileInfo);\r
222\r
223 //\r
224 // Write the file data from the buffer\r
225 //\r
226 TempBufferSize = BufferSize;\r
227 Status = ShellProtocol->WriteFile (\r
228 Handle,\r
229 &TempBufferSize,\r
230 Buffer\r
231 );\r
232 if (EFI_ERROR (Status)) {\r
233 ShellProtocol->CloseFile (Handle);\r
234 return Status;\r
235 }\r
236\r
237 ShellProtocol->CloseFile (Handle);\r
238\r
239 return EFI_SUCCESS;\r
240}\r
241\r