blob: 6f4b4bd935bef68910883fe15680609ff24489f0 [file] [log] [blame]
rscd3df3082003-12-06 18:08:52 +00001#include <u.h>
2#include <libc.h>
3#include <fcall.h>
4
5int
6statcheck(uchar *buf, uint nbuf)
7{
8 uchar *ebuf;
9 int i;
10
11 ebuf = buf + nbuf;
12
13 if(nbuf < STATFIXLEN || nbuf != BIT16SZ + GBIT16(buf))
14 return -1;
15
16 buf += STATFIXLEN - 4 * BIT16SZ;
17
18 for(i = 0; i < 4; i++){
19 if(buf + BIT16SZ > ebuf)
20 return -1;
21 buf += BIT16SZ + GBIT16(buf);
22 }
23
24 if(buf != ebuf)
25 return -1;
26
27 return 0;
28}
29
30static char nullstring[] = "";
31
32uint
33convM2D(uchar *buf, uint nbuf, Dir *d, char *strs)
34{
35 uchar *p, *ebuf;
36 char *sv[4];
37 int i, ns;
38
39 if(nbuf < STATFIXLEN)
40 return 0;
41
42 p = buf;
43 ebuf = buf + nbuf;
44
45 p += BIT16SZ; /* ignore size */
46 d->type = GBIT16(p);
47 p += BIT16SZ;
48 d->dev = GBIT32(p);
49 p += BIT32SZ;
50 d->qid.type = GBIT8(p);
51 p += BIT8SZ;
52 d->qid.vers = GBIT32(p);
53 p += BIT32SZ;
54 d->qid.path = GBIT64(p);
55 p += BIT64SZ;
56 d->mode = GBIT32(p);
57 p += BIT32SZ;
58 d->atime = GBIT32(p);
59 p += BIT32SZ;
60 d->mtime = GBIT32(p);
61 p += BIT32SZ;
62 d->length = GBIT64(p);
63 p += BIT64SZ;
64
65 for(i = 0; i < 4; i++){
66 if(p + BIT16SZ > ebuf)
67 return 0;
68 ns = GBIT16(p);
69 p += BIT16SZ;
70 if(p + ns > ebuf)
71 return 0;
72 if(strs){
73 sv[i] = strs;
74 memmove(strs, p, ns);
75 strs += ns;
76 *strs++ = '\0';
77 }
78 p += ns;
79 }
80
81 if(strs){
82 d->name = sv[0];
83 d->uid = sv[1];
84 d->gid = sv[2];
85 d->muid = sv[3];
86 }else{
87 d->name = nullstring;
88 d->uid = nullstring;
89 d->gid = nullstring;
90 d->muid = nullstring;
91 }
92
93 return p - buf;
94}