Whamcloud - gitweb
AOSP: e2fsdroid: add an option to generate a base_fs file
authorAdrien Schildknecht <adriens@google.com>
Wed, 30 Nov 2016 05:45:03 +0000 (21:45 -0800)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 24 May 2017 02:08:49 +0000 (22:08 -0400)
Test: make_ext4 and e2fsdroid both generate the same list of file.

Change-Id: Idaf42b64b588824d453bc204562ccbe702de26a9
From AOSP commit: 0fe9949ca0cae4be6cde69e084db922506eda11a

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
contrib/android/Android.mk
contrib/android/base_fs.c [new file with mode: 0644]
contrib/android/base_fs.h [new file with mode: 0644]
contrib/android/e2fsdroid.c

index 8199037..6018695 100644 (file)
@@ -3,7 +3,8 @@ LOCAL_PATH:= $(call my-dir)
 e2fsdroid_src := e2fsdroid.c \
     block_range.c \
     fsmap.c \
-    block_list.c
+    block_list.c \
+    base_fs.c
 
 include $(CLEAR_VARS)
 LOCAL_SRC_FILES := $(e2fsdroid_src)
diff --git a/contrib/android/base_fs.c b/contrib/android/base_fs.c
new file mode 100644 (file)
index 0000000..d2b44f9
--- /dev/null
@@ -0,0 +1,92 @@
+#include "base_fs.h"
+#include <stdio.h>
+
+#define BASE_FS_VERSION "Base EXT4 version 1.0"
+
+struct base_fs {
+       FILE *file;
+       const char *mountpoint;
+       struct basefs_entry entry;
+};
+
+static void *init(const char *file, const char *mountpoint)
+{
+       struct base_fs *params = malloc(sizeof(*params));
+
+       if (!params)
+               return NULL;
+       params->mountpoint = mountpoint;
+       params->file = fopen(file, "w+");
+       if (!params->file) {
+               free(params);
+               return NULL;
+       }
+       if (fwrite(BASE_FS_VERSION"\n", 1, strlen(BASE_FS_VERSION"\n"),
+                  params->file) != strlen(BASE_FS_VERSION"\n")) {
+               fclose(params->file);
+               free(params);
+               return NULL;
+       }
+       return params;
+}
+
+static int start_new_file(char *path, ext2_ino_t ino EXT2FS_ATTR((unused)),
+                         struct ext2_inode *inode, void *data)
+{
+       struct base_fs *params = data;
+
+       params->entry.head = params->entry.tail = NULL;
+       params->entry.path = LINUX_S_ISREG(inode->i_mode) ? path : NULL;
+       return 0;
+}
+
+static int add_block(ext2_filsys fs EXT2FS_ATTR((unused)), blk64_t blocknr,
+                    int metadata, void *data)
+{
+       struct base_fs *params = data;
+
+       if (params->entry.path && !metadata)
+               add_blocks_to_range(&params->entry.head, &params->entry.tail,
+                                   blocknr, blocknr);
+       return 0;
+}
+
+static int inline_data(void *inline_data EXT2FS_ATTR((unused)),
+                      void *data EXT2FS_ATTR((unused)))
+{
+       return 0;
+}
+
+static int end_new_file(void *data)
+{
+       struct base_fs *params = data;
+
+       if (!params->entry.path)
+               return 0;
+       if (fprintf(params->file, "%s%s ", params->mountpoint,
+                   params->entry.path) < 0
+           || write_block_ranges(params->file, params->entry.head, ",")
+           || fwrite("\n", 1, 1, params->file) != 1)
+               return -1;
+
+       delete_block_ranges(params->entry.head);
+       return 0;
+}
+
+static int cleanup(void *data)
+{
+       struct base_fs *params = data;
+
+       fclose(params->file);
+       free(params);
+       return 0;
+}
+
+struct fsmap_format base_fs_format = {
+       .init = init,
+       .start_new_file = start_new_file,
+       .add_block = add_block,
+       .inline_data = inline_data,
+       .end_new_file = end_new_file,
+       .cleanup = cleanup,
+};
diff --git a/contrib/android/base_fs.h b/contrib/android/base_fs.h
new file mode 100644 (file)
index 0000000..bd44107
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef BASE_FS_H
+# define BASE_FS_H
+
+# include "fsmap.h"
+# include "block_range.h"
+
+struct basefs_entry {
+       char *path;
+       struct block_range *head;
+       struct block_range *tail;
+};
+
+extern struct fsmap_format base_fs_format;
+
+#endif /* !BASE_FS_H */
index 816104f..4678206 100644 (file)
@@ -5,17 +5,20 @@
 #include <limits.h>
 #include <ext2fs/ext2fs.h>
 
+#include "base_fs.h"
 #include "block_list.h"
 
 const char *prog_name = "e2fsdroid";
 const char *in_file;
 const char *block_list;
+const char *basefs_out;
 const char *mountpoint = "";
 int android_sparse_file = 1;
 
 static void usage(int ret)
 {
-       fprintf(stderr, "%s [-B block_list] [-e] image\n", prog_name);
+       fprintf(stderr, "%s [-B block_list] [-D basefs_out] [-e] image\n",
+                prog_name);
        exit(ret);
 }
 
@@ -44,8 +47,11 @@ int main(int argc, char *argv[])
 
        add_error_table(&et_ext2_error_table);
 
-       while ((c = getopt (argc, argv, "B:e")) != EOF) {
+       while ((c = getopt (argc, argv, "D:B:e")) != EOF) {
                switch (c) {
+               case 'D':
+                       basefs_out = absolute_path(optarg);
+                       break;
                case 'B':
                        block_list = absolute_path(optarg);
                        break;
@@ -74,7 +80,17 @@ int main(int argc, char *argv[])
                                           mountpoint);
                if (retval) {
                        com_err(prog_name, retval, "%s",
-                               "while creating block_list");
+                               "while creating the block_list");
+                       exit(1);
+               }
+       }
+
+       if (basefs_out) {
+               retval = fsmap_iter_filsys(fs, &base_fs_format,
+                                          basefs_out, mountpoint);
+               if (retval) {
+                       com_err(prog_name, retval, "%s",
+                               "while creating the basefs file");
                        exit(1);
                }
        }