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