diff options
author | Adrien Schildknecht <adriens@google.com> | 2016-11-29 21:45:03 -0800 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2017-05-23 22:08:49 -0400 |
commit | ed8e189b38a96cf678e0ef901dd9a3fdb6c133d4 (patch) | |
tree | 429476bb4ad076628ff6d0f91e8fd03c8f3f1df6 /contrib | |
parent | 974c8483b9f097798a78dbe9cf1c4a10cd1eb9ab (diff) |
AOSP: e2fsdroid: add an option to generate a base_fs file
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>
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/android/Android.mk | 3 | ||||
-rw-r--r-- | contrib/android/base_fs.c | 92 | ||||
-rw-r--r-- | contrib/android/base_fs.h | 15 | ||||
-rw-r--r-- | contrib/android/e2fsdroid.c | 22 |
4 files changed, 128 insertions, 4 deletions
diff --git a/contrib/android/Android.mk b/contrib/android/Android.mk index 8199037f..60186959 100644 --- a/contrib/android/Android.mk +++ b/contrib/android/Android.mk @@ -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 index 00000000..d2b44f91 --- /dev/null +++ b/contrib/android/base_fs.c @@ -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(¶ms->entry.head, ¶ms->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 index 00000000..bd441078 --- /dev/null +++ b/contrib/android/base_fs.h @@ -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 */ diff --git a/contrib/android/e2fsdroid.c b/contrib/android/e2fsdroid.c index 816104f8..46782067 100644 --- a/contrib/android/e2fsdroid.c +++ b/contrib/android/e2fsdroid.c @@ -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); } } |