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