Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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