diff options
Diffstat (limited to 'common/globalvar.c')
-rw-r--r-- | common/globalvar.c | 137 |
1 files changed, 91 insertions, 46 deletions
diff --git a/common/globalvar.c b/common/globalvar.c index 1385559fd7..fdfaf76fae 100644 --- a/common/globalvar.c +++ b/common/globalvar.c @@ -19,7 +19,7 @@ struct device_d global_device = { .id = DEVICE_ID_SINGLE, }; -static struct device_d nv_device = { +struct device_d nv_device = { .name = "nv", .id = DEVICE_ID_SINGLE, }; @@ -99,9 +99,6 @@ void dev_param_init_from_nv(struct device_d *dev, const char *name) const char *val; int ret = 0; - if (!IS_ENABLED(CONFIG_NVVAR)) - return; - if (dev == &nv_device) return; if (dev == &global_device) @@ -166,20 +163,16 @@ static int nvvar_device_dispatch(const char *name, struct device_d **dev, return 1; } -static int nv_set(struct param_d *p, const char *val) +static int nv_set(struct device_d *dev, struct param_d *p, const char *val) { - struct param_d *g; int ret; if (!val) val = ""; - g = get_param_by_name(&global_device, p->name); - if (g) { - ret = dev_set_param(&global_device, p->name, val); - if (ret) - return ret; - } + ret = dev_set_param(&global_device, p->name, val); + if (ret) + return ret; free(p->value); p->value = xstrdup(val); @@ -187,16 +180,16 @@ static int nv_set(struct param_d *p, const char *val) return 0; } -static const char *nv_param_get(struct param_d *p) +static const char *nv_param_get(struct device_d *dev, struct param_d *p) { return p->value ? p->value : ""; } -static int nv_param_set(struct param_d *p, const char *val) +static int nv_param_set(struct device_d *dev, struct param_d *p, const char *val) { int ret; - ret = nv_set(p, val); + ret = nv_set(dev, p, val); if (ret) return ret; @@ -206,6 +199,7 @@ static int nv_param_set(struct param_d *p, const char *val) static int __nvvar_add(const char *name, const char *value) { struct param_d *p; + int ret; if (!IS_ENABLED(CONFIG_NVVAR)) return -ENOSYS; @@ -218,8 +212,13 @@ static int __nvvar_add(const char *name, const char *value) return PTR_ERR(p); } + /* Create corresponding globalvar if it doesn't exist yet */ + ret = globalvar_add_simple(name, value); + if (ret && ret != -EEXIST) + return ret; + if (value) - return nv_set(p, value); + return nv_set(&nv_device, p, value); value = dev_get_param(&global_device, name); if (value) { @@ -373,7 +372,7 @@ void globalvar_set_match(const char *match, const char *val) } } -static int globalvar_simple_set(struct param_d *p, const char *val) +static int globalvar_simple_set(struct device_d *dev, struct param_d *p, const char *val) { struct device_d *rdev; const char *pname = NULL; @@ -391,19 +390,7 @@ static int globalvar_simple_set(struct param_d *p, const char *val) } /* Pass to the generic function we have overwritten */ - return dev_param_set_generic(p, val); -} - -static void globalvar_nv_sync(const char *name) -{ - const char *val; - - if (!IS_ENABLED(CONFIG_NVVAR)) - return; - - val = dev_get_param(&nv_device, name); - if (val) - dev_set_param(&global_device, name, val); + return dev_param_set_generic(dev, p, val); } /* @@ -416,23 +403,51 @@ int globalvar_add_simple(const char *name, const char *value) struct param_d *param; param = dev_add_param(&global_device, name, globalvar_simple_set, NULL, - 0); + PARAM_GLOBALVAR_UNQUALIFIED); if (IS_ERR(param)) { if (PTR_ERR(param) != -EEXIST) return PTR_ERR(param); } - if (value) - dev_set_param(&global_device, name, value); + if (!value) + return 0; - globalvar_nv_sync(name); + return dev_set_param(&global_device, name, value); +} + +static int globalvar_remove_unqualified(const char *name) +{ + struct param_d *p; + + p = get_param_by_name(&global_device, name); + if (!p) + return 0; + + if (!(p->flags & PARAM_GLOBALVAR_UNQUALIFIED)) + return -EEXIST; + + dev_remove_param(p); return 0; } -int __globalvar_add_simple_string(const char *name, char **value) +static void globalvar_nv_sync(const char *name) +{ + const char *val; + + val = dev_get_param(&nv_device, name); + if (val) + dev_set_param(&global_device, name, val); +} + +int globalvar_add_simple_string(const char *name, char **value) { struct param_d *p; + int ret; + + ret = globalvar_remove_unqualified(name); + if (ret) + return ret; p = dev_add_param_string(&global_device, name, NULL, NULL, value, NULL); @@ -445,14 +460,38 @@ int __globalvar_add_simple_string(const char *name, char **value) return 0; } -int __globalvar_add_simple_int(const char *name, void *value, - enum param_type type, - const char *format) +int globalvar_add_simple_int(const char *name, int *value, + const char *format) { struct param_d *p; + int ret; + + ret = globalvar_remove_unqualified(name); + if (ret) + return ret; - p = __dev_add_param_int(&global_device, name, NULL, NULL, - value, type, format, NULL); + p = dev_add_param_int(&global_device, name, NULL, NULL, + value, format, NULL); + + if (IS_ERR(p)) + return PTR_ERR(p); + + globalvar_nv_sync(name); + + return 0; +} + +int globalvar_add_simple_bool(const char *name, int *value) +{ + struct param_d *p; + int ret; + + ret = globalvar_remove_unqualified(name); + if (ret) + return ret; + + p = dev_add_param_bool(&global_device, name, NULL, NULL, + value, NULL); if (IS_ERR(p)) return PTR_ERR(p); @@ -466,6 +505,11 @@ int globalvar_add_simple_enum(const char *name, int *value, const char * const *names, int max) { struct param_d *p; + int ret; + + ret = globalvar_remove_unqualified(name); + if (ret) + return ret; p = dev_add_param_enum(&global_device, name, NULL, NULL, value, names, max, NULL); @@ -495,6 +539,11 @@ int globalvar_add_simple_bitmask(const char *name, unsigned long *value, int globalvar_add_simple_ip(const char *name, IPaddr_t *ip) { struct param_d *p; + int ret; + + ret = globalvar_remove_unqualified(name); + if (ret) + return ret; p = dev_add_param_ip(&global_device, name, NULL, NULL, ip, NULL); @@ -514,7 +563,7 @@ static int globalvar_init(void) if (IS_ENABLED(CONFIG_NVVAR)) register_device(&nv_device); - globalvar_add_simple_string_fixed("version", UTS_RELEASE); + globalvar_add_simple("version", UTS_RELEASE); return 0; } @@ -534,8 +583,6 @@ int nvvar_save(void) const char *env = default_environment_path_get(); int ret; #define TMPDIR "/.env.tmp" - if (!IS_ENABLED(CONFIG_NVVAR)) - return -ENOSYS; if (!nv_dirty || !env) return 0; @@ -596,9 +643,7 @@ static int nv_global_param_complete(struct device_d *dev, struct string_list *sl int nv_global_complete(struct string_list *sl, char *instr) { nv_global_param_complete(&global_device, sl, instr, 0); - - if (IS_ENABLED(CONFIG_NVVAR)) - nv_global_param_complete(&nv_device, sl, instr, 0); + nv_global_param_complete(&nv_device, sl, instr, 0); return 0; } |