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