xref: /plan9/sys/src/cmd/unix/u9fs/convD2M.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1 #include	<plan9.h>
2 #include	<fcall.h>
3 
4 uint
sizeD2M(Dir * d)5 sizeD2M(Dir *d)
6 {
7 	char *sv[4];
8 	int i, ns;
9 
10 	sv[0] = d->name;
11 	sv[1] = d->uid;
12 	sv[2] = d->gid;
13 	sv[3] = d->muid;
14 
15 	ns = 0;
16 	for(i = 0; i < 4; i++)
17 		ns += strlen(sv[i]);
18 
19 	return STATFIXLEN + ns;
20 }
21 
22 uint
convD2M(Dir * d,uchar * buf,uint nbuf)23 convD2M(Dir *d, uchar *buf, uint nbuf)
24 {
25 	uchar *p, *ebuf;
26 	char *sv[4];
27 	int i, ns, nsv[4], ss;
28 
29 	if(nbuf < BIT16SZ)
30 		return 0;
31 
32 	p = buf;
33 	ebuf = buf + nbuf;
34 
35 	sv[0] = d->name;
36 	sv[1] = d->uid;
37 	sv[2] = d->gid;
38 	sv[3] = d->muid;
39 
40 	ns = 0;
41 	for(i = 0; i < 4; i++){
42 		nsv[i] = strlen(sv[i]);
43 		ns += nsv[i];
44 	}
45 
46 	ss = STATFIXLEN + ns;
47 
48 	/* set size befor erroring, so user can know how much is needed */
49 	/* note that length excludes count field itself */
50 	PBIT16(p, ss-BIT16SZ);
51 	p += BIT16SZ;
52 
53 	if(ss > nbuf)
54 		return BIT16SZ;
55 
56 	PBIT16(p, d->type);
57 	p += BIT16SZ;
58 	PBIT32(p, d->dev);
59 	p += BIT32SZ;
60 	PBIT8(p, d->qid.type);
61 	p += BIT8SZ;
62 	PBIT32(p, d->qid.vers);
63 	p += BIT32SZ;
64 	PBIT64(p, d->qid.path);
65 	p += BIT64SZ;
66 	PBIT32(p, d->mode);
67 	p += BIT32SZ;
68 	PBIT32(p, d->atime);
69 	p += BIT32SZ;
70 	PBIT32(p, d->mtime);
71 	p += BIT32SZ;
72 	PBIT64(p, d->length);
73 	p += BIT64SZ;
74 
75 	for(i = 0; i < 4; i++){
76 		ns = nsv[i];
77 		if(p + ns + BIT16SZ > ebuf)
78 			return 0;
79 		PBIT16(p, ns);
80 		p += BIT16SZ;
81 		memmove(p, sv[i], ns);
82 		p += ns;
83 	}
84 
85 	if(ss != p - buf)
86 		return 0;
87 
88 	return p - buf;
89 }
90