1 /*
2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2012 Daniil Lunev
4 *
5 * GRUB is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * GRUB is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 #include <grub/types.h>
20 #include <grub/misc.h>
21 #include <grub/command.h>
22 #include <grub/mm.h>
23 #include <grub/err.h>
24 #include <grub/dl.h>
25 #include <grub/file.h>
26 #include <grub/normal.h>
27 #include <grub/script_sh.h>
28 #include <grub/i18n.h>
29 #include <grub/term.h>
30 #include <grub/legacy_parse.h>
31 #include <grub/crypto.h>
32 #include <grub/auth.h>
33 #include <grub/disk.h>
34 #include <grub/partition.h>
35
36 #include "menu_managing.c"
37
38 GRUB_MOD_LICENSE ("GPLv3+");
39
40 static entries *
41 parse_entries(grub_file_t file)
42 {
43 entries * list = NULL;
44 entries * current = NULL;
45 init_entries(&list);
46 for(;;) {
47 char * buf = grub_file_getline(file);
48 char * param = buf;
49 char * value;
50
51 if (! buf)
52 break;
53
54 if ((buf[0] == '#') || (buf[0] == ' ') ||
55 (buf[0] == '\t') || (buf[0] == '\n')) {
56 grub_free(buf);
57 continue;
58 }
59
60 while ((*param == ' ') || (*param == '\t'))
61 ++param;
62
63 value = grub_strchr(param, ' ');
64 if (! value)
65 value = grub_strchr(param, '\t');
66
67 if (! value) {
68 grub_free(buf);
69 continue;
70 }
71
72 *value++ = 0;
73 while ((*value == ' ') || (*value == '\t'))
74 ++value;
75
76 if ((*value == '\0') || (*value == '\n')) {
77 grub_free(buf);
78 continue;
79 }
80
81 if (! grub_strcmp(param, "default")) {
82 } else if (! grub_strcmp(param, "timeout")) {
83 } else if (! grub_strcmp(param, "serial")) {
84 } else if (! grub_strcmp(param, "terminal")) {
85 } else if (! grub_strcmp(param, "title")) {
86 current = new_entry(value, list);
87 } else if (! grub_strcmp(param, "bootfs")) {
88 char * lpath;
89 if (! current) {
90 grub_free(buf);
91 grub_error (GRUB_ERR_INVALID_COMMAND, N_("illumos syntax error"));
92 return NULL;
93 }
94 lpath = grub_strchr(value, '/');
95 *lpath = 0;
96 grub_strcpy(current->entry_info[POOL_LABEL], value);
97 *lpath = '/';
98 grub_strcpy(current->entry_info[DATA_SET], lpath);
99 } else if (! grub_strcmp(param, "kernel$")) {
100 char * ender;
101 ender = grub_strchr(value, ' ');
102 if (! ender)
103 ender = grub_strchr(value, '\t');
104 if (ender)
105 *ender = 0;
106 grub_strcpy(current->entry_info[KERNEL_PATH], value);
107 if (ender) {
108 ++ender;
109 while ((*ender == ' ') || (*ender == '\t'))
110 ++ender;
111 grub_strcpy(current->entry_info[KERNEL_OPTIONS], ender);
112 }
113 } else if (! grub_strcmp(param, "module$")) {
114 grub_strcpy(current->entry_info[BA_PATH], value);
115 } else {
116 grub_free(buf);
117 continue;
118 }
119 grub_free(buf);
120 }
121 return list;
122 }
123
124 static grub_err_t
125 grub_solaris_legacy_cmd(struct grub_command *cmd,
126 int argc, char **args)
127 {
128 int new_env, extractor;
129 extractor = (cmd->name[0] == 'e');
130 new_env = (cmd->name[extractor ? (sizeof ("extract_slegacy_entries_") - 1)
131 : (sizeof ("slegacy_") - 1)] == 'c');
132
133
134 if (argc != 1)
135 return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
136
137 grub_file_t file = grub_file_open(args[0]);
138
139 if (new_env)
140 grub_cls ();
141
142 if (new_env && !extractor)
143 grub_env_context_open ();
144 if (extractor)
145 grub_env_extractor_open (!new_env);
146
147 if (! file)
148 return grub_errno;
149
150 entries * list = parse_entries(file);
151
152 if (! list) {
153 return grub_error (GRUB_ERR_INVALID_COMMAND, N_("illumos syntax error"));
154 }
155
156 add_entries(list);
157
158 if (new_env)
159 {
160 grub_menu_t menu;
161 menu = grub_env_get_menu ();
162 if (menu && menu->size)
163 grub_show_menu (menu, 1, 0);
164 if (!extractor)
165 grub_env_context_close ();
166 }
167 if (extractor)
168 grub_env_extractor_close (!new_env);
169
170 clear_entries(list);
171
172 grub_file_close(file);
173 return 0;
174 }
175
176 static grub_command_t cmd_source, cmd_configfile;
177 static grub_command_t cmd_source_extract, cmd_configfile_extract;
178
179 GRUB_MOD_INIT(solaris_legacy)
180 {
181 cmd_source
182 = grub_register_command ("slegacy_source",
183 grub_solaris_legacy_cmd,
184 N_("FILE"),
185 /* TRANSLATORS: "legacy config" means
186 "config as used by grub-legacy". */
187 N_("Parse legacy config in same context"));
188 cmd_configfile
189 = grub_register_command ("slegacy_configfile",
190 grub_solaris_legacy_cmd,
191 N_("FILE"),
192 N_("Parse legacy config in new context"));
193 cmd_source_extract
194 = grub_register_command ("extract_slegacy_entries_source",
195 grub_solaris_legacy_cmd,
196 N_("FILE"),
197 N_("Parse legacy config in same context taking only menu entries"));
198 cmd_configfile_extract
199 = grub_register_command ("extract_slegacy_entries_configfile",
200 grub_solaris_legacy_cmd,
201 N_("FILE"),
202 N_("Parse legacy config in new context taking only menu entries"));
203
204
205 }
206
207 GRUB_MOD_FINI(solaris_legacy)
208 {
209 grub_unregister_command (cmd_source);
210 grub_unregister_command (cmd_configfile);
211 grub_unregister_command (cmd_source_extract);
212 grub_unregister_command (cmd_configfile_extract);
213 }