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