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