Blame


1 fb1a36c0 2022-01-09 op /*
2 fb1a36c0 2022-01-09 op * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
3 fb1a36c0 2022-01-09 op *
4 fb1a36c0 2022-01-09 op * Permission to use, copy, modify, and distribute this software for any
5 fb1a36c0 2022-01-09 op * purpose with or without fee is hereby granted, provided that the above
6 fb1a36c0 2022-01-09 op * copyright notice and this permission notice appear in all copies.
7 fb1a36c0 2022-01-09 op *
8 fb1a36c0 2022-01-09 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 fb1a36c0 2022-01-09 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 fb1a36c0 2022-01-09 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 fb1a36c0 2022-01-09 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 fb1a36c0 2022-01-09 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 fb1a36c0 2022-01-09 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 fb1a36c0 2022-01-09 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 fb1a36c0 2022-01-09 op */
16 fb1a36c0 2022-01-09 op
17 bbcba3ed 2022-01-10 op #include "compat.h"
18 bbcba3ed 2022-01-10 op
19 fb1a36c0 2022-01-09 op #include <endian.h>
20 fb1a36c0 2022-01-09 op #include <inttypes.h>
21 fb1a36c0 2022-01-09 op #include <string.h>
22 fb1a36c0 2022-01-09 op
23 fb1a36c0 2022-01-09 op #include "kami.h"
24 fb1a36c0 2022-01-09 op #include "log.h"
25 fb1a36c0 2022-01-09 op #include "utils.h"
26 fb1a36c0 2022-01-09 op
27 4e93fcbd 2022-01-17 op #include "9pclib.h"
28 4e93fcbd 2022-01-17 op
29 fb1a36c0 2022-01-09 op uint16_t iota_tag;
30 fb1a36c0 2022-01-09 op
31 fb1a36c0 2022-01-09 op struct evbuffer *evb;
32 fb1a36c0 2022-01-09 op
33 fb1a36c0 2022-01-09 op void
34 fb1a36c0 2022-01-09 op write_hdr(uint32_t len, uint8_t type, uint16_t tag)
35 fb1a36c0 2022-01-09 op {
36 fb1a36c0 2022-01-09 op len += HEADERSIZE;
37 fb1a36c0 2022-01-09 op
38 fb1a36c0 2022-01-09 op log_debug("enqueuing a packet; len=%"PRIu32" type=%d[%s] tag=%d",
39 fb1a36c0 2022-01-09 op len, type, pp_msg_type(type), tag);
40 fb1a36c0 2022-01-09 op
41 fb1a36c0 2022-01-09 op len = htole32(len);
42 fb1a36c0 2022-01-09 op /* type is one byte, no endiannes issues */
43 fb1a36c0 2022-01-09 op tag = htole16(tag);
44 fb1a36c0 2022-01-09 op
45 fb1a36c0 2022-01-09 op evbuffer_add(evb, &len, sizeof(len));
46 fb1a36c0 2022-01-09 op evbuffer_add(evb, &type, sizeof(type));
47 fb1a36c0 2022-01-09 op evbuffer_add(evb, &tag, sizeof(tag));
48 fb1a36c0 2022-01-09 op }
49 fb1a36c0 2022-01-09 op
50 fb1a36c0 2022-01-09 op void
51 fb1a36c0 2022-01-09 op write_hdr_auto(uint32_t len, uint8_t type)
52 fb1a36c0 2022-01-09 op {
53 fb1a36c0 2022-01-09 op if (++iota_tag == NOTAG)
54 fb1a36c0 2022-01-09 op ++iota_tag;
55 fb1a36c0 2022-01-09 op write_hdr(len, type, iota_tag);
56 fb1a36c0 2022-01-09 op }
57 fb1a36c0 2022-01-09 op
58 fb1a36c0 2022-01-09 op void
59 fb1a36c0 2022-01-09 op write_str(uint16_t len, const char *str)
60 fb1a36c0 2022-01-09 op {
61 fb1a36c0 2022-01-09 op uint16_t l = len;
62 fb1a36c0 2022-01-09 op
63 fb1a36c0 2022-01-09 op len = htole16(len);
64 fb1a36c0 2022-01-09 op evbuffer_add(evb, &len, sizeof(len));
65 fb1a36c0 2022-01-09 op evbuffer_add(evb, str, l);
66 fb1a36c0 2022-01-09 op }
67 fb1a36c0 2022-01-09 op
68 fb1a36c0 2022-01-09 op void
69 fb1a36c0 2022-01-09 op write_str_auto(const char *str)
70 fb1a36c0 2022-01-09 op {
71 4e93fcbd 2022-01-17 op if (str == NULL)
72 4e93fcbd 2022-01-17 op write_16(0);
73 4e93fcbd 2022-01-17 op else
74 4e93fcbd 2022-01-17 op write_str(strlen(str), str);
75 fb1a36c0 2022-01-09 op }
76 fb1a36c0 2022-01-09 op
77 fb1a36c0 2022-01-09 op void
78 fb1a36c0 2022-01-09 op write_buf(const void *d, uint32_t len)
79 fb1a36c0 2022-01-09 op {
80 fb1a36c0 2022-01-09 op write_32(len);
81 fb1a36c0 2022-01-09 op evbuffer_add(evb, d, len);
82 fb1a36c0 2022-01-09 op }
83 fb1a36c0 2022-01-09 op
84 fb1a36c0 2022-01-09 op void
85 fb1a36c0 2022-01-09 op write_64(uint64_t x)
86 fb1a36c0 2022-01-09 op {
87 fb1a36c0 2022-01-09 op x = htole64(x);
88 fb1a36c0 2022-01-09 op evbuffer_add(evb, &x, sizeof(x));
89 fb1a36c0 2022-01-09 op }
90 fb1a36c0 2022-01-09 op
91 fb1a36c0 2022-01-09 op void
92 fb1a36c0 2022-01-09 op write_32(uint32_t fid)
93 fb1a36c0 2022-01-09 op {
94 fb1a36c0 2022-01-09 op fid = htole32(fid);
95 fb1a36c0 2022-01-09 op evbuffer_add(evb, &fid, sizeof(fid));
96 fb1a36c0 2022-01-09 op }
97 fb1a36c0 2022-01-09 op
98 fb1a36c0 2022-01-09 op void
99 fb1a36c0 2022-01-09 op write_16(uint16_t tag)
100 fb1a36c0 2022-01-09 op {
101 fb1a36c0 2022-01-09 op tag = htole16(tag);
102 fb1a36c0 2022-01-09 op evbuffer_add(evb, &tag, sizeof(tag));
103 fb1a36c0 2022-01-09 op }
104 fb1a36c0 2022-01-09 op
105 fb1a36c0 2022-01-09 op void
106 fb1a36c0 2022-01-09 op write_8(uint8_t x)
107 fb1a36c0 2022-01-09 op {
108 fb1a36c0 2022-01-09 op evbuffer_add(evb, &x, sizeof(x));
109 fb1a36c0 2022-01-09 op }
110 fb1a36c0 2022-01-09 op
111 fb1a36c0 2022-01-09 op
112 fb1a36c0 2022-01-09 op
113 fb1a36c0 2022-01-09 op void
114 fb1a36c0 2022-01-09 op tversion(const char *v, uint32_t msize)
115 fb1a36c0 2022-01-09 op {
116 fb1a36c0 2022-01-09 op uint32_t len;
117 fb1a36c0 2022-01-09 op uint16_t sl;
118 fb1a36c0 2022-01-09 op
119 fb1a36c0 2022-01-09 op sl = strlen(v);
120 fb1a36c0 2022-01-09 op
121 fb1a36c0 2022-01-09 op /* msize[4] version[s] */
122 fb1a36c0 2022-01-09 op len = sizeof(msize) + sizeof(sl) + sl;
123 fb1a36c0 2022-01-09 op write_hdr(len, Tversion, NOTAG);
124 fb1a36c0 2022-01-09 op write_32(msize);
125 fb1a36c0 2022-01-09 op write_str(sl, v);
126 fb1a36c0 2022-01-09 op }
127 fb1a36c0 2022-01-09 op
128 fb1a36c0 2022-01-09 op void
129 fb1a36c0 2022-01-09 op tattach(uint32_t fid, uint32_t afid, const char *uname, const char *aname)
130 fb1a36c0 2022-01-09 op {
131 fb1a36c0 2022-01-09 op uint32_t len;
132 fb1a36c0 2022-01-09 op uint16_t ul, al;
133 fb1a36c0 2022-01-09 op
134 fb1a36c0 2022-01-09 op ul = strlen(uname);
135 fb1a36c0 2022-01-09 op al = strlen(aname);
136 fb1a36c0 2022-01-09 op
137 fb1a36c0 2022-01-09 op /* fid[4] afid[4] uname[s] aname[s] */
138 fb1a36c0 2022-01-09 op len = sizeof(fid) + sizeof(afid) + sizeof(ul) + ul
139 fb1a36c0 2022-01-09 op + sizeof(al) + al;
140 fb1a36c0 2022-01-09 op write_hdr_auto(len, Tattach);
141 fb1a36c0 2022-01-09 op write_fid(fid);
142 fb1a36c0 2022-01-09 op write_fid(afid);
143 fb1a36c0 2022-01-09 op write_str(ul, uname);
144 fb1a36c0 2022-01-09 op write_str(al, aname);
145 fb1a36c0 2022-01-09 op }
146 fb1a36c0 2022-01-09 op
147 fb1a36c0 2022-01-09 op void
148 fb1a36c0 2022-01-09 op tclunk(uint32_t fid)
149 fb1a36c0 2022-01-09 op {
150 fb1a36c0 2022-01-09 op uint32_t len;
151 fb1a36c0 2022-01-09 op
152 fb1a36c0 2022-01-09 op /* fid[4] */
153 fb1a36c0 2022-01-09 op len = sizeof(fid);
154 fb1a36c0 2022-01-09 op write_hdr_auto(len, Tclunk);
155 fb1a36c0 2022-01-09 op write_fid(fid);
156 fb1a36c0 2022-01-09 op }
157 fb1a36c0 2022-01-09 op
158 fb1a36c0 2022-01-09 op void
159 fb1a36c0 2022-01-09 op tflush(uint16_t oldtag)
160 fb1a36c0 2022-01-09 op {
161 fb1a36c0 2022-01-09 op uint32_t len;
162 fb1a36c0 2022-01-09 op
163 fb1a36c0 2022-01-09 op /* oldtag[2] */
164 fb1a36c0 2022-01-09 op len = sizeof(oldtag);
165 fb1a36c0 2022-01-09 op write_hdr_auto(len, Tflush);
166 fb1a36c0 2022-01-09 op write_tag(oldtag);
167 fb1a36c0 2022-01-09 op }
168 fb1a36c0 2022-01-09 op
169 fb1a36c0 2022-01-09 op void
170 fb1a36c0 2022-01-09 op twalk(uint32_t fid, uint32_t newfid, const char **wnames, size_t nwname)
171 fb1a36c0 2022-01-09 op {
172 fb1a36c0 2022-01-09 op size_t i;
173 fb1a36c0 2022-01-09 op uint32_t len;
174 fb1a36c0 2022-01-09 op
175 fb1a36c0 2022-01-09 op /* fid[4] newfid[4] nwname[2] nwname*(wname[s]) */
176 fb1a36c0 2022-01-09 op len = sizeof(fid) + sizeof(newfid) + 2;
177 fb1a36c0 2022-01-09 op for (i = 0; i < nwname; ++i)
178 fb1a36c0 2022-01-09 op len += 2 + strlen(wnames[i]);
179 fb1a36c0 2022-01-09 op
180 fb1a36c0 2022-01-09 op write_hdr_auto(len, Twalk);
181 fb1a36c0 2022-01-09 op write_fid(fid);
182 fb1a36c0 2022-01-09 op write_fid(newfid);
183 fb1a36c0 2022-01-09 op write_16(nwname);
184 fb1a36c0 2022-01-09 op for (i = 0; i < nwname; ++i)
185 fb1a36c0 2022-01-09 op write_str_auto(wnames[i]);
186 fb1a36c0 2022-01-09 op }
187 fb1a36c0 2022-01-09 op
188 fb1a36c0 2022-01-09 op void
189 fb1a36c0 2022-01-09 op topen(uint32_t fid, uint8_t mode)
190 fb1a36c0 2022-01-09 op {
191 fb1a36c0 2022-01-09 op uint32_t len;
192 fb1a36c0 2022-01-09 op
193 fb1a36c0 2022-01-09 op /* fid[4] mode[1] */
194 fb1a36c0 2022-01-09 op len = sizeof(fid) + sizeof(mode);
195 fb1a36c0 2022-01-09 op write_hdr_auto(len, Topen);
196 fb1a36c0 2022-01-09 op write_fid(fid);
197 fb1a36c0 2022-01-09 op write_8(mode);
198 fb1a36c0 2022-01-09 op }
199 fb1a36c0 2022-01-09 op
200 fb1a36c0 2022-01-09 op void
201 fb1a36c0 2022-01-09 op tcreate(uint32_t fid, const char *name, uint32_t perm, uint8_t mode)
202 fb1a36c0 2022-01-09 op {
203 fb1a36c0 2022-01-09 op uint32_t len;
204 fb1a36c0 2022-01-09 op uint16_t nl;
205 fb1a36c0 2022-01-09 op
206 fb1a36c0 2022-01-09 op /* fid[4] name[s] perm[4] mode[1] */
207 fb1a36c0 2022-01-09 op nl = strlen(name);
208 fb1a36c0 2022-01-09 op len = sizeof(fid) + sizeof(nl) + nl + sizeof(perm) + sizeof(mode);
209 fb1a36c0 2022-01-09 op write_hdr_auto(len, Tcreate);
210 fb1a36c0 2022-01-09 op write_fid(fid);
211 fb1a36c0 2022-01-09 op write_str(nl, name);
212 fb1a36c0 2022-01-09 op write_32(perm);
213 fb1a36c0 2022-01-09 op write_8(mode);
214 fb1a36c0 2022-01-09 op }
215 fb1a36c0 2022-01-09 op
216 fb1a36c0 2022-01-09 op void
217 fb1a36c0 2022-01-09 op tread(uint32_t fid, uint64_t off, uint32_t count)
218 fb1a36c0 2022-01-09 op {
219 fb1a36c0 2022-01-09 op uint32_t len;
220 fb1a36c0 2022-01-09 op
221 fb1a36c0 2022-01-09 op /* fid[4] off[8] count[4] */
222 fb1a36c0 2022-01-09 op len = sizeof(fid) + sizeof(off) + sizeof(count);
223 fb1a36c0 2022-01-09 op write_hdr_auto(len, Tread);
224 fb1a36c0 2022-01-09 op write_fid(fid);
225 fb1a36c0 2022-01-09 op write_off(off);
226 fb1a36c0 2022-01-09 op write_32(count);
227 fb1a36c0 2022-01-09 op }
228 fb1a36c0 2022-01-09 op
229 fb1a36c0 2022-01-09 op void
230 fb1a36c0 2022-01-09 op twrite(uint32_t fid, uint64_t off, const void *data, uint32_t count)
231 fb1a36c0 2022-01-09 op {
232 fb1a36c0 2022-01-09 op uint32_t len;
233 fb1a36c0 2022-01-09 op
234 fb1a36c0 2022-01-09 op /* fid[4] off[8] count[4] data[count] */
235 fb1a36c0 2022-01-09 op len = sizeof(fid) + sizeof(off) + sizeof(count) + count;
236 fb1a36c0 2022-01-09 op write_hdr_auto(len, Twrite);
237 fb1a36c0 2022-01-09 op write_fid(fid);
238 fb1a36c0 2022-01-09 op write_off(off);
239 fb1a36c0 2022-01-09 op write_buf(data, count);
240 fb1a36c0 2022-01-09 op }
241 fb1a36c0 2022-01-09 op
242 fb1a36c0 2022-01-09 op void
243 fb1a36c0 2022-01-09 op tstat(uint32_t fid)
244 fb1a36c0 2022-01-09 op {
245 fb1a36c0 2022-01-09 op /* fid[4] */
246 fb1a36c0 2022-01-09 op write_hdr_auto(sizeof(fid), Tstat);
247 4e93fcbd 2022-01-17 op write_fid(fid);
248 4e93fcbd 2022-01-17 op }
249 4e93fcbd 2022-01-17 op
250 4e93fcbd 2022-01-17 op void
251 4e93fcbd 2022-01-17 op twstat(uint32_t fid, const struct np_stat *st)
252 4e93fcbd 2022-01-17 op {
253 4e93fcbd 2022-01-17 op uint32_t len;
254 9f898869 2022-02-02 op uint16_t stlen, n;
255 4e93fcbd 2022-01-17 op
256 4e93fcbd 2022-01-17 op /* fid[4] stat[n] */
257 f55ab68b 2022-01-19 op
258 f55ab68b 2022-01-19 op stlen = NPSTATSIZ(0, 0, 0, 0);
259 4e93fcbd 2022-01-17 op if (st->name != NULL)
260 f55ab68b 2022-01-19 op stlen += strlen(st->name);
261 4e93fcbd 2022-01-17 op if (st->uid != NULL)
262 f55ab68b 2022-01-19 op stlen += strlen(st->uid);
263 f55ab68b 2022-01-19 op if (st->gid != NULL)
264 f55ab68b 2022-01-19 op stlen += strlen(st->gid);
265 4e93fcbd 2022-01-17 op if (st->muid != NULL)
266 f55ab68b 2022-01-19 op stlen += strlen(st->muid);
267 4e93fcbd 2022-01-17 op
268 9f898869 2022-02-02 op n = sizeof(stlen) + stlen;
269 9f898869 2022-02-02 op len = sizeof(fid) + sizeof(n) + n;
270 f55ab68b 2022-01-19 op
271 4e93fcbd 2022-01-17 op write_hdr_auto(len, Twstat);
272 fb1a36c0 2022-01-09 op write_fid(fid);
273 9f898869 2022-02-02 op write_16(n);
274 f55ab68b 2022-01-19 op write_16(stlen);
275 4e93fcbd 2022-01-17 op write_16(st->type);
276 4e93fcbd 2022-01-17 op write_32(st->dev);
277 4e93fcbd 2022-01-17 op
278 4e93fcbd 2022-01-17 op write_8(st->qid.type);
279 344d2bad 2022-01-22 op write_32(st->qid.vers);
280 344d2bad 2022-01-22 op write_64(st->qid.path);
281 4e93fcbd 2022-01-17 op
282 4e93fcbd 2022-01-17 op write_32(st->mode);
283 4e93fcbd 2022-01-17 op write_32(st->atime);
284 4e93fcbd 2022-01-17 op write_32(st->mtime);
285 4e93fcbd 2022-01-17 op write_64(st->length);
286 4e93fcbd 2022-01-17 op
287 4e93fcbd 2022-01-17 op write_str_auto(st->name);
288 4e93fcbd 2022-01-17 op write_str_auto(st->uid);
289 4e93fcbd 2022-01-17 op write_str_auto(st->gid);
290 4e93fcbd 2022-01-17 op write_str_auto(st->muid);
291 fb1a36c0 2022-01-09 op }
292 fb1a36c0 2022-01-09 op
293 fb1a36c0 2022-01-09 op void
294 fb1a36c0 2022-01-09 op tremove(uint32_t fid)
295 fb1a36c0 2022-01-09 op {
296 fb1a36c0 2022-01-09 op /* fid[4] */
297 fb1a36c0 2022-01-09 op write_hdr_auto(sizeof(fid), Tremove);
298 fb1a36c0 2022-01-09 op write_fid(fid);
299 fb1a36c0 2022-01-09 op }