1 3d7e9092 2003-10-14 devnull #include <u.h>
2 3d7e9092 2003-10-14 devnull #include <libc.h>
3 3d7e9092 2003-10-14 devnull #include <draw.h>
4 3d7e9092 2003-10-14 devnull #include <event.h>
5 3d7e9092 2003-10-14 devnull #include "plumb.h"
7 3d7e9092 2003-10-14 devnull typedef struct EQueue EQueue;
9 3d7e9092 2003-10-14 devnull struct EQueue
12 3d7e9092 2003-10-14 devnull char *buf;
13 3d7e9092 2003-10-14 devnull int nbuf;
14 3d7e9092 2003-10-14 devnull EQueue *next;
17 3d7e9092 2003-10-14 devnull static EQueue *equeue;
18 3d7e9092 2003-10-14 devnull static Lock eqlock;
22 3d7e9092 2003-10-14 devnull partial(int id, Event *e, uchar *b, int n)
24 3d7e9092 2003-10-14 devnull EQueue *eq, *p;
25 3d7e9092 2003-10-14 devnull int nmore;
27 3d7e9092 2003-10-14 devnull lock(&eqlock);
28 3d7e9092 2003-10-14 devnull for(eq = equeue; eq != nil; eq = eq->next)
29 3d7e9092 2003-10-14 devnull if(eq->id == id)
31 3d7e9092 2003-10-14 devnull unlock(&eqlock);
32 3d7e9092 2003-10-14 devnull if(eq == nil)
33 3d7e9092 2003-10-14 devnull return 0;
34 3d7e9092 2003-10-14 devnull /* partial message exists for this id */
35 3d7e9092 2003-10-14 devnull eq->buf = realloc(eq->buf, eq->nbuf+n);
36 3d7e9092 2003-10-14 devnull if(eq->buf == nil)
37 3d7e9092 2003-10-14 devnull drawerror(display, "eplumb: cannot allocate buffer");
38 3d7e9092 2003-10-14 devnull memmove(eq->buf+eq->nbuf, b, n);
39 3d7e9092 2003-10-14 devnull eq->nbuf += n;
40 3d7e9092 2003-10-14 devnull e->v = plumbunpackpartial((char*)eq->buf, eq->nbuf, &nmore);
41 3d7e9092 2003-10-14 devnull if(nmore == 0){ /* no more to read in this message */
42 3d7e9092 2003-10-14 devnull lock(&eqlock);
43 3d7e9092 2003-10-14 devnull if(eq == equeue)
44 3d7e9092 2003-10-14 devnull equeue = eq->next;
46 3d7e9092 2003-10-14 devnull for(p = equeue; p!=nil && p->next!=eq; p = p->next)
48 3d7e9092 2003-10-14 devnull if(p == nil)
49 3d7e9092 2003-10-14 devnull drawerror(display, "eplumb: bad event queue");
50 3d7e9092 2003-10-14 devnull p->next = eq->next;
52 3d7e9092 2003-10-14 devnull unlock(&eqlock);
53 3d7e9092 2003-10-14 devnull free(eq->buf);
54 3d7e9092 2003-10-14 devnull free(eq);
56 3d7e9092 2003-10-14 devnull return 1;
61 3d7e9092 2003-10-14 devnull addpartial(int id, char *b, int n)
63 3d7e9092 2003-10-14 devnull EQueue *eq;
65 3d7e9092 2003-10-14 devnull eq = malloc(sizeof(EQueue));
66 3d7e9092 2003-10-14 devnull if(eq == nil)
68 3d7e9092 2003-10-14 devnull eq->id = id;
69 3d7e9092 2003-10-14 devnull eq->nbuf = n;
70 3d7e9092 2003-10-14 devnull eq->buf = malloc(n);
71 3d7e9092 2003-10-14 devnull if(eq->buf == nil){
72 3d7e9092 2003-10-14 devnull free(eq);
75 3d7e9092 2003-10-14 devnull memmove(eq->buf, b, n);
76 3d7e9092 2003-10-14 devnull lock(&eqlock);
77 3d7e9092 2003-10-14 devnull eq->next = equeue;
78 3d7e9092 2003-10-14 devnull equeue = eq;
79 3d7e9092 2003-10-14 devnull unlock(&eqlock);
84 3d7e9092 2003-10-14 devnull plumbevent(int id, Event *e, uchar *b, int n)
86 3d7e9092 2003-10-14 devnull int nmore;
88 3d7e9092 2003-10-14 devnull if(partial(id, e, b, n) == 0){
89 3d7e9092 2003-10-14 devnull /* no partial message already waiting for this id */
90 3d7e9092 2003-10-14 devnull e->v = plumbunpackpartial((char*)b, n, &nmore);
91 3d7e9092 2003-10-14 devnull if(nmore > 0) /* incomplete message */
92 3d7e9092 2003-10-14 devnull addpartial(id, (char*)b, n);
94 3d7e9092 2003-10-14 devnull if(e->v == nil)
95 3d7e9092 2003-10-14 devnull return 0;
96 3d7e9092 2003-10-14 devnull return id;
100 3d7e9092 2003-10-14 devnull eplumb(int key, char *port)
104 3d7e9092 2003-10-14 devnull fd = plumbopen(port, OREAD|OCEXEC);
105 3d7e9092 2003-10-14 devnull if(fd < 0)
106 3d7e9092 2003-10-14 devnull return -1;
107 3d7e9092 2003-10-14 devnull return estartfn(key, fd, 8192, plumbevent);