about summary refs log tree commit diff
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/libwpactrl/bcnm-wpactrl-scan.c.txt87
-rw-r--r--doc/libwpactrl/index.html14
2 files changed, 100 insertions, 1 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 ;  
+}
diff --git a/doc/libwpactrl/index.html b/doc/libwpactrl/index.html
index d3a3424..7a0a644 100644
--- a/doc/libwpactrl/index.html
+++ b/doc/libwpactrl/index.html
@@ -147,7 +147,7 @@ the answer is bigger than <em>anslen</em> bytes.
 </p>
 
 <p>
-<code> ssize_t wpactrl_querysa (wpactrl_t *a, char const *q, stralloc *sa, tain_t *stamp) </code> <br />
+<code> int wpactrl_querysa (wpactrl_t *a, char const *q, stralloc *sa, tain_t *stamp) </code> <br />
 Sends the query <em>q</em> to the connected instance
 of wpa_supplicant, and reads its answer into the
 <a href="//skarnet.org/software/skalibs/libstddjb/stralloc.html">stralloc</a>
@@ -472,5 +472,17 @@ written the results to the auxiliary pointer. <em>dt</em> can now be ignored. </
 error. </li>
 </ul>
 
+<h2> A working example </h2>
+
+<p>
+ The provided
+ <a href="bcnm-wpactrl-scan.c.txt">bcnm-wpactrl-scan.c</a>
+file is an example on how to program with
+<a href="//skarnet.org/software/skalibs/">skalibs</a> and libwpactrl. It connects to
+a wpa_supplicant instance (it takes the path to the Unix socket to wpa_supplicant as
+an argument), requests a scan, waits for the scan results with a timeout of 10
+seconds, and prints the results as is on its standard output.
+</p>
+
 </body>
 </html>