aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2013-01-14 19:01:25 -0500
committerTheodore Ts'o <tytso@mit.edu>2013-01-15 14:06:32 -0500
commit35d886b67947dcb802da09306b6a85f1e9f99865 (patch)
tree0b7813eb3f62240674bef131a0046c7ec0e76ac9
parent2a3b1c6ea29db5d5dfe4602d0b0adfda88068de6 (diff)
downloade2fsprogs-35d886b67947dcb802da09306b6a85f1e9f99865.tar.gz
e2fsprogs-35d886b67947dcb802da09306b6a85f1e9f99865.tar.xz
e2fsprogs-35d886b67947dcb802da09306b6a85f1e9f99865.zip
libe2p: teach parse_num_blocks2() to return bytes if log_block_size < 0
Previously the behavior of parse_num_block2 was undefined if log_block_size was less than zero. It will now return a number in units of bytes. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> Reviewed-by: Zheng Liu <wenqing.lz@taobao.com>
-rw-r--r--lib/e2p/parse_num.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/lib/e2p/parse_num.c b/lib/e2p/parse_num.c
index d9ad3e74..cb0dc5b4 100644
--- a/lib/e2p/parse_num.c
+++ b/lib/e2p/parse_num.c
@@ -35,10 +35,16 @@ unsigned long long parse_num_blocks2(const char *arg, int log_block_size)
num <<= 10;
/* fallthrough */
case 'K': case 'k':
- num >>= log_block_size;
+ if (log_block_size < 0)
+ num <<= 10;
+ else
+ num >>= log_block_size;
break;
case 's':
- num >>= (1+log_block_size);
+ if (log_block_size < 0)
+ num << 1;
+ else
+ num >>= (1+log_block_size);
break;
case '\0':
break;
@@ -62,11 +68,21 @@ main(int argc, char **argv)
unsigned long num;
int log_block_size = 0;
- if (argc != 2) {
- fprintf(stderr, "Usage: %s arg\n", argv[0]);
+ if (argc != 2 && argc != 3) {
+ fprintf(stderr, "Usage: %s arg [log_block_size]\n", argv[0]);
exit(1);
}
+ if (argc == 3) {
+ char *p;
+
+ log_block_size = strtol(argv[2], &p, 0);
+ if (*p) {
+ fprintf(stderr, "Bad log_block_size: %s\n", argv[2]);
+ exit(1);
+ }
+ }
+
num = parse_num_blocks(argv[1], log_block_size);
printf("Parsed number: %lu\n", num);