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