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