From 564eaf48e14411803a353206eefbb89d525c63ff Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Sun, 6 Mar 2011 16:59:23 +0100 Subject: libxtables: XTTYPE_UINT16RC support Signed-off-by: Jan Engelhardt --- include/xtables.h.in | 2 ++ xtoptions.c | 28 +++++++++++++++++++++------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/include/xtables.h.in b/include/xtables.h.in index 30d9e73b..ae76bb6b 100644 --- a/include/xtables.h.in +++ b/include/xtables.h.in @@ -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 { diff --git a/xtoptions.c b/xtoptions.c index f48c011c..ca5bffab 100644 --- a/xtoptions.c +++ b/xtoptions.c @@ -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, }; -- cgit v1.2.3