summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ethtool.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/ethtool.c b/ethtool.c
index 4b750a4..10ff1f1 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -324,6 +324,7 @@ typedef enum {
CMDL_NONE,
CMDL_BOOL,
CMDL_INT,
+ CMDL_UINT,
CMDL_STR,
} cmdline_type_t;
@@ -404,18 +405,32 @@ static struct cmdline_info cmdline_coalesce[] = {
static int get_int(char *str, int base)
{
- unsigned long v;
+ long v;
char *endp;
if (!str)
show_usage(1);
errno = 0;
- v = strtoul(str, &endp, base);
+ v = strtol(str, &endp, base);
if ( errno || *endp || v > INT_MAX)
show_usage(1);
return (int)v;
}
+static int get_uint(char *str, int base)
+{
+ unsigned long v;
+ char *endp;
+
+ if (!str)
+ show_usage(1);
+ errno = 0;
+ v = strtoul(str, &endp, base);
+ if ( errno || *endp || v > UINT_MAX)
+ show_usage(1);
+ return v;
+}
+
static void parse_generic_cmdline(int argc, char **argp,
int first_arg, int *changed,
struct cmdline_info *info,
@@ -447,6 +462,10 @@ static void parse_generic_cmdline(int argc, char **argp,
*p = get_int(argp[i],0);
break;
}
+ case CMDL_UINT: {
+ *p = get_uint(argp[i],0);
+ break;
+ }
case CMDL_STR: {
char **s = info[idx].wanted_val;
*s = strdup(argp[i]);