1 #include	<u.h>
2 #include	<libc.h>
3 #include	<fcall.h>
4 
5 int
statcheck(uchar * buf,uint nbuf)6 statcheck(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 
30 static char nullstring[] = "";
31 
32 uint
convM2D(uchar * buf,uint nbuf,Dir * d,char * strs)33 convM2D(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 }
95