]> git.proxmox.com Git - mirror_edk2.git/blob - SignedCapsulePkg/Universal/RecoveryModuleLoadPei/ParseConfigProfile.c
SignedCapsulePkg: Apply uncrustify changes
[mirror_edk2.git] / SignedCapsulePkg / Universal / RecoveryModuleLoadPei / ParseConfigProfile.c
1 /** @file
2 Parse the INI configuration file and pass the information to the recovery driver
3 so that the driver can perform recovery accordingly.
4
5 Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
6
7 SPDX-License-Identifier: BSD-2-Clause-Patent
8
9 **/
10
11 #include "RecoveryModuleLoadPei.h"
12 #include <Library/IniParsingLib.h>
13 #include <Library/PrintLib.h>
14
15 #define MAX_LINE_LENGTH 512
16
17 /**
18 Parse Config data file to get the updated data array.
19
20 @param[in] DataBuffer Config raw file buffer.
21 @param[in] BufferSize Size of raw buffer.
22 @param[in, out] ConfigHeader Pointer to the config header.
23 @param[in, out] RecoveryArray Pointer to the config of recovery data.
24
25 @retval EFI_NOT_FOUND No config data is found.
26 @retval EFI_OUT_OF_RESOURCES No enough memory is allocated.
27 @retval EFI_SUCCESS Parse the config file successfully.
28
29 **/
30 EFI_STATUS
31 ParseRecoveryDataFile (
32 IN UINT8 *DataBuffer,
33 IN UINTN BufferSize,
34 IN OUT CONFIG_HEADER *ConfigHeader,
35 IN OUT RECOVERY_CONFIG_DATA **RecoveryArray
36 )
37 {
38 EFI_STATUS Status;
39 CHAR8 *SectionName;
40 CHAR8 Entry[MAX_LINE_LENGTH];
41 UINTN Num;
42 UINTN Index;
43 EFI_GUID FileGuid;
44 VOID *Context;
45
46 //
47 // First process the data buffer and get all sections and entries
48 //
49 Context = OpenIniFile (DataBuffer, BufferSize);
50 if (Context == NULL) {
51 return EFI_INVALID_PARAMETER;
52 }
53
54 //
55 // Now get NumOfUpdate
56 //
57 Status = GetDecimalUintnFromDataFile (
58 Context,
59 "Head",
60 "NumOfRecovery",
61 &Num
62 );
63 if (EFI_ERROR (Status) || (Num == 0)) {
64 DEBUG ((DEBUG_ERROR, "NumOfRecovery not found\n"));
65 CloseIniFile (Context);
66 return EFI_NOT_FOUND;
67 }
68
69 ConfigHeader->NumOfRecovery = Num;
70 *RecoveryArray = AllocateZeroPool ((sizeof (RECOVERY_CONFIG_DATA) * Num));
71 if (*RecoveryArray == NULL) {
72 CloseIniFile (Context);
73 return EFI_OUT_OF_RESOURCES;
74 }
75
76 for (Index = 0; Index < ConfigHeader->NumOfRecovery; Index++) {
77 //
78 // Get the section name of each update
79 //
80 AsciiStrCpyS (Entry, MAX_LINE_LENGTH, "Recovery");
81 AsciiValueToStringS (
82 Entry + AsciiStrnLenS (Entry, MAX_LINE_LENGTH),
83 MAX_LINE_LENGTH - AsciiStrnLenS (Entry, MAX_LINE_LENGTH),
84 0,
85 Index,
86 0
87 );
88 Status = GetStringFromDataFile (
89 Context,
90 "Head",
91 Entry,
92 &SectionName
93 );
94 if (EFI_ERROR (Status) || (SectionName == NULL)) {
95 DEBUG ((DEBUG_ERROR, "[%d] %a not found\n", Index, Entry));
96 CloseIniFile (Context);
97 return EFI_NOT_FOUND;
98 }
99
100 //
101 // The section name of this update has been found.
102 // Now looks for all the config data of this update
103 //
104
105 //
106 // FileGuid
107 //
108 Status = GetGuidFromDataFile (
109 Context,
110 SectionName,
111 "FileGuid",
112 &FileGuid
113 );
114 if (EFI_ERROR (Status)) {
115 CloseIniFile (Context);
116 DEBUG ((DEBUG_ERROR, "[%d] FileGuid not found\n", Index));
117 return EFI_NOT_FOUND;
118 }
119
120 CopyGuid (&((*RecoveryArray)[Index].FileGuid), &FileGuid);
121
122 //
123 // Length
124 //
125 Status = GetHexUintnFromDataFile (
126 Context,
127 SectionName,
128 "Length",
129 &Num
130 );
131 if (EFI_ERROR (Status)) {
132 CloseIniFile (Context);
133 DEBUG ((DEBUG_ERROR, "[%d] Length not found\n", Index));
134 return EFI_NOT_FOUND;
135 }
136
137 (*RecoveryArray)[Index].Length = Num;
138
139 //
140 // ImageOffset
141 //
142 Status = GetHexUintnFromDataFile (
143 Context,
144 SectionName,
145 "ImageOffset",
146 &Num
147 );
148 if (EFI_ERROR (Status)) {
149 CloseIniFile (Context);
150 DEBUG ((DEBUG_ERROR, "[%d] ImageOffset not found\n", Index));
151 return EFI_NOT_FOUND;
152 }
153
154 (*RecoveryArray)[Index].ImageOffset = Num;
155 }
156
157 //
158 // Now all configuration data got. Free those temporary buffers
159 //
160 CloseIniFile (Context);
161
162 return EFI_SUCCESS;
163 }