From 6e7a315eb67cb6c113cf37e1d66c4f11a51a2b3e Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 18:29:51 +0200 Subject: Adding upstream version 2.06. Signed-off-by: Daniel Baumann --- grub-core/kern/command.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 grub-core/kern/command.c (limited to 'grub-core/kern/command.c') diff --git a/grub-core/kern/command.c b/grub-core/kern/command.c new file mode 100644 index 0000000..4aabcd4 --- /dev/null +++ b/grub-core/kern/command.c @@ -0,0 +1,111 @@ +/* command.c - support basic command */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2009 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include +#include +#include + +grub_command_t grub_command_list; + +grub_command_t +grub_register_command_prio (const char *name, + grub_command_func_t func, + const char *summary, + const char *description, + int prio) +{ + grub_command_t cmd; + int inactive = 0; + + grub_command_t *p, q; + + cmd = (grub_command_t) grub_zalloc (sizeof (*cmd)); + if (! cmd) + return 0; + + cmd->name = name; + cmd->func = func; + cmd->summary = (summary) ? summary : ""; + cmd->description = description; + + cmd->flags = 0; + cmd->prio = prio; + + for (p = &grub_command_list, q = *p; q; p = &(q->next), q = q->next) + { + int r; + + r = grub_strcmp (cmd->name, q->name); + if (r < 0) + break; + if (r > 0) + continue; + + if (cmd->prio >= (q->prio & GRUB_COMMAND_PRIO_MASK)) + { + q->prio &= ~GRUB_COMMAND_FLAG_ACTIVE; + break; + } + + inactive = 1; + } + + *p = cmd; + cmd->next = q; + if (q) + q->prev = &cmd->next; + cmd->prev = p; + + if (! inactive) + cmd->prio |= GRUB_COMMAND_FLAG_ACTIVE; + + return cmd; +} + +static grub_err_t +grub_cmd_lockdown (grub_command_t cmd __attribute__ ((unused)), + int argc __attribute__ ((unused)), + char **argv __attribute__ ((unused))) + +{ + return grub_error (GRUB_ERR_ACCESS_DENIED, + N_("%s: the command is not allowed when lockdown is enforced"), + cmd->name); +} + +grub_command_t +grub_register_command_lockdown (const char *name, + grub_command_func_t func, + const char *summary, + const char *description) +{ + if (grub_is_lockdown () == GRUB_LOCKDOWN_ENABLED) + func = grub_cmd_lockdown; + + return grub_register_command_prio (name, func, summary, description, 0); +} + +void +grub_unregister_command (grub_command_t cmd) +{ + if ((cmd->prio & GRUB_COMMAND_FLAG_ACTIVE) && (cmd->next)) + cmd->next->prio |= GRUB_COMMAND_FLAG_ACTIVE; + grub_list_remove (GRUB_AS_LIST (cmd)); + grub_free (cmd); +} -- cgit v1.2.3