Blob


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