diff options
Diffstat (limited to 'common/env.c')
-rw-r--r-- | common/env.c | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/common/env.c b/common/env.c index 6f736d5add..df8a4dff60 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); |