summaryrefslogtreecommitdiffstats
path: root/commands
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2014-06-18 15:12:05 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2014-11-06 10:58:54 +0100
commit3249006a2facd31a072fd2808991697b4727643e (patch)
treeec4e5dd4fbd1ea124349a23cb3664bda4ba2e1aa /commands
parentfe39e8aadc3e2f3d87bb5b6f8c6ebb4fb1a84253 (diff)
downloadbarebox-3249006a2facd31a072fd2808991697b4727643e.tar.gz
Add support for non volatile variables
This adds (back) support for non volatile variables. Non volatile variables are variables which are stored in the environment over reboot. They are used in the same way as the global variables, but with a 'nv' command and device. The variables are stored under /env/nv/, one variable per file. Adding a nv variable automatically adds a global variable with the same name. Changing a nv variable also changes the same global variable, but not the other way round. This allows for example to configure the username as: nv user=sha; saveenv Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'commands')
-rw-r--r--commands/Kconfig14
-rw-r--r--commands/Makefile1
-rw-r--r--commands/loadenv.c11
-rw-r--r--commands/nv.c84
4 files changed, 107 insertions, 3 deletions
diff --git a/commands/Kconfig b/commands/Kconfig
index bef5847..cf32548 100644
--- a/commands/Kconfig
+++ b/commands/Kconfig
@@ -674,6 +674,20 @@ endmenu
menu "Environment"
+config CMD_NV
+ select GLOBALVAR
+ tristate
+ prompt "nv"
+ help
+ create, set or remove non volatile variables.
+
+ Usage: nv [-r] VAR[=VALUE]
+
+ Add a new config non volatile named VAR, optionally set to VALUE.
+
+ Options:
+ -r remove a non volatile variable
+
config CMD_EXPORT
depends on ENVIRONMENT_VARIABLES
tristate
diff --git a/commands/Makefile b/commands/Makefile
index be17496..b4fc3d3 100644
--- a/commands/Makefile
+++ b/commands/Makefile
@@ -107,3 +107,4 @@ obj-$(CONFIG_CMD_HWCLOCK) += hwclock.o
obj-$(CONFIG_CMD_USBGADGET) += usbgadget.o
obj-$(CONFIG_CMD_FIRMWARELOAD) += firmwareload.o
obj-$(CONFIG_CMD_CMP) += cmp.o
+obj-$(CONFIG_CMD_NV) += nv.o
diff --git a/commands/loadenv.c b/commands/loadenv.c
index 8b15af4..91ce5e7 100644
--- a/commands/loadenv.c
+++ b/commands/loadenv.c
@@ -27,12 +27,13 @@
#include <errno.h>
#include <fs.h>
#include <malloc.h>
+#include <globalvar.h>
static int do_loadenv(int argc, char *argv[])
{
char *filename = NULL, *dirname;
unsigned flags = 0;
- int opt;
+ int opt, ret;
int scrub = 0;
int defaultenv = 0;
@@ -97,9 +98,13 @@ static int do_loadenv(int argc, char *argv[])
printf("loading environment from %s\n", defaultenv ? "defaultenv" : filename);
if (defaultenv)
- return defaultenv_load(dirname, flags);
+ ret = defaultenv_load(dirname, flags);
else
- return envfs_load(filename, dirname, flags);
+ ret = envfs_load(filename, dirname, flags);
+
+ nvvar_load();
+
+ return ret;
}
BAREBOX_CMD_HELP_START(loadenv)
diff --git a/commands/nv.c b/commands/nv.c
new file mode 100644
index 0000000..8cebb85
--- /dev/null
+++ b/commands/nv.c
@@ -0,0 +1,84 @@
+/*
+ * nv.c - non volatile shell variables
+ *
+ * Copyright (c) 2014 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+#include <common.h>
+#include <malloc.h>
+#include <command.h>
+#include <globalvar.h>
+#include <environment.h>
+#include <getopt.h>
+
+static int do_nv(int argc, char *argv[])
+{
+ int opt;
+ int do_remove = 0;
+ int ret;
+ char *value;
+
+ while ((opt = getopt(argc, argv, "r")) > 0) {
+ switch (opt) {
+ case 'r':
+ do_remove = 1;
+ break;
+ default:
+ return COMMAND_ERROR_USAGE;
+ }
+ }
+
+ if (argc == optind) {
+ nvvar_print();
+ return 0;
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ if (argc != 1)
+ return COMMAND_ERROR_USAGE;
+
+ value = strchr(argv[0], '=');
+ if (value) {
+ *value = 0;
+ value++;
+ }
+
+ if (do_remove)
+ ret = nvvar_remove(argv[0]);
+ else
+ ret = nvvar_add(argv[0], value);
+
+ return ret;
+}
+
+BAREBOX_CMD_HELP_START(nv)
+BAREBOX_CMD_HELP_TEXT("Add a new non volatile variable named VAR, optionally set to VALUE.")
+BAREBOX_CMD_HELP_TEXT("non volatile variables are persistent variables that overwrite the")
+BAREBOX_CMD_HELP_TEXT("global variables of the same name. Their value is saved with")
+BAREBOX_CMD_HELP_TEXT("'saveenv'.")
+BAREBOX_CMD_HELP_TEXT("")
+BAREBOX_CMD_HELP_TEXT("Options:")
+BAREBOX_CMD_HELP_OPT("-r", "remove a non volatile variable")
+BAREBOX_CMD_HELP_END
+
+BAREBOX_CMD_START(nv)
+ .cmd = do_nv,
+ BAREBOX_CMD_DESC("create or set non volatile variables")
+ BAREBOX_CMD_OPTS("[-r] VAR[=VALUE]")
+ BAREBOX_CMD_GROUP(CMD_GRP_ENV)
+ BAREBOX_CMD_HELP(cmd_nv_help)
+BAREBOX_CMD_END