From: Jo-Philipp Wich <jow@openwrt.org>
Date: Tue, 30 Apr 2013 17:56:39 +0000 (+0200)
Subject: Add common fw3_address_to_string() helper function
X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=b6bfb7a067c5699fd5aec28d407d773d3a022567;p=oweals%2Ffirewall3.git

Add common fw3_address_to_string() helper function
---

diff --git a/ipsets.c b/ipsets.c
index 430cf74..7278c50 100644
--- a/ipsets.c
+++ b/ipsets.c
@@ -272,10 +272,8 @@ static void
 create_ipset(struct fw3_ipset *ipset, struct fw3_state *state)
 {
 	bool first = true;
-	char s[INET6_ADDRSTRLEN];
 
 	struct fw3_ipset_datatype *type;
-	struct fw3_address *a;
 
 	const char *methods[] = {
 		"(bug)",
@@ -309,27 +307,7 @@ create_ipset(struct fw3_ipset *ipset, struct fw3_state *state)
 
 	if (ipset->iprange.set)
 	{
-		a = &ipset->iprange;
-
-		if (!a->range)
-		{
-			inet_ntop(a->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
-			          &a->address.v6, s, sizeof(s));
-
-			fw3_pr(" range %s/%u", s, a->mask);
-		}
-		else
-		{
-			inet_ntop(a->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
-			          &a->address.v6, s, sizeof(s));
-
-			fw3_pr(" range %s", s);
-
-			inet_ntop(a->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
-			          &a->address2.v6, s, sizeof(s));
-
-			fw3_pr("-%s", s);
-		}
+		fw3_pr(" range %s", fw3_address_to_string(&ipset->iprange, false));
 	}
 	else if (ipset->portrange.set)
 	{
diff --git a/options.c b/options.c
index 1f561d3..f261e70 100644
--- a/options.c
+++ b/options.c
@@ -888,58 +888,55 @@ fw3_format_in_out(struct fw3_device *in, struct fw3_device *out)
 		fw3_pr(" %s-o %s", out->invert ? "! " : "", out->name);
 }
 
-void
-fw3_format_src_dest(struct fw3_address *src, struct fw3_address *dest)
+const char *
+fw3_address_to_string(struct fw3_address *address, bool allow_invert)
 {
-	char s[INET6_ADDRSTRLEN];
+	char *p, ip[INET6_ADDRSTRLEN];
+	static char buf[INET6_ADDRSTRLEN * 2 + 2];
 
-	if ((src && src->range) || (dest && dest->range))
-		fw3_pr(" -m iprange");
+	p = buf;
 
-	if (src && src->set)
-	{
-		if (src->range)
-		{
-			inet_ntop(src->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
-					  &src->address.v4, s, sizeof(s));
+	if (address->invert && allow_invert)
+		p += sprintf(p, "!");
 
-			fw3_pr(" %s--src-range %s", src->invert ? "! " : "", s);
+	inet_ntop(address->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
+	          &address->address.v4, ip, sizeof(ip));
 
-			inet_ntop(src->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
-					  &src->address2.v4, s, sizeof(s));
+	p += sprintf(p, "%s", ip);
 
-			fw3_pr("-%s", s);
-		}
-		else
-		{
-			inet_ntop(src->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
-					  &src->address.v4, s, sizeof(s));
+	if (address->range)
+	{
+		inet_ntop(address->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
+		          &address->address2.v4, ip, sizeof(ip));
 
-			fw3_pr(" %s-s %s/%u", src->invert ? "! " : "", s, src->mask);
-		}
+		p += sprintf(p, "-%s", ip);
 	}
-
-	if (dest && dest->set)
+	else
 	{
-		if (dest->range)
-		{
-			inet_ntop(dest->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
-					  &dest->address.v4, s, sizeof(s));
+		p += sprintf(p, "/%u", address->mask);
+	}
 
-			fw3_pr(" %s--dst-range %s", dest->invert ? "! " : "", s);
+	return buf;
+}
 
-			inet_ntop(dest->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
-					  &dest->address2.v4, s, sizeof(s));
+void
+fw3_format_src_dest(struct fw3_address *src, struct fw3_address *dest)
+{
+	if ((src && src->range) || (dest && dest->range))
+		fw3_pr(" -m iprange");
 
-			fw3_pr("-%s", s);
-		}
-		else
-		{
-			inet_ntop(dest->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
-					  &dest->address.v4, s, sizeof(s));
+	if (src && src->set)
+	{
+		fw3_pr(" %s%s %s", src->invert ? "! " : "",
+		                   src->range ? "--src-range" : "-s",
+		                   fw3_address_to_string(src, false));
+	}
 
-			fw3_pr(" %s-d %s/%u", dest->invert ? "! " : "", s, dest->mask);
-		}
+	if (dest && dest->set)
+	{
+		fw3_pr(" %s%s %s", dest->invert ? "! " : "",
+		                   dest->range ? "--dst-range" : "-d",
+		                   fw3_address_to_string(dest, false));
 	}
 }
 
diff --git a/options.h b/options.h
index 734d185..e242f67 100644
--- a/options.h
+++ b/options.h
@@ -488,6 +488,9 @@ bool fw3_parse_mark(void *ptr, const char *val, bool is_list);
 void fw3_parse_options(void *s, const struct fw3_option *opts,
                        struct uci_section *section);
 
+const char * fw3_address_to_string(struct fw3_address *address,
+                                   bool allow_invert);
+
 void fw3_format_in_out(struct fw3_device *in, struct fw3_device *out);
 void fw3_format_src_dest(struct fw3_address *src, struct fw3_address *dest);
 void fw3_format_sport_dport(struct fw3_port *sp, struct fw3_port *dp);
diff --git a/utils.c b/utils.c
index 9f57e9f..3ad50e3 100644
--- a/utils.c
+++ b/utils.c
@@ -378,9 +378,7 @@ write_zone_uci(struct uci_context *ctx, struct fw3_zone *z,
 	struct fw3_address *sub;
 	enum fw3_family fam = FW3_FAMILY_ANY;
 
-	char addr[INET6_ADDRSTRLEN];
-	char buf[INET6_ADDRSTRLEN * 2 + 2];
-	char *p;
+	char *p, buf[34];
 
 	struct uci_ptr ptr = { .p = dest };
 
@@ -471,29 +469,7 @@ write_zone_uci(struct uci_context *ctx, struct fw3_zone *z,
 		if (!sub)
 			continue;
 
-		p = buf;
-
-		if (sub->invert)
-			p += sprintf(p, "!");
-
-		inet_ntop(sub->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
-				  &sub->address.v4, addr, sizeof(addr));
-
-		p += sprintf(p, "%s", addr);
-
-		if (sub->range)
-		{
-			inet_ntop(sub->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
-			          &sub->address2.v4, addr, sizeof(addr));
-
-			p += sprintf(p, "-%s", addr);
-		}
-		else
-		{
-			p += sprintf(p, "/%u", sub->mask);
-		}
-
-		ptr.value = buf;
+		ptr.value = fw3_address_to_string(sub, true);
 		uci_add_list(ctx, &ptr);
 	}