Blame


1 46f79934 2005-01-04 devnull /* Mostly copied from Plan 9's libc. */
2 46f79934 2005-01-04 devnull
3 46f79934 2005-01-04 devnull #include <u.h>
4 46f79934 2005-01-04 devnull #include <libc.h>
5 46f79934 2005-01-04 devnull #include <fcall.h>
6 46f79934 2005-01-04 devnull #include <9pclient.h>
7 46f79934 2005-01-04 devnull
8 46f79934 2005-01-04 devnull static long
9 46f79934 2005-01-04 devnull dirpackage(uchar *buf, long ts, Dir **d)
10 46f79934 2005-01-04 devnull {
11 46f79934 2005-01-04 devnull char *s;
12 46f79934 2005-01-04 devnull long ss, i, n, nn, m;
13 46f79934 2005-01-04 devnull
14 46f79934 2005-01-04 devnull *d = nil;
15 46f79934 2005-01-04 devnull if(ts <= 0)
16 46f79934 2005-01-04 devnull return 0;
17 46f79934 2005-01-04 devnull
18 46f79934 2005-01-04 devnull /*
19 46f79934 2005-01-04 devnull * first find number of all stats, check they look like stats, & size all associated strings
20 46f79934 2005-01-04 devnull */
21 46f79934 2005-01-04 devnull ss = 0;
22 46f79934 2005-01-04 devnull n = 0;
23 46f79934 2005-01-04 devnull for(i = 0; i < ts; i += m){
24 46f79934 2005-01-04 devnull m = BIT16SZ + GBIT16(&buf[i]);
25 46f79934 2005-01-04 devnull if(statcheck(&buf[i], m) < 0)
26 46f79934 2005-01-04 devnull break;
27 46f79934 2005-01-04 devnull ss += m;
28 46f79934 2005-01-04 devnull n++;
29 46f79934 2005-01-04 devnull }
30 46f79934 2005-01-04 devnull
31 46f79934 2005-01-04 devnull if(i != ts)
32 46f79934 2005-01-04 devnull return -1;
33 46f79934 2005-01-04 devnull
34 46f79934 2005-01-04 devnull *d = malloc(n * sizeof(Dir) + ss);
35 46f79934 2005-01-04 devnull if(*d == nil)
36 46f79934 2005-01-04 devnull return -1;
37 46f79934 2005-01-04 devnull
38 46f79934 2005-01-04 devnull /*
39 46f79934 2005-01-04 devnull * then convert all buffers
40 46f79934 2005-01-04 devnull */
41 46f79934 2005-01-04 devnull s = (char*)*d + n * sizeof(Dir);
42 46f79934 2005-01-04 devnull nn = 0;
43 46f79934 2005-01-04 devnull for(i = 0; i < ts; i += m){
44 46f79934 2005-01-04 devnull m = BIT16SZ + GBIT16((uchar*)&buf[i]);
45 46f79934 2005-01-04 devnull if(nn >= n || convM2D(&buf[i], m, *d + nn, s) != m){
46 46f79934 2005-01-04 devnull free(*d);
47 46f79934 2005-01-04 devnull *d = nil;
48 46f79934 2005-01-04 devnull return -1;
49 46f79934 2005-01-04 devnull }
50 46f79934 2005-01-04 devnull nn++;
51 46f79934 2005-01-04 devnull s += m;
52 46f79934 2005-01-04 devnull }
53 46f79934 2005-01-04 devnull
54 46f79934 2005-01-04 devnull return nn;
55 46f79934 2005-01-04 devnull }
56 46f79934 2005-01-04 devnull
57 46f79934 2005-01-04 devnull long
58 46f79934 2005-01-04 devnull fsdirread(CFid *fid, Dir **d)
59 46f79934 2005-01-04 devnull {
60 46f79934 2005-01-04 devnull uchar *buf;
61 46f79934 2005-01-04 devnull long ts;
62 46f79934 2005-01-04 devnull
63 46f79934 2005-01-04 devnull buf = malloc(DIRMAX);
64 46f79934 2005-01-04 devnull if(buf == nil)
65 46f79934 2005-01-04 devnull return -1;
66 46f79934 2005-01-04 devnull ts = fsread(fid, buf, DIRMAX);
67 46f79934 2005-01-04 devnull if(ts >= 0)
68 46f79934 2005-01-04 devnull ts = dirpackage(buf, ts, d);
69 46f79934 2005-01-04 devnull free(buf);
70 46f79934 2005-01-04 devnull return ts;
71 46f79934 2005-01-04 devnull }
72 46f79934 2005-01-04 devnull
73 46f79934 2005-01-04 devnull long
74 46f79934 2005-01-04 devnull fsdirreadall(CFid *fid, Dir **d)
75 46f79934 2005-01-04 devnull {
76 46f79934 2005-01-04 devnull uchar *buf, *nbuf;
77 46f79934 2005-01-04 devnull long n, ts;
78 46f79934 2005-01-04 devnull
79 46f79934 2005-01-04 devnull buf = nil;
80 46f79934 2005-01-04 devnull ts = 0;
81 46f79934 2005-01-04 devnull for(;;){
82 46f79934 2005-01-04 devnull nbuf = realloc(buf, ts+DIRMAX);
83 46f79934 2005-01-04 devnull if(nbuf == nil){
84 46f79934 2005-01-04 devnull free(buf);
85 46f79934 2005-01-04 devnull return -1;
86 46f79934 2005-01-04 devnull }
87 46f79934 2005-01-04 devnull buf = nbuf;
88 46f79934 2005-01-04 devnull n = fsread(fid, buf+ts, DIRMAX);
89 46f79934 2005-01-04 devnull if(n <= 0)
90 46f79934 2005-01-04 devnull break;
91 46f79934 2005-01-04 devnull ts += n;
92 46f79934 2005-01-04 devnull }
93 46f79934 2005-01-04 devnull if(ts >= 0)
94 46f79934 2005-01-04 devnull ts = dirpackage(buf, ts, d);
95 46f79934 2005-01-04 devnull free(buf);
96 46f79934 2005-01-04 devnull if(ts == 0 && n < 0)
97 46f79934 2005-01-04 devnull return -1;
98 46f79934 2005-01-04 devnull return ts;
99 46f79934 2005-01-04 devnull }