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