diff options
author | David Sterba <dsterba@suse.cz> | 2014-04-11 13:22:50 +0200 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2014-05-02 17:04:28 +0200 |
commit | aa46922c09159d8315a35b81cacf30dcfb9243a5 (patch) | |
tree | 0358e828aa52ec0681dc012a05a0791388c99293 /utils-lib.c | |
parent | ff58a897eaf7100d85179ce0d976897554455c36 (diff) |
btrfs-progs: move arg_strtou64 to a separate file for library
Linking with libbtrfs fails because arg_strtou64 is not defined and we
cannot just add utils.o to library objects because it's not
library-clean.
Reported-by: Arvin Schnell <aschnell@suse.com>
Reported-by: Anton Farygin <rider@altlinux.org>
Signed-off-by: David Sterba <dsterba@suse.cz>
Diffstat (limited to 'utils-lib.c')
-rw-r--r-- | utils-lib.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/utils-lib.c b/utils-lib.c new file mode 100644 index 00000000..9d53c6e5 --- /dev/null +++ b/utils-lib.c @@ -0,0 +1,42 @@ +#define _GNU_SOURCE + +#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; +} |