| /*  | 
 |  * This file is part of the UCB release of Plan 9. It is subject to the license | 
 |  * terms in the LICENSE file found in the top-level directory of this | 
 |  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No | 
 |  * part of the UCB release of Plan 9, including this file, may be copied, | 
 |  * modified, propagated, or distributed except according to the terms contained | 
 |  * in the LICENSE file. | 
 |  */ | 
 | #include <stdlib.h> | 
 |  | 
 | #include <stdio.h> | 
 | #include <parlib.h> | 
 | #include <unistd.h> | 
 | #include <signal.h> | 
 | #include <fcntl.h> | 
 | #include <iplib.h> | 
 | #include <fcall.h> | 
 | #include <fcallfmt.h> | 
 | #include <ndb.h> | 
 |  | 
 | long | 
 | readn(int f, void *av, long n) | 
 | { | 
 | 	char *a; | 
 | 	long m, t; | 
 |  | 
 | 	a = av; | 
 | 	t = 0; | 
 | 	while(t < n){ | 
 | 		m = read(f, a+t, n-t); | 
 | 		if(m <= 0){ | 
 | 			if(t == 0) | 
 | 				return m; | 
 | 			break; | 
 | 		} | 
 | 		t += m; | 
 | 	} | 
 | 	return t; | 
 | } | 
 |  | 
 | int | 
 | read9pmsg(int fd, void *abuf, unsigned int n) | 
 | { | 
 | 	int m, len; | 
 | 	uint8_t *buf; | 
 |  | 
 | 	buf = abuf; | 
 |  | 
 | 	/* read count */ | 
 | 	m = readn(fd, buf, BIT32SZ); | 
 | 	if(m != BIT32SZ){ | 
 | 		if(m < 0) | 
 | 			return -1; | 
 | 		return 0; | 
 | 	} | 
 |  | 
 | 	len = GBIT32(buf); | 
 | 	if(len <= BIT32SZ || len > n){ | 
 | 		werrstr("bad length in 9P2000 message header"); | 
 | 		return -1; | 
 | 	} | 
 | 	len -= BIT32SZ; | 
 | 	m = readn(fd, buf+BIT32SZ, len); | 
 | 	if(m < len) | 
 | 		return 0; | 
 | 	return BIT32SZ+m; | 
 | } |