summaryrefslogtreecommitdiff
path: root/src/libwpactrl/wpactrl_xchg_event.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2017-08-10 20:51:40 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2017-08-10 20:51:40 +0000
commit5445a1d653cddb7b9321c87aec6b025c7627fe1d (patch)
tree1fad42bb0b4abbda9c35eb3ff829fb84bbcb8d78 /src/libwpactrl/wpactrl_xchg_event.c
parentbabf43abf301d072192bda1f72a47440c354b072 (diff)
downloadbcnm-5445a1d653cddb7b9321c87aec6b025c7627fe1d.tar.xz
Complete first draft of libwpactrl, with documentation
Diffstat (limited to 'src/libwpactrl/wpactrl_xchg_event.c')
-rw-r--r--src/libwpactrl/wpactrl_xchg_event.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/src/libwpactrl/wpactrl_xchg_event.c b/src/libwpactrl/wpactrl_xchg_event.c
index 6d25295..e9d2f06 100644
--- a/src/libwpactrl/wpactrl_xchg_event.c
+++ b/src/libwpactrl/wpactrl_xchg_event.c
@@ -1,6 +1,8 @@
/* ISC license. */
#include <string.h>
+#include <errno.h>
+#include <skalibs/error.h>
#include <skalibs/stralloc.h>
#include <bcnm/wpactrl.h>
@@ -10,7 +12,7 @@ static inline size_t wpactrl_findmsg (wpactrl_t *a, char const *filter)
size_t i = 0 ;
while (i < a->data.len)
{
- if (!strncmp(a->data.s + i, filter, filterlen)) break ;
+ if (!strncmp(a->data.s + i + 3, filter, filterlen)) break ;
i += strlen(a->data.s + i) + 1 ;
}
return i ;
@@ -20,23 +22,19 @@ 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 ;
+ if (!error_isagain(dt->status)) return (errno = EINVAL, -1) ;
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 (!(*dt->tab[dt->i].cb)(a, a->data.s + pos, len - 1, dt->aux, stamp)) return -2 ;
+ 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 (++dt->i == dt->n)
{
- 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 ;
+ if (!wpactrl_filter_add(a, dt->tab[dt->i].filter)) return -1 ;
return 0 ;
}