summaryrefslogtreecommitdiff
path: root/src/libs6/ftrigr_update.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2017-06-14 04:09:00 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2017-06-14 04:09:00 +0000
commit0445f2a3590f67441602a05fe3924ab677c79ff0 (patch)
tree1a011697fbd92ca53468efe019c8c93c364ad6a8 /src/libs6/ftrigr_update.c
parentf287ac765101f21b530f1a9886e06976c165c922 (diff)
downloads6-0445f2a3590f67441602a05fe3924ab677c79ff0.tar.xz
Add ftrigr_checksa(), rewrite s6_svlisten_loop() around it
- Fixes the race condition hit by permanent failure, i.e. two ftrig events close to each other - Requires storing the sequence of events client-side, so an additional stralloc, bleh - The visible struct ftrigr_s changes, so a major bump is needed -> prepare for 2.6.0.0 - ftrigr_check() is now a trivial wrapper around ftrigr_checksa()
Diffstat (limited to 'src/libs6/ftrigr_update.c')
-rw-r--r--src/libs6/ftrigr_update.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/libs6/ftrigr_update.c b/src/libs6/ftrigr_update.c
index 52f79b9..f97535d 100644
--- a/src/libs6/ftrigr_update.c
+++ b/src/libs6/ftrigr_update.c
@@ -35,12 +35,14 @@ static int msghandler (unixmessage_t const *m, void *context)
switch (m->s[2])
{
case 'd' :
+ if (!stralloc_catb(&p->what, m->s + 3, 1)) return 0 ;
p->state = FR1STATE_WAITACK ;
break ;
case '!' :
+ if (!stralloc_catb(&p->what, m->s + 3, 1)) return 0 ;
if (p->options & FTRIGR_REPEAT)
{
- if (p->count++
+ if (p->what.len > 1
&& appears(id+1, genalloc_s(uint16_t, &a->list), genalloc_len(uint16_t, &a->list)))
addit = 0 ;
}
@@ -48,7 +50,6 @@ static int msghandler (unixmessage_t const *m, void *context)
break ;
default : return (errno = EPROTO, 0) ;
}
- p->what = m->s[3] ;
if (addit)
{
id++ ; genalloc_append(uint16_t, &a->list, &id) ;