From 42a3d9b7746e5a3bab0ca4532069078c43083b2c Mon Sep 17 00:00:00 2001 From: Wang Shilong Date: Fri, 21 Feb 2014 14:07:05 +0800 Subject: Btrfs-progs: new helper to parse string to u64 for btrfs There are many places that need parse string to u64 for btrfs commands, in fact, we do such things *too casually*, using atoi/atol/atoll..is not right at all, and even we don't check whether it is a valid string. Let's do everything more gracefully, we introduce a new helper arg_strtou64() which will do all the necessary checks.If we fail to parse string to u64, we will output message and exit directly, this is something like what usage() is doing. It is ok to not return erro to it's caller, because this function should be called when parsing arg (just like usage!) Signed-off-by: Wang Shilong Reviewed-by: Eric Sandeen Signed-off-by: David Sterba Signed-off-by: Chris Mason --- utils.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'utils.c') diff --git a/utils.c b/utils.c index 8006e49b..9a921f0c 100644 --- a/utils.c +++ b/utils.c @@ -1517,6 +1517,39 @@ scan_again: return 0; } +/* + * This function should be only used when parsing + * command arg, it won't return error to it's + * caller and rather exit directly just like usage(). + */ +u64 arg_strtou64(const char *str) +{ + u64 value; + char *ptr_parse_end = NULL; + + value = strtoull(str, &ptr_parse_end, 0); + if (ptr_parse_end && *ptr_parse_end != '\0') { + fprintf(stderr, "ERROR: %s is not a valid numeric value.\n", + str); + exit(1); + } + /* + * if we pass a negative number to strtoull, + * it will return an unexpected number to us, + * so let's do the check ourselves. + */ + if (str[0] == '-') { + fprintf(stderr, "ERROR: %s: negative value is invalid.\n", + str); + exit(1); + } + if (value == ULLONG_MAX) { + fprintf(stderr, "ERROR: %s is too large.\n", str); + exit(1); + } + return value; +} + u64 parse_size(char *s) { int i; -- cgit v1.2.3