OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
GrubEnv.c
Go to the documentation of this file.
1
8#include <Library/BaseLib.h>
10#include "LinuxBootInternal.h"
11
12/*
13 grubenv processing states.
14*/
21
22EFI_STATUS
24 IN OUT CHAR8 *Content,
25 IN CONST UINTN Length
26 )
27{
28 EFI_STATUS Status;
29 UINTN Pos;
30 UINTN KeyStart;
31 UINTN VarStart;
32 GRUBENV_STATE State;
33
34 State = GRUBENV_NEXT_LINE;
35
36 //
37 // In a valid grubenv block the last comment, if present, is not
38 // \n terminated, but all var lines must be.
39 //
40 for (Pos = 0; Pos < Length && Content[Pos] != '\0'; Pos++) {
41 switch (State) {
43 if (Content[Pos] == '#') {
44 State = GRUBENV_COMMENT;
45 } else {
46 KeyStart = Pos;
47 State = GRUBENV_KEY;
48 }
49
50 break;
51
52 case GRUBENV_COMMENT:
53 if (Content[Pos] == '\n') {
54 State = GRUBENV_NEXT_LINE;
55 }
56
57 break;
58
59 case GRUBENV_KEY:
60 if (Content[Pos] == '=') {
61 Content[Pos] = '\0';
62 VarStart = Pos + 1;
63 State = GRUBENV_VAR;
64 }
65
66 break;
67
68 case GRUBENV_VAR:
69 if (Content[Pos] == '\n') {
70 Content[Pos] = '\0';
71 Status = InternalSetGrubVar (&Content[KeyStart], &Content[VarStart], VAR_ERR_NONE);
72 if (EFI_ERROR (Status)) {
73 return Status;
74 }
75
76 State = GRUBENV_NEXT_LINE;
77 }
78
79 break;
80
81 default:
82 ASSERT (FALSE);
83 break;
84 }
85 }
86
87 ASSERT (State == GRUBENV_COMMENT || State == GRUBENV_NEXT_LINE);
88
89 return EFI_SUCCESS;
90}
UINT64 Length
GRUBENV_STATE_
Definition GrubEnv.c:15
@ GRUBENV_KEY
Definition GrubEnv.c:17
@ GRUBENV_NEXT_LINE
Definition GrubEnv.c:16
@ GRUBENV_COMMENT
Definition GrubEnv.c:19
@ GRUBENV_VAR
Definition GrubEnv.c:18
enum GRUBENV_STATE_ GRUBENV_STATE
EFI_STATUS InternalProcessGrubEnv(IN OUT CHAR8 *Content, IN CONST UINTN Length)
Definition GrubEnv.c:23
EFI_STATUS InternalSetGrubVar(CHAR8 *Key, CHAR8 *Value, UINTN Errors)
Definition GrubVars.c:44
#define VAR_ERR_NONE
#define ASSERT(x)
Definition coder.h:55
ush Pos
Definition deflate.h:92