diff --git a/commands/saveenv.c b/commands/saveenv.c index 29a29c1..178b783 100644 --- a/commands/saveenv.c +++ b/commands/saveenv.c @@ -37,7 +37,7 @@ else filename = argv[1]; - ret = envfs_save(filename, dirname); + ret = envfs_save(filename, dirname, 0); return ret; } diff --git a/common/environment.c b/common/environment.c index 8c4882c..e55c7b7 100644 --- a/common/environment.c +++ b/common/environment.c @@ -167,12 +167,13 @@ * 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 @@ 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 @@ 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)); diff --git a/include/envfs.h b/include/envfs.h index beae38a..fdcb8a8 100644 --- a/include/envfs.h +++ b/include/envfs.h @@ -93,7 +93,7 @@ #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 */ diff --git a/scripts/bareboxenv.c b/scripts/bareboxenv.c index da420db..ec6ccfe 100644 --- a/scripts/bareboxenv.c +++ b/scripts/bareboxenv.c @@ -181,7 +181,7 @@ 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);