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