Blame


1 d3df3087 2003-12-06 devnull #include <u.h>
2 d3df3087 2003-12-06 devnull #include <libc.h>
3 d3df3087 2003-12-06 devnull #include <fcall.h>
4 d3df3087 2003-12-06 devnull
5 d3df3087 2003-12-06 devnull int
6 fb941e08 2005-09-13 devnull statchecku(uchar *buf, uint nbuf, int dotu)
7 d3df3087 2003-12-06 devnull {
8 d3df3087 2003-12-06 devnull uchar *ebuf;
9 fb941e08 2005-09-13 devnull int i, nstr;
10 d3df3087 2003-12-06 devnull
11 d3df3087 2003-12-06 devnull ebuf = buf + nbuf;
12 d3df3087 2003-12-06 devnull
13 d3df3087 2003-12-06 devnull if(nbuf < STATFIXLEN || nbuf != BIT16SZ + GBIT16(buf))
14 d3df3087 2003-12-06 devnull return -1;
15 d3df3087 2003-12-06 devnull
16 d3df3087 2003-12-06 devnull buf += STATFIXLEN - 4 * BIT16SZ;
17 d3df3087 2003-12-06 devnull
18 fb941e08 2005-09-13 devnull nstr = 4;
19 fb941e08 2005-09-13 devnull if(dotu)
20 fb941e08 2005-09-13 devnull nstr = 5;
21 fb941e08 2005-09-13 devnull for(i = 0; i < nstr; i++){
22 d3df3087 2003-12-06 devnull if(buf + BIT16SZ > ebuf)
23 d3df3087 2003-12-06 devnull return -1;
24 d3df3087 2003-12-06 devnull buf += BIT16SZ + GBIT16(buf);
25 d3df3087 2003-12-06 devnull }
26 d3df3087 2003-12-06 devnull
27 fb941e08 2005-09-13 devnull if(dotu)
28 fb941e08 2005-09-13 devnull buf += 3*BIT32SZ;
29 fb941e08 2005-09-13 devnull
30 d3df3087 2003-12-06 devnull if(buf != ebuf)
31 d3df3087 2003-12-06 devnull return -1;
32 d3df3087 2003-12-06 devnull
33 d3df3087 2003-12-06 devnull return 0;
34 d3df3087 2003-12-06 devnull }
35 d3df3087 2003-12-06 devnull
36 3ce03fac 2005-09-13 devnull int
37 3ce03fac 2005-09-13 devnull statcheck(uchar *buf, uint nbuf)
38 3ce03fac 2005-09-13 devnull {
39 3ce03fac 2005-09-13 devnull return statchecku(buf, nbuf, 0);
40 3ce03fac 2005-09-13 devnull }
41 3ce03fac 2005-09-13 devnull
42 d3df3087 2003-12-06 devnull static char nullstring[] = "";
43 d3df3087 2003-12-06 devnull
44 d3df3087 2003-12-06 devnull uint
45 fb941e08 2005-09-13 devnull convM2Du(uchar *buf, uint nbuf, Dir *d, char *strs, int dotu)
46 d3df3087 2003-12-06 devnull {
47 d3df3087 2003-12-06 devnull uchar *p, *ebuf;
48 fb941e08 2005-09-13 devnull char *sv[5];
49 fb941e08 2005-09-13 devnull int i, ns, nstr;
50 d3df3087 2003-12-06 devnull
51 d3df3087 2003-12-06 devnull if(nbuf < STATFIXLEN)
52 d3df3087 2003-12-06 devnull return 0;
53 d3df3087 2003-12-06 devnull
54 d3df3087 2003-12-06 devnull p = buf;
55 d3df3087 2003-12-06 devnull ebuf = buf + nbuf;
56 d3df3087 2003-12-06 devnull
57 d3df3087 2003-12-06 devnull p += BIT16SZ; /* ignore size */
58 d3df3087 2003-12-06 devnull d->type = GBIT16(p);
59 d3df3087 2003-12-06 devnull p += BIT16SZ;
60 d3df3087 2003-12-06 devnull d->dev = GBIT32(p);
61 d3df3087 2003-12-06 devnull p += BIT32SZ;
62 d3df3087 2003-12-06 devnull d->qid.type = GBIT8(p);
63 d3df3087 2003-12-06 devnull p += BIT8SZ;
64 d3df3087 2003-12-06 devnull d->qid.vers = GBIT32(p);
65 d3df3087 2003-12-06 devnull p += BIT32SZ;
66 d3df3087 2003-12-06 devnull d->qid.path = GBIT64(p);
67 d3df3087 2003-12-06 devnull p += BIT64SZ;
68 d3df3087 2003-12-06 devnull d->mode = GBIT32(p);
69 d3df3087 2003-12-06 devnull p += BIT32SZ;
70 d3df3087 2003-12-06 devnull d->atime = GBIT32(p);
71 d3df3087 2003-12-06 devnull p += BIT32SZ;
72 d3df3087 2003-12-06 devnull d->mtime = GBIT32(p);
73 d3df3087 2003-12-06 devnull p += BIT32SZ;
74 d3df3087 2003-12-06 devnull d->length = GBIT64(p);
75 d3df3087 2003-12-06 devnull p += BIT64SZ;
76 d3df3087 2003-12-06 devnull
77 fb941e08 2005-09-13 devnull nstr = 4;
78 fb941e08 2005-09-13 devnull if(dotu)
79 fb941e08 2005-09-13 devnull nstr = 5;
80 fb941e08 2005-09-13 devnull for(i = 0; i < nstr; i++){
81 d3df3087 2003-12-06 devnull if(p + BIT16SZ > ebuf)
82 d3df3087 2003-12-06 devnull return 0;
83 d3df3087 2003-12-06 devnull ns = GBIT16(p);
84 d3df3087 2003-12-06 devnull p += BIT16SZ;
85 d3df3087 2003-12-06 devnull if(p + ns > ebuf)
86 d3df3087 2003-12-06 devnull return 0;
87 d3df3087 2003-12-06 devnull if(strs){
88 d3df3087 2003-12-06 devnull sv[i] = strs;
89 d3df3087 2003-12-06 devnull memmove(strs, p, ns);
90 d3df3087 2003-12-06 devnull strs += ns;
91 d3df3087 2003-12-06 devnull *strs++ = '\0';
92 d3df3087 2003-12-06 devnull }
93 d3df3087 2003-12-06 devnull p += ns;
94 d3df3087 2003-12-06 devnull }
95 d3df3087 2003-12-06 devnull
96 fb941e08 2005-09-13 devnull if(dotu){
97 fb941e08 2005-09-13 devnull if(p + BIT32SZ*3 > ebuf)
98 fb941e08 2005-09-13 devnull return 0;
99 fb941e08 2005-09-13 devnull d->uidnum = GBIT32(p);
100 fb941e08 2005-09-13 devnull p += BIT32SZ;
101 fb941e08 2005-09-13 devnull d->gidnum = GBIT32(p);
102 fb941e08 2005-09-13 devnull p += BIT32SZ;
103 fb941e08 2005-09-13 devnull d->muidnum = GBIT32(p);
104 fb941e08 2005-09-13 devnull p += BIT32SZ;
105 fb941e08 2005-09-13 devnull }
106 fb941e08 2005-09-13 devnull
107 d3df3087 2003-12-06 devnull if(strs){
108 d3df3087 2003-12-06 devnull d->name = sv[0];
109 d3df3087 2003-12-06 devnull d->uid = sv[1];
110 d3df3087 2003-12-06 devnull d->gid = sv[2];
111 d3df3087 2003-12-06 devnull d->muid = sv[3];
112 fb941e08 2005-09-13 devnull d->ext = nullstring;
113 fb941e08 2005-09-13 devnull if(dotu)
114 fb941e08 2005-09-13 devnull d->ext = sv[4];
115 d3df3087 2003-12-06 devnull }else{
116 d3df3087 2003-12-06 devnull d->name = nullstring;
117 d3df3087 2003-12-06 devnull d->uid = nullstring;
118 d3df3087 2003-12-06 devnull d->gid = nullstring;
119 d3df3087 2003-12-06 devnull d->muid = nullstring;
120 fb941e08 2005-09-13 devnull d->ext = nullstring;
121 d3df3087 2003-12-06 devnull }
122 d3df3087 2003-12-06 devnull
123 d3df3087 2003-12-06 devnull return p - buf;
124 d3df3087 2003-12-06 devnull }
125 fb941e08 2005-09-13 devnull
126 fb941e08 2005-09-13 devnull uint
127 fb941e08 2005-09-13 devnull convM2D(uchar *buf, uint nbuf, Dir *d, char *strs)
128 fb941e08 2005-09-13 devnull {
129 fb941e08 2005-09-13 devnull return convM2Du(buf, nbuf, d, strs, 0);
130 fb941e08 2005-09-13 devnull }