diff options
Diffstat (limited to 'utils-lib.c')
-rw-r--r-- | utils-lib.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/utils-lib.c b/utils-lib.c new file mode 100644 index 00000000..79ef35e3 --- /dev/null +++ b/utils-lib.c @@ -0,0 +1,40 @@ +#include "kerncompat.h" +#include <unistd.h> +#include <stdlib.h> +#include <limits.h> + +#if BTRFS_FLAT_INCLUDES +#else +#endif /* BTRFS_FLAT_INCLUDES */ + +/* + * This function should be only used when parsing command arg, it won't return + * error to its 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; +} |