2 4e83b30f 2021-12-14 op * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
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.
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.
17 4e83b30f 2021-12-14 op #include "compat.h"
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>
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"
28 4e83b30f 2021-12-14 op uint16_t iota_tag;
30 4e83b30f 2021-12-14 op struct evbuffer *evb;
33 4e83b30f 2021-12-14 op write_hdr(uint32_t len, uint8_t type, uint16_t tag)
35 4e83b30f 2021-12-14 op len += HEADERSIZE;
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);
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);
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));
50 4e83b30f 2021-12-14 op write_hdr_auto(uint32_t len, uint8_t type)
52 4e83b30f 2021-12-14 op if (++iota_tag == NOTAG)
54 4e83b30f 2021-12-14 op write_hdr(len, type, iota_tag);
58 4e83b30f 2021-12-14 op write_str(uint16_t len, const char *str)
60 4e83b30f 2021-12-14 op uint16_t l = len;
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);
68 4e83b30f 2021-12-14 op write_str_auto(const char *str)
70 4e83b30f 2021-12-14 op write_str(strlen(str), str);
74 4e83b30f 2021-12-14 op write_32(uint32_t fid)
76 4e83b30f 2021-12-14 op fid = htole32(fid);
77 4e83b30f 2021-12-14 op evbuffer_add(evb, &fid, sizeof(fid));
81 4e83b30f 2021-12-14 op write_16(uint16_t tag)
83 4e83b30f 2021-12-14 op tag = htole16(tag);
84 4e83b30f 2021-12-14 op evbuffer_add(evb, &tag, sizeof(tag));
90 4e83b30f 2021-12-14 op tversion(const char *v, uint32_t msize)
95 4e83b30f 2021-12-14 op sl = strlen(v);
97 4e83b30f 2021-12-14 op /* msize[4] version[s] */
98 4e83b30f 2021-12-14 op len = sizeof(msize) + sizeof(sl) + sl;
99 4e83b30f 2021-12-14 op write_hdr(len, Tversion, NOTAG);
100 4e83b30f 2021-12-14 op write_32(msize);
101 4e83b30f 2021-12-14 op write_str(sl, v);
105 4e83b30f 2021-12-14 op tattach(uint32_t fid, uint32_t afid, const char *uname, const char *aname)
107 4e83b30f 2021-12-14 op uint32_t len;
108 4e83b30f 2021-12-14 op uint16_t ul, al;
110 4e83b30f 2021-12-14 op ul = strlen(uname);
111 4e83b30f 2021-12-14 op al = strlen(aname);
113 4e83b30f 2021-12-14 op /* fid[4] afid[4] uname[s] aname[s] */
114 4e83b30f 2021-12-14 op len = sizeof(fid) + sizeof(afid) + sizeof(ul) + ul
115 4e83b30f 2021-12-14 op + sizeof(al) + al;
116 4e83b30f 2021-12-14 op write_hdr_auto(len, Tattach);
117 4e83b30f 2021-12-14 op write_fid(fid);
118 4e83b30f 2021-12-14 op write_fid(NOFID);
119 4e83b30f 2021-12-14 op write_str(ul, uname);
120 4e83b30f 2021-12-14 op write_str(al, aname);
124 4e83b30f 2021-12-14 op tclunk(uint32_t fid)
126 4e83b30f 2021-12-14 op uint32_t len;
129 4e83b30f 2021-12-14 op len = sizeof(fid);
130 4e83b30f 2021-12-14 op write_hdr_auto(len, Tclunk);
131 4e83b30f 2021-12-14 op write_fid(fid);
135 4e83b30f 2021-12-14 op tflush(uint16_t oldtag)
137 4e83b30f 2021-12-14 op uint32_t len;
139 4e83b30f 2021-12-14 op /* oldtag[2] */
140 4e83b30f 2021-12-14 op len = sizeof(oldtag);
141 4e83b30f 2021-12-14 op write_hdr_auto(len, Tflush);
142 4e83b30f 2021-12-14 op write_tag(oldtag);
146 4e83b30f 2021-12-14 op twalk(uint32_t fid, uint32_t newfid, const char **wnames, size_t nwname)
149 4e83b30f 2021-12-14 op uint32_t len;
151 4e83b30f 2021-12-14 op /* fid[4] newfid[4] nwname[2] nwname*(wname[s]) */
152 4e83b30f 2021-12-14 op len = sizeof(fid) + sizeof(newfid) + 2;
153 4e83b30f 2021-12-14 op for (i = 0; i < nwname; ++i)
154 4e83b30f 2021-12-14 op len += 2 + strlen(wnames[i]);
156 4e83b30f 2021-12-14 op write_hdr_auto(len, Twalk);
157 4e83b30f 2021-12-14 op write_fid(fid);
158 4e83b30f 2021-12-14 op write_fid(newfid);
159 4e83b30f 2021-12-14 op write_16(nwname);
160 4e83b30f 2021-12-14 op for (i = 0; i < nwname; ++i)
161 4e83b30f 2021-12-14 op write_str_auto(wnames[i]);