chiark / gitweb /
test-example: Test not specifying a port
[secnet.git] / 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     n=safe_malloc(sizeof(*n),"comm_request_notify");
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 }