1 /* extcmd.c - support extended command */
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/>.
21 #include <grub/list.h>
22 #include <grub/misc.h>
23 #include <grub/extcmd.h>
26 grub_extcmd_dispatcher (struct grub_command
*cmd
,
27 int argc
, char **args
)
31 struct grub_arg_option
*parser
;
32 struct grub_arg_list
*state
;
38 parser
= (struct grub_arg_option
*) ext
->options
;
39 while (parser
&& (parser
++)->doc
)
42 /* Set up the option state. */
43 state
= grub_malloc (sizeof (struct grub_arg_list
) * maxargs
);
44 grub_memset (state
, 0, sizeof (struct grub_arg_list
) * maxargs
);
46 if (grub_arg_parse (ext
, argc
, args
, state
, &new_args
, &new_argc
))
49 ret
= (ext
->func
) (ext
, new_argc
, new_args
);
61 grub_register_extcmd (const char *name
, grub_extcmd_func_t func
,
62 unsigned flags
, const char *summary
,
63 const char *description
,
64 const struct grub_arg_option
*parser
)
69 ext
= (grub_extcmd_t
) grub_malloc (sizeof (*ext
));
73 cmd
= grub_register_command_prio (name
, grub_extcmd_dispatcher
,
74 summary
, description
, 1);
81 cmd
->flags
= (flags
| GRUB_COMMAND_FLAG_EXTCMD
);
86 ext
->options
= parser
;
93 grub_unregister_extcmd (grub_extcmd_t ext
)
95 grub_unregister_command (ext
->cmd
);