]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
libxtables: XTTYPE_UINT16RC support
authorJan Engelhardt <jengelh@medozas.de>
Sun, 6 Mar 2011 15:59:23 +0000 (16:59 +0100)
committerJan Engelhardt <jengelh@medozas.de>
Wed, 13 Apr 2011 16:09:26 +0000 (18:09 +0200)
Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
include/xtables.h.in
xtoptions.c

index 30d9e73b10f613d7839cbc4644b3b167ee25d0d4..ae76bb6be8b4513e3d2347da13691c9aac6cc6e9 100644 (file)
@@ -57,6 +57,7 @@ enum xt_option_type {
        XTTYPE_UINT8,
        XTTYPE_UINT32,
        XTTYPE_UINT64,
+       XTTYPE_UINT16RC,
        XTTYPE_UINT32RC,
        XTTYPE_STRING,
        XTTYPE_MARKMASK32,
@@ -115,6 +116,7 @@ struct xt_option_call {
        uint8_t nvals;
        union {
                uint8_t u8;
+               uint16_t u16_range[2];
                uint32_t u32, u32_range[2];
                uint64_t u64;
                struct {
index f48c011c86b4120f1a22859d74e423ab1324444d..ca5bffaba2224980c06ce290a3bd87e683983b89 100644 (file)
@@ -133,15 +133,18 @@ static void xtopt_parse_mint(struct xt_option_call *cb)
 {
        const struct xt_option_entry *entry = cb->entry;
        const char *arg = cb->arg;
-       uint32_t *put = XTOPT_MKPTR(cb);
+       size_t esize = sizeof(uint32_t);
+       char *put = XTOPT_MKPTR(cb);
        unsigned int maxiter, value;
        char *end = "";
        char sep = ':';
 
-       maxiter = entry->size / sizeof(uint32_t);
+       if (entry->type == XTTYPE_UINT16RC)
+               esize = sizeof(uint16_t);
+       maxiter = entry->size / esize;
        if (maxiter == 0)
                maxiter = 2; /* ARRAY_SIZE(cb->val.uXX_range) */
-       if (entry->size % sizeof(uint32_t) != 0)
+       if (entry->size % esize != 0)
                xt_params->exit_err(OTHER_PROBLEM, "%s: memory block does "
                        "not have proper size\n", __func__);
 
@@ -161,10 +164,19 @@ static void xtopt_parse_mint(struct xt_option_call *cb)
                                "%s: Argument to \"--%s\" has unexpected "
                                "characters.\n", cb->ext_name, entry->name);
                ++cb->nvals;
-               if (cb->nvals < ARRAY_SIZE(cb->val.u32_range))
-                       cb->val.u32_range[cb->nvals] = value;
-               if (entry->flags & XTOPT_PUT)
-                       *put++ = value;
+               if (cb->nvals < ARRAY_SIZE(cb->val.u32_range)) {
+                       if (entry->type == XTTYPE_UINT16RC)
+                               cb->val.u16_range[cb->nvals] = value;
+                       else if (entry->type == XTTYPE_UINT32RC)
+                               cb->val.u32_range[cb->nvals] = value;
+               }
+               if (entry->flags & XTOPT_PUT) {
+                       if (entry->type == XTTYPE_UINT16RC)
+                               *(uint16_t *)put = value;
+                       else if (entry->type == XTTYPE_UINT32RC)
+                               *(uint32_t *)put = value;
+                       put += esize;
+               }
                if (*end == '\0')
                        break;
        }
@@ -225,6 +237,7 @@ static void (*const xtopt_subparse[])(struct xt_option_call *) = {
        [XTTYPE_UINT8]       = xtopt_parse_int,
        [XTTYPE_UINT32]      = xtopt_parse_int,
        [XTTYPE_UINT64]      = xtopt_parse_int,
+       [XTTYPE_UINT16RC]    = xtopt_parse_mint,
        [XTTYPE_UINT32RC]    = xtopt_parse_mint,
        [XTTYPE_STRING]      = xtopt_parse_string,
        [XTTYPE_MARKMASK32]  = xtopt_parse_markmask,
@@ -234,6 +247,7 @@ static const size_t xtopt_psize[] = {
        [XTTYPE_UINT8]       = sizeof(uint8_t),
        [XTTYPE_UINT32]      = sizeof(uint32_t),
        [XTTYPE_UINT64]      = sizeof(uint64_t),
+       [XTTYPE_UINT16RC]    = sizeof(uint16_t[2]),
        [XTTYPE_UINT32RC]    = sizeof(uint32_t[2]),
        [XTTYPE_STRING]      = -1,
 };