/** @file
Parse the INI configuration file and pass the information to the recovery driver
so that the driver can perform recovery accordingly.
Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "RecoveryModuleLoadPei.h"
#include
#include
#define MAX_LINE_LENGTH 512
/**
Parse Config data file to get the updated data array.
@param[in] DataBuffer Config raw file buffer.
@param[in] BufferSize Size of raw buffer.
@param[in, out] ConfigHeader Pointer to the config header.
@param[in, out] RecoveryArray Pointer to the config of recovery data.
@retval EFI_NOT_FOUND No config data is found.
@retval EFI_OUT_OF_RESOURCES No enough memory is allocated.
@retval EFI_SUCCESS Parse the config file successfully.
**/
EFI_STATUS
ParseRecoveryDataFile (
IN UINT8 *DataBuffer,
IN UINTN BufferSize,
IN OUT CONFIG_HEADER *ConfigHeader,
IN OUT RECOVERY_CONFIG_DATA **RecoveryArray
)
{
EFI_STATUS Status;
CHAR8 *SectionName;
CHAR8 Entry[MAX_LINE_LENGTH];
UINTN Num;
UINTN Index;
EFI_GUID FileGuid;
VOID *Context;
//
// First process the data buffer and get all sections and entries
//
Context = OpenIniFile (DataBuffer, BufferSize);
if (Context == NULL) {
return EFI_INVALID_PARAMETER;
}
//
// Now get NumOfUpdate
//
Status = GetDecimalUintnFromDataFile (
Context,
"Head",
"NumOfRecovery",
&Num
);
if (EFI_ERROR (Status) || (Num == 0)) {
DEBUG ((DEBUG_ERROR, "NumOfRecovery not found\n"));
CloseIniFile (Context);
return EFI_NOT_FOUND;
}
ConfigHeader->NumOfRecovery = Num;
*RecoveryArray = AllocateZeroPool ((sizeof (RECOVERY_CONFIG_DATA) * Num));
if (*RecoveryArray == NULL) {
CloseIniFile (Context);
return EFI_OUT_OF_RESOURCES;
}
for (Index = 0; Index < ConfigHeader->NumOfRecovery; Index++) {
//
// Get the section name of each update
//
AsciiStrCpyS (Entry, MAX_LINE_LENGTH, "Recovery");
AsciiValueToStringS (
Entry + AsciiStrnLenS (Entry, MAX_LINE_LENGTH),
MAX_LINE_LENGTH - AsciiStrnLenS (Entry, MAX_LINE_LENGTH),
0,
Index,
0
);
Status = GetStringFromDataFile (
Context,
"Head",
Entry,
&SectionName
);
if (EFI_ERROR (Status) || (SectionName == NULL)) {
DEBUG ((DEBUG_ERROR, "[%d] %a not found\n", Index, Entry));
CloseIniFile (Context);
return EFI_NOT_FOUND;
}
//
// The section name of this update has been found.
// Now looks for all the config data of this update
//
//
// FileGuid
//
Status = GetGuidFromDataFile (
Context,
SectionName,
"FileGuid",
&FileGuid
);
if (EFI_ERROR (Status)) {
CloseIniFile (Context);
DEBUG ((DEBUG_ERROR, "[%d] FileGuid not found\n", Index));
return EFI_NOT_FOUND;
}
CopyGuid (&((*RecoveryArray)[Index].FileGuid), &FileGuid);
//
// Length
//
Status = GetHexUintnFromDataFile (
Context,
SectionName,
"Length",
&Num
);
if (EFI_ERROR (Status)) {
CloseIniFile (Context);
DEBUG ((DEBUG_ERROR, "[%d] Length not found\n", Index));
return EFI_NOT_FOUND;
}
(*RecoveryArray)[Index].Length = Num;
//
// ImageOffset
//
Status = GetHexUintnFromDataFile (
Context,
SectionName,
"ImageOffset",
&Num
);
if (EFI_ERROR (Status)) {
CloseIniFile (Context);
DEBUG ((DEBUG_ERROR, "[%d] ImageOffset not found\n", Index));
return EFI_NOT_FOUND;
}
(*RecoveryArray)[Index].ImageOffset = Num;
}
//
// Now all configuration data got. Free those temporary buffers
//
CloseIniFile (Context);
return EFI_SUCCESS;
}