]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
xtables: Derive xtables_globals from family
authorPhil Sutter <phil@nwl.cc>
Mon, 27 Sep 2021 14:59:49 +0000 (16:59 +0200)
committerPhil Sutter <phil@nwl.cc>
Wed, 20 Oct 2021 09:32:54 +0000 (11:32 +0200)
Prepare xtables_main() for use with other families than IPV4 or IPV6
which both use the same xtables_globals object. Therefore introduce a
function to map from family value to xtables_globals object pointer.

In do_parse(), use xt_params pointer as well instead of direct
reference.

While being at it, Declare arptables_globals and ebtables_globals in
xtables_multi.h which seems to be the proper place for that.

Signed-off-by: Phil Sutter <phil@nwl.cc>
iptables/xtables-arp-standalone.c
iptables/xtables-eb-translate.c
iptables/xtables-multi.h
iptables/xtables-standalone.c
iptables/xtables.c

index 04cf7dccc820671cd475ad580dd8c74d5c2b7d2e..82db3f3801c104f6aa93c19cfa16498cee27cfa1 100644 (file)
@@ -41,8 +41,6 @@
 
 #include "xtables-multi.h"
 
-extern struct xtables_globals arptables_globals;
-
 int xtables_arp_main(int argc, char *argv[])
 {
        int ret;
index 0539a829d3ff893cd0b6745552ea43fac7f5ae56..a6c86b6531e3fdcb30938a78906467d1089b27fe 100644 (file)
@@ -87,7 +87,6 @@ static int parse_rule_number(const char *rule)
 /* Default command line options. Do not mess around with the already
  * assigned numbers unless you know what you are doing */
 extern struct option ebt_original_options[];
-extern struct xtables_globals ebtables_globals;
 #define opts ebtables_globals.opts
 #define prog_name ebtables_globals.program_name
 #define prog_vers ebtables_globals.program_version
index 0fedb430e1a28477c699317a7af9f3456e02a1fc..94c24d5a22c7e2351e32a921a9395dca4babbd4e 100644 (file)
@@ -22,6 +22,9 @@ extern int xtables_eb_restore_main(int, char **);
 extern int xtables_eb_save_main(int, char **);
 extern int xtables_config_main(int, char **);
 extern int xtables_monitor_main(int, char **);
+
+extern struct xtables_globals arptables_globals;
+extern struct xtables_globals ebtables_globals;
 #endif
 
 #endif /* _XTABLES_MULTI_H */
index 54c70c5429766ad81f1388d6e39c338e0214598b..19d663b02348c1a3507b17621d2db7768a14ea21 100644 (file)
 #include "xtables-multi.h"
 #include "nft.h"
 
+static struct xtables_globals *xtables_globals_lookup(int family)
+{
+       switch (family) {
+       case AF_INET:
+       case AF_INET6:
+               return &xtables_globals;
+       case NFPROTO_ARP:
+               return &arptables_globals;
+       case NFPROTO_BRIDGE:
+               return &ebtables_globals;
+       default:
+               xtables_error(OTHER_PROBLEM, "Unknown family value %d", family);
+       }
+}
+
 static int
 xtables_main(int family, const char *progname, int argc, char *argv[])
 {
-       int ret;
        char *table = "filter";
        struct nft_handle h;
+       int ret;
 
-       xtables_globals.program_name = progname;
-       ret = xtables_init_all(&xtables_globals, family);
+       ret = xtables_init_all(xtables_globals_lookup(family), family);
        if (ret < 0) {
                fprintf(stderr, "%s: Failed to initialize xtables\n", progname);
                exit(1);
        }
+       xt_params->program_name = progname;
 #if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS)
        init_extensions();
        init_extensions4();
@@ -60,7 +75,7 @@ xtables_main(int family, const char *progname, int argc, char *argv[])
 
        if (nft_init(&h, family) < 0) {
                fprintf(stderr, "%s: Failed to initialize nft: %s\n",
-                       xtables_globals.program_name, strerror(errno));
+                       xt_params->program_name, strerror(errno));
                exit(EXIT_FAILURE);
        }
 
index 2b3cc9301c455ba8480c8220ca713da83ac21e0a..dc67affc19dbec42b666fdbb419bcbccb2cf77a3 100644 (file)
@@ -659,7 +659,7 @@ void do_parse(struct nft_handle *h, int argc, char *argv[],
                        exit_tryhelp(2);
 
                default:
-                       if (command_default(cs, &xtables_globals, invert))
+                       if (command_default(cs, xt_params, invert))
                                /* cf. ip6tables.c */
                                continue;
                        break;