summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorAdrien Schildknecht <adriens@google.com>2016-11-29 21:45:03 -0800
committerTheodore Ts'o <tytso@mit.edu>2017-05-23 22:08:49 -0400
commited8e189b38a96cf678e0ef901dd9a3fdb6c133d4 (patch)
tree429476bb4ad076628ff6d0f91e8fd03c8f3f1df6 /contrib
parent974c8483b9f097798a78dbe9cf1c4a10cd1eb9ab (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.mk3
-rw-r--r--contrib/android/base_fs.c92
-rw-r--r--contrib/android/base_fs.h15
-rw-r--r--contrib/android/e2fsdroid.c22
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(&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
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);
}
}