diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2012-04-29 20:21:16 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-05-14 08:57:01 +0200 |
commit | b8c94a15611ce7e191d022a3cd9f3ba23930a9c8 (patch) | |
tree | f0daa10332462b729219562cfca592c0f9268770 /common | |
parent | 9b42dfff0f2cecb6a9c7581c4c0c59ed9c9c586d (diff) | |
download | barebox-b8c94a15611ce7e191d022a3cd9f3ba23930a9c8.tar.gz barebox-b8c94a15611ce7e191d022a3cd9f3ba23930a9c8.tar.xz |
add 'global' command
This implements global shell variable support. This is done by registering
a new device named 'global', so global variables are just plain device
parameters.
Global variables are useful for storing the global state in the environment.
Currently we do this by sourcing scripts instead of executing them which is
quite limiting.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'common')
-rw-r--r-- | common/Kconfig | 7 | ||||
-rw-r--r-- | common/Makefile | 1 | ||||
-rw-r--r-- | common/globalvar.c | 65 |
3 files changed, 73 insertions, 0 deletions
diff --git a/common/Kconfig b/common/Kconfig index 73d620a576..81e3acb54a 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -47,6 +47,9 @@ config BINFMT bool select FILETYPE +config GLOBALVAR + bool + menu "General Settings " config LOCALVERSION @@ -493,6 +496,7 @@ config DEFAULT_ENVIRONMENT_GENERIC select HUSH_GETOPT select CMD_CRC select CMD_CRC_CMP + select CMD_AUTOMOUNT if HAVE_DEFAULT_ENVIRONMENT_NEW prompt "Default environment generic" help With this option barebox will use the generic default @@ -502,6 +506,9 @@ config DEFAULT_ENVIRONMENT_GENERIC at least contain a /env/config file. This will be able to overwrite the files from defaultenv. +config HAVE_DEFAULT_ENVIRONMENT_NEW + bool + config DEFAULT_ENVIRONMENT_PATH string depends on DEFAULT_ENVIRONMENT diff --git a/common/Makefile b/common/Makefile index a58aef94c8..d842a2e080 100644 --- a/common/Makefile +++ b/common/Makefile @@ -29,6 +29,7 @@ obj-$(CONFIG_CMD_BOOTM) += uimage.o obj-y += startup.o obj-y += misc.o obj-y += memsize.o +obj-$(CONFIG_GLOBALVAR) += globalvar.o obj-$(CONFIG_FILETYPE) += filetype.o obj-y += resource.o obj-$(CONFIG_MENU) += menu.o diff --git a/common/globalvar.c b/common/globalvar.c new file mode 100644 index 0000000000..71296ff5a3 --- /dev/null +++ b/common/globalvar.c @@ -0,0 +1,65 @@ +#include <common.h> +#include <malloc.h> +#include <globalvar.h> +#include <init.h> + +static struct device_d global_device = { + .name = "global", + .id = DEVICE_ID_SINGLE, +}; + +int globalvar_add(const char *name, + int (*set)(struct device_d *dev, struct param_d *p, const char *val), + const char *(*get)(struct device_d *, struct param_d *p), + unsigned long flags) +{ + return dev_add_param(&global_device, name, set, get, flags); +} + +/* + * globalvar_get_match + * + * get a concatenated string of all globalvars beginning with 'match'. + * This adds whitespaces between the different globalvars + */ +char *globalvar_get_match(const char *match, const char *seperator) +{ + char *val = NULL; + struct param_d *param; + + list_for_each_entry(param, &global_device.parameters, list) { + if (!strncmp(match, param->name, strlen(match))) { + const char *p = dev_get_param(&global_device, param->name); + if (val) { + char *new = asprintf("%s%s%s", val, seperator, p); + free(val); + val = new; + } else { + val = xstrdup(p); + } + } + } + + if (!val) + val = xstrdup(""); + + return val; +} + +/* + * globalvar_add_simple + * + * add a new globalvar named 'name' + */ +int globalvar_add_simple(const char *name) +{ + return globalvar_add(name, NULL, NULL, 0); +} + +static int globalvar_init(void) +{ + register_device(&global_device); + + return 0; +} +postconsole_initcall(globalvar_init); |