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>
6 d3df3087 2003-12-06 devnull statcheck(uchar *buf, uint nbuf)
8 d3df3087 2003-12-06 devnull uchar *ebuf;
11 d3df3087 2003-12-06 devnull ebuf = buf + nbuf;
13 d3df3087 2003-12-06 devnull if(nbuf < STATFIXLEN || nbuf != BIT16SZ + GBIT16(buf))
14 d3df3087 2003-12-06 devnull return -1;
16 d3df3087 2003-12-06 devnull buf += STATFIXLEN - 4 * BIT16SZ;
18 d3df3087 2003-12-06 devnull for(i = 0; i < 4; i++){
19 d3df3087 2003-12-06 devnull if(buf + BIT16SZ > ebuf)
20 d3df3087 2003-12-06 devnull return -1;
21 d3df3087 2003-12-06 devnull buf += BIT16SZ + GBIT16(buf);
24 d3df3087 2003-12-06 devnull if(buf != ebuf)
25 d3df3087 2003-12-06 devnull return -1;
27 d3df3087 2003-12-06 devnull return 0;
30 d3df3087 2003-12-06 devnull static char nullstring[] = "";
33 d3df3087 2003-12-06 devnull convM2D(uchar *buf, uint nbuf, Dir *d, char *strs)
35 d3df3087 2003-12-06 devnull uchar *p, *ebuf;
36 d3df3087 2003-12-06 devnull char *sv[4];
37 d3df3087 2003-12-06 devnull int i, ns;
39 d3df3087 2003-12-06 devnull if(nbuf < STATFIXLEN)
40 d3df3087 2003-12-06 devnull return 0;
43 d3df3087 2003-12-06 devnull ebuf = buf + nbuf;
45 d3df3087 2003-12-06 devnull p += BIT16SZ; /* ignore size */
46 d3df3087 2003-12-06 devnull d->type = GBIT16(p);
47 d3df3087 2003-12-06 devnull p += BIT16SZ;
48 d3df3087 2003-12-06 devnull d->dev = GBIT32(p);
49 d3df3087 2003-12-06 devnull p += BIT32SZ;
50 d3df3087 2003-12-06 devnull d->qid.type = GBIT8(p);
51 d3df3087 2003-12-06 devnull p += BIT8SZ;
52 d3df3087 2003-12-06 devnull d->qid.vers = GBIT32(p);
53 d3df3087 2003-12-06 devnull p += BIT32SZ;
54 d3df3087 2003-12-06 devnull d->qid.path = GBIT64(p);
55 d3df3087 2003-12-06 devnull p += BIT64SZ;
56 d3df3087 2003-12-06 devnull d->mode = GBIT32(p);
57 d3df3087 2003-12-06 devnull p += BIT32SZ;
58 d3df3087 2003-12-06 devnull d->atime = GBIT32(p);
59 d3df3087 2003-12-06 devnull p += BIT32SZ;
60 d3df3087 2003-12-06 devnull d->mtime = GBIT32(p);
61 d3df3087 2003-12-06 devnull p += BIT32SZ;
62 d3df3087 2003-12-06 devnull d->length = GBIT64(p);
63 d3df3087 2003-12-06 devnull p += BIT64SZ;
65 d3df3087 2003-12-06 devnull for(i = 0; i < 4; i++){
66 d3df3087 2003-12-06 devnull if(p + BIT16SZ > ebuf)
67 d3df3087 2003-12-06 devnull return 0;
68 d3df3087 2003-12-06 devnull ns = GBIT16(p);
69 d3df3087 2003-12-06 devnull p += BIT16SZ;
70 d3df3087 2003-12-06 devnull if(p + ns > ebuf)
71 d3df3087 2003-12-06 devnull return 0;
72 d3df3087 2003-12-06 devnull if(strs){
73 d3df3087 2003-12-06 devnull sv[i] = strs;
74 d3df3087 2003-12-06 devnull memmove(strs, p, ns);
75 d3df3087 2003-12-06 devnull strs += ns;
76 d3df3087 2003-12-06 devnull *strs++ = '\0';
81 d3df3087 2003-12-06 devnull if(strs){
82 d3df3087 2003-12-06 devnull d->name = sv[0];
83 d3df3087 2003-12-06 devnull d->uid = sv[1];
84 d3df3087 2003-12-06 devnull d->gid = sv[2];
85 d3df3087 2003-12-06 devnull d->muid = sv[3];
87 d3df3087 2003-12-06 devnull d->name = nullstring;
88 d3df3087 2003-12-06 devnull d->uid = nullstring;
89 d3df3087 2003-12-06 devnull d->gid = nullstring;
90 d3df3087 2003-12-06 devnull d->muid = nullstring;
93 d3df3087 2003-12-06 devnull return p - buf;