From adc8e37d7f86d661ab54adf9c43e4b0aa67a939c Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Mon, 22 Jul 2019 03:28:05 +0200 Subject: Add a way to optionally keep the original time stamps First of all, this commit adds a mod_time field to a tree node. When creating the tree node, the field is set from the struct stat. When scanning a directory, the time stamps from the input are used if set. Second, the libsqfs code that reads inodes is modified to store the mod_time from the inode in the fstree node and to write the tree node into a generated inode. Finally, tar2sqfs is modified to optionally keep the timestamps from the tar archive instead of setting defaults. gensquashfs is similarly modified to keep the input timestamps if specified. The result is as follows: - sqfs2tar will always carry the timestamps from the squashfs over to the tar ball. - tar2sqfs will set defaults, unless explicitly asked to preserve the mtime from the tar ball. - gensquashfs can optionally preserve the mtime from the input hierarchy it processes if only --pack-dir is specified. Signed-off-by: David Oberhollenzer --- lib/fstree/add_by_path.c | 1 + lib/fstree/fstree_from_dir.c | 14 ++++++++++---- lib/fstree/fstree_from_file.c | 6 ++++++ lib/fstree/mknode.c | 1 + lib/fstree/node_stat.c | 3 +++ 5 files changed, 21 insertions(+), 4 deletions(-) (limited to 'lib/fstree') diff --git a/lib/fstree/add_by_path.c b/lib/fstree/add_by_path.c index eaa0925..7e0a4ce 100644 --- a/lib/fstree/add_by_path.c +++ b/lib/fstree/add_by_path.c @@ -77,6 +77,7 @@ tree_node_t *fstree_add_generic(fstree_t *fs, const char *path, child->uid = sb->st_uid; child->gid = sb->st_gid; child->mode = sb->st_mode; + child->mod_time = sb->st_mtime; child->data.dir->created_implicitly = false; return child; } diff --git a/lib/fstree/fstree_from_dir.c b/lib/fstree/fstree_from_dir.c index 29911f4..ad75006 100644 --- a/lib/fstree/fstree_from_dir.c +++ b/lib/fstree/fstree_from_dir.c @@ -43,7 +43,7 @@ fail: return NULL; } -static int populate_dir(fstree_t *fs, tree_node_t *root) +static int populate_dir(fstree_t *fs, tree_node_t *root, bool keep_time_stamps) { char *extra = NULL; struct dirent *ent; @@ -92,6 +92,12 @@ static int populate_dir(fstree_t *fs, tree_node_t *root) goto fail; } + if (!keep_time_stamps) { + sb.st_atim = fs->defaults.st_atim; + sb.st_mtim = fs->defaults.st_mtim; + sb.st_ctim = fs->defaults.st_ctim; + } + n = fstree_mknode(fs, root, ent->d_name, strlen(ent->d_name), extra, &sb); if (n == NULL) { @@ -110,7 +116,7 @@ static int populate_dir(fstree_t *fs, tree_node_t *root) if (pushd(n->name)) return -1; - if (populate_dir(fs, n)) + if (populate_dir(fs, n, keep_time_stamps)) return -1; if (popd()) @@ -127,14 +133,14 @@ fail: return -1; } -int fstree_from_dir(fstree_t *fs, const char *path) +int fstree_from_dir(fstree_t *fs, const char *path, bool keep_time_stamps) { int ret; if (pushd(path)) return -1; - ret = populate_dir(fs, fs->root); + ret = populate_dir(fs, fs->root, keep_time_stamps); if (popd()) ret = -1; diff --git a/lib/fstree/fstree_from_file.c b/lib/fstree/fstree_from_file.c index 901e431..91a922b 100644 --- a/lib/fstree/fstree_from_file.c +++ b/lib/fstree/fstree_from_file.c @@ -66,6 +66,9 @@ static int add_file(fstree_t *fs, const char *filename, size_t line_num, sb.st_uid = basic->st_uid; sb.st_gid = basic->st_gid; sb.st_mode = basic->st_mode; + sb.st_atim = basic->st_atim; + sb.st_mtim = basic->st_mtim; + sb.st_ctim = basic->st_ctim; return add_generic(fs, filename, line_num, path, &sb, extra); } @@ -119,6 +122,9 @@ static int handle_line(fstree_t *fs, const char *filename, size_t i; memset(&sb, 0, sizeof(sb)); + sb.st_mtime = fs->defaults.st_mtime; + sb.st_atime = fs->defaults.st_atime; + sb.st_ctime = fs->defaults.st_ctime; /* isolate keyword */ for (i = 0; isalpha(line[i]); ++i) diff --git a/lib/fstree/mknode.c b/lib/fstree/mknode.c index 4b4cdfd..7d09fbd 100644 --- a/lib/fstree/mknode.c +++ b/lib/fstree/mknode.c @@ -43,6 +43,7 @@ tree_node_t *fstree_mknode(fstree_t *fs, tree_node_t *parent, const char *name, n->uid = sb->st_uid; n->gid = sb->st_gid; n->mode = sb->st_mode; + n->mod_time = sb->st_mtime; switch (sb->st_mode & S_IFMT) { case S_IFDIR: diff --git a/lib/fstree/node_stat.c b/lib/fstree/node_stat.c index 8f62a0f..a28cae8 100644 --- a/lib/fstree/node_stat.c +++ b/lib/fstree/node_stat.c @@ -13,6 +13,9 @@ void fstree_node_stat(fstree_t *fs, tree_node_t *node, struct stat *sb) sb->st_nlink = 1; sb->st_uid = node->uid; sb->st_gid = node->gid; + sb->st_mtime = node->mod_time; + sb->st_atime = node->mod_time; + sb->st_ctime = node->mod_time; switch (node->mode & S_IFMT) { case S_IFDIR: -- cgit v1.2.3