iptables: Add extensions options parsing for matches
authorTomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Thu, 27 Oct 2011 07:26:39 +0000 (10:26 +0300)
committerSamuel Ortiz <sameo@linux.intel.com>
Fri, 28 Oct 2011 19:34:28 +0000 (21:34 +0200)
src/iptables.c

index d64a151..1668df7 100644 (file)
@@ -1385,8 +1385,8 @@ done:
 static int iptables_command(int argc, char *argv[])
 {
        struct connman_iptables *table;
-       struct xtables_rule_match *xt_rm;
-       struct xtables_match *xt_m;
+       struct xtables_rule_match *xt_rm, *tmp_xt_rm;
+       struct xtables_match *xt_m, *xt_m_t;
        struct xtables_target *xt_t;
        struct ipt_ip ip;
        char *table_name, *chain, *new_chain, *match_name, *target_name;
@@ -1550,6 +1550,28 @@ static int iptables_command(int argc, char *argv[])
                                        XT_OPTION_OFFSET_SCALE)) {
                                xtables_option_tpcall(c, argv,
                                                        invert, xt_t, NULL);
+
+                               break;
+                       }
+
+                       for (tmp_xt_rm = xt_rm; tmp_xt_rm != NULL;
+                                               tmp_xt_rm = tmp_xt_rm->next) {
+                               xt_m_t = tmp_xt_rm->match;
+
+                               if (tmp_xt_rm->completed ||
+                                               (xt_m_t->x6_parse == NULL &&
+                                                xt_m_t->parse == NULL))
+                                       continue;
+
+                               if (c < (int) xt_m_t->option_offset ||
+                                       c >= (int) xt_m_t->option_offset
+                                       + XT_OPTION_OFFSET_SCALE)
+                                       continue;
+
+                               xtables_option_mpcall(c, argv,
+                                                       invert, xt_m_t, NULL);
+
+                               break;
                        }
 
                        break;