Fixes stat() #include
[akaros.git] / user / ndblib / convD2M.c
1 /* 
2  * This file is part of the UCB release of Plan 9. It is subject to the license
3  * terms in the LICENSE file found in the top-level directory of this
4  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
5  * part of the UCB release of Plan 9, including this file, may be copied,
6  * modified, propagated, or distributed except according to the terms contained
7  * in the LICENSE file.
8  */
9 #include <stdlib.h>
10
11 #include <stdio.h>
12 #include <parlib.h>
13 #include <unistd.h>
14 #include <signal.h>
15 #include <fcntl.h>
16 #include <iplib.h>
17 #include <dir.h>
18 #include <ndb.h>
19 #include <fcall.h>
20
21 unsigned int
22 sizeD2M(struct dir *d)
23 {
24         char *sv[4];
25         int i, ns;
26
27         sv[0] = d->name;
28         sv[1] = d->uid;
29         sv[2] = d->gid;
30         sv[3] = d->muid;
31
32         ns = 0;
33         for(i = 0; i < 4; i++)
34                 if(sv[i])
35                         ns += strlen(sv[i]);
36
37         return STATFIXLEN + ns;
38 }
39
40 unsigned int
41 convD2M(struct dir *d, uint8_t *buf, unsigned int nbuf)
42 {
43         uint8_t *p, *ebuf;
44         char *sv[4];
45         int i, ns, nsv[4], ss;
46
47         if(nbuf < BIT16SZ)
48                 return 0;
49
50         p = buf;
51         ebuf = buf + nbuf;
52
53         sv[0] = d->name;
54         sv[1] = d->uid;
55         sv[2] = d->gid;
56         sv[3] = d->muid;
57
58         ns = 0;
59         for(i = 0; i < 4; i++){
60                 if(sv[i])
61                         nsv[i] = strlen(sv[i]);
62                 else
63                         nsv[i] = 0;
64                 ns += nsv[i];
65         }
66
67         ss = STATFIXLEN + ns;
68
69         /* set size before erroring, so user can know how much is needed */
70         /* note that length excludes count field itself */
71         PBIT16(p, ss-BIT16SZ);
72         p += BIT16SZ;
73
74         if(ss > nbuf)
75                 return BIT16SZ;
76
77         PBIT16(p, d->type);
78         p += BIT16SZ;
79         PBIT32(p, d->dev);
80         p += BIT32SZ;
81         PBIT8(p, d->qid.type);
82         p += BIT8SZ;
83         PBIT32(p, d->qid.vers);
84         p += BIT32SZ;
85         PBIT64(p, d->qid.path);
86         p += BIT64SZ;
87         PBIT32(p, d->mode);
88         p += BIT32SZ;
89         PBIT32(p, d->atime);
90         p += BIT32SZ;
91         PBIT32(p, d->mtime);
92         p += BIT32SZ;
93         PBIT64(p, d->length);
94         p += BIT64SZ;
95
96         for(i = 0; i < 4; i++){
97                 ns = nsv[i];
98                 if(p + ns + BIT16SZ > ebuf)
99                         return 0;
100                 PBIT16(p, ns);
101                 p += BIT16SZ;
102                 if(ns)
103                         memmove(p, sv[i], ns);
104                 p += ns;
105         }
106
107         if(ss != p - buf)
108                 return 0;
109
110         return p - buf;
111 }