13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <fcall.h>
43e12c5d1SDavid du Colombier
59a747e4fSDavid du Colombier uint
sizeD2M(Dir * d)69a747e4fSDavid du Colombier sizeD2M(Dir *d)
73e12c5d1SDavid du Colombier {
89a747e4fSDavid du Colombier char *sv[4];
99a747e4fSDavid du Colombier int i, ns;
103e12c5d1SDavid du Colombier
119a747e4fSDavid du Colombier sv[0] = d->name;
129a747e4fSDavid du Colombier sv[1] = d->uid;
139a747e4fSDavid du Colombier sv[2] = d->gid;
149a747e4fSDavid du Colombier sv[3] = d->muid;
159a747e4fSDavid du Colombier
169a747e4fSDavid du Colombier ns = 0;
179a747e4fSDavid du Colombier for(i = 0; i < 4; i++)
189a747e4fSDavid du Colombier if(sv[i])
199a747e4fSDavid du Colombier ns += strlen(sv[i]);
209a747e4fSDavid du Colombier
219a747e4fSDavid du Colombier return STATFIXLEN + ns;
229a747e4fSDavid du Colombier }
239a747e4fSDavid du Colombier
249a747e4fSDavid du Colombier uint
convD2M(Dir * d,uchar * buf,uint nbuf)259a747e4fSDavid du Colombier convD2M(Dir *d, uchar *buf, uint nbuf)
269a747e4fSDavid du Colombier {
279a747e4fSDavid du Colombier uchar *p, *ebuf;
289a747e4fSDavid du Colombier char *sv[4];
299a747e4fSDavid du Colombier int i, ns, nsv[4], ss;
309a747e4fSDavid du Colombier
319a747e4fSDavid du Colombier if(nbuf < BIT16SZ)
329a747e4fSDavid du Colombier return 0;
339a747e4fSDavid du Colombier
349a747e4fSDavid du Colombier p = buf;
359a747e4fSDavid du Colombier ebuf = buf + nbuf;
369a747e4fSDavid du Colombier
379a747e4fSDavid du Colombier sv[0] = d->name;
389a747e4fSDavid du Colombier sv[1] = d->uid;
399a747e4fSDavid du Colombier sv[2] = d->gid;
409a747e4fSDavid du Colombier sv[3] = d->muid;
419a747e4fSDavid du Colombier
429a747e4fSDavid du Colombier ns = 0;
439a747e4fSDavid du Colombier for(i = 0; i < 4; i++){
449a747e4fSDavid du Colombier if(sv[i])
459a747e4fSDavid du Colombier nsv[i] = strlen(sv[i]);
469a747e4fSDavid du Colombier else
479a747e4fSDavid du Colombier nsv[i] = 0;
489a747e4fSDavid du Colombier ns += nsv[i];
499a747e4fSDavid du Colombier }
509a747e4fSDavid du Colombier
519a747e4fSDavid du Colombier ss = STATFIXLEN + ns;
529a747e4fSDavid du Colombier
53*5fe11e25SDavid du Colombier /* set size before erroring, so user can know how much is needed */
549a747e4fSDavid du Colombier /* note that length excludes count field itself */
559a747e4fSDavid du Colombier PBIT16(p, ss-BIT16SZ);
569a747e4fSDavid du Colombier p += BIT16SZ;
579a747e4fSDavid du Colombier
589a747e4fSDavid du Colombier if(ss > nbuf)
599a747e4fSDavid du Colombier return BIT16SZ;
609a747e4fSDavid du Colombier
619a747e4fSDavid du Colombier PBIT16(p, d->type);
629a747e4fSDavid du Colombier p += BIT16SZ;
639a747e4fSDavid du Colombier PBIT32(p, d->dev);
649a747e4fSDavid du Colombier p += BIT32SZ;
659a747e4fSDavid du Colombier PBIT8(p, d->qid.type);
669a747e4fSDavid du Colombier p += BIT8SZ;
679a747e4fSDavid du Colombier PBIT32(p, d->qid.vers);
689a747e4fSDavid du Colombier p += BIT32SZ;
699a747e4fSDavid du Colombier PBIT64(p, d->qid.path);
709a747e4fSDavid du Colombier p += BIT64SZ;
719a747e4fSDavid du Colombier PBIT32(p, d->mode);
729a747e4fSDavid du Colombier p += BIT32SZ;
739a747e4fSDavid du Colombier PBIT32(p, d->atime);
749a747e4fSDavid du Colombier p += BIT32SZ;
759a747e4fSDavid du Colombier PBIT32(p, d->mtime);
769a747e4fSDavid du Colombier p += BIT32SZ;
779a747e4fSDavid du Colombier PBIT64(p, d->length);
789a747e4fSDavid du Colombier p += BIT64SZ;
799a747e4fSDavid du Colombier
809a747e4fSDavid du Colombier for(i = 0; i < 4; i++){
819a747e4fSDavid du Colombier ns = nsv[i];
829a747e4fSDavid du Colombier if(p + ns + BIT16SZ > ebuf)
839a747e4fSDavid du Colombier return 0;
849a747e4fSDavid du Colombier PBIT16(p, ns);
859a747e4fSDavid du Colombier p += BIT16SZ;
869a747e4fSDavid du Colombier if(ns)
879a747e4fSDavid du Colombier memmove(p, sv[i], ns);
889a747e4fSDavid du Colombier p += ns;
899a747e4fSDavid du Colombier }
909a747e4fSDavid du Colombier
919a747e4fSDavid du Colombier if(ss != p - buf)
929a747e4fSDavid du Colombier return 0;
939a747e4fSDavid du Colombier
949a747e4fSDavid du Colombier return p - buf;
953e12c5d1SDavid du Colombier }
96