diff --git a/include/utils.h b/include/utils.h index 47f8e07d..496db68e 100644 --- a/include/utils.h +++ b/include/utils.h @@ -85,6 +85,7 @@ extern int get_time_rtt(unsigned *val, const char *arg, int *raw); #define get_short get_s16 extern int get_u64(__u64 *val, const char *arg, int base); extern int get_u32(__u32 *val, const char *arg, int base); +extern int get_s32(__s32 *val, const char *arg, int base); extern int get_u16(__u16 *val, const char *arg, int base); extern int get_s16(__s16 *val, const char *arg, int base); extern int get_u8(__u8 *val, const char *arg, int base); diff --git a/lib/utils.c b/lib/utils.c index efaf377e..d80f79b4 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "utils.h" @@ -198,6 +199,24 @@ int get_u8(__u8 *val, const char *arg, int base) return 0; } +int get_s32(__s32 *val, const char *arg, int base) +{ + long res; + char *ptr; + + errno = 0; + + if (!arg || !*arg) + return -1; + res = strtol(arg, &ptr, base); + if (ptr == arg || *ptr || + ((res == LONG_MIN || res == LONG_MAX) && errno == ERANGE) || + res > INT32_MAX || res < INT32_MIN) + return -1; + *val = res; + return 0; +} + int get_s16(__s16 *val, const char *arg, int base) { long res;