9
0
Fork 0

envfs: change API to be able to forward special flags into the envfs superblock

In order to be able to mark an stored envfs image with special features
(intentional ignore for example), we now can feed forward these flags.
By forwarding a '0' for the flags nothing changes because the envfs superblock
was already allocated with xzalloc.

Signed-off-by: Juergen Borleis <jbe@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Juergen Borleis 2014-07-31 12:39:02 +02:00 committed by Sascha Hauer
parent c4c7b16588
commit 72ce27f8e0
4 changed files with 19 additions and 11 deletions

View File

@ -37,7 +37,7 @@ static int do_saveenv(int argc, char *argv[])
else
filename = argv[1];
ret = envfs_save(filename, dirname);
ret = envfs_save(filename, dirname, 0);
return ret;
}

View File

@ -167,12 +167,13 @@ out:
* Make the current environment persistent
* @param[in] filename where to store
* @param[in] dirname what to store (all files in this dir)
* @param[in] flags superblock flags (refer ENVFS_FLAGS_* macros)
* @return 0 on success, anything else in case of failure
*
* Note: This function will also be used on the host! See note in the header
* of this file.
*/
int envfs_save(const char *filename, const char *dirname)
int envfs_save(const char *filename, const char *dirname, unsigned flags)
{
struct envfs_super *super;
int envfd, size, ret;
@ -182,11 +183,15 @@ int envfs_save(const char *filename, const char *dirname)
data.writep = NULL;
data.base = dirname;
/* first pass: calculate size */
recursive_action(dirname, ACTION_RECURSE, file_size_action,
NULL, &data, 0);
if (flags & ENVFS_FLAGS_FORCE_BUILT_IN) {
size = 0; /* force no content */
} else {
/* first pass: calculate size */
recursive_action(dirname, ACTION_RECURSE, file_size_action,
NULL, &data, 0);
size = (unsigned long)data.writep;
size = (unsigned long)data.writep;
}
buf = xzalloc(size + sizeof(struct envfs_super));
data.writep = buf + sizeof(struct envfs_super);
@ -196,10 +201,13 @@ int envfs_save(const char *filename, const char *dirname)
super->major = ENVFS_MAJOR;
super->minor = ENVFS_MINOR;
super->size = ENVFS_32(size);
super->flags = ENVFS_32(flags);
/* second pass: copy files to buffer */
recursive_action(dirname, ACTION_RECURSE, file_save_action,
NULL, &data, 0);
if (!(flags & ENVFS_FLAGS_FORCE_BUILT_IN)) {
/* second pass: copy files to buffer */
recursive_action(dirname, ACTION_RECURSE, file_save_action,
NULL, &data, 0);
}
super->crc = ENVFS_32(crc32(0, buf + sizeof(struct envfs_super), size));
super->sb_crc = ENVFS_32(crc32(0, buf, sizeof(struct envfs_super) - 4));

View File

@ -93,7 +93,7 @@ struct envfs_super {
#define ENV_FLAG_NO_OVERWRITE (1 << 0)
int envfs_load(const char *filename, const char *dirname, unsigned flags);
int envfs_save(const char *filename, const char *dirname);
int envfs_save(const char *filename, const char *dirname, unsigned flags);
int envfs_load_from_buf(void *buf, int len, const char *dir, unsigned flags);
/* defaults to /dev/env0 */

View File

@ -181,7 +181,7 @@ int main(int argc, char *argv[])
if (verbose)
printf("saving contents of %s to file %s\n", dirname, filename);
err = envfs_save(filename, dirname);
err = envfs_save(filename, dirname, 0);
if (verbose && err)
printf("saving env failed: %d\n", err);