summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgandalf <gandalf>2004-05-26 15:54:49 +0000
committergandalf <gandalf>2004-05-26 15:54:49 +0000
commit44f3f9a4ea6c8c7c2caa8c8b883a93cc8210d43b (patch)
treea3a34c099e170849facffa83f4c08561619fb7a7
parenta32c699b6ea3a6d44406062e4b076071461ed2f2 (diff)
Add versions of string_to_number() for use in 32bit userspace with 64bit kernel.
-rw-r--r--include/iptables_common.h8
-rw-r--r--ip6tables.c35
-rw-r--r--iptables.c35
3 files changed, 68 insertions, 10 deletions
diff --git a/include/iptables_common.h b/include/iptables_common.h
index 25f23c3..ca65594 100644
--- a/include/iptables_common.h
+++ b/include/iptables_common.h
@@ -14,6 +14,14 @@ extern int string_to_number(const char *,
unsigned int,
unsigned int,
unsigned int *);
+extern int string_to_number_l(const char *,
+ unsigned long int,
+ unsigned long int,
+ unsigned long *);
+extern int string_to_number_ll(const char *,
+ unsigned long long int,
+ unsigned long long int,
+ unsigned long long *);
extern int iptables_insmod(const char *modname, const char *modprobe);
void exit_error(enum exittype, char *, ...)__attribute__((noreturn,
format(printf,2,3)));
diff --git a/ip6tables.c b/ip6tables.c
index ee42c08..714632d 100644
--- a/ip6tables.c
+++ b/ip6tables.c
@@ -900,18 +900,18 @@ parse_target(const char *targetname)
}
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)
diff --git a/iptables.c b/iptables.c
index 648f988..fab4643 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)