* [PATCH] environment: support redundant environments
@ 2013-04-17 13:16 Jan Luebbe
2013-04-18 9:16 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 1 reply; 2+ messages in thread
From: Jan Luebbe @ 2013-04-17 13:16 UTC (permalink / raw)
To: barebox
Signed-off-by: Jan Luebbe <jlu@pengutronix.de>
---
arch/arm/mach-omap/omap_generic.c | 14 +++++++++++--
commands/loadenv.c | 23 ++++++++++++++-------
commands/saveenv.c | 42 ++++++++++++++++++++++++++++-----------
common/environment.c | 7 ++++++-
common/startup.c | 17 ++++++++++------
include/envfs.h | 2 +-
6 files changed, 76 insertions(+), 29 deletions(-)
diff --git a/arch/arm/mach-omap/omap_generic.c b/arch/arm/mach-omap/omap_generic.c
index 580ed3e..6d7f371 100644
--- a/arch/arm/mach-omap/omap_generic.c
+++ b/arch/arm/mach-omap/omap_generic.c
@@ -31,6 +31,16 @@ enum omap_boot_src omap_bootsrc(void)
#endif
}
+static char *ift_environment_paths[] = {
+ "/dev/defaultenv",
+ NULL,
+};
+
+static char *sd_environment_paths[] = {
+ "/boot/barebox.env",
+ NULL,
+};
+
#if defined(CONFIG_DEFAULT_ENVIRONMENT) && defined(CONFIG_MCI_STARTUP)
static int omap_env_init(void)
{
@@ -55,9 +65,9 @@ static int omap_env_init(void)
}
if (IS_ENABLED(CONFIG_OMAP_BUILD_IFT))
- default_environment_path = "/dev/defaultenv";
+ environment_paths = ift_environment_paths;
else
- default_environment_path = "/boot/barebox.env";
+ environment_paths = sd_environment_paths;
return 0;
}
diff --git a/commands/loadenv.c b/commands/loadenv.c
index 14b9643..197e957 100644
--- a/commands/loadenv.c
+++ b/commands/loadenv.c
@@ -30,7 +30,7 @@ static int do_loadenv(int argc, char *argv[])
{
char *filename, *dirname;
unsigned flags = 0;
- int opt;
+ int opt, ret;
int scrub = 0;
while ((opt = getopt(argc, argv, "ns")) > 0) {
@@ -52,13 +52,11 @@ static int do_loadenv(int argc, char *argv[])
dirname = argv[optind + 1];
if (argc - optind < 1)
- filename = default_environment_path;
+ filename = NULL;
else
filename = argv[optind];
if (scrub) {
- int ret;
-
ret = unlink_recursive(dirname, NULL);
if (ret) {
eprintf("cannot remove %s: %s\n", dirname,
@@ -74,9 +72,20 @@ static int do_loadenv(int argc, char *argv[])
}
}
- printf("loading environment from %s\n", filename);
-
- return envfs_load(filename, dirname, flags);
+ if (filename) {
+ printf("loading environment from %s\n", filename);
+ return envfs_load(filename, dirname, flags);
+ } else {
+ char **paths = environment_paths;
+ while (*paths) {
+ printf("loading environment from %s\n", *paths);
+ ret = envfs_load(*paths, dirname, flags);
+ if (!ret)
+ return ret;
+ paths++;
+ }
+ return ret;
+ }
}
BAREBOX_CMD_HELP_START(loadenv)
diff --git a/commands/saveenv.c b/commands/saveenv.c
index 7f371a8..ad783e6 100644
--- a/commands/saveenv.c
+++ b/commands/saveenv.c
@@ -27,20 +27,10 @@
#include <fcntl.h>
#include <envfs.h>
-static int do_saveenv(int argc, char *argv[])
-{
+static int single_saveenv(char *filename, char *dirname) {
int ret, fd;
- char *filename, *dirname;
- printf("saving environment\n");
- if (argc < 3)
- dirname = "/env";
- else
- dirname = argv[2];
- if (argc < 2)
- filename = default_environment_path;
- else
- filename = argv[1];
+ printf("saving environment to %s\n", filename);
fd = open(filename, O_WRONLY | O_CREAT);
if (fd < 0) {
@@ -91,6 +81,34 @@ out:
return ret;
}
+static int do_saveenv(int argc, char *argv[])
+{
+ int ret;
+ char *filename, *dirname;
+
+ if (argc < 3)
+ dirname = "/env";
+ else
+ dirname = argv[2];
+ if (argc < 2)
+ filename = NULL;
+ else
+ filename = argv[1];
+
+ if (filename) {
+ ret = single_saveenv(filename, dirname);
+ } else {
+ char **paths = environment_paths;
+ ret = 1;
+ while (*paths) {
+ ret = single_saveenv(*paths, dirname) && ret;
+ paths++;
+ }
+ }
+
+ return ret;
+}
+
BAREBOX_CMD_HELP_START(saveenv)
BAREBOX_CMD_HELP_USAGE("saveenv [envfs] [directory]\n")
BAREBOX_CMD_HELP_SHORT("Save the files in <directory> to the persistent storage device <envfs>.\n")
diff --git a/common/environment.c b/common/environment.c
index 78cd45c..300fa57 100644
--- a/common/environment.c
+++ b/common/environment.c
@@ -48,7 +48,12 @@ struct action_data {
};
#define PAD4(x) ((x + 3) & ~3)
-char *default_environment_path = "/dev/env0";
+static char *default_environment_paths[] = {
+ "/dev/env0",
+ NULL,
+};
+
+char **environment_paths = default_environment_paths;
static int file_size_action(const char *filename, struct stat *statbuf,
void *userdata, int depth)
diff --git a/common/startup.c b/common/startup.c
index 52a8996..1525c69 100644
--- a/common/startup.c
+++ b/common/startup.c
@@ -115,14 +115,19 @@ void __noreturn start_barebox(void)
debug("initcalls done\n");
if (IS_ENABLED(CONFIG_ENV_HANDLING)) {
- int ret;
-
- ret = envfs_load(default_environment_path, "/env", 0);
+ char **paths = environment_paths;
+ int ret = -ENOENT;
+
+ while (*paths) {
+ printf("loading environment from %s\n", *paths);
+ ret = envfs_load(*paths, "/env", 0);
+ if (!ret)
+ break;
+ paths++;
+ }
if (ret && IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT)) {
- printf("no valid environment found on %s. "
- "Using default environment\n",
- default_environment_path);
+ printf("using default environment\n");
envfs_load("/dev/defaultenv", "/env", 0);
}
}
diff --git a/include/envfs.h b/include/envfs.h
index e9372b3..981a190 100644
--- a/include/envfs.h
+++ b/include/envfs.h
@@ -94,7 +94,7 @@ int envfs_load(char *filename, char *dirname, unsigned flags);
int envfs_save(char *filename, char *dirname);
/* defaults to /dev/env0 */
-extern char *default_environment_path;
+extern char **environment_paths;
int envfs_register_partition(const char *devname, unsigned int partnr);
--
1.8.2.rc2
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] environment: support redundant environments
2013-04-17 13:16 [PATCH] environment: support redundant environments Jan Luebbe
@ 2013-04-18 9:16 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 2+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2013-04-18 9:16 UTC (permalink / raw)
To: Jan Luebbe; +Cc: barebox
On 15:16 Wed 17 Apr , Jan Luebbe wrote:
> Signed-off-by: Jan Luebbe <jlu@pengutronix.de>
this need more explaination how it supposed to work
> ---
> arch/arm/mach-omap/omap_generic.c | 14 +++++++++++--
you mix gerenic code and mach code split
> commands/loadenv.c | 23 ++++++++++++++-------
> commands/saveenv.c | 42 ++++++++++++++++++++++++++++-----------
> common/environment.c | 7 ++++++-
> common/startup.c | 17 ++++++++++------
> include/envfs.h | 2 +-
> 6 files changed, 76 insertions(+), 29 deletions(-)
>
> diff --git a/arch/arm/mach-omap/omap_generic.c b/arch/arm/mach-omap/omap_generic.c
> index 580ed3e..6d7f371 100644
> --- a/arch/arm/mach-omap/omap_generic.c
> +++ b/arch/arm/mach-omap/omap_generic.c
> @@ -31,6 +31,16 @@ enum omap_boot_src omap_bootsrc(void)
> #endif
> }
>
> +static char *ift_environment_paths[] = {
> + "/dev/defaultenv",
> + NULL,
> +};
> +
> +static char *sd_environment_paths[] = {
> + "/boot/barebox.env",
> + NULL,
> +};
> +
> #if defined(CONFIG_DEFAULT_ENVIRONMENT) && defined(CONFIG_MCI_STARTUP)
> static int omap_env_init(void)
> {
> @@ -55,9 +65,9 @@ static int omap_env_init(void)
> }
>
> if (IS_ENABLED(CONFIG_OMAP_BUILD_IFT))
> - default_environment_path = "/dev/defaultenv";
> + environment_paths = ift_environment_paths;
> else
> - default_environment_path = "/boot/barebox.env";
> + environment_paths = sd_environment_paths;
>
> return 0;
> }
> diff --git a/commands/loadenv.c b/commands/loadenv.c
> index 14b9643..197e957 100644
> --- a/commands/loadenv.c
> +++ b/commands/loadenv.c
why that/
do more simple laod 1 if fails load others
but not a command level
> @@ -30,7 +30,7 @@ static int do_loadenv(int argc, char *argv[])
> {
> char *filename, *dirname;
> unsigned flags = 0;
> - int opt;
> + int opt, ret;
> int scrub = 0;
>
> while ((opt = getopt(argc, argv, "ns")) > 0) {
> @@ -52,13 +52,11 @@ static int do_loadenv(int argc, char *argv[])
> dirname = argv[optind + 1];
>
> if (argc - optind < 1)
> - filename = default_environment_path;
> + filename = NULL;
> else
> filename = argv[optind];
>
> if (scrub) {
> - int ret;
> -
> ret = unlink_recursive(dirname, NULL);
> if (ret) {
> eprintf("cannot remove %s: %s\n", dirname,
> @@ -74,9 +72,20 @@ static int do_loadenv(int argc, char *argv[])
> }
> }
>
> - printf("loading environment from %s\n", filename);
> -
> - return envfs_load(filename, dirname, flags);
> + if (filename) {
> + printf("loading environment from %s\n", filename);
> + return envfs_load(filename, dirname, flags);
> + } else {
> + char **paths = environment_paths;
> + while (*paths) {
> + printf("loading environment from %s\n", *paths);
> + ret = envfs_load(*paths, dirname, flags);
> + if (!ret)
> + return ret;
> + paths++;
> + }
> + return ret;
> + }
> }
>
> BAREBOX_CMD_HELP_START(loadenv)
> diff --git a/commands/saveenv.c b/commands/saveenv.c
> index 7f371a8..ad783e6 100644
> --- a/commands/saveenv.c
> +++ b/commands/saveenv.c
> @@ -27,20 +27,10 @@
> #include <fcntl.h>
> #include <envfs.h>
>
> -static int do_saveenv(int argc, char *argv[])
> -{
> +static int single_saveenv(char *filename, char *dirname) {
> int ret, fd;
> - char *filename, *dirname;
>
> - printf("saving environment\n");
> - if (argc < 3)
> - dirname = "/env";
> - else
> - dirname = argv[2];
> - if (argc < 2)
> - filename = default_environment_path;
> - else
> - filename = argv[1];
> + printf("saving environment to %s\n", filename);
>
> fd = open(filename, O_WRONLY | O_CREAT);
> if (fd < 0) {
> @@ -91,6 +81,34 @@ out:
> return ret;
> }
>
> +static int do_saveenv(int argc, char *argv[])
> +{
> + int ret;
> + char *filename, *dirname;
> +
> + if (argc < 3)
> + dirname = "/env";
> + else
> + dirname = argv[2];
> + if (argc < 2)
> + filename = NULL;
> + else
> + filename = argv[1];
> +
> + if (filename) {
> + ret = single_saveenv(filename, dirname);
> + } else {
> + char **paths = environment_paths;
> + ret = 1;
> + while (*paths) {
> + ret = single_saveenv(*paths, dirname) && ret;
> + paths++;
> + }
> + }
> +
> + return ret;
> +}
> +
> BAREBOX_CMD_HELP_START(saveenv)
> BAREBOX_CMD_HELP_USAGE("saveenv [envfs] [directory]\n")
> BAREBOX_CMD_HELP_SHORT("Save the files in <directory> to the persistent storage device <envfs>.\n")
> diff --git a/common/environment.c b/common/environment.c
> index 78cd45c..300fa57 100644
> --- a/common/environment.c
> +++ b/common/environment.c
> @@ -48,7 +48,12 @@ struct action_data {
> };
> #define PAD4(x) ((x + 3) & ~3)
>
> -char *default_environment_path = "/dev/env0";
> +static char *default_environment_paths[] = {
> + "/dev/env0",
> + NULL,
> +};
> +
> +char **environment_paths = default_environment_paths;
>
> static int file_size_action(const char *filename, struct stat *statbuf,
> void *userdata, int depth)
> diff --git a/common/startup.c b/common/startup.c
> index 52a8996..1525c69 100644
> --- a/common/startup.c
> +++ b/common/startup.c
> @@ -115,14 +115,19 @ void __noreturn start_barebox(void)
> debug("initcalls done\n");
>
> if (IS_ENABLED(CONFIG_ENV_HANDLING)) {
> - int ret;
> -
> - ret = envfs_load(default_environment_path, "/env", 0);
> + char **paths = environment_paths;
> + int ret = -ENOENT;
> +
> + while (*paths) {
> + printf("loading environment from %s\n", *paths);
> + ret = envfs_load(*paths, "/env", 0);
> + if (!ret)
> + break;
> + paths++;
> + }
>
> if (ret && IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT)) {
> - printf("no valid environment found on %s. "
> - "Using default environment\n",
> - default_environment_path);
> + printf("using default environment\n");
> envfs_load("/dev/defaultenv", "/env", 0);
> }
> }
> diff --git a/include/envfs.h b/include/envfs.h
> index e9372b3..981a190 100644
> --- a/include/envfs.h
> +++ b/include/envfs.h
> @@ -94,7 +94,7 @@ int envfs_load(char *filename, char *dirname, unsigned flags);
> int envfs_save(char *filename, char *dirname);
>
> /* defaults to /dev/env0 */
> -extern char *default_environment_path;
> +extern char **environment_paths;
>
> int envfs_register_partition(const char *devname, unsigned int partnr);
>
> --
> 1.8.2.rc2
>
>
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-04-18 9:21 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-04-17 13:16 [PATCH] environment: support redundant environments Jan Luebbe
2013-04-18 9:16 ` Jean-Christophe PLAGNIOL-VILLARD
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox