[wireless-regdb] [PATCH 40/40] crda: make reglib_for_each_country() use the reglib context

Luis R. Rodriguez mcgrof at do-not-panic.com
Thu May 30 22:09:29 EDT 2013


From: "Luis R. Rodriguez" <mcgrof at do-not-panic.com>

This allows users of reglib to iterate over the regdb
with just one open() and mmap() to be kept sharing as
much code as possible. This makes the regdbdump and
intersection code use the context therefore sharing
all that boiler plate code.

Signed-off-by: Luis R. Rodriguez <mcgrof at do-not-panic.com>
---
 intersect.c |   15 +++++++++++++--
 regdbdump.c |   28 ++++++++++++++--------------
 reglib.c    |   23 +++++++++--------------
 reglib.h    |   11 ++++++-----
 4 files changed, 42 insertions(+), 35 deletions(-)

diff --git a/intersect.c b/intersect.c
index 56d0d35..ae9ca1b 100644
--- a/intersect.c
+++ b/intersect.c
@@ -8,21 +8,32 @@
 
 int main(int argc, char **argv)
 {
+	const struct reglib_regdb_ctx *ctx;
 	const struct ieee80211_regdomain *rd;
 
 	if (argc != 2) {
-		fprintf(stderr, "You must specify a file\n");
+		fprintf(stderr, "Usage: %s <regulatory-binary-file>\n", argv[0]);
 		return -EINVAL;
 	}
 
-	rd = reglib_intersect_regdb(argv[1]);
+	ctx = reglib_malloc_regdb_ctx(argv[1]);
+	if (!ctx) {
+		fprintf(stderr, "Invalid or empty regulatory file, note: "
+			"a binary regulatory file should be used.\n");
+		return -EINVAL;
+	}
+
+	rd = reglib_intersect_regdb(ctx);
 	if (!rd) {
 		fprintf(stderr, "Intersection not possible\n");
+		reglib_free_regdb_ctx(ctx);
 		return -ENOENT;
 	}
 
 	reglib_print_regdom(rd);
+
 	free((struct ieee80211_regdomain *) rd);
 
+	reglib_free_regdb_ctx(ctx);
 	return 0;
 }
diff --git a/regdbdump.c b/regdbdump.c
index edf3e7c..cc7eb85 100644
--- a/regdbdump.c
+++ b/regdbdump.c
@@ -2,35 +2,35 @@
 #include <errno.h>
 #include "reglib.h"
 
-static int reglib_regdbdump(char *regdb_file)
+static void reglib_regdbdump(const struct reglib_regdb_ctx *ctx)
 {
 	const struct ieee80211_regdomain *rd = NULL;
 	unsigned int idx = 0;
 
-	reglib_for_each_country(rd, idx, regdb_file) {
+	reglib_for_each_country(rd, idx, ctx) {
 		reglib_print_regdom(rd);
 		free((struct ieee80211_regdomain *) rd);
 	}
-
-	if (!idx) {
-		fprintf(stderr, "Invalid or empty regulatory file, note: "
-		       "a binary regulatory file should be used.\n");
-		return -EINVAL;
-	}
-
-	return 0;
 }
 
 int main(int argc, char **argv)
 {
-	int r;
+	const struct reglib_regdb_ctx *ctx;
 
 	if (argc != 2) {
 		fprintf(stderr, "Usage: %s <regulatory-binary-file>\n", argv[0]);
-		return 2;
+		return -EINVAL;
+	}
+
+	ctx = reglib_malloc_regdb_ctx(argv[1]);
+	if (!ctx) {
+		fprintf(stderr, "Invalid or empty regulatory file, note: "
+			"a binary regulatory file should be used.\n");
+		return -EINVAL;
 	}
 
-	r = reglib_regdbdump(argv[1]);
+	reglib_regdbdump(ctx);
+	reglib_free_regdb_ctx(ctx);
 
-	return r;
+	return 0;
 }
diff --git a/reglib.c b/reglib.c
index ff05aaa..c4d00f8 100644
--- a/reglib.c
+++ b/reglib.c
@@ -336,28 +336,19 @@ country2rd(const struct reglib_regdb_ctx *ctx,
 }
 
 const struct ieee80211_regdomain *
-reglib_get_rd_idx(unsigned int idx, const char *file)
+reglib_get_rd_idx(unsigned int idx, const struct reglib_regdb_ctx *ctx)
 {
-	const struct reglib_regdb_ctx *ctx;
 	struct regdb_file_reg_country *country;
-	const struct ieee80211_regdomain *rd = NULL;
 
-	ctx = reglib_malloc_regdb_ctx(file);
 	if (!ctx)
 		return NULL;
 
 	if (idx >= ctx->num_countries)
-		goto out;
+		return NULL;
 
 	country = ctx->countries + idx;
 
-	rd = country2rd(ctx, country);
-	if (!rd)
-		goto out;
-
-out:
-	reglib_free_regdb_ctx(ctx);
-	return rd;
+	return country2rd(ctx, country);
 }
 
 const struct ieee80211_regdomain *
@@ -552,14 +543,18 @@ reglib_intersect_rds(const struct ieee80211_regdomain *rd1,
 	return rd;
 }
 
-const struct ieee80211_regdomain *reglib_intersect_regdb(char *regdb_file)
+const struct ieee80211_regdomain *
+reglib_intersect_regdb(const struct reglib_regdb_ctx *ctx)
 {
 	const struct ieee80211_regdomain *rd;
 	struct ieee80211_regdomain *prev_rd_intsct = NULL, *rd_intsct = NULL;
 	int intersected = 0;
 	unsigned int idx = 0;
 
-	reglib_for_each_country(rd, idx, regdb_file) {
+	if (!ctx)
+		return NULL;
+
+	reglib_for_each_country(rd, idx, ctx) {
 		if (reglib_is_world_regdom((const char *) rd->alpha2)) {
 			free((struct ieee80211_regdomain *) rd);
 			continue;
diff --git a/reglib.h b/reglib.h
index f1bd6b8..86087e3 100644
--- a/reglib.h
+++ b/reglib.h
@@ -139,12 +139,12 @@ const struct reglib_regdb_ctx *reglib_malloc_regdb_ctx(const char *regdb_file);
 void reglib_free_regdb_ctx(const struct reglib_regdb_ctx *regdb_ctx);
 
 const struct ieee80211_regdomain *
-reglib_get_rd_idx(unsigned int idx, const char *file);
+reglib_get_rd_idx(unsigned int idx, const struct reglib_regdb_ctx *ctx);
 
-#define reglib_for_each_country(__rd, __idx, __file)		\
-	for (__rd = reglib_get_rd_idx(__idx, __file);		\
+#define reglib_for_each_country(__rd, __idx, __ctx)		\
+	for (__rd = reglib_get_rd_idx(__idx, __ctx);		\
 	     __rd != NULL;					\
-	     __rd = reglib_get_rd_idx(++__idx, __file))		\
+	     __rd = reglib_get_rd_idx(++__idx, __ctx))		\
 
 const struct ieee80211_regdomain *
 reglib_get_rd_alpha2(const char *alpha2, const char *file);
@@ -166,6 +166,7 @@ reglib_intersect_rds(const struct ieee80211_regdomain *rd1,
  * to find rules that fit all regulatory domains it return a regulatory
  * domain with such rules otherwise it returns NULL.
  */
-const struct ieee80211_regdomain *reglib_intersect_regdb(char *regdb_file);
+const struct ieee80211_regdomain *
+reglib_intersect_regdb(const struct reglib_regdb_ctx *ctx);
 
 #endif
-- 
1.7.10.4




More information about the wireless-regdb mailing list