diff mbox series

[OpenWrt-Devel,v2] firewall3: utils: create a common helper to find strings in files

Message ID 20200130135422.15939-1-rsalvaterra@gmail.com
State Needs Review / ACK
Headers show
Series [OpenWrt-Devel,v2] firewall3: utils: create a common helper to find strings in files | expand

Commit Message

Rui Salvaterra Jan. 30, 2020, 1:54 p.m. UTC
v2: Actually make it work. Use strncmp instead of strcmp (strangely
enough, strcmp fails for the ip*names case, but I don't understand why).

Both fw3_has_table and fw3_has_target do the same thing. Factor out the
common code into a separate function.

Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
---
 utils.c | 38 ++++++++++++--------------------------
 utils.h |  7 ++++++-
 2 files changed, 18 insertions(+), 27 deletions(-)
diff mbox series

Patch

diff --git a/utils.c b/utils.c
index da65632..6289ec9 100644
--- a/utils.c
+++ b/utils.c
@@ -316,23 +316,19 @@  fw3_command_close(void)
 	pipe_pid = -1;
 }
 
-bool
-fw3_has_table(bool ipv6, const char *table)
+static bool
+file_contains(const char *path, const char *str)
 {
 	FILE *f;
-
 	char line[12];
 	bool seen = false;
 
-	const char *path = ipv6
-		? "/proc/net/ip6_tables_names" : "/proc/net/ip_tables_names";
-
 	if (!(f = fopen(path, "r")))
 		return false;
 
 	while (fgets(line, sizeof(line), f))
 	{
-		if (!strncmp(line, table, strlen(table)))
+		if (!strncmp(line, str, MIN(sizeof(line), strlen(str))))
 		{
 			seen = true;
 			break;
@@ -345,31 +341,21 @@  fw3_has_table(bool ipv6, const char *table)
 }
 
 bool
-fw3_has_target(const bool ipv6, const char *target)
+fw3_has_table(const bool ipv6, const char *table)
 {
-	FILE *f;
+	const char *path = ipv6
+		? "/proc/net/ip6_tables_names" : "/proc/net/ip_tables_names";
 
-	char line[12];
-	bool seen = false;
+	return file_contains(path, table);
+}
 
+bool
+fw3_has_target(const bool ipv6, const char *target)
+{
 	const char *path = ipv6
 		? "/proc/net/ip6_tables_targets" : "/proc/net/ip_tables_targets";
 
-	if (!(f = fopen(path, "r")))
-		return false;
-
-	while (fgets(line, sizeof(line), f))
-	{
-		if (!strcmp(line, target))
-		{
-			seen = true;
-			break;
-		}
-	}
-
-	fclose(f);
-
-	return seen;
+	return file_contains(path, target);
 }
 
 bool
diff --git a/utils.h b/utils.h
index 254bea4..ff58cc6 100644
--- a/utils.h
+++ b/utils.h
@@ -55,6 +55,11 @@  void error(const char *format, ...)
 void info(const char *format, ...)
 	__attribute__ ((format (printf, 1, 2)));
 
+#define MIN(x, y) ({		\
+	typeof(x) _x = (x);	\
+	typeof(y) _y = (y);	\
+	(void) (&_x == &_y);	\
+	_x < _y ? _x : _y; })
 
 #define warn_section(t, r, e, fmt, ...)					\
 	do {									\
@@ -103,7 +108,7 @@  void fw3_command_close(void);
 void fw3_pr(const char *fmt, ...)
 	__attribute__ ((format (printf, 1, 2)));
 
-bool fw3_has_table(bool ipv6, const char *table);
+bool fw3_has_table(const bool ipv6, const char *table);
 
 bool fw3_has_target(const bool ipv6, const char *target);