1 #include <u.h>
2 #include <libc.h>
3 #include <fcall.h>
4 
5 int
read9pmsg(int fd,void * abuf,uint n)6 read9pmsg(int fd, void *abuf, uint n)
7 {
8 	int m, len;
9 	uchar *buf;
10 
11 	buf = abuf;
12 
13 	/* read count */
14 	m = readn(fd, buf, BIT32SZ);
15 	if(m != BIT32SZ){
16 		if(m < 0)
17 			return -1;
18 		return 0;
19 	}
20 
21 	len = GBIT32(buf);
22 	if(len <= BIT32SZ || len > n){
23 		werrstr("bad length in 9P2000 message header");
24 		return -1;
25 	}
26 	len -= BIT32SZ;
27 	m = readn(fd, buf+BIT32SZ, len);
28 	if(m < len)
29 		return 0;
30 	return BIT32SZ+m;
31 }
32