summaryrefslogtreecommitdiffstats
path: root/iptables/xshared.c
diff options
context:
space:
mode:
authorPhil Sutter <phil@nwl.cc>2021-11-05 18:02:13 +0100
committerPhil Sutter <phil@nwl.cc>2021-11-23 15:01:23 +0100
commit766e4872e10bccc12fa37dcf5380d3c99fcf1d75 (patch)
tree75592710c2f9acb76903a187dbeebb6d3ce56797 /iptables/xshared.c
parentb5881e7f22d42a8b00acbdbab296b71572ddb903 (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.c25
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;