summaryrefslogtreecommitdiff
path: root/iwinfo_utils.c
diff options
context:
space:
mode:
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2014-10-05 10:26:05 +0000
committerJo-Philipp Wich <jow@openwrt.org>2014-10-27 13:48:19 +0100
commitfe7133f7e5a4faca63b6d939c6d55d09d8c240fb (patch)
treeb9737f5b2831697c23a3128999d0f040ded5a94f /iwinfo_utils.c
parent8ae758db52957939eeb6bc1c7da7be9d0339d3aa (diff)
downloadiwinfo-fe7133f7e5a4faca63b6d939c6d55d09d8c240fb.tar.gz
iwinfo: fix handling of accessing nl80211 interfaces via radio*
look up device path via uci instead of assuming a direct phy index Signed-off-by: Felix Fietkau <nbd@openwrt.org> git-svn-id: svn+ssh://svn.openwrt.org/openwrt/trunk@42759 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'iwinfo_utils.c')
-rw-r--r--iwinfo_utils.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/iwinfo_utils.c b/iwinfo_utils.c
index 4a82433..b313ea2 100644
--- a/iwinfo_utils.c
+++ b/iwinfo_utils.c
@@ -24,6 +24,7 @@
static int ioctl_socket = -1;
+struct uci_context *uci_ctx = NULL;
static int iwinfo_ioctl_socket(void)
{
@@ -365,3 +366,43 @@ void iwinfo_parse_rsn(struct iwinfo_crypto_entry *c, uint8_t *data, uint8_t len,
data += 2 + (count * 4);
len -= 2 + (count * 4);
}
+
+struct uci_section *iwinfo_uci_get_radio(const char *name, const char *type)
+{
+ struct uci_ptr ptr = {
+ .package = "wireless",
+ .section = name,
+ };
+ const char *opt;
+
+ if (!uci_ctx) {
+ uci_ctx = uci_alloc_context();
+ if (!uci_ctx)
+ return NULL;
+ }
+
+ memset(&ptr, 0, sizeof(ptr));
+ ptr.package = "wireless";
+ ptr.section = name;
+
+ if (uci_lookup_ptr(uci_ctx, &ptr, NULL, false))
+ return NULL;
+
+ if (!ptr.s || strcmp(ptr.s->type, "wifi-device") != 0)
+ return NULL;
+
+ opt = uci_lookup_option_string(uci_ctx, ptr.s, "type");
+ if (!opt || strcmp(opt, type) != 0)
+ return NULL;
+
+ return ptr.s;
+}
+
+void iwinfo_uci_free(void)
+{
+ if (!uci_ctx)
+ return;
+
+ uci_free_context(uci_ctx);
+ uci_ctx = NULL;
+}