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