tools: Refactor iptables_test matches preparation
authorTomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Thu, 27 Oct 2011 07:24:47 +0000 (10:24 +0300)
committerSamuel Ortiz <sameo@linux.intel.com>
Fri, 28 Oct 2011 19:26:12 +0000 (21:26 +0200)
tools/iptables-test.c

index 5ee1ec3..2c5c670 100644 (file)
@@ -1306,6 +1306,48 @@ static struct xtables_target *prepare_target(struct connman_iptables *table,
        return xt_t;
 }
 
+static struct xtables_match *prepare_matches(struct connman_iptables *table,
+                                                       char *match_name)
+{
+       struct xtables_match *xt_m;
+       size_t match_size;
+
+       if (match_name == NULL)
+               return NULL;
+
+       xt_m = xtables_find_match(match_name, XTF_LOAD_MUST_SUCCEED, NULL);
+       match_size = ALIGN(sizeof(struct ipt_entry_match)) + xt_m->size;
+
+       xt_m->m = g_try_malloc0(match_size);
+       if (xt_m->m == NULL)
+               return NULL;
+
+       xt_m->m->u.match_size = match_size;
+       strcpy(xt_m->m->u.user.name, xt_m->name);
+       xt_m->m->u.user.revision = xt_m->revision;
+
+       if (xt_m->init != NULL)
+               xt_m->init(xt_m->m);
+
+       if (xt_m != xt_m->next) {
+               connman_iptables_globals.opts =
+                       xtables_merge_options(
+#if XTABLES_VERSION_CODE > 5
+                               connman_iptables_globals.orig_opts,
+#endif
+                               connman_iptables_globals.opts,
+                               xt_m->extra_opts,
+                               &xt_m->option_offset);
+
+               if (connman_iptables_globals.opts == NULL) {
+                       g_free(xt_m->m);
+                       xt_m = NULL;
+               }
+       }
+
+       return xt_m;
+}
+
 int main(int argc, char *argv[])
 {
        struct connman_iptables *table;
@@ -1315,7 +1357,6 @@ int main(int argc, char *argv[])
        char *table_name, *chain, *new_chain, *match_name, *target_name;
        char *delete_chain, *flush_chain;
        int c, in_len, out_len;
-       size_t size;
        gboolean dump, invert, delete, insert, delete_rule;
        struct in_addr src, dst;
 
@@ -1411,30 +1452,6 @@ int main(int argc, char *argv[])
 
                case 'm':
                        match_name = optarg;
-
-                       xt_m = xtables_find_match(optarg, XTF_LOAD_MUST_SUCCEED, NULL);
-                       size = ALIGN(sizeof(struct ipt_entry_match)) + xt_m->size;
-                       xt_m->m = g_try_malloc0(size);
-                       if (xt_m == NULL)
-                               goto out;
-                       xt_m->m->u.match_size = size;
-                       strcpy(xt_m->m->u.user.name, xt_m->name);
-                       xt_m->m->u.user.revision = xt_m->revision;
-                       if (xt_m->init != NULL)
-                               xt_m->init(xt_m->m);
-                       if (xt_m != xt_m->next) {
-                               connman_iptables_globals.opts =
-                                       xtables_merge_options(
-#if XTABLES_VERSION_CODE > 5
-                                               connman_iptables_globals.orig_opts,
-#endif
-                                               connman_iptables_globals.opts,
-                                               xt_m->extra_opts,
-                                               &xt_m->option_offset);
-                               if (connman_iptables_globals.opts == NULL)
-                                       goto out;
-                       }
-
                        break;
 
                case 'o':
@@ -1544,6 +1561,12 @@ int main(int argc, char *argv[])
                if (xt_t == NULL)
                        goto out;
 
+               if (match_name != NULL) {
+                       xt_m = prepare_matches(table, match_name);
+                       if (xt_m == NULL)
+                               goto out;
+               }
+
                if (delete_rule == TRUE) {
                        printf("Deleting %s to %s (match %s)\n", target_name,
                                        chain, match_name);