Blame


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