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