]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/unix/u9fs/convD2M.c
c630b1b9327b11fa39fc0b9093d362262a9980ba
[plan9front.git] / sys / src / cmd / unix / u9fs / convD2M.c
1 #include        <plan9.h>
2 #include        <fcall.h>
3
4 uint
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
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 }