Fix cross compilation (e.g. on Darwin). Following changes to make.tmpl,
[AROS.git] / arch / all-pc / boot / grub2-aros / grub-core / normal / dyncmd.c
blob169c126f5080dda6599c8059823bb9dc1d134f56
1 /* dyncmd.c - support dynamic 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/dl.h>
21 #include <grub/mm.h>
22 #include <grub/env.h>
23 #include <grub/misc.h>
24 #include <grub/command.h>
25 #include <grub/normal.h>
26 #include <grub/extcmd.h>
27 #include <grub/script_sh.h>
28 #include <grub/i18n.h>
30 grub_command_t
31 grub_dyncmd_get_cmd (grub_command_t cmd)
33 grub_extcmd_t extcmd = cmd->data;
34 char *modname;
35 char *name;
36 grub_dl_t mod;
38 modname = extcmd->data;
39 mod = grub_dl_load (modname);
40 if (!mod)
41 return NULL;
43 grub_free (modname);
44 grub_dl_ref (mod);
46 name = (char *) cmd->name;
47 grub_unregister_extcmd (extcmd);
49 cmd = grub_command_find (name);
51 grub_free (name);
53 return cmd;
56 static grub_err_t
57 grub_dyncmd_dispatcher (struct grub_extcmd_context *ctxt,
58 int argc, char **args)
60 char *modname;
61 grub_dl_t mod;
62 grub_err_t ret;
63 grub_extcmd_t extcmd = ctxt->extcmd;
64 grub_command_t cmd = extcmd->cmd;
65 char *name;
67 modname = extcmd->data;
68 mod = grub_dl_load (modname);
69 if (!mod)
70 return grub_errno;
72 grub_free (modname);
73 grub_dl_ref (mod);
75 name = (char *) cmd->name;
76 grub_unregister_extcmd (extcmd);
78 cmd = grub_command_find (name);
79 if (cmd)
81 if (cmd->flags & GRUB_COMMAND_FLAG_BLOCKS &&
82 cmd->flags & GRUB_COMMAND_FLAG_EXTCMD)
83 ret = grub_extcmd_dispatcher (cmd, argc, args, ctxt->script);
84 else
85 ret = (cmd->func) (cmd, argc, args);
87 else
88 ret = grub_errno;
90 grub_free (name);
92 return ret;
95 /* Read the file command.lst for auto-loading. */
96 void
97 read_command_list (const char *prefix)
99 if (prefix)
101 char *filename;
103 filename = grub_xasprintf ("%s/" GRUB_TARGET_CPU "-" GRUB_PLATFORM
104 "/command.lst", prefix);
105 if (filename)
107 grub_file_t file;
109 file = grub_file_open (filename);
110 if (file)
112 char *buf = NULL;
113 grub_command_t ptr, last = 0, next;
115 /* Override previous commands.lst. */
116 for (ptr = grub_command_list; ptr; ptr = next)
118 next = ptr->next;
119 if (ptr->flags & GRUB_COMMAND_FLAG_DYNCMD)
121 if (last)
122 last->next = ptr->next;
123 else
124 grub_command_list = ptr->next;
125 grub_free (ptr->data); /* extcmd struct */
126 grub_free (ptr);
128 else
129 last = ptr;
132 for (;; grub_free (buf))
134 char *p, *name, *modname;
135 grub_extcmd_t cmd;
136 int prio = 0;
138 buf = grub_file_getline (file);
140 if (! buf)
141 break;
143 name = buf;
144 while (grub_isspace (name[0]))
145 name++;
147 if (*name == '*')
149 name++;
150 prio++;
153 if (! grub_isgraph (name[0]))
154 continue;
156 p = grub_strchr (name, ':');
157 if (! p)
158 continue;
160 *p = '\0';
161 p++;
162 while (*p == ' ' || *p == '\t')
163 p++;
165 if (! grub_isgraph (*p))
166 continue;
168 if (grub_dl_get (p))
169 continue;
171 name = grub_strdup (name);
172 if (! name)
173 continue;
175 modname = grub_strdup (p);
176 if (! modname)
178 grub_free (name);
179 continue;
182 cmd = grub_register_extcmd_prio (name,
183 grub_dyncmd_dispatcher,
184 GRUB_COMMAND_FLAG_BLOCKS
185 | GRUB_COMMAND_FLAG_EXTCMD
186 | GRUB_COMMAND_FLAG_DYNCMD,
187 0, N_("module isn't loaded"),
188 0, prio);
189 if (! cmd)
191 grub_free (name);
192 grub_free (modname);
193 continue;
195 cmd->data = modname;
197 /* Update the active flag. */
198 grub_command_find (name);
201 grub_file_close (file);
204 grub_free (filename);
208 /* Ignore errors. */
209 grub_errno = GRUB_ERR_NONE;