From: Theodore Ts'o Date: Tue, 15 Jan 2013 00:01:25 +0000 (-0500) Subject: libe2p: teach parse_num_blocks2() to return bytes if log_block_size < 0 X-Git-Tag: v1.42.7~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=35d886b67947dcb802da09306b6a85f1e9f99865;p=thirdparty%2Fe2fsprogs.git 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" Reviewed-by: Zheng Liu --- diff --git a/lib/e2p/parse_num.c b/lib/e2p/parse_num.c index d9ad3e74c..cb0dc5b42 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);