2
* GRUB -- GRand Unified Bootloader
3
* Copyright (C) 2009,2010 Free Software Foundation, Inc.
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.
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.
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/>.
21
#include <grub/command.h>
22
#include <grub/term.h>
23
#include <grub/i18n.h>
24
#include <grub/misc.h>
26
struct grub_term_autoload *grub_term_input_autoload = NULL;
27
struct grub_term_autoload *grub_term_output_autoload = NULL;
30
grub_cmd_terminal_input (grub_command_t cmd __attribute__ ((unused)),
31
int argc, char **args)
34
grub_term_input_t term;
35
struct grub_term_autoload *aut;
39
grub_puts_ (N_ ("Active input terminals:"));
40
FOR_ACTIVE_TERM_INPUTS(term)
41
grub_printf ("%s ", term->name);
43
grub_puts_ (N_ ("Available input terminals:"));
44
FOR_DISABLED_TERM_INPUTS(term)
45
grub_printf ("%s ", term->name);
46
/* This is quadratic but we don't expect mode than 30 terminal
48
for (aut = grub_term_input_autoload; aut; aut = aut->next)
50
FOR_DISABLED_TERM_INPUTS(term)
51
if (grub_strcmp (term->name, aut->name) == 0)
54
FOR_ACTIVE_TERM_INPUTS(term)
55
if (grub_strcmp (term->name, aut->name) == 0)
58
grub_printf ("%s ", aut->name);
65
if (grub_strcmp (args[0], "--append") == 0
66
|| grub_strcmp (args[0], "--remove") == 0)
70
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_ ("no terminal specified"));
77
FOR_DISABLED_TERM_INPUTS(term)
78
if (grub_strcmp (args[i], term->name) == 0)
81
FOR_ACTIVE_TERM_INPUTS(term)
82
if (grub_strcmp (args[i], term->name) == 0)
87
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown terminal '%s'\n",
89
for (aut = grub_term_input_autoload; aut; aut = aut->next)
90
if (grub_strcmp (args[i], aut->name) == 0)
93
mod = grub_dl_load (aut->modname);
96
grub_errno = GRUB_ERR_NONE;
100
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown terminal '%s'\n",
106
if (grub_strcmp (args[0], "--append") == 0)
108
for (i = 1; i < argc; i++)
110
FOR_DISABLED_TERM_INPUTS(term)
111
if (grub_strcmp (args[i], term->name) == 0)
115
if (term->init && term->init () != GRUB_ERR_NONE)
118
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_inputs_disabled)),
119
GRUB_AS_LIST (term));
120
grub_list_push (GRUB_AS_LIST_P (&grub_term_inputs),
121
GRUB_AS_LIST (term));
124
return GRUB_ERR_NONE;
127
if (grub_strcmp (args[0], "--remove") == 0)
129
for (i = 1; i < argc; i++)
131
FOR_ACTIVE_TERM_INPUTS(term)
132
if (grub_strcmp (args[i], term->name) == 0)
136
if (!term->next && term == grub_term_inputs)
137
return grub_error (GRUB_ERR_BAD_ARGUMENT,
138
"can't remove the last terminal");
139
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_inputs)),
140
GRUB_AS_LIST (term));
143
grub_list_push (GRUB_AS_LIST_P (&grub_term_inputs_disabled),
144
GRUB_AS_LIST (term));
147
return GRUB_ERR_NONE;
149
for (i = 0; i < argc; i++)
151
FOR_DISABLED_TERM_INPUTS(term)
152
if (grub_strcmp (args[i], term->name) == 0)
156
if (term->init && term->init () != GRUB_ERR_NONE)
159
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_inputs_disabled)),
160
GRUB_AS_LIST (term));
161
grub_list_push (GRUB_AS_LIST_P (&grub_term_inputs),
162
GRUB_AS_LIST (term));
166
FOR_ACTIVE_TERM_INPUTS(term)
168
for (i = 0; i < argc; i++)
169
if (grub_strcmp (args[i], term->name) == 0)
173
if (!term->next && term == grub_term_inputs)
174
return grub_error (GRUB_ERR_BAD_ARGUMENT,
175
"can't remove the last terminal");
176
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_inputs)),
177
GRUB_AS_LIST (term));
180
grub_list_push (GRUB_AS_LIST_P (&grub_term_inputs_disabled),
181
GRUB_AS_LIST (term));
185
return GRUB_ERR_NONE;
189
grub_cmd_terminal_output (grub_command_t cmd __attribute__ ((unused)),
190
int argc, char **args)
193
grub_term_output_t term;
194
struct grub_term_autoload *aut;
198
grub_puts_ (N_ ("Active output terminals:"));
199
FOR_ACTIVE_TERM_OUTPUTS(term)
200
grub_printf ("%s ", term->name);
202
grub_puts_ (N_ ("Available output terminals:"));
203
FOR_DISABLED_TERM_OUTPUTS(term)
204
grub_printf ("%s ", term->name);
205
/* This is quadratic but we don't expect mode than 30 terminal
207
for (aut = grub_term_output_autoload; aut; aut = aut->next)
209
FOR_DISABLED_TERM_OUTPUTS(term)
210
if (grub_strcmp (term->name, aut->name) == 0)
213
FOR_ACTIVE_TERM_OUTPUTS(term)
214
if (grub_strcmp (term->name, aut->name) == 0)
217
grub_printf ("%s ", aut->name);
220
return GRUB_ERR_NONE;
224
if (grub_strcmp (args[0], "--append") == 0
225
|| grub_strcmp (args[0], "--remove") == 0)
229
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_ ("no terminal specified"));
231
for (; i < argc; i++)
236
FOR_DISABLED_TERM_OUTPUTS(term)
237
if (grub_strcmp (args[i], term->name) == 0)
240
FOR_ACTIVE_TERM_OUTPUTS(term)
241
if (grub_strcmp (args[i], term->name) == 0)
246
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown terminal '%s'\n",
248
for (aut = grub_term_output_autoload; aut; aut = aut->next)
249
if (grub_strcmp (args[i], aut->name) == 0)
252
mod = grub_dl_load (aut->modname);
255
grub_errno = GRUB_ERR_NONE;
259
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown terminal '%s'\n",
265
if (grub_strcmp (args[0], "--append") == 0)
267
for (i = 1; i < argc; i++)
269
FOR_DISABLED_TERM_OUTPUTS(term)
270
if (grub_strcmp (args[i], term->name) == 0)
274
if (term->init && term->init () != GRUB_ERR_NONE)
277
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_outputs_disabled)),
278
GRUB_AS_LIST (term));
279
grub_list_push (GRUB_AS_LIST_P (&grub_term_outputs),
280
GRUB_AS_LIST (term));
283
return GRUB_ERR_NONE;
286
if (grub_strcmp (args[0], "--remove") == 0)
288
for (i = 1; i < argc; i++)
290
FOR_ACTIVE_TERM_OUTPUTS(term)
291
if (grub_strcmp (args[i], term->name) == 0)
295
if (!term->next && term == grub_term_outputs)
296
return grub_error (GRUB_ERR_BAD_ARGUMENT,
297
"can't remove the last terminal");
298
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_outputs)),
299
GRUB_AS_LIST (term));
302
grub_list_push (GRUB_AS_LIST_P (&grub_term_outputs_disabled),
303
GRUB_AS_LIST (term));
306
return GRUB_ERR_NONE;
309
for (i = 0; i < argc; i++)
311
FOR_DISABLED_TERM_OUTPUTS(term)
312
if (grub_strcmp (args[i], term->name) == 0)
316
if (term->init && term->init () != GRUB_ERR_NONE)
319
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_outputs_disabled)),
320
GRUB_AS_LIST (term));
321
grub_list_push (GRUB_AS_LIST_P (&grub_term_outputs),
322
GRUB_AS_LIST (term));
326
FOR_ACTIVE_TERM_OUTPUTS(term)
328
for (i = 0; i < argc; i++)
329
if (grub_strcmp (args[i], term->name) == 0)
333
if (!term->next && term == grub_term_outputs)
334
return grub_error (GRUB_ERR_BAD_ARGUMENT,
335
"can't remove the last terminal");
336
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_outputs)),
337
GRUB_AS_LIST (term));
340
grub_list_push (GRUB_AS_LIST_P (&grub_term_outputs_disabled),
341
GRUB_AS_LIST (term));
345
return GRUB_ERR_NONE;
348
static grub_command_t cmd_terminal_input, cmd_terminal_output;
350
GRUB_MOD_INIT(terminal)
353
grub_register_command ("terminal_input", grub_cmd_terminal_input,
354
"[--append|--remove] "
355
"[TERMINAL1] [TERMINAL2] ...",
356
"List or select an input terminal.");
357
cmd_terminal_output =
358
grub_register_command ("terminal_output", grub_cmd_terminal_output,
359
"[--append|--remove] "
360
"[TERMINAL1] [TERMINAL2] ...",
361
"List or select an output terminal.");
364
GRUB_MOD_FINI(terminal)
366
grub_unregister_command (cmd_terminal_input);
367
grub_unregister_command (cmd_terminal_output);