From b105bc9f4bf61ffa835950c3d4e4b6162e1e16f8 Mon Sep 17 00:00:00 2001 From: Martin Josefsson Date: Wed, 26 May 2004 15:54:49 +0000 Subject: Add versions of string_to_number() for use in 32bit userspace with 64bit kernel. --- iptables.c | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) (limited to 'iptables.c') diff --git a/iptables.c b/iptables.c index 648f988f..fab46430 100644 --- a/iptables.c +++ b/iptables.c @@ -900,18 +900,18 @@ mask_to_dotted(const struct in_addr *mask) } int -string_to_number(const char *s, unsigned int min, unsigned int max, - unsigned int *ret) +string_to_number_ll(const char *s, unsigned long long min, unsigned long long max, + unsigned long long *ret) { - long number; + unsigned long long number; char *end; /* Handle hex, octal, etc. */ errno = 0; - number = strtol(s, &end, 0); + number = strtoull(s, &end, 0); if (*end == '\0' && end != s) { /* we parsed a number, let's see if we want this */ - if (errno != ERANGE && min <= number && number <= max) { + if (errno != ERANGE && min <= number && (!max || number <= max)) { *ret = number; return 0; } @@ -919,6 +919,31 @@ string_to_number(const char *s, unsigned int min, unsigned int max, return -1; } +int +string_to_number_l(const char *s, unsigned long min, unsigned long max, + unsigned long *ret) +{ + int result; + unsigned long long number; + + result = string_to_number_ll(s, min, max, &number); + *ret = (unsigned long)number; + + return result; +} + +int string_to_number(const char *s, unsigned int min, unsigned int max, + unsigned int *ret) +{ + int result; + unsigned long number; + + result = string_to_number_l(s, min, max, &number); + *ret = (unsigned int)number; + + return result; +} + static void set_option(unsigned int *options, unsigned int option, u_int8_t *invflg, int invert) -- cgit v1.2.3