diff options
author | Theodore Ts'o <tytso@mit.edu> | 2005-09-24 21:56:38 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2005-09-24 21:56:38 -0400 |
commit | 4efae606bf3159f2134fa29a5ad78fb9f6331f92 (patch) | |
tree | f6e255377947396027eacec2510a8b034da58ef0 /debugfs | |
parent | 32138187f08d1f1dc03feb269f987982db76f3db (diff) | |
download | e2fsprogs-4efae606bf3159f2134fa29a5ad78fb9f6331f92.tar.gz |
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>
Diffstat (limited to 'debugfs')
-rw-r--r-- | debugfs/ChangeLog | 8 | ||||
-rw-r--r-- | debugfs/debug_cmds.ct | 3 | ||||
-rw-r--r-- | debugfs/debugfs.c | 28 | ||||
-rw-r--r-- | debugfs/debugfs.h | 1 | ||||
-rw-r--r-- | debugfs/lsdel.c | 2 | ||||
-rw-r--r-- | debugfs/set_fields.c | 31 | ||||
-rw-r--r-- | debugfs/util.c | 36 |
7 files changed, 82 insertions, 27 deletions
diff --git a/debugfs/ChangeLog b/debugfs/ChangeLog index dd96b58d..f92dc802 100644 --- a/debugfs/ChangeLog +++ b/debugfs/ChangeLog @@ -1,3 +1,11 @@ +2005-09-24 Theodore Ts'o <tytso@mit.edu> + + * set_fields.c (parse_time), util.c (string_to_time), debugfs.c + (do_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. + 2005-09-06 Theodore Ts'o <tytso@mit.edu> * set_fields.c: Fix set_inode_field so it can properly set the diff --git a/debugfs/debug_cmds.ct b/debugfs/debug_cmds.ct index 06e6fe16..a3d3e2df 100644 --- a/debugfs/debug_cmds.ct +++ b/debugfs/debug_cmds.ct @@ -148,5 +148,8 @@ request do_imap, "Calculate the location of an inode", request do_dump_unused, "Dump unused blocks", dump_unused; +request do_set_current_time, "Set current time to use when setting filesystme fields", + set_current_time; + end; diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c index c2baee97..20d1f4bf 100644 --- a/debugfs/debugfs.c +++ b/debugfs/debugfs.c @@ -1295,7 +1295,8 @@ void do_write(int argc, char *argv[]) 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 @@ void do_mknod(int argc, char *argv[]) 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 @@ static void kill_file_by_inode(ext2_ino_t inode) 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_imap(int argc, char *argv[]) } +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) { diff --git a/debugfs/debugfs.h b/debugfs/debugfs.h index 56fa3a97..3081cce4 100644 --- a/debugfs/debugfs.h +++ b/debugfs/debugfs.h @@ -31,6 +31,7 @@ extern int check_fs_read_write(char *name); extern int check_fs_bitmaps(char *name); extern ext2_ino_t string_to_inode(char *str); extern char *time_to_string(__u32); +extern time_t string_to_time(const char *); extern unsigned long parse_ulong(const char *str, const char *cmd, const char *descr, int *err); extern int strtoblk(const char *cmd, const char *str, blk_t *ret); diff --git a/debugfs/lsdel.c b/debugfs/lsdel.c index 71febd57..774b88ed 100644 --- a/debugfs/lsdel.c +++ b/debugfs/lsdel.c @@ -81,7 +81,7 @@ void do_lsdel(int argc, char **argv) int i; long secs = 0; char *tmp; - time_t now = time(0); + time_t now = current_fs->now ? current_fs->now : time(0); FILE *out; if (common_args_process(argc, argv, 1, 2, "ls_deleted_inodes", diff --git a/debugfs/set_fields.c b/debugfs/set_fields.c index ef933a10..188d016a 100644 --- a/debugfs/set_fields.c +++ b/debugfs/set_fields.c @@ -278,33 +278,18 @@ static errcode_t parse_string(struct field_set_info *info, char *arg) static errcode_t parse_time(struct field_set_info *info, char *arg) { - struct tm ts; - __u32 *ptr32; + __u32 *ptr32, t; ptr32 = (__u32 *) info->ptr; - if (strcmp(arg, "now") == 0) { - *ptr32 = time(0); - return 0; - } - memset(&ts, 0, sizeof(ts)); -#ifdef HAVE_STRPTIME - strptime(arg, "%Y%m%d%H%M%S", &ts); -#else - sscanf(arg, "%4d%2d%2d%2d%2d%2d", &ts.tm_year, &ts.tm_mon, - &ts.tm_mday, &ts.tm_hour, &ts.tm_min, &ts.tm_sec); - ts.tm_year -= 1900; - ts.tm_mon -= 1; - if (ts.tm_year < 0 || ts.tm_mon < 0 || ts.tm_mon > 11 || - ts.tm_mday < 0 || ts.tm_mday > 31 || ts.tm_hour > 23 || - ts.tm_min > 59 || ts.tm_sec > 61) - ts.tm_mday = 0; -#endif - if (ts.tm_mday == 0) { - /* Try it as an integer... */ - return parse_uint(info, arg); + t = string_to_time(arg); + + if (t == ((time_t) -1)) { + fprintf(stderr, "Couldn't parse '%s' for field %s.\n", + arg, info->name); + return EINVAL; } - *ptr32 = mktime(&ts); + *ptr32 = t; return 0; } diff --git a/debugfs/util.c b/debugfs/util.c index ce1a2f3a..cbbc99b5 100644 --- a/debugfs/util.c +++ b/debugfs/util.c @@ -202,6 +202,42 @@ char *time_to_string(__u32 cl) } /* + * Parse a string as a time. Return ((time_t)-1) if the string + * doesn't appear to be a sane time. + */ +extern time_t string_to_time(const char *arg) +{ + struct tm ts; + unsigned long ret; + char *tmp; + + if (strcmp(arg, "now") == 0) { + return time(0); + } + memset(&ts, 0, sizeof(ts)); +#ifdef HAVE_STRPTIME + strptime(arg, "%Y%m%d%H%M%S", &ts); +#else + sscanf(arg, "%4d%2d%2d%2d%2d%2d", &ts.tm_year, &ts.tm_mon, + &ts.tm_mday, &ts.tm_hour, &ts.tm_min, &ts.tm_sec); + ts.tm_year -= 1900; + ts.tm_mon -= 1; + if (ts.tm_year < 0 || ts.tm_mon < 0 || ts.tm_mon > 11 || + ts.tm_mday < 0 || ts.tm_mday > 31 || ts.tm_hour > 23 || + ts.tm_min > 59 || ts.tm_sec > 61) + ts.tm_mday = 0; +#endif + if (ts.tm_mday == 0) { + /* Try it as an integer... */ + + ret = strtoul(arg, &tmp, 0); + if (*tmp) + return ((time_t) -1); + } + return mktime(&ts); +} + +/* * This function will convert a string to an unsigned long, printing * an error message if it fails, and returning success or failure in err. */ |