net: Change transport_header_end -> tranport_offset
[akaros.git] / kern / src / ns / convM2D.c
1 /* Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
2  * Portions Copyright © 1997-1999 Vita Nuova Limited
3  * Portions Copyright © 2000-2007 Vita Nuova Holdings Limited
4  *                                (www.vitanuova.com)
5  * Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
6  *
7  * Modified for the Akaros operating system:
8  * Copyright (c) 2013-2014 The Regents of the University of California
9  * Copyright (c) 2013-2015 Google Inc.
10  *
11  * Permission is hereby granted, free of charge, to any person obtaining a copy
12  * of this software and associated documentation files (the "Software"), to deal
13  * in the Software without restriction, including without limitation the rights
14  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15  * copies of the Software, and to permit persons to whom the Software is
16  * furnished to do so, subject to the following conditions:
17  *
18  * The above copyright notice and this permission notice shall be included in
19  * all copies or substantial portions of the Software.
20  *
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
24  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27  * SOFTWARE. */
28
29 #include <vfs.h>
30 #include <kfs.h>
31 #include <slab.h>
32 #include <kmalloc.h>
33 #include <kref.h>
34 #include <string.h>
35 #include <stdio.h>
36 #include <assert.h>
37 #include <error.h>
38 #include <cpio.h>
39 #include <pmap.h>
40 #include <smp.h>
41 #include <net/ip.h>
42
43 int statcheck(uint8_t * buf, unsigned int nbuf)
44 {
45         uint8_t *ebuf;
46         int i;
47
48         ebuf = buf + nbuf;
49
50         if (nbuf < STATFIXLEN || nbuf != BIT16SZ + GBIT16(buf)){
51                 printk("nbuf %d, STATFIXLEN %d ", nbuf, STATFIXLEN);
52                 printk("BIT16SZ %d, GBIT16(buf) %d ",
53                         BIT16SZ, GBIT16(buf));
54                 printk("This is bad!\n");
55                 return -1;
56         }
57
58         buf += STATFIXLEN - 4 * BIT16SZ;
59
60         for (i = 0; i < 4; i++) {
61                 if (buf + BIT16SZ > ebuf)
62                         return -1;
63                 buf += BIT16SZ + GBIT16(buf);
64         }
65
66         if (buf != ebuf){
67                 return -1;
68         }
69
70         return 0;
71 }
72
73 static char nullstring[] = "";
74
75 unsigned int
76 convM2D(uint8_t * buf, unsigned int nbuf, struct dir *d, char *strs)
77 {
78         uint8_t *p, *ebuf;
79         char *sv[4];
80         int i, ns;
81
82         if (nbuf < STATFIXLEN)
83                 return 0;
84
85         p = buf;
86         ebuf = buf + nbuf;
87
88         p += BIT16SZ;   /* ignore size */
89         d->type = GBIT16(p);
90         p += BIT16SZ;
91         d->dev = GBIT32(p);
92         p += BIT32SZ;
93         d->qid.type = GBIT8(p);
94         p += BIT8SZ;
95         d->qid.vers = GBIT32(p);
96         p += BIT32SZ;
97         d->qid.path = GBIT64(p);
98         p += BIT64SZ;
99         d->mode = GBIT32(p);
100         p += BIT32SZ;
101         d->atime = GBIT32(p);
102         p += BIT32SZ;
103         d->mtime = GBIT32(p);
104         p += BIT32SZ;
105         d->length = GBIT64(p);
106         p += BIT64SZ;
107
108         for (i = 0; i < 4; i++) {
109                 if (p + BIT16SZ > ebuf)
110                         return 0;
111                 ns = GBIT16(p);
112                 p += BIT16SZ;
113                 if (p + ns > ebuf)
114                         return 0;
115                 if (strs) {
116                         sv[i] = strs;
117                         memmove(strs, p, ns);
118                         strs += ns;
119                         *strs++ = '\0';
120                 }
121                 p += ns;
122         }
123
124         if (strs) {
125                 d->name = sv[0];
126                 d->uid = sv[1];
127                 d->gid = sv[2];
128                 d->muid = sv[3];
129         } else {
130                 d->name = nullstring;
131                 d->uid = nullstring;
132                 d->gid = nullstring;
133                 d->muid = nullstring;
134         }
135
136         return p - buf;
137 }