Blame


1 d3df3087 2003-12-06 devnull /* Mostly copied from Plan 9's libc. */
2 d3df3087 2003-12-06 devnull
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>
7 d3df3087 2003-12-06 devnull
8 d3df3087 2003-12-06 devnull static
9 d3df3087 2003-12-06 devnull long
10 d3df3087 2003-12-06 devnull dirpackage(uchar *buf, long ts, Dir **d)
11 d3df3087 2003-12-06 devnull {
12 d3df3087 2003-12-06 devnull char *s;
13 d3df3087 2003-12-06 devnull long ss, i, n, nn, m;
14 d3df3087 2003-12-06 devnull
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;
18 d3df3087 2003-12-06 devnull
19 d3df3087 2003-12-06 devnull /*
20 d3df3087 2003-12-06 devnull * first find number of all stats, check they look like stats, & size all associated strings
21 d3df3087 2003-12-06 devnull */
22 d3df3087 2003-12-06 devnull ss = 0;
23 d3df3087 2003-12-06 devnull n = 0;
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)
27 d3df3087 2003-12-06 devnull break;
28 d3df3087 2003-12-06 devnull ss += m;
29 d3df3087 2003-12-06 devnull n++;
30 d3df3087 2003-12-06 devnull }
31 d3df3087 2003-12-06 devnull
32 d3df3087 2003-12-06 devnull if(i != ts)
33 d3df3087 2003-12-06 devnull return -1;
34 d3df3087 2003-12-06 devnull
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;
38 d3df3087 2003-12-06 devnull
39 d3df3087 2003-12-06 devnull /*
40 d3df3087 2003-12-06 devnull * then convert all buffers
41 d3df3087 2003-12-06 devnull */
42 d3df3087 2003-12-06 devnull s = (char*)*d + n * sizeof(Dir);
43 d3df3087 2003-12-06 devnull nn = 0;
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;
50 d3df3087 2003-12-06 devnull }
51 d3df3087 2003-12-06 devnull nn++;
52 d3df3087 2003-12-06 devnull s += m;
53 d3df3087 2003-12-06 devnull }
54 d3df3087 2003-12-06 devnull
55 d3df3087 2003-12-06 devnull return nn;
56 d3df3087 2003-12-06 devnull }
57 d3df3087 2003-12-06 devnull
58 d3df3087 2003-12-06 devnull long
59 d3df3087 2003-12-06 devnull fsdirread(Fid *fid, Dir **d)
60 d3df3087 2003-12-06 devnull {
61 d3df3087 2003-12-06 devnull uchar *buf;
62 d3df3087 2003-12-06 devnull long ts;
63 d3df3087 2003-12-06 devnull
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;
72 d3df3087 2003-12-06 devnull }
73 d3df3087 2003-12-06 devnull
74 d3df3087 2003-12-06 devnull long
75 d3df3087 2003-12-06 devnull fsdirreadall(Fid *fid, Dir **d)
76 d3df3087 2003-12-06 devnull {
77 d3df3087 2003-12-06 devnull uchar *buf, *nbuf;
78 d3df3087 2003-12-06 devnull long n, ts;
79 d3df3087 2003-12-06 devnull
80 d3df3087 2003-12-06 devnull buf = nil;
81 d3df3087 2003-12-06 devnull ts = 0;
82 d3df3087 2003-12-06 devnull for(;;){
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;
87 d3df3087 2003-12-06 devnull }
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)
91 d3df3087 2003-12-06 devnull break;
92 d3df3087 2003-12-06 devnull ts += n;
93 d3df3087 2003-12-06 devnull }
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;
100 d3df3087 2003-12-06 devnull }