25 |
#include <grub/env.h> |
#include <grub/env.h> |
26 |
#include <grub/dl.h> |
#include <grub/dl.h> |
27 |
#include <grub/parser.h> |
#include <grub/parser.h> |
28 |
|
#include <grub/script.h> |
29 |
|
|
30 |
static grub_command_t grub_command_list; |
static grub_command_t grub_command_list; |
31 |
|
|
194 |
return grub_cmdline_get (">", *s, GRUB_MAX_CMDLINE, 0, 1); |
return grub_cmdline_get (">", *s, GRUB_MAX_CMDLINE, 0, 1); |
195 |
} |
} |
196 |
|
|
|
grub_command_t cmd; |
|
197 |
grub_err_t ret = 0; |
grub_err_t ret = 0; |
198 |
char *pager; |
char *pager; |
199 |
int num; |
struct grub_script *parsed_script; |
|
char **args; |
|
|
struct grub_arg_list *state; |
|
|
struct grub_arg_option *parser; |
|
|
int maxargs = 0; |
|
|
char **arglist; |
|
|
int numargs; |
|
|
|
|
|
if (grub_parser_split_cmdline (cmdline, cmdline_get, &num, &args)) |
|
|
return 0; |
|
|
|
|
|
/* In case of an assignment set the environment accordingly instead |
|
|
of calling a function. */ |
|
|
if (num == 0 && grub_strchr (args[0], '=')) |
|
|
{ |
|
|
char *val; |
|
|
|
|
|
if (! interactive) |
|
|
grub_printf ("%s\n", cmdline); |
|
|
|
|
|
val = grub_strchr (args[0], '='); |
|
|
val[0] = 0; |
|
|
grub_env_set (args[0], val + 1); |
|
|
val[0] = '='; |
|
|
return 0; |
|
|
} |
|
|
|
|
|
cmd = grub_command_find (args[0]); |
|
|
if (! cmd) |
|
|
return -1; |
|
|
|
|
|
if (! (cmd->flags & GRUB_COMMAND_FLAG_NO_ECHO) && ! interactive) |
|
|
grub_printf ("%s\n", cmdline); |
|
200 |
|
|
201 |
/* Enable the pager if the environment pager is set to 1. */ |
/* Enable the pager if the environment pager is set to 1. */ |
202 |
if (interactive) |
if (interactive) |
205 |
pager = 0; |
pager = 0; |
206 |
if (pager && (! grub_strcmp (pager, "1"))) |
if (pager && (! grub_strcmp (pager, "1"))) |
207 |
grub_set_more (1); |
grub_set_more (1); |
208 |
|
|
209 |
parser = (struct grub_arg_option *) cmd->options; |
/* Parse the script. */ |
210 |
while (parser && (parser++)->doc) |
parsed_script = grub_script_parse (cmdline, cmdline_get); |
211 |
maxargs++; |
|
212 |
|
if (parsed_script) |
|
state = grub_malloc (sizeof (struct grub_arg_list) * maxargs); |
|
|
grub_memset (state, 0, sizeof (struct grub_arg_list) * maxargs); |
|
|
if (! (cmd->flags & GRUB_COMMAND_FLAG_NO_ARG_PARSE)) |
|
213 |
{ |
{ |
214 |
if (grub_arg_parse (cmd, num, &args[1], state, &arglist, &numargs)) |
/* Execute the command(s). */ |
215 |
ret = (cmd->func) (state, numargs, arglist); |
grub_script_execute (parsed_script); |
216 |
|
|
217 |
|
/* The parsed script was executed, throw it away. */ |
218 |
|
grub_script_free (parsed_script); |
219 |
} |
} |
|
else |
|
|
ret = (cmd->func) (state, num, &args[1]); |
|
|
|
|
|
grub_free (state); |
|
220 |
|
|
221 |
if (pager && (! grub_strcmp (pager, "1"))) |
if (pager && (! grub_strcmp (pager, "1"))) |
222 |
grub_set_more (0); |
grub_set_more (0); |
223 |
|
|
|
grub_free (args); |
|
224 |
return ret; |
return ret; |
225 |
} |
} |
226 |
|
|