1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
#include <stdio.h>
#include <string.h>
#include <log/log.h>
#include <types/types.h>
#include <talloc/talloc.h>
#include <array-size/array-size.h>
#include <discover/parser.h>
#include <discover/file.h>
#include "grub2.h"
static const char *default_envfile = "grubenv";
static const char *signature = "# GRUB Environment Block\n";
static int parse_buf_to_env(struct grub2_script *script, void *buf, int len)
{
char *tmp, *line, *sep;
int siglen;
siglen = strlen(signature);
if (len < siglen) {
pb_log("grub environment block too small\n");
return -1;
}
if (memcmp(buf, signature, siglen)) {
pb_log("grub environment block has invalid signature\n");
return -1;
}
buf += siglen;
for (line = strtok_r(buf, "\n", &tmp); line;
line = strtok_r(NULL, "\n", &tmp)) {
if (*line == '#')
continue;
sep = strchr(line, '=');
if (!sep)
continue;
if (sep == line)
continue;
*sep = '\0';
script_env_set(script, line, sep + 1);
}
return 0;
}
int builtin_load_env(struct grub2_script *script,
void *data __attribute__((unused)),
int argc, char *argv[]);
int builtin_load_env(struct grub2_script *script,
void *data __attribute__((unused)),
int argc, char *argv[])
{
struct discover_device *dev = script->ctx->device;
const char *envfile;
char *buf, *envpath;
int rc, len;
/* we only support local filesystems */
if (!dev->mounted) {
pb_log("load_env: can't load from a non-mounted device (%s)\n",
dev->device->id);
return -1;
}
if (argc == 3 && !strcmp(argv[1], "-f"))
envfile = argv[2];
else
envfile = default_envfile;
envpath = talloc_asprintf(script, "%s/%s",
script_env_get(script, "prefix") ? : "",
envfile);
rc = parser_request_file(script->ctx, dev, envpath, &buf, &len);
if (!rc)
rc = parse_buf_to_env(script, buf, len);
talloc_free(buf);
return 0;
}
int builtin_save_env(struct grub2_script *script,
void *data __attribute__((unused)),
int argc, char *argv[]);
int builtin_save_env(struct grub2_script *script __attribute__((unused)),
void *data __attribute__((unused)),
int argc __attribute__((unused)),
char *argv[] __attribute__((unused)))
{
/* todo: save */
return 0;
}
|