Devices can have a dot in the name, so we can't expect to find the full device name before the first dot. Currently parameters of devices with a dot in the name are inaccessible from the shell. Fix this by iterating over the possible device name / parameter name combinations to find a existing combination. Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> --- common/env.c | 48 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/common/env.c b/common/env.c index 6f736d5..df8a4df 100644 --- a/common/env.c +++ b/common/env.c @@ -135,26 +135,46 @@ static const char *getenv_raw(struct list_head *l, const char *name) return NULL; } -const char *getenv (const char *name) +static const char *dev_getenv(const char *name) { - struct env_context *c; - const char *val; + const char *pos, *val, *dot, *varname; + char *devname; + struct device_d *dev; + + pos = name; + + while (1) { + dot = strchr(pos, '.'); + if (!dot) + break; + + devname = xstrndup(name, dot - name); + varname = dot + 1; + + dev = get_device_by_name(devname); + + free(devname); - if (strchr(name, '.')) { - const char *ret = NULL; - char *devstr = strdup(name); - char *par = strchr(devstr, '.'); - struct device_d *dev; - *par = 0; - dev = get_device_by_name(devstr); if (dev) { - par++; - ret = dev_get_param(dev, par); + val = dev_get_param(dev, varname); + if (val) + return val; } - free(devstr); - return ret; + + pos = dot + 1; } + return NULL; +} + +const char *getenv(const char *name) +{ + struct env_context *c; + const char *val; + + if (strchr(name, '.')) + return dev_getenv(name); + c = context; val = getenv_raw(&c->local, name); -- 2.9.3 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox