diff options
Diffstat (limited to 'debugfs/util.c')
-rw-r--r-- | debugfs/util.c | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/debugfs/util.c b/debugfs/util.c index f43b4704..9ddfe0ba 100644 --- a/debugfs/util.c +++ b/debugfs/util.c @@ -201,7 +201,7 @@ char *time_to_string(__u32 cl) tz = ss_safe_getenv("TZ"); if (!tz) tz = ""; - do_gmt = !strcmp(tz, "GMT"); + do_gmt = !strcmp(tz, "GMT") | !strcmp(tz, "GMT0"); } return asctime((do_gmt) ? gmtime(&t) : localtime(&t)); @@ -211,7 +211,7 @@ 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) +time_t string_to_time(const char *arg) { struct tm ts; time_t ret; @@ -220,9 +220,20 @@ extern time_t string_to_time(const char *arg) if (strcmp(arg, "now") == 0) { return time(0); } + if (arg[0] == '@') { + /* interpret it as an integer */ + arg++; + fallback: + ret = strtoul(arg, &tmp, 0); + if (*tmp) + return ((time_t) -1); + return ret; + } memset(&ts, 0, sizeof(ts)); #ifdef HAVE_STRPTIME - strptime(arg, "%Y%m%d%H%M%S", &ts); + tmp = strptime(arg, "%Y%m%d%H%M%S", &ts); + if (tmp == NULL) + goto fallback; #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); @@ -234,13 +245,9 @@ extern time_t string_to_time(const char *arg) ts.tm_mday = 0; #endif ts.tm_isdst = -1; - ret = mktime(&ts); - if (ts.tm_mday == 0 || ret == ((time_t) -1)) { - /* Try it as an integer... */ - ret = strtoul(arg, &tmp, 0); - if (*tmp) - return ((time_t) -1); - } + ret = ts.tm_sec + ts.tm_min*60 + ts.tm_hour*3600 + ts.tm_yday*86400 + + (ts.tm_year-70)*31536000 + ((ts.tm_year-69)/4)*86400 - + ((ts.tm_year-1)/100)*86400 + ((ts.tm_year+299)/400)*86400; return ret; } @@ -294,17 +301,20 @@ unsigned long long parse_ulonglong(const char *str, const char *cmd, /* * This function will convert a string to a block number. It returns - * 0 on success, 1 on failure. + * 0 on success, 1 on failure. On failure, it outputs either an optionally + * specified error message or a default. */ -int strtoblk(const char *cmd, const char *str, blk64_t *ret) +int strtoblk(const char *cmd, const char *str, const char *errmsg, + blk64_t *ret) { - blk_t blk; + blk64_t blk; int err; - blk = parse_ulonglong(str, cmd, "block number", &err); + if (errmsg == NULL) + blk = parse_ulonglong(str, cmd, "block number", &err); + else + blk = parse_ulonglong(str, cmd, errmsg, &err); *ret = blk; - if (err) - com_err(cmd, 0, "Invalid block number: %s", str); return err; } @@ -362,7 +372,7 @@ int common_block_args_process(int argc, char *argv[], "<block> [count]", CHECK_FS_BITMAPS)) return 1; - if (strtoblk(argv[0], argv[1], block)) + if (strtoblk(argv[0], argv[1], NULL, block)) return 1; if (*block == 0) { com_err(argv[0], 0, "Invalid block number 0"); @@ -370,7 +380,7 @@ int common_block_args_process(int argc, char *argv[], } if (argc > 2) { - *count = parse_ulong(argv[2], argv[0], "count", &err); + err = strtoblk(argv[0], argv[2], "count", count); if (err) return 1; } |