/[grub]/grub2/kern/env.c
ViewVC logotype

Diff of /grub2/kern/env.c

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

revision 1.2 by okuji, Sun Apr 4 13:46:01 2004 UTC revision 1.3 by okuji, Wed Jul 20 20:30:45 2005 UTC
# Line 1  Line 1 
1  /* env.c - Environment variables */  /* env.c - Environment variables */
2  /*  /*
3   *  GRUB  --  GRand Unified Bootloader   *  GRUB  --  GRand Unified Bootloader
4   *  Copyright (C) 2003  Free Software Foundation, Inc.   *  Copyright (C) 2003,2005  Free Software Foundation, Inc.
5   *   *
6   *  GRUB is free software; you can redistribute it and/or modify   *  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   *  it under the terms of the GNU General Public License as published by
# Line 22  Line 22 
22  #include <grub/misc.h>  #include <grub/misc.h>
23  #include <grub/mm.h>  #include <grub/mm.h>
24    
25  /* XXX: What would be a good size for the hashtable?  */  /* The size of the hash table.  */
26  #define HASHSZ  123  #define HASHSZ  13
27    
28  /* A hashtable for quick lookup of variables.  */  /* A hashtable for quick lookup of variables.  */
29  static struct grub_env_var *grub_env[HASHSZ];  static struct grub_env_var *grub_env[HASHSZ];
# Line 68  grub_env_set (const char *var, const cha Line 68  grub_env_set (const char *var, const cha
68    if (env)    if (env)
69      {      {
70        char *old = env->value;        char *old = env->value;
71        env->value = grub_strdup (val);  
72        if (! env->name)        if (env->write_hook)
73            env->value = env->write_hook (env, val);
74          else
75            env->value = grub_strdup (val);
76          
77          if (! env->value)
78          {          {
79            env->value = old;            env->value = old;
80            return grub_errno;            return grub_errno;
81          }          }
82    
       if (env->write_hook)  
         (env->write_hook) (env);  
   
83        grub_free (old);        grub_free (old);
84        return 0;        return 0;
85      }      }
# Line 141  grub_env_get (const char *name) Line 143  grub_env_get (const char *name)
143      return 0;      return 0;
144    
145    if (env->read_hook)    if (env->read_hook)
146      {      return env->read_hook (env, env->value);
       char *val;  
       env->read_hook (env, &val);  
   
       return val;  
     }  
147    
148    return env->value;    return env->value;
149  }  }
# Line 190  grub_env_iterate (int (* func) (struct g Line 187  grub_env_iterate (int (* func) (struct g
187    
188  grub_err_t  grub_err_t
189  grub_register_variable_hook (const char *var,  grub_register_variable_hook (const char *var,
190                               grub_err_t (*read_hook) (struct grub_env_var *var, char **),                               grub_env_read_hook_t read_hook,
191                               grub_err_t (*write_hook) (struct grub_env_var *var))                               grub_env_write_hook_t write_hook)
192  {  {
193    struct grub_env_var *env = grub_env_find (var);    struct grub_env_var *env = grub_env_find (var);
194    
195    if (! env)    if (! env)
196      if (grub_env_set (var, "") != GRUB_ERR_NONE)      {
197        return grub_errno;        char *val = grub_strdup ("");
198    
199          if (! val)
200            return grub_errno;
201          
202          if (grub_env_set (var, val) != GRUB_ERR_NONE)
203            return grub_errno;
204        }
205        
206    env = grub_env_find (var);    env = grub_env_find (var);
207    /* XXX Insert an assertion?  */    /* XXX Insert an assertion?  */

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.3

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