New debugfs command: set_current_time
Generalize the time parsing code and move it to
util.c:string_to_time(). Add new command, set_current_time, which
sets the time used to set the filesystems's time fields.
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c
index c2baee9..20d1f4b 100644
--- a/debugfs/debugfs.c
+++ b/debugfs/debugfs.c
@@ -1295,7 +1295,8 @@
ext2fs_inode_alloc_stats2(current_fs, newfile, +1, 0);
memset(&inode, 0, sizeof(inode));
inode.i_mode = (statbuf.st_mode & ~LINUX_S_IFMT) | LINUX_S_IFREG;
- inode.i_atime = inode.i_ctime = inode.i_mtime = time(NULL);
+ inode.i_atime = inode.i_ctime = inode.i_mtime =
+ current_fs->now ? current_fs->now : time(0);
inode.i_links_count = 1;
inode.i_size = statbuf.st_size;
if (debugfs_write_new_inode(newfile, &inode, argv[0])) {
@@ -1382,7 +1383,8 @@
ext2fs_mark_ib_dirty(current_fs);
memset(&inode, 0, sizeof(inode));
inode.i_mode = mode;
- inode.i_atime = inode.i_ctime = inode.i_mtime = time(NULL);
+ inode.i_atime = inode.i_ctime = inode.i_mtime =
+ current_fs->now ? current_fs->now : time(0);
if ((major < 256) && (minor < 256)) {
inode.i_block[0] = major*256+minor;
inode.i_block[1] = 0;
@@ -1454,7 +1456,7 @@
if (debugfs_read_inode(inode, &inode_buf, 0))
return;
- inode_buf.i_dtime = time(NULL);
+ inode_buf.i_dtime = current_fs->now ? current_fs->now : time(0);
if (debugfs_write_inode(inode, &inode_buf, 0))
return;
if (!ext2fs_inode_has_valid_blocks(&inode_buf))
@@ -1697,7 +1699,27 @@
}
+void do_set_current_time(int argc, char *argv[])
+{
+ ext2_ino_t ino;
+ unsigned long group, block, block_nr, offset;
+ time_t now;
+ if (common_args_process(argc, argv, 2, 2, argv[0],
+ "<time>", 0))
+ return;
+
+ now = string_to_time(argv[1]);
+ if (now == ((time_t) -1)) {
+ com_err(argv[0], 0, "Couldn't parse argument as a time: %s\n",
+ argv[1]);
+ return;
+
+ } else {
+ printf("Setting current time to %s\n", time_to_string(now));
+ current_fs->now = now;
+ }
+}
static int source_file(const char *cmd_file, int sci_idx)
{