9
0
Fork 0

env: erase/protect in envfs_save

So that the envfs_save is more useful outside of the saveenv command

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2014-04-09 12:14:06 +02:00
parent 54bea204e2
commit ebb8a4b594
2 changed files with 37 additions and 47 deletions

View File

@ -29,7 +29,7 @@
static int do_saveenv(int argc, char *argv[])
{
int ret, fd;
int ret;
char *filename, *dirname;
printf("saving environment\n");
@ -42,52 +42,8 @@ static int do_saveenv(int argc, char *argv[])
else
filename = argv[1];
fd = open(filename, O_WRONLY | O_CREAT);
if (fd < 0) {
printf("could not open %s: %s\n", 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;
}
close(fd);
ret = envfs_save(filename, dirname);
if (ret) {
printf("saveenv failed\n");
goto out;
}
fd = open(filename, O_WRONLY | O_CREAT);
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;
}

View File

@ -60,6 +60,16 @@ char *default_environment_path_get(void)
{
return default_environment_path;
}
#else
static inline int protect(int fd, size_t count, unsigned long offset, int prot)
{
return 0;
}
static inline int erase(int fd, size_t count, unsigned long offset)
{
return 0;
}
#endif
static int file_size_action(const char *filename, struct stat *statbuf,
@ -196,11 +206,27 @@ int envfs_save(const char *filename, const char *dirname)
envfd = open(filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
if (envfd < 0) {
printf("Open %s %s\n", filename, errno_str());
ret = envfd;
printf("could not open %s: %s\n", filename, errno_str());
ret = -errno;
goto out1;
}
ret = protect(envfd, ~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());
goto out;
}
ret = erase(envfd, ~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());
goto out;
}
size += sizeof(struct envfs_super);
wbuf = buf;
@ -216,6 +242,14 @@ int envfs_save(const char *filename, const char *dirname)
size -= now;
}
ret = protect(envfd, ~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());
goto out;
}
ret = 0;
out: