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>
24 #include <grub/script_sh.h>
27 GRUB_MOD_LICENSE ("GPLv3+");
30 grub_extcmd_dispatcher (struct grub_command
*cmd
, int argc
, char **args
,
31 struct grub_script
*script
)
35 struct grub_arg_list
*state
;
36 struct grub_extcmd_context context
;
38 grub_extcmd_t ext
= cmd
->data
;
42 context
.script
= script
;
46 ret
= (ext
->func
) (&context
, argc
, args
);
50 state
= grub_arg_list_alloc (ext
, argc
, args
);
51 if (grub_arg_parse (ext
, argc
, args
, state
, &new_args
, &new_argc
))
53 context
.state
= state
;
54 ret
= (ext
->func
) (&context
, new_argc
, new_args
);
65 grub_extcmd_dispatch (struct grub_command
*cmd
, int argc
, char **args
)
67 return grub_extcmd_dispatcher (cmd
, argc
, args
, 0);
71 grub_register_extcmd_prio (const char *name
, grub_extcmd_func_t func
,
72 grub_command_flags_t flags
, const char *summary
,
73 const char *description
,
74 const struct grub_arg_option
*parser
,
80 ext
= (grub_extcmd_t
) grub_malloc (sizeof (*ext
));
84 cmd
= grub_register_command_prio (name
, grub_extcmd_dispatch
,
85 summary
, description
, prio
);
92 cmd
->flags
= (flags
| GRUB_COMMAND_FLAG_EXTCMD
);
97 ext
->options
= parser
;
104 grub_register_extcmd (const char *name
, grub_extcmd_func_t func
,
105 grub_command_flags_t flags
, const char *summary
,
106 const char *description
,
107 const struct grub_arg_option
*parser
)
109 return grub_register_extcmd_prio (name
, func
, flags
,
110 summary
, description
, parser
, 1);
114 grub_unregister_extcmd (grub_extcmd_t ext
)
116 grub_unregister_command (ext
->cmd
);