NEW etc.: Use NEW_ARY
[secnet] / comm-common.c
1
2 #include "secnet.h"
3 #include "comm-common.h"
4
5 void comm_request_notify(void *commst, void *nst, comm_notify_fn *fn)
6 {
7 struct commcommon *st=commst;
8 struct comm_notify_entry *n;
9
10 NEW(n);
11 n->fn=fn;
12 n->state=nst;
13 LIST_INSERT_HEAD(&st->notify, n, entry);
14 }
15
16 void comm_release_notify(void *commst, void *nst, comm_notify_fn *fn)
17 {
18 struct commcommon *st=commst;
19 struct comm_notify_entry *n, *t;
20
21 /* XXX untested */
22 LIST_FOREACH_SAFE(n, &st->notify, entry, t) {
23 if (n->state==nst && n->fn==fn) {
24 LIST_REMOVE(n, entry);
25 free(n);
26 }
27 }
28 }
29
30 bool_t comm_notify(struct comm_notify_list *notify,
31 struct buffer_if *buf, const struct comm_addr *ca)
32 {
33 struct comm_notify_entry *n;
34
35 LIST_FOREACH(n, notify, entry) {
36 if (n->fn(n->state, buf, ca)) {
37 return True;
38 }
39 }
40 return False;
41 }
42
43 void comm_apply(struct commcommon *cc, void *st)
44 {
45 assert(cc==st);
46 cc->cl.type=CL_COMM;
47 cc->cl.apply=NULL;
48 cc->cl.interface=&cc->ops;
49 cc->ops.st=cc;
50 cc->ops.request_notify=comm_request_notify;
51 cc->ops.release_notify=comm_release_notify;
52 LIST_INIT(&cc->notify);
53 cc->rbuf=NULL;
54 }