tools: Disable getopt unknown option display in iptables_test
[framework/connectivity/connman.git] / tools / iptables-test.c
index 9ccee9d..fb8cefe 100644 (file)
@@ -533,15 +533,15 @@ err_head:
 
 static struct ipt_entry *new_rule(struct ipt_ip *ip,
                        char *target_name, struct xtables_target *xt_t,
-                       char *match_name, struct xtables_match *xt_m)
+                       struct xtables_rule_match *xt_rm)
 {
+       struct xtables_rule_match *tmp_xt_rm;
        struct ipt_entry *new_entry;
        size_t match_size, target_size;
 
-       if (xt_m)
-               match_size = xt_m->m->u.match_size;
-       else
-               match_size = 0;
+       match_size = 0;
+       for (tmp_xt_rm = xt_rm; tmp_xt_rm != NULL; tmp_xt_rm = tmp_xt_rm->next)
+               match_size += tmp_xt_rm->match->m->u.match_size;
 
        if (xt_t)
                target_size = ALIGN(xt_t->t->u.target_size);
@@ -558,11 +558,13 @@ static struct ipt_entry *new_rule(struct ipt_ip *ip,
        new_entry->target_offset = sizeof(struct ipt_entry) + match_size;
        new_entry->next_offset = sizeof(struct ipt_entry) + target_size +
                                                                match_size;
-       if (xt_m) {
-               struct xt_entry_match *entry_match;
 
-               entry_match = (struct xt_entry_match *)new_entry->elems;
-               memcpy(entry_match, xt_m->m, match_size);
+       match_size = 0;
+       for (tmp_xt_rm = xt_rm; tmp_xt_rm != NULL;
+                               tmp_xt_rm = tmp_xt_rm->next) {
+               memcpy(new_entry->elems + match_size, tmp_xt_rm->match->m,
+                                       tmp_xt_rm->match->m->u.match_size);
+               match_size += tmp_xt_rm->match->m->u.match_size;
        }
 
        if (xt_t) {
@@ -608,8 +610,7 @@ static void update_hooks(struct connman_iptables *table, GList *chain_head,
 static struct ipt_entry *prepare_rule_inclusion(struct connman_iptables *table,
                                struct ipt_ip *ip, char *chain_name,
                                char *target_name, struct xtables_target *xt_t,
-                               char *match_name, struct xtables_match *xt_m,
-                               int *builtin)
+                               int *builtin, struct xtables_rule_match *xt_rm)
 {
        GList *chain_tail, *chain_head;
        struct ipt_entry *new_entry;
@@ -623,7 +624,7 @@ static struct ipt_entry *prepare_rule_inclusion(struct connman_iptables *table,
        if (chain_tail == NULL)
                return NULL;
 
-       new_entry = new_rule(ip, target_name, xt_t, match_name, xt_m);
+       new_entry = new_rule(ip, target_name, xt_t, xt_rm);
        if (new_entry == NULL)
                return NULL;
 
@@ -648,7 +649,7 @@ static struct ipt_entry *prepare_rule_inclusion(struct connman_iptables *table,
 static int connman_iptables_append_rule(struct connman_iptables *table,
                                struct ipt_ip *ip, char *chain_name,
                                char *target_name, struct xtables_target *xt_t,
-                               char *match_name, struct xtables_match *xt_m)
+                               struct xtables_rule_match *xt_rm)
 {
        GList *chain_tail;
        struct ipt_entry *new_entry;
@@ -659,7 +660,7 @@ static int connman_iptables_append_rule(struct connman_iptables *table,
                return -EINVAL;
 
        new_entry = prepare_rule_inclusion(table, ip, chain_name,
-                       target_name, xt_t, match_name, xt_m, &builtin);
+                                       target_name, xt_t, &builtin, xt_rm);
        if (new_entry == NULL)
                return -EINVAL;
 
@@ -673,7 +674,7 @@ static int connman_iptables_append_rule(struct connman_iptables *table,
 static int connman_iptables_insert_rule(struct connman_iptables *table,
                                struct ipt_ip *ip, char *chain_name,
                                char *target_name, struct xtables_target *xt_t,
-                               char *match_name, struct xtables_match *xt_m)
+                               struct xtables_rule_match *xt_rm)
 {
        GList *chain_head;
        struct ipt_entry *new_entry;
@@ -684,7 +685,7 @@ static int connman_iptables_insert_rule(struct connman_iptables *table,
                return -EINVAL;
 
        new_entry = prepare_rule_inclusion(table, ip, chain_name,
-                       target_name, xt_t, match_name, xt_m, &builtin);
+                                       target_name, xt_t, &builtin, xt_rm);
        if (new_entry == NULL)
                return -EINVAL;
 
@@ -757,7 +758,8 @@ static gboolean is_same_match(struct xt_entry_match *xt_e_m1,
 static int connman_iptables_delete_rule(struct connman_iptables *table,
                                struct ipt_ip *ip, char *chain_name,
                                char *target_name, struct xtables_target *xt_t,
-                               char *match_name, struct xtables_match *xt_m)
+                               struct xtables_match *xt_m,
+                               struct xtables_rule_match *xt_rm)
 {
        GList *chain_tail, *chain_head, *list;
        struct xt_entry_target *xt_e_t = NULL;
@@ -779,7 +781,7 @@ static int connman_iptables_delete_rule(struct connman_iptables *table,
        if (!xt_t && !xt_m)
                return -EINVAL;
 
-       entry_test = new_rule(ip, target_name, xt_t, match_name, xt_m);
+       entry_test = new_rule(ip, target_name, xt_t, xt_rm);
        if (entry_test == NULL)
                return -EINVAL;
 
@@ -1375,8 +1377,8 @@ done:
 int main(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;
@@ -1400,6 +1402,9 @@ int main(int argc, char *argv[])
        xt_m = NULL;
        xt_t = NULL;
 
+       /* extension's options will generate false-positives errors */
+       opterr = 0;
+
        while ((c = getopt_long(argc, argv, "-A:D:F:I:L::N:X:d:i:j:m:o:s:t:",
                                connman_iptables_globals.opts, NULL)) != -1) {
                switch (c) {
@@ -1540,12 +1545,38 @@ int main(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;
                }
        }
 
+       for (tmp_xt_rm = xt_rm; tmp_xt_rm != NULL;
+                               tmp_xt_rm = tmp_xt_rm->next)
+               xtables_option_mfcall(tmp_xt_rm->match);
+
        if (xt_t != NULL)
                xtables_option_tfcall(xt_t);
 
@@ -1598,7 +1629,7 @@ int main(int argc, char *argv[])
                                        chain, match_name);
 
                        connman_iptables_delete_rule(table, &ip, chain,
-                                       target_name, xt_t, match_name, xt_m);
+                                       target_name, xt_t, xt_m, xt_rm);
 
                        goto commit;
                }
@@ -1608,13 +1639,13 @@ int main(int argc, char *argv[])
                                        chain, match_name);
 
                        connman_iptables_insert_rule(table, &ip, chain,
-                                       target_name, xt_t, match_name, xt_m);
+                                               target_name, xt_t, xt_rm);
                } else {
                        printf("Appending %s to %s (match %s)\n", target_name,
                                        chain, match_name);
 
                        connman_iptables_append_rule(table, &ip, chain,
-                               target_name, xt_t, match_name, xt_m);
+                                               target_name, xt_t, xt_rm);
                }
        }