1 /* ISC license. */
2 
3 #include <errno.h>
4 #include <skalibs/stralloc.h>
5 #include <skalibs/gensetdyn.h>
6 #include <s6/ftrigr.h>
7 
ftrigr_checksa(ftrigr_t * a,uint16_t id,stralloc * sa)8 int ftrigr_checksa (ftrigr_t *a, uint16_t id, stralloc *sa)
9 {
10   ftrigr1_t *p ;
11   if (!id--) return (errno = EINVAL, -1) ;
12   p = GENSETDYN_P(ftrigr1_t, &a->data, id) ;
13   if (!p) return (errno = EINVAL, -1) ;
14   switch (p->state)
15   {
16     case FR1STATE_WAITACKDATA :
17     {
18       if (!stralloc_catb(sa, p->what.s, p->what.len)) return -1 ;
19       stralloc_free(&p->what) ;
20       *p = ftrigr1_zero ;
21       gensetdyn_delete(&a->data, id) ;
22       return 1 ;
23     }
24     case FR1STATE_LISTENING :
25     {
26       if (!p->what.len) break ;
27       if (!stralloc_catb(sa, p->what.s, p->what.len)) return -1 ;
28       p->what.len = 0 ;
29       return 1 ;
30     }
31     case FR1STATE_WAITACK :
32     {
33       int e ;
34       if (!stralloc_catb(sa, p->what.s, p->what.len - 1)) return -1 ;
35       e = p->what.s[p->what.len - 1] ;
36       stralloc_free(&p->what) ;
37       *p = ftrigr1_zero ;
38       gensetdyn_delete(&a->data, id) ;
39       errno = e ;
40       return -1 ;
41     }
42     default: return (errno = EINVAL, -1) ;
43   }
44   return 0 ;
45 }
46