]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
libxtables: XTTYPE_DOUBLE support
authorJan Engelhardt <jengelh@medozas.de>
Mon, 2 May 2011 16:09:59 +0000 (18:09 +0200)
committerJan Engelhardt <jengelh@medozas.de>
Sun, 8 May 2011 22:18:23 +0000 (00:18 +0200)
Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
include/xtables.h.in
xtoptions.c

index da8d84c9950ca26e67522e81fa23733e69be71bc..47f797bdc3f24f2d2d1373fe79133f0d534da127 100644 (file)
@@ -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;
index 1cfc8440cf42ba02e915f3381478a3ea69579e88..86498a978f350858ba0fb4158ef327073bc8e5f4 100644 (file)
@@ -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),