/[grub]/grub2/normal/command.c
ViewVC logotype

Diff of /grub2/normal/command.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.8 by marco_g, Mon Jan 31 21:40:25 2005 UTC revision 1.9 by okuji, Tue Mar 8 01:01:06 2005 UTC
# Line 27  Line 27 
27    
28  static grub_command_t grub_command_list;  static grub_command_t grub_command_list;
29    
30  void  grub_command_t
31  grub_register_command (const char *name,  grub_register_command (const char *name,
32                         grub_err_t (*func) (struct grub_arg_list *state,                         grub_err_t (*func) (struct grub_arg_list *state,
33                                             int argc, char **args),                                             int argc, char **args),
# Line 40  grub_register_command (const char *name, Line 40  grub_register_command (const char *name,
40    
41    cmd = (grub_command_t) grub_malloc (sizeof (*cmd));    cmd = (grub_command_t) grub_malloc (sizeof (*cmd));
42    if (! cmd)    if (! cmd)
43      return;      return 0;
44    
45    cmd->name = name;    cmd->name = grub_strdup (name);
46      if (! cmd->name)
47        {
48          grub_free (cmd);
49          return 0;
50        }
51      
52    cmd->func = func;    cmd->func = func;
53    cmd->flags = flags;    cmd->flags = flags;
54    cmd->summary = summary;    cmd->summary = summary;
55    cmd->description = description;    cmd->description = description;
56    cmd->options = options;    cmd->options = options;
57      cmd->module_name = 0;
58    
59    /* Keep the list sorted for simplicity.  */    /* Keep the list sorted for simplicity.  */
60    p = &grub_command_list;    p = &grub_command_list;
61    while (*p)    while (*p)
62      {      {
63        if (grub_strcmp ((*p)->name, name) > 0)        if (grub_strcmp ((*p)->name, name) >= 0)
64          break;          break;
65    
66        p = &((*p)->next);        p = &((*p)->next);
67      }      }
68    
69    cmd->next = *p;    if (*p && grub_strcmp ((*p)->name, name) == 0)
70    *p = cmd;      {
71          grub_command_t q;
72    
73          q = *p;
74          if (q->flags & GRUB_COMMAND_FLAG_NOT_LOADED)
75            {
76              q->func = cmd->func;
77              q->flags = cmd->flags;
78              q->summary = cmd->summary;
79              q->description = cmd->description;
80              q->options = cmd->options;
81              grub_free (cmd->name);
82              grub_free (cmd->module_name);
83              grub_free (cmd);
84              cmd = q;
85            }
86          else
87            {
88              grub_free (cmd->name);
89              grub_free (cmd);
90              cmd = 0;
91            }
92        }
93      else
94        {
95          cmd->next = *p;
96          *p = cmd;
97        }
98    
99      return cmd;
100  }  }
101    
102  void  void
# Line 72  grub_unregister_command (const char *nam Line 108  grub_unregister_command (const char *nam
108      if (grub_strcmp (name, q->name) == 0)      if (grub_strcmp (name, q->name) == 0)
109        {        {
110          *p = q->next;          *p = q->next;
111            grub_free (q->name);
112            grub_free (q->module_name);
113          grub_free (q);          grub_free (q);
114          break;          break;
115        }        }
# Line 82  grub_command_find (char *cmdline) Line 120  grub_command_find (char *cmdline)
120  {  {
121    char *first_space;    char *first_space;
122    grub_command_t cmd;    grub_command_t cmd;
123      int count = 0;
124      
125    first_space = grub_strchr (cmdline, ' ');    first_space = grub_strchr (cmdline, ' ');
126    if (first_space)    if (first_space)
127      *first_space = '\0';      *first_space = '\0';
128    
129     again:
130      
131    for (cmd = grub_command_list; cmd; cmd = cmd->next)    for (cmd = grub_command_list; cmd; cmd = cmd->next)
132      if (grub_strcmp (cmdline, cmd->name) == 0)      if (grub_strcmp (cmdline, cmd->name) == 0)
133        break;        break;
134    
135    if (! cmd)    if (! cmd)
136      grub_error (GRUB_ERR_UNKNOWN_COMMAND, "unknown command `%s'", cmdline);      grub_error (GRUB_ERR_UNKNOWN_COMMAND, "unknown command `%s'", cmdline);
137      else if (cmd->flags & GRUB_COMMAND_FLAG_NOT_LOADED)
138        {
139          /* Automatically load the command.  */
140          if (count == 0)
141            {
142              grub_dl_t mod;
143              char *module_name;
144    
145              module_name = grub_strdup (cmd->module_name);
146              if (module_name)
147                {
148                  mod = grub_dl_load (module_name);
149                  if (mod)
150                    {
151                      grub_dl_ref (mod);
152                      count++;
153                      goto again;
154                    }
155    
156                  grub_free (module_name);
157                }
158            }
159    
160          /* This module seems broken.  */
161          grub_unregister_command (cmdline);
162          grub_error (GRUB_ERR_UNKNOWN_COMMAND, "unknown command `%s'", cmdline);
163          cmd = 0;
164        }
165        
166    if (first_space)    if (first_space)
167      *first_space = ' ';      *first_space = ' ';

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.9

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26