1 d3df3087 2003-12-06 devnull /* Mostly copied from Plan 9's libc. */
3 d3df3087 2003-12-06 devnull #include <u.h>
4 d3df3087 2003-12-06 devnull #include <libc.h>
5 d3df3087 2003-12-06 devnull #include <fcall.h>
6 d3df3087 2003-12-06 devnull #include <fs.h>
10 d3df3087 2003-12-06 devnull dirpackage(uchar *buf, long ts, Dir **d)
13 d3df3087 2003-12-06 devnull long ss, i, n, nn, m;
15 d3df3087 2003-12-06 devnull *d = nil;
16 d3df3087 2003-12-06 devnull if(ts <= 0)
17 d3df3087 2003-12-06 devnull return 0;
20 d3df3087 2003-12-06 devnull * first find number of all stats, check they look like stats, & size all associated strings
24 d3df3087 2003-12-06 devnull for(i = 0; i < ts; i += m){
25 d3df3087 2003-12-06 devnull m = BIT16SZ + GBIT16(&buf[i]);
26 d3df3087 2003-12-06 devnull if(statcheck(&buf[i], m) < 0)
32 d3df3087 2003-12-06 devnull if(i != ts)
33 d3df3087 2003-12-06 devnull return -1;
35 d3df3087 2003-12-06 devnull *d = malloc(n * sizeof(Dir) + ss);
36 d3df3087 2003-12-06 devnull if(*d == nil)
37 d3df3087 2003-12-06 devnull return -1;
40 d3df3087 2003-12-06 devnull * then convert all buffers
42 d3df3087 2003-12-06 devnull s = (char*)*d + n * sizeof(Dir);
44 d3df3087 2003-12-06 devnull for(i = 0; i < ts; i += m){
45 d3df3087 2003-12-06 devnull m = BIT16SZ + GBIT16((uchar*)&buf[i]);
46 d3df3087 2003-12-06 devnull if(nn >= n || convM2D(&buf[i], m, *d + nn, s) != m){
47 d3df3087 2003-12-06 devnull free(*d);
48 d3df3087 2003-12-06 devnull *d = nil;
49 d3df3087 2003-12-06 devnull return -1;
55 d3df3087 2003-12-06 devnull return nn;
59 d3df3087 2003-12-06 devnull fsdirread(Fid *fid, Dir **d)
61 d3df3087 2003-12-06 devnull uchar *buf;
64 d3df3087 2003-12-06 devnull buf = malloc(DIRMAX);
65 d3df3087 2003-12-06 devnull if(buf == nil)
66 d3df3087 2003-12-06 devnull return -1;
67 d3df3087 2003-12-06 devnull ts = fsread(fid, buf, DIRMAX);
68 d3df3087 2003-12-06 devnull if(ts >= 0)
69 d3df3087 2003-12-06 devnull ts = dirpackage(buf, ts, d);
70 d3df3087 2003-12-06 devnull free(buf);
71 d3df3087 2003-12-06 devnull return ts;
75 d3df3087 2003-12-06 devnull fsdirreadall(Fid *fid, Dir **d)
77 d3df3087 2003-12-06 devnull uchar *buf, *nbuf;
78 d3df3087 2003-12-06 devnull long n, ts;
80 d3df3087 2003-12-06 devnull buf = nil;
83 d3df3087 2003-12-06 devnull nbuf = realloc(buf, ts+DIRMAX);
84 d3df3087 2003-12-06 devnull if(nbuf == nil){
85 d3df3087 2003-12-06 devnull free(buf);
86 d3df3087 2003-12-06 devnull return -1;
88 d3df3087 2003-12-06 devnull buf = nbuf;
89 d3df3087 2003-12-06 devnull n = fsread(fid, buf+ts, DIRMAX);
90 d3df3087 2003-12-06 devnull if(n <= 0)
94 d3df3087 2003-12-06 devnull if(ts >= 0)
95 d3df3087 2003-12-06 devnull ts = dirpackage(buf, ts, d);
96 d3df3087 2003-12-06 devnull free(buf);
97 d3df3087 2003-12-06 devnull if(ts == 0 && n < 0)
98 d3df3087 2003-12-06 devnull return -1;
99 d3df3087 2003-12-06 devnull return ts;