Blame


1 c3a72d77 2004-02-29 devnull #include <u.h>
2 c3a72d77 2004-02-29 devnull #include <libc.h>
3 c3a72d77 2004-02-29 devnull #include <thread.h>
4 c3a72d77 2004-02-29 devnull #include <fcall.h>
5 c3a72d77 2004-02-29 devnull #include <fs.h>
6 c3a72d77 2004-02-29 devnull #include "plumb.h"
7 c3a72d77 2004-02-29 devnull
8 c3a72d77 2004-02-29 devnull Plumbmsg*
9 c3a72d77 2004-02-29 devnull threadplumbrecv(int fd)
10 c3a72d77 2004-02-29 devnull {
11 c3a72d77 2004-02-29 devnull char *buf;
12 c3a72d77 2004-02-29 devnull Plumbmsg *m;
13 c3a72d77 2004-02-29 devnull int n, more;
14 c3a72d77 2004-02-29 devnull
15 c3a72d77 2004-02-29 devnull buf = malloc(8192);
16 c3a72d77 2004-02-29 devnull if(buf == nil)
17 c3a72d77 2004-02-29 devnull return nil;
18 c3a72d77 2004-02-29 devnull n = threadread(fd, buf, 8192);
19 c3a72d77 2004-02-29 devnull m = nil;
20 c3a72d77 2004-02-29 devnull if(n > 0){
21 c3a72d77 2004-02-29 devnull m = plumbunpackpartial(buf, n, &more);
22 c3a72d77 2004-02-29 devnull if(m==nil && more>0){
23 c3a72d77 2004-02-29 devnull /* we now know how many more bytes to read for complete message */
24 c3a72d77 2004-02-29 devnull buf = realloc(buf, n+more);
25 c3a72d77 2004-02-29 devnull if(buf == nil)
26 c3a72d77 2004-02-29 devnull return nil;
27 c3a72d77 2004-02-29 devnull if(threadreadn(fd, buf+n, more) == more)
28 c3a72d77 2004-02-29 devnull m = plumbunpackpartial(buf, n+more, nil);
29 c3a72d77 2004-02-29 devnull }
30 c3a72d77 2004-02-29 devnull }
31 c3a72d77 2004-02-29 devnull free(buf);
32 c3a72d77 2004-02-29 devnull return m;
33 c3a72d77 2004-02-29 devnull }
34 2277c5d7 2004-03-21 devnull