xref: /plan9/sys/src/libc/9sys/dirread.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <auth.h>
43e12c5d1SDavid du Colombier #include <fcall.h>
53e12c5d1SDavid du Colombier 
6*7dd7cddfSDavid du Colombier #define	N	50
7*7dd7cddfSDavid du Colombier #define	SZ	(N*DIRLEN)
8*7dd7cddfSDavid du Colombier 
93e12c5d1SDavid du Colombier long
103e12c5d1SDavid du Colombier dirread(int f, Dir *dbuf, long count)
113e12c5d1SDavid du Colombier {
12*7dd7cddfSDavid du Colombier 	char *buf;
133e12c5d1SDavid du Colombier 	int c, n, i, r;
143e12c5d1SDavid du Colombier 
153e12c5d1SDavid du Colombier 	n = 0;
16*7dd7cddfSDavid du Colombier 	buf = malloc(SZ);
17*7dd7cddfSDavid du Colombier 	if(buf == nil)
18*7dd7cddfSDavid du Colombier 		return -1;
193e12c5d1SDavid du Colombier 	count = (count/sizeof(Dir)) * DIRLEN;
203e12c5d1SDavid du Colombier 	while(n < count) {
213e12c5d1SDavid du Colombier 		c = count - n;
22*7dd7cddfSDavid du Colombier 		if(c > SZ)
23*7dd7cddfSDavid du Colombier 			c = SZ;
243e12c5d1SDavid du Colombier 		r = read(f, buf, c);
253e12c5d1SDavid du Colombier 		if(r == 0)
263e12c5d1SDavid du Colombier 			break;
27*7dd7cddfSDavid du Colombier 		if(r < 0 || r % DIRLEN) {
28*7dd7cddfSDavid du Colombier 			free(buf);
293e12c5d1SDavid du Colombier 			return -1;
30*7dd7cddfSDavid du Colombier 		}
313e12c5d1SDavid du Colombier 		for(i=0; i<r; i+=DIRLEN) {
323e12c5d1SDavid du Colombier 			convM2D(buf+i, dbuf);
333e12c5d1SDavid du Colombier 			dbuf++;
343e12c5d1SDavid du Colombier 		}
353e12c5d1SDavid du Colombier 		n += r;
363e12c5d1SDavid du Colombier 		if(r != c)
373e12c5d1SDavid du Colombier 			break;
383e12c5d1SDavid du Colombier 	}
39*7dd7cddfSDavid du Colombier 	free(buf);
403e12c5d1SDavid du Colombier 	return (n/DIRLEN) * sizeof(Dir);
413e12c5d1SDavid du Colombier }
42