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 |
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]; |
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 |
} |
} |
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 |
} |
} |
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? */ |