diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/fstree/add_by_path.c | 1 | ||||
-rw-r--r-- | lib/fstree/fstree_from_dir.c | 14 | ||||
-rw-r--r-- | lib/fstree/fstree_from_file.c | 6 | ||||
-rw-r--r-- | lib/fstree/mknode.c | 1 | ||||
-rw-r--r-- | lib/fstree/node_stat.c | 3 | ||||
-rw-r--r-- | lib/sqfs/tree_node_from_inode.c | 1 | ||||
-rw-r--r-- | lib/sqfs/write_inode.c | 2 |
7 files changed, 23 insertions, 5 deletions
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: diff --git a/lib/sqfs/tree_node_from_inode.c b/lib/sqfs/tree_node_from_inode.c index 0d46eed..1ee85e5 100644 --- a/lib/sqfs/tree_node_from_inode.c +++ b/lib/sqfs/tree_node_from_inode.c @@ -88,6 +88,7 @@ tree_node_t *tree_node_from_inode(sqfs_inode_generic_t *inode, out->gid = idtbl->ids[inode->base.gid_idx]; out->mode = inode->base.mode; out->inode_num = inode->base.inode_number; + out->mod_time = inode->base.mod_time; out->name = (char *)out->payload; switch (inode->base.type) { diff --git a/lib/sqfs/write_inode.c b/lib/sqfs/write_inode.c index a013d6f..6e11277 100644 --- a/lib/sqfs/write_inode.c +++ b/lib/sqfs/write_inode.c @@ -143,7 +143,7 @@ int meta_writer_write_inode(fstree_t *fs, id_table_t *idtbl, meta_writer_t *im, base.mode = htole16(node->mode); base.uid_idx = htole16(uid_idx); base.gid_idx = htole16(gid_idx); - base.mod_time = htole32(fs->defaults.st_mtime); + base.mod_time = htole32(node->mod_time); base.inode_number = htole32(node->inode_num); if (meta_writer_append(im, &base, sizeof(base))) { |