The resulting environment was dependend of the build machines'
filesystem, i.e. the order in which readdir returns dirents depends on
the filesystem implementation.

Use the new flag in scripts/bareboxenv.c for generating a reproducible
built-in environment.

Signed-off-by: Florian Bäuerle <[email protected]>
---
 common/environment.c | 8 ++++++--
 include/envfs.h      | 1 +
 scripts/bareboxenv.c | 2 +-
 3 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/common/environment.c b/common/environment.c
index 56a030eda..cea55f313 100644
--- a/common/environment.c
+++ b/common/environment.c
@@ -257,6 +257,7 @@ int envfs_save(const char *filename, const char *dirname, 
unsigned flags)
        void *buf = NULL, *wbuf;
        struct envfs_entry *env;
        const char *defenv_path = default_environment_path_get();
+       int recursive_flags = ACTION_RECURSE;
 
        if (!filename)
                filename = defenv_path;
@@ -276,10 +277,13 @@ int envfs_save(const char *filename, const char *dirname, 
unsigned flags)
        if (flags & ENVFS_FLAGS_FORCE_BUILT_IN) {
                size = 0; /* force no content */
        } else {
+               if (flags & ENVFS_FLAGS_SORTED)
+                       recursive_flags |= ACTION_SORT;
+
                /* first pass: calculate size */
-               recursive_action(dirname, ACTION_RECURSE, file_action,
+               recursive_action(dirname, recursive_flags, file_action,
                                NULL, &data, 0);
-               recursive_action("/.defaultenv", ACTION_RECURSE,
+               recursive_action("/.defaultenv", recursive_flags,
                                file_remove_action, NULL, &data, 0);
                size = 0;
 
diff --git a/include/envfs.h b/include/envfs.h
index 27c4b42c6..fa12c60a8 100644
--- a/include/envfs.h
+++ b/include/envfs.h
@@ -45,6 +45,7 @@ struct envfs_super {
        uint16_t future;                /* reserved for future use */
        uint32_t flags;                 /* feature flags */
 #define ENVFS_FLAGS_FORCE_BUILT_IN     (1 << 0)
+#define ENVFS_FLAGS_SORTED             (1 << 1)
        uint32_t sb_crc;                /* crc for the superblock */
 };
 
diff --git a/scripts/bareboxenv.c b/scripts/bareboxenv.c
index de57c2fce..3e7c736b9 100644
--- a/scripts/bareboxenv.c
+++ b/scripts/bareboxenv.c
@@ -127,7 +127,7 @@ int main(int argc, char *argv[])
        int opt;
        int save = 0, load = 0, pad = 0, err = 0, fd;
        char *filename = NULL, *dirname = NULL;
-       unsigned envfs_flags = 0;
+       unsigned envfs_flags = ENVFS_FLAGS_SORTED;
        int verbose = 0;
 
        while((opt = getopt(argc, argv, "slp:vz")) != -1) {
-- 
2.19.2

_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to