2009-11-21 Samuel Thibault <samuel.thibault@ens-lyon.org>
[grub2.git] / commands / extcmd.c
blob16796febf8fe8269f15e7695ac3593c34eacee91
1 /* extcmd.c - support extended command */
2 /*
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2009 Free Software Foundation, Inc.
6 * GRUB is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * GRUB is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
20 #include <grub/mm.h>
21 #include <grub/list.h>
22 #include <grub/misc.h>
23 #include <grub/extcmd.h>
25 static grub_err_t
26 grub_extcmd_dispatcher (struct grub_command *cmd,
27 int argc, char **args)
29 int new_argc;
30 char **new_args;
31 struct grub_arg_option *parser;
32 struct grub_arg_list *state;
33 int maxargs = 0;
34 grub_err_t ret;
35 grub_extcmd_t ext;
37 ext = cmd->data;
38 parser = (struct grub_arg_option *) ext->options;
39 while (parser && (parser++)->doc)
40 maxargs++;
42 /* Set up the option state. */
43 state = grub_zalloc (sizeof (struct grub_arg_list) * maxargs);
45 if (grub_arg_parse (ext, argc, args, state, &new_args, &new_argc))
47 ext->state = state;
48 ret = (ext->func) (ext, new_argc, new_args);
49 grub_free (new_args);
51 else
52 ret = grub_errno;
54 grub_free (state);
56 return ret;
59 grub_extcmd_t
60 grub_register_extcmd (const char *name, grub_extcmd_func_t func,
61 unsigned flags, const char *summary,
62 const char *description,
63 const struct grub_arg_option *parser)
65 grub_extcmd_t ext;
66 grub_command_t cmd;
68 ext = (grub_extcmd_t) grub_malloc (sizeof (*ext));
69 if (! ext)
70 return 0;
72 cmd = grub_register_command_prio (name, grub_extcmd_dispatcher,
73 summary, description, 1);
74 if (! cmd)
76 grub_free (ext);
77 return 0;
80 cmd->flags = (flags | GRUB_COMMAND_FLAG_EXTCMD);
81 cmd->data = ext;
83 ext->cmd = cmd;
84 ext->func = func;
85 ext->options = parser;
86 ext->data = 0;
88 return ext;
91 void
92 grub_unregister_extcmd (grub_extcmd_t ext)
94 grub_unregister_command (ext->cmd);
95 grub_free (ext);