diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2018-01-05 12:08:20 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-01-05 12:08:20 +0100 |
commit | 052d1c9e0756db2b02da98c97a6c50d26b8c28ce (patch) | |
tree | cd9c072425c9e333e4be744d47aab96fed2cd430 /common/globalvar.c | |
parent | e2d5e447e6b5035f9e78a29037d15f7fd9606918 (diff) | |
parent | 7518e1c47765bb66ee854acb97bd285e9320df36 (diff) | |
download | barebox-052d1c9e0756db2b02da98c97a6c50d26b8c28ce.tar.gz barebox-052d1c9e0756db2b02da98c97a6c50d26b8c28ce.tar.xz |
Merge branch 'for-next/misc'
Diffstat (limited to 'common/globalvar.c')
-rw-r--r-- | common/globalvar.c | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/common/globalvar.c b/common/globalvar.c index 77b89c1791..1471d849ec 100644 --- a/common/globalvar.c +++ b/common/globalvar.c @@ -199,6 +199,8 @@ static int nv_param_set(struct device_d *dev, struct param_d *p, const char *val static int __nvvar_add(const char *name, const char *value) { struct param_d *p; + struct device_d *dev = NULL; + const char *pname; int ret; if (!IS_ENABLED(CONFIG_NVVAR)) @@ -220,7 +222,12 @@ static int __nvvar_add(const char *name, const char *value) if (value) return nv_set(&nv_device, p, value); - value = dev_get_param(&global_device, name); + ret = nvvar_device_dispatch(name, &dev, &pname); + if (ret > 0) + value = dev_get_param(dev, pname); + else + value = dev_get_param(&global_device, name); + if (value) { free(p->value); p->value = xstrdup(value); @@ -460,6 +467,9 @@ int globalvar_add_simple_string(const char *name, char **value) globalvar_nv_sync(name); + if (!*value) + *value = xstrdup(""); + return 0; } @@ -643,10 +653,39 @@ static int nv_global_param_complete(struct device_d *dev, struct string_list *sl return 0; } -int nv_global_complete(struct string_list *sl, char *instr) +int nv_complete(struct string_list *sl, char *instr) +{ + struct device_d *dev; + struct param_d *param; + char *str; + int len; + + nv_global_param_complete(&global_device, sl, instr, 0); + + len = strlen(instr); + + if (strncmp(instr, "dev.", min_t(int, len, 4))) + return 0; + + for_each_device(dev) { + if (dev == &global_device || dev == &nv_device) + continue; + + list_for_each_entry(param, &dev->parameters, list) { + str = basprintf("dev.%s.%s=", dev_name(dev), param->name); + if (strncmp(instr, str, len)) + free(str); + else + string_list_add(sl, str); + } + } + + return 0; +} + +int global_complete(struct string_list *sl, char *instr) { nv_global_param_complete(&global_device, sl, instr, 0); - nv_global_param_complete(&nv_device, sl, instr, 0); return 0; } |