From: Vinicius Costa Gomes Date: Fri, 5 Oct 2018 23:25:17 +0000 (-0700) Subject: utils: Implement get_s64() X-Git-Tag: v4.20.0~98^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a066bac8a2775bc43d54ae7173057f75f543c44b;p=thirdparty%2Fiproute2.git utils: Implement get_s64() Add this helper to read signed 64-bit integers from a string. Signed-off-by: Vinicius Costa Gomes Signed-off-by: David Ahern --- diff --git a/include/utils.h b/include/utils.h index eba67b6ec..258d630ec 100644 --- a/include/utils.h +++ b/include/utils.h @@ -144,6 +144,7 @@ int get_time_rtt(unsigned *val, const char *arg, int *raw); #define get_byte get_u8 #define get_ushort get_u16 #define get_short get_s16 +int get_s64(__s64 *val, const char *arg, int base); int get_u64(__u64 *val, const char *arg, int base); int get_u32(__u32 *val, const char *arg, int base); int get_s32(__s32 *val, const char *arg, int base); diff --git a/lib/utils.c b/lib/utils.c index 406ab8bd9..cd1e0a987 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -383,6 +383,27 @@ int get_u8(__u8 *val, const char *arg, int base) return 0; } +int get_s64(__s64 *val, const char *arg, int base) +{ + long res; + char *ptr; + + errno = 0; + + if (!arg || !*arg) + return -1; + res = strtoll(arg, &ptr, base); + if (!ptr || ptr == arg || *ptr) + return -1; + if ((res == LLONG_MIN || res == LLONG_MAX) && errno == ERANGE) + return -1; + if (res > INT64_MAX || res < INT64_MIN) + return -1; + + *val = res; + return 0; +} + int get_s32(__s32 *val, const char *arg, int base) { long res;