summaryrefslogtreecommitdiff
path: root/src/libwpactrl/wpactrl_xchg_event.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libwpactrl/wpactrl_xchg_event.c')
-rw-r--r--src/libwpactrl/wpactrl_xchg_event.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/libwpactrl/wpactrl_xchg_event.c b/src/libwpactrl/wpactrl_xchg_event.c
new file mode 100644
index 0000000..6d25295
--- /dev/null
+++ b/src/libwpactrl/wpactrl_xchg_event.c
@@ -0,0 +1,42 @@
+/* ISC license. */
+
+#include <string.h>
+#include <skalibs/stralloc.h>
+#include <bcnm/wpactrl.h>
+
+static inline size_t wpactrl_findmsg (wpactrl_t *a, char const *filter)
+{
+ size_t filterlen = strlen(filter) ;
+ size_t i = 0 ;
+ while (i < a->data.len)
+ {
+ if (!strncmp(a->data.s + i, filter, filterlen)) break ;
+ i += strlen(a->data.s + i) + 1 ;
+ }
+ return i ;
+}
+
+int wpactrl_xchg_event (wpactrl_t *a, wpactrl_xchg_t *dt, tain_t *stamp)
+{
+ size_t pos, len ;
+ if (dt->i >= dt->n) return 2 ;
+ pos = wpactrl_findmsg(a, dt->tab[dt->i].filter) ;
+ if (pos >= a->data.len) return 0 ;
+ dt->sa.len = 0 ;
+ len = strlen(a->data.s + pos) + 1 ;
+ if (dt->i == dt->n - 1)
+ {
+ if (!stralloc_catb(&dt->sa, a->data.s + pos, len)) return -1 ;
+ memmove(a->data.s + pos, a->data.s + pos + len, a->data.len - len) ;
+ a->data.len -= len ;
+ dt->status = 0 ;
+ wpactrl_filter_remove(a, dt->tab[dt->i].filter) ;
+ return 1 ;
+ }
+ if (!(*dt->tab[dt->i].f)(a, a->data.s + pos, len - 1, dt->aux, stamp)) return -1 ;
+ memmove(a->data.s + pos, a->data.s + pos + len, a->data.len - len) ;
+ a->data.len -= len ;
+ wpactrl_filter_remove(a, dt->tab[dt->i].filter) ;
+ if (!wpactrl_filter_add(a, dt->tab[++dt->i].filter)) return -1 ;
+ return 0 ;
+}