diff --git a/tc/m_ematch.c b/tc/m_ematch.c index 7dbc2e75..61f8fb3f 100644 --- a/tc/m_ematch.c +++ b/tc/m_ematch.c @@ -169,6 +169,31 @@ static struct ematch_util *get_ematch_kind_num(__u16 kind) return get_ematch_kind(name); } +static int em_parse_call(struct nlmsghdr *n, struct tcf_ematch_hdr *hdr, + struct ematch_util *e, struct ematch *t) +{ + if (e->parse_eopt_argv) { + int argc = 0, i = 0, ret; + struct bstr *args; + char **argv; + + for (args = t->args; args; args = bstr_next(args)) + argc++; + argv = calloc(argc, sizeof(char *)); + if (!argv) + return -1; + for (args = t->args; args; args = bstr_next(args)) + argv[i++] = args->data; + + ret = e->parse_eopt_argv(n, hdr, argc, argv); + + free(argv); + return ret; + } + + return e->parse_eopt(n, hdr, t->args->next); +} + static int parse_tree(struct nlmsghdr *n, struct ematch *tree) { int index = 1; @@ -212,7 +237,7 @@ static int parse_tree(struct nlmsghdr *n, struct ematch *tree) } hdr.kind = num; - if (e->parse_eopt(n, &hdr, t->args->next) < 0) + if (em_parse_call(n, &hdr, e, t) < 0) return -1; } diff --git a/tc/m_ematch.h b/tc/m_ematch.h index fa6e214a..f634f191 100644 --- a/tc/m_ematch.h +++ b/tc/m_ematch.h @@ -88,6 +88,8 @@ struct ematch_util int kind_num; int (*parse_eopt)(struct nlmsghdr *,struct tcf_ematch_hdr *, struct bstr *); + int (*parse_eopt_argv)(struct nlmsghdr *, struct tcf_ematch_hdr *, + int, char **); int (*print_eopt)(FILE *, struct tcf_ematch_hdr *, void *, int); void (*print_usage)(FILE *); struct ematch_util *next;