From f012b3c9190cd95ac170072f759a97575613ea07 Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Mon, 2 May 2011 18:09:59 +0200 Subject: libxtables: XTTYPE_DOUBLE support Signed-off-by: Jan Engelhardt --- include/xtables.h.in | 3 +++ xtoptions.c | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/include/xtables.h.in b/include/xtables.h.in index da8d84c9..47f797bd 100644 --- a/include/xtables.h.in +++ b/include/xtables.h.in @@ -49,6 +49,7 @@ struct in_addr; * %XTTYPE_NONE: option takes no argument * %XTTYPE_UINT*: standard integer * %XTTYPE_UINT*RC: colon-separated range of standard integers + * %XTTYPE_DOUBLE: double-precision floating point number * %XTTYPE_STRING: arbitrary string * %XTTYPE_TOSMASK: 8-bit TOS value with optional mask * %XTTYPE_MARKMASK32: 32-bit mark with optional mask @@ -69,6 +70,7 @@ enum xt_option_type { XTTYPE_UINT16RC, XTTYPE_UINT32RC, XTTYPE_UINT64RC, + XTTYPE_DOUBLE, XTTYPE_STRING, XTTYPE_TOSMASK, XTTYPE_MARKMASK32, @@ -136,6 +138,7 @@ struct xt_option_call { uint16_t u16, u16_range[2], port, port_range[2]; uint32_t u32, u32_range[2]; uint64_t u64, u64_range[2]; + double dbl; union nf_inet_addr inetaddr; struct { uint8_t tos_value, tos_mask; diff --git a/xtoptions.c b/xtoptions.c index 1cfc8440..86498a97 100644 --- a/xtoptions.c +++ b/xtoptions.c @@ -143,6 +143,29 @@ static void xtopt_parse_int(struct xt_option_call *cb) } } +/** + * Require a simple floating point number. + */ +static void xtopt_parse_float(struct xt_option_call *cb) +{ + const struct xt_option_entry *entry = cb->entry; + double value; + char *end; + + value = strtod(cb->arg, &end); + if (end == cb->arg || *end != '\0' || + (entry->min != entry->max && + (value < entry->min || value > entry->max))) + xt_params->exit_err(PARAMETER_PROBLEM, + "%s: bad value for option \"--%s\", " + "or out of range (%u-%u).\n", + cb->ext_name, entry->name, entry->min, entry->max); + + cb->val.dbl = value; + if (entry->flags & XTOPT_PUT) + *(double *)XTOPT_MKPTR(cb) = cb->val.dbl; +} + /** * Multiple integer parse routine. * @@ -547,6 +570,7 @@ static void (*const xtopt_subparse[])(struct xt_option_call *) = { [XTTYPE_UINT16RC] = xtopt_parse_mint, [XTTYPE_UINT32RC] = xtopt_parse_mint, [XTTYPE_UINT64RC] = xtopt_parse_mint, + [XTTYPE_DOUBLE] = xtopt_parse_float, [XTTYPE_STRING] = xtopt_parse_string, [XTTYPE_TOSMASK] = xtopt_parse_tosmask, [XTTYPE_MARKMASK32] = xtopt_parse_markmask, @@ -567,6 +591,7 @@ static const size_t xtopt_psize[] = { [XTTYPE_UINT16RC] = sizeof(uint16_t[2]), [XTTYPE_UINT32RC] = sizeof(uint32_t[2]), [XTTYPE_UINT64RC] = sizeof(uint64_t[2]), + [XTTYPE_DOUBLE] = sizeof(double), [XTTYPE_STRING] = -1, [XTTYPE_SYSLOGLEVEL] = sizeof(uint8_t), [XTTYPE_ONEHOST] = sizeof(union nf_inet_addr), -- cgit v1.2.3