diff options
author | Phil Sutter <phil@nwl.cc> | 2021-11-05 18:02:13 +0100 |
---|---|---|
committer | Phil Sutter <phil@nwl.cc> | 2021-11-23 15:01:23 +0100 |
commit | 766e4872e10bccc12fa37dcf5380d3c99fcf1d75 (patch) | |
tree | 75592710c2f9acb76903a187dbeebb6d3ce56797 /iptables/xshared.c | |
parent | b5881e7f22d42a8b00acbdbab296b71572ddb903 (diff) |
xshared: Share print_iface() function
Merge the three identical copies into one and name it 'save_iface' (as
the printed syntax is for "save"-format). Leave arptables alone for now,
its rather complicated whitespace printing doesn't allow for use of the
shared function. Also keep ebtables' custom implementation, it is used
for the --logical-in/--logical-out long-options, too. Apart from that,
ebtables-nft does not use a mask, at all.
Signed-off-by: Phil Sutter <phil@nwl.cc>
Diffstat (limited to 'iptables/xshared.c')
-rw-r--r-- | iptables/xshared.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/iptables/xshared.c b/iptables/xshared.c index bd545d6b..db03aaaa 100644 --- a/iptables/xshared.c +++ b/iptables/xshared.c @@ -637,6 +637,31 @@ void print_ifaces(const char *iniface, const char *outiface, uint8_t invflags, printf(FMT("%-6s ", "out %s "), iface); } +/* This assumes that mask is contiguous, and byte-bounded. */ +void save_iface(char letter, const char *iface, + const unsigned char *mask, int invert) +{ + unsigned int i; + + if (mask[0] == 0) + return; + + printf("%s -%c ", invert ? " !" : "", letter); + + for (i = 0; i < IFNAMSIZ; i++) { + if (mask[i] != 0) { + if (iface[i] != '\0') + printf("%c", iface[i]); + } else { + /* we can access iface[i-1] here, because + * a few lines above we make sure that mask[0] != 0 */ + if (iface[i-1] != '\0') + printf("+"); + break; + } + } +} + void command_match(struct iptables_command_state *cs, bool invert) { struct option *opts = xt_params->opts; |