| From b9254539811ce912bfd16dd1d185eba7a10cceff Mon Sep 17 00:00:00 2001 |
| From: Markus Mayer <mmayer@mmayer.net> |
| Date: Wed, 7 Sep 2016 12:58:47 +0300 |
| Subject: [PATCH] ext4_utils: add -o argument to preserve ownership |
| |
| See also https://android-review.googlesource.com/#/c/100312/ |
| |
| Upstream-Status: Inappropriate |
| --- |
| ext4_utils/make_ext4fs.c | 6 ++++++ |
| ext4_utils/make_ext4fs_main.c | 10 ++++++++-- |
| 2 files changed, 14 insertions(+), 2 deletions(-) |
| |
| diff --git a/ext4_utils/make_ext4fs.c b/ext4_utils/make_ext4fs.c |
| index 732afbed7..2cbf04399 100644 |
| --- a/ext4_utils/make_ext4fs.c |
| +++ b/ext4_utils/make_ext4fs.c |
| @@ -67,6 +67,8 @@ |
| |
| #endif |
| |
| +int preserve_owner = 0; |
| + |
| /* TODO: Not implemented: |
| Allocating blocks in the same block group as the file inode |
| Hash or binary tree directories |
| @@ -185,6 +187,10 @@ static u32 build_directory_structure(const char *full_path, const char *dir_path |
| } else { |
| dentries[i].mtime = fixed_time; |
| } |
| + if (preserve_owner) { |
| + dentries[i].uid = stat.st_uid; |
| + dentries[i].gid = stat.st_gid; |
| + } |
| uint64_t capabilities; |
| if (fs_config_func != NULL) { |
| #ifdef ANDROID |
| diff --git a/ext4_utils/make_ext4fs_main.c b/ext4_utils/make_ext4fs_main.c |
| index f8e7b9da9..e82d43277 100644 |
| --- a/ext4_utils/make_ext4fs_main.c |
| +++ b/ext4_utils/make_ext4fs_main.c |
| @@ -47,13 +47,15 @@ struct selabel_handle; |
| extern struct fs_info info; |
| |
| |
| +extern int preserve_owner; |
| + |
| static void usage(char *path) |
| { |
| fprintf(stderr, "%s [ -l <len> ] [ -j <journal size> ] [ -b <block_size> ]\n", basename(path)); |
| fprintf(stderr, " [ -g <blocks per group> ] [ -i <inodes> ] [ -I <inode size> ]\n"); |
| fprintf(stderr, " [ -L <label> ] [ -f ] [ -a <android mountpoint> ]\n"); |
| fprintf(stderr, " [ -S file_contexts ] [ -C fs_config ] [ -T timestamp ]\n"); |
| - fprintf(stderr, " [ -z | -s ] [ -w ] [ -c ] [ -J ] [ -v ] [ -B <block_list_file> ]\n"); |
| + fprintf(stderr, " [ -z | -s ] [ -w ] [ -c ] [ -J ] [ -o ] [ -v ] [ -B <block_list_file> ]\n"); |
| fprintf(stderr, " <filename> [<directory>]\n"); |
| } |
| |
| @@ -79,7 +81,7 @@ int main(int argc, char **argv) |
| struct selinux_opt seopts[] = { { SELABEL_OPT_PATH, "" } }; |
| #endif |
| |
| - while ((opt = getopt(argc, argv, "l:j:b:g:i:I:L:a:S:T:C:B:fwzJsctv")) != -1) { |
| + while ((opt = getopt(argc, argv, "l:j:b:g:i:I:L:a:S:T:C:B:fwzJsctov")) != -1) { |
| switch (opt) { |
| case 'l': |
| info.len = parse_num(optarg); |
| @@ -142,6 +144,10 @@ int main(int argc, char **argv) |
| } |
| #endif |
| break; |
| + case 'o': |
| + preserve_owner = 1; |
| + printf("Warning: Enabling 'preserve ownership', this is an unofficial feature!\n"); |
| + break; |
| case 'v': |
| verbose = 1; |
| break; |