summaryrefslogtreecommitdiff
path: root/doc/libwpactrl/bcnm-wpactrl-scan.c.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/libwpactrl/bcnm-wpactrl-scan.c.txt')
-rw-r--r--doc/libwpactrl/bcnm-wpactrl-scan.c.txt87
1 files changed, 87 insertions, 0 deletions
diff --git a/doc/libwpactrl/bcnm-wpactrl-scan.c.txt b/doc/libwpactrl/bcnm-wpactrl-scan.c.txt
new file mode 100644
index 0000000..6c4cfb8
--- /dev/null
+++ b/doc/libwpactrl/bcnm-wpactrl-scan.c.txt
@@ -0,0 +1,87 @@
+/* ISC license. */
+
+#include <sys/types.h>
+#include <skalibs/stddjb.h>
+#include <bcnm/wpactrl.h>
+
+#define USAGE "bcnm-wpactrl-scan socket-to-wpa_supplicant"
+#define dieusage() strerr_dieusage(100, USAGE)
+
+static int print_scan_results (wpactrl_t *a, char const *s, size_t len, void *aux, tain_t *stamp)
+{
+ stralloc sa = STRALLOC_ZERO ;
+ ssize_t r ;
+ if (!wpactrl_querysa(a, "SCAN_RESULTS", &sa, stamp)) return 0 ;
+ r = buffer_put(buffer_1, sa.s, sa.len) ;
+ stralloc_free(&sa) ;
+ (void)s ;
+ (void)len ;
+ (void)aux ;
+ return r >= 0 ;
+}
+
+static wpactrl_xchgitem_t exchange_item =
+{
+ .filter = "CTRL-EVENT-SCAN-RESULTS",
+ .cb = &print_scan_results
+} ;
+
+
+int main (int argc, char const *const *argv)
+{
+ wpactrl_t a = WPACTRL_ZERO ;
+ wpactrl_xchg_t dt ;
+ tain_t deadline ;
+ wparesponse_t r ;
+
+ PROG = "bcnm-wpactrl-scan" ;
+ if (argc < 2) dieusage() ;
+
+ tain_now_g() ;
+
+ if (!wpactrl_start_g(&a, argv[1], 2000))
+ strerr_diefu2sys(111, "connect to ", argv[1]) ;
+
+ r = wpactrl_command_g(&a, "SCAN") ;
+ if (r != WPA_OK && r != WPA_FAILBUSY)
+ strerr_dief1x(111, "SCAN command failed") ;
+
+ tain_from_millisecs(&deadline, 10000) ;
+ tain_add_g(&deadline, &deadline) ;
+ wpactrl_xchg_init(&dt, &exchange_item, 1, &deadline, 0) ;
+ if (!wpactrl_xchg_start(&a, &dt))
+ strerr_diefu1sys(111, "start wpactrl exchange") ;
+
+ {
+ iopause_fd x = { .fd = wpactrl_fd(&a), .events = IOPAUSE_READ } ;
+ for (;;)
+ {
+ int r ;
+ tain_add_g(&deadline, &tain_infinite_relative) ;
+ wpactrl_xchg_computedeadline(&dt, &deadline) ;
+ r = iopause_g(&x, 1, &deadline) ;
+ if (r < 0)
+ strerr_diefu1sys(111, "iopause") ;
+
+ if (!r)
+ {
+ if (wpactrl_xchg_timeout_g(&a, &dt))
+ strerr_dief1x(111, "scan exchange timed out") ;
+ else
+ strerr_diefu1x(111, "timeout unrelated to the scan exchange") ;
+ }
+
+ if (wpactrl_update(&a) < 0)
+ strerr_diefu1sys(111, "wpactrl_update") ;
+ r = wpactrl_xchg_event_g(&a, &dt) ;
+ if (r < 0)
+ strerr_diefu1sys(111, r < -1 ? "print_scan_results" : "wpactrl_xchg_event") ;
+ if (r) break ;
+ }
+ }
+
+ wpactrl_end(&a) ;
+ if (!buffer_flush(buffer_1))
+ strerr_diefu1sys(111, "write to stdout") ;
+ return 0 ;
+}