diff options
author | Doug Zongker <dougz@android.com> | 2013-12-05 15:51:28 -0800 |
---|---|---|
committer | Doug Zongker <dougz@android.com> | 2013-12-06 09:56:21 -0800 |
commit | 9526680de97e2bc963a70d1fabffe165a688bb1e (patch) | |
tree | 4a0e4f9d7e7b2a7317da26529c3c619114e669dc /ext4_utils | |
parent | 1fadf4f9a32eb961401ee86786b6ce687a0e67c8 (diff) | |
download | extras-9526680de97e2bc963a70d1fabffe165a688bb1e.tar.gz |
allow fixing timestamps when building ext4 filesystem
When building an image, make_ext4fs currently sets the timestamps in
the image to the timestamps of the source files. Allow this time to
be overridden with a fixed value provided on the command line, to make
it easier to reproduce bit-identical images from a target_files zip.
Change-Id: I52ddab4575a334ee52404f4d5d1c61b55513c618
Diffstat (limited to 'ext4_utils')
-rw-r--r-- | ext4_utils/ext4_utils.h | 8 | ||||
-rw-r--r-- | ext4_utils/make_ext4fs.c | 44 | ||||
-rw-r--r-- | ext4_utils/make_ext4fs_main.c | 10 | ||||
-rwxr-xr-x | ext4_utils/mkuserimg.sh | 17 |
4 files changed, 47 insertions, 32 deletions
diff --git a/ext4_utils/ext4_utils.h b/ext4_utils/ext4_utils.h index 083aff56..1e13a90c 100644 --- a/ext4_utils/ext4_utils.h +++ b/ext4_utils/ext4_utils.h @@ -172,14 +172,14 @@ void ext4_parse_sb(struct ext4_super_block *sb); u16 ext4_crc16(u16 crc_in, const void *buf, int size); typedef void (*fs_config_func_t)(const char *path, int dir, unsigned *uid, unsigned *gid, - unsigned *mode, uint64_t *capabilities); + unsigned *mode, uint64_t *capabilities); struct selabel_handle; int make_ext4fs_internal(int fd, const char *directory, - const char *mountpoint, fs_config_func_t fs_config_func, int gzip, - int sparse, int crc, int wipe, - struct selabel_handle *sehnd, int verbose); + const char *mountpoint, fs_config_func_t fs_config_func, int gzip, + int sparse, int crc, int wipe, + struct selabel_handle *sehnd, int verbose, time_t fixed_time); #ifdef __cplusplus } diff --git a/ext4_utils/make_ext4fs.c b/ext4_utils/make_ext4fs.c index c2a26653..d6723781 100644 --- a/ext4_utils/make_ext4fs.c +++ b/ext4_utils/make_ext4fs.c @@ -109,7 +109,7 @@ static u32 build_default_directory_structure() if the image were mounted at the specified mount point */ static u32 build_directory_structure(const char *full_path, const char *dir_path, u32 dir_inode, fs_config_func_t fs_config_func, - struct selabel_handle *sehnd, int verbose) + struct selabel_handle *sehnd, int verbose, time_t fixed_time) { int entries = 0; struct dentry *dentries; @@ -163,7 +163,11 @@ static u32 build_directory_structure(const char *full_path, const char *dir_path dentries[i].size = stat.st_size; dentries[i].mode = stat.st_mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO); - dentries[i].mtime = stat.st_mtime; + if (fixed_time == -1) { + dentries[i].mtime = stat.st_mtime; + } else { + dentries[i].mtime = fixed_time; + } uint64_t capabilities; if (fs_config_func != NULL) { #ifdef ANDROID @@ -256,7 +260,7 @@ static u32 build_directory_structure(const char *full_path, const char *dir_path if (ret < 0) critical_error_errno("asprintf"); entry_inode = build_directory_structure(subdir_full_path, - subdir_dir_path, inode, fs_config_func, sehnd, verbose); + subdir_dir_path, inode, fs_config_func, sehnd, verbose, fixed_time); free(subdir_full_path); free(subdir_dir_path); } else if (dentries[i].file_type == EXT4_FT_SYMLINK) { @@ -357,28 +361,28 @@ static u32 compute_bg_desc_reserve_blocks() } void reset_ext4fs_info() { - // Reset all the global data structures used by make_ext4fs so it - // can be called again. - memset(&info, 0, sizeof(info)); - memset(&aux_info, 0, sizeof(aux_info)); - - if (info.sparse_file) { - sparse_file_destroy(info.sparse_file); - info.sparse_file = NULL; - } + // Reset all the global data structures used by make_ext4fs so it + // can be called again. + memset(&info, 0, sizeof(info)); + memset(&aux_info, 0, sizeof(aux_info)); + + if (info.sparse_file) { + sparse_file_destroy(info.sparse_file); + info.sparse_file = NULL; + } } int make_ext4fs_sparse_fd(int fd, long long len, - const char *mountpoint, struct selabel_handle *sehnd) + const char *mountpoint, struct selabel_handle *sehnd) { reset_ext4fs_info(); info.len = len; - return make_ext4fs_internal(fd, NULL, mountpoint, NULL, 0, 1, 0, 0, sehnd, 0); + return make_ext4fs_internal(fd, NULL, mountpoint, NULL, 0, 1, 0, 0, sehnd, 0, -1); } int make_ext4fs(const char *filename, long long len, - const char *mountpoint, struct selabel_handle *sehnd) + const char *mountpoint, struct selabel_handle *sehnd) { int fd; int status; @@ -392,7 +396,7 @@ int make_ext4fs(const char *filename, long long len, return EXIT_FAILURE; } - status = make_ext4fs_internal(fd, NULL, mountpoint, NULL, 0, 0, 0, 1, sehnd, 0); + status = make_ext4fs_internal(fd, NULL, mountpoint, NULL, 0, 0, 0, 1, sehnd, 0, -1); close(fd); return status; @@ -456,9 +460,9 @@ static char *canonicalize_rel_slashes(const char *str) } int make_ext4fs_internal(int fd, const char *_directory, - const char *_mountpoint, fs_config_func_t fs_config_func, int gzip, - int sparse, int crc, int wipe, - struct selabel_handle *sehnd, int verbose) + const char *_mountpoint, fs_config_func_t fs_config_func, int gzip, + int sparse, int crc, int wipe, + struct selabel_handle *sehnd, int verbose, time_t fixed_time) { u32 root_inode_num; u16 root_mode; @@ -567,7 +571,7 @@ int make_ext4fs_internal(int fd, const char *_directory, #else if (directory) root_inode_num = build_directory_structure(directory, mountpoint, 0, - fs_config_func, sehnd, verbose); + fs_config_func, sehnd, verbose, fixed_time); else root_inode_num = build_default_directory_structure(); #endif diff --git a/ext4_utils/make_ext4fs_main.c b/ext4_utils/make_ext4fs_main.c index b6c740d2..7e59417c 100644 --- a/ext4_utils/make_ext4fs_main.c +++ b/ext4_utils/make_ext4fs_main.c @@ -52,7 +52,7 @@ 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 ]\n"); + fprintf(stderr, " [ -S file_contexts ] [ -T timestamp ]\n"); fprintf(stderr, " [ -z | -s ] [ -w ] [ -c ] [ -J ] [ -v ]\n"); fprintf(stderr, " <filename> [<directory>]\n"); } @@ -71,12 +71,13 @@ int main(int argc, char **argv) int fd; int exitcode; int verbose = 0; + time_t fixed_time = -1; struct selabel_handle *sehnd = NULL; #ifndef USE_MINGW struct selinux_opt seopts[] = { { SELABEL_OPT_PATH, "" } }; #endif - while ((opt = getopt(argc, argv, "l:j:b:g:i:I:L:a:S:fwzJsctv")) != -1) { + while ((opt = getopt(argc, argv, "l:j:b:g:i:I:L:a:S:T:fwzJsctv")) != -1) { switch (opt) { case 'l': info.len = parse_num(optarg); @@ -143,6 +144,9 @@ int main(int argc, char **argv) case 'v': verbose = 1; break; + case 'T': + fixed_time = strtoll(optarg, NULL, 0); + break; default: /* '?' */ usage(argv[0]); exit(EXIT_FAILURE); @@ -201,7 +205,7 @@ int main(int argc, char **argv) } exitcode = make_ext4fs_internal(fd, directory, mountpoint, fs_config_func, gzip, - sparse, crc, wipe, sehnd, verbose); + sparse, crc, wipe, sehnd, verbose, fixed_time); close(fd); return exitcode; diff --git a/ext4_utils/mkuserimg.sh b/ext4_utils/mkuserimg.sh index c44129e7..6ef0294c 100755 --- a/ext4_utils/mkuserimg.sh +++ b/ext4_utils/mkuserimg.sh @@ -1,11 +1,11 @@ -#!/bin/bash -x +#!/bin/bash # # To call this script, make sure make_ext4fs is somewhere in PATH function usage() { cat<<EOT Usage: -mkuserimg.sh [-s] SRC_DIR OUTPUT_FILE EXT_VARIANT MOUNT_POINT SIZE [FILE_CONTEXTS] +mkuserimg.sh [-s] SRC_DIR OUTPUT_FILE EXT_VARIANT MOUNT_POINT SIZE [-T TIMESTAMP] [FILE_CONTEXTS] EOT } @@ -17,7 +17,7 @@ if [ "$1" = "-s" ]; then shift fi -if [ $# -ne 5 -a $# -ne 6 ]; then +if [ $# -lt 5 -o $# -gt 8 ]; then usage exit 1 fi @@ -32,7 +32,14 @@ OUTPUT_FILE=$2 EXT_VARIANT=$3 MOUNT_POINT=$4 SIZE=$5 -FC=$6 +shift; shift; shift; shift; shift + +TIMESTAMP=-1 +if [[ "$1" == "-T" ]]; then + TIMESTAMP=$2 + shift; shift +fi +FC=$1 case $EXT_VARIANT in ext4) ;; @@ -53,7 +60,7 @@ if [ -n "$FC" ]; then FCOPT="-S $FC" fi -MAKE_EXT4FS_CMD="make_ext4fs $ENABLE_SPARSE_IMAGE $FCOPT -l $SIZE -a $MOUNT_POINT $OUTPUT_FILE $SRC_DIR" +MAKE_EXT4FS_CMD="make_ext4fs $ENABLE_SPARSE_IMAGE -T $TIMESTAMP $FCOPT -l $SIZE -a $MOUNT_POINT $OUTPUT_FILE $SRC_DIR" echo $MAKE_EXT4FS_CMD $MAKE_EXT4FS_CMD if [ $? -ne 0 ]; then |