From 8413d78ab3e3062641dbe3069fcd454858244679 Mon Sep 17 00:00:00 2001 From: Juergen Beisert Date: Fri, 9 Nov 2007 23:19:54 +0100 Subject: separating environment commands, part 2 Signed-off-by: Juergen Beisert --- commands/saveenv.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 commands/saveenv.c (limited to 'commands/saveenv.c') diff --git a/commands/saveenv.c b/commands/saveenv.c new file mode 100644 index 0000000000..ef195bc13e --- /dev/null +++ b/commands/saveenv.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2007 Sascha Hauer , 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/** + * @file + * @brief saveenv: Make the environment persistent + */ + +#include +#include +#include +#include +#include +#include + +static int do_saveenv(cmd_tbl_t *cmdtp, int argc, char *argv[]) +{ + int ret, fd; + char *filename, *dirname; + + printf("saving environment\n"); + if (argc < 3) + dirname = "/env"; + else + dirname = argv[2]; + if (argc < 2) + filename = "/dev/env0"; + else + filename = argv[1]; + + fd = open(filename, O_WRONLY | O_CREAT); + if (fd < 0) { + printf("could not open %s: %s", filename, errno_str()); + return 1; + } + + ret = protect(fd, ~0, 0, 0); + + /* ENOSYS is no error here, many devices do not need it */ + if (ret && errno != -ENOSYS) { + printf("could not unprotect %s: %s\n", filename, errno_str()); + close(fd); + return 1; + } + + ret = erase(fd, ~0, 0); + + /* ENOSYS is no error here, many devices do not need it */ + if (ret && errno != -ENOSYS) { + printf("could not erase %s: %s\n", filename, errno_str()); + close(fd); + return 1; + } + + ret = envfs_save(filename, dirname); + if (ret) { + printf("saveenv failed\n"); + goto out; + } + + ret = protect(fd, ~0, 0, 1); + + /* ENOSYS is no error here, many devices do not need it */ + if (ret && errno != -ENOSYS) { + printf("could not protect %s: %s\n", filename, errno_str()); + close(fd); + return 1; + } + + ret = 0; +out: + close(fd); + return ret; +} + +static __maybe_unused char cmd_saveenv_help[] = +"Usage: saveenv [] []\n" +"Save the files in to the persistent storage device .\n" +" is normally a block in flash, but could be any other file.\n" +"If ommitted defaults to /env and defaults to /dev/env0.\n" +"Note that envfs can only handle files. Directories are skipped silently.\n"; + +U_BOOT_CMD_START(saveenv) + .maxargs = 3, + .cmd = do_saveenv, + .usage = "save environment to persistent storage", + U_BOOT_CMD_HELP(cmd_saveenv_help) +U_BOOT_CMD_END + +/** + * @page saveenv_command saveenv + * + * Usage: saveenv [\] [\] + * + * Save the files in \ to the persistent storage device \. + * \ is normally a block in flash, but could be any other file. + * + * If ommitted \ defaults to \c /env and \ defaults to + * \c /dev/env0. + * + * @note envfs can only handle files. Directories are skipped silently. + */ -- cgit v1.2.3