Blame


1 8d1b399b 2021-07-22 op /*
2 8d1b399b 2021-07-22 op * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
3 8d1b399b 2021-07-22 op *
4 8d1b399b 2021-07-22 op * Permission to use, copy, modify, and distribute this software for any
5 8d1b399b 2021-07-22 op * purpose with or without fee is hereby granted, provided that the above
6 8d1b399b 2021-07-22 op * copyright notice and this permission notice appear in all copies.
7 8d1b399b 2021-07-22 op *
8 8d1b399b 2021-07-22 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 8d1b399b 2021-07-22 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 8d1b399b 2021-07-22 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 8d1b399b 2021-07-22 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 8d1b399b 2021-07-22 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 8d1b399b 2021-07-22 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 8d1b399b 2021-07-22 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 8d1b399b 2021-07-22 op */
16 8d1b399b 2021-07-22 op
17 d41445b9 2021-07-26 op #include "compat.h"
18 8d1b399b 2021-07-22 op
19 78b94752 2021-08-01 op #include <ctype.h>
20 78b94752 2021-08-01 op #include <stdio.h>
21 8d1b399b 2021-07-22 op #include <stdlib.h>
22 8d1b399b 2021-07-22 op #include <string.h>
23 8d1b399b 2021-07-22 op
24 d41445b9 2021-07-26 op #include "kamid.h"
25 8d1b399b 2021-07-22 op #include "log.h"
26 8d1b399b 2021-07-22 op #include "utils.h"
27 8d1b399b 2021-07-22 op
28 8d1b399b 2021-07-22 op void *
29 8d1b399b 2021-07-22 op xmalloc(size_t size)
30 8d1b399b 2021-07-22 op {
31 8d1b399b 2021-07-22 op void *r;
32 8d1b399b 2021-07-22 op
33 8d1b399b 2021-07-22 op if ((r = malloc(size)) == NULL)
34 8d1b399b 2021-07-22 op fatal("malloc");
35 8d1b399b 2021-07-22 op return r;
36 8d1b399b 2021-07-22 op }
37 8d1b399b 2021-07-22 op
38 8d1b399b 2021-07-22 op void *
39 8d1b399b 2021-07-22 op xcalloc(size_t nmemb, size_t size)
40 8d1b399b 2021-07-22 op {
41 8d1b399b 2021-07-22 op void *r;
42 8d1b399b 2021-07-22 op
43 8d1b399b 2021-07-22 op if ((r = calloc(nmemb, size)) == NULL)
44 8d1b399b 2021-07-22 op fatal("calloc");
45 8d1b399b 2021-07-22 op return r;
46 8d1b399b 2021-07-22 op }
47 8d1b399b 2021-07-22 op
48 8d1b399b 2021-07-22 op char *
49 8d1b399b 2021-07-22 op xstrdup(const char *s)
50 8d1b399b 2021-07-22 op {
51 8d1b399b 2021-07-22 op char *r;
52 8d1b399b 2021-07-22 op
53 8d1b399b 2021-07-22 op if ((r = strdup(s)) == NULL)
54 8d1b399b 2021-07-22 op fatal("strdup");
55 8d1b399b 2021-07-22 op return r;
56 8d1b399b 2021-07-22 op }
57 8d1b399b 2021-07-22 op
58 8d1b399b 2021-07-22 op void *
59 8d1b399b 2021-07-22 op xmemdup(const void *d, size_t len)
60 8d1b399b 2021-07-22 op {
61 8d1b399b 2021-07-22 op void *r;
62 8d1b399b 2021-07-22 op
63 8d1b399b 2021-07-22 op if ((r = malloc(len)) == NULL)
64 8d1b399b 2021-07-22 op fatal("malloc");
65 8d1b399b 2021-07-22 op memcpy(r, d, len);
66 8d1b399b 2021-07-22 op return r;
67 8d1b399b 2021-07-22 op }
68 d41445b9 2021-07-26 op
69 d41445b9 2021-07-26 op const char *
70 d41445b9 2021-07-26 op pp_msg_type(uint8_t type)
71 d41445b9 2021-07-26 op {
72 d41445b9 2021-07-26 op switch (type) {
73 50428ac0 2021-07-28 op case Tversion: return "Tversion";
74 50428ac0 2021-07-28 op case Rversion: return "Rversion";
75 50428ac0 2021-07-28 op case Tauth: return "Tauth";
76 50428ac0 2021-07-28 op case Rauth: return "Rauth";
77 50428ac0 2021-07-28 op case Tattach: return "Tattach";
78 50428ac0 2021-07-28 op case Rattach: return "Rattach";
79 594eb2b8 2021-07-28 op case Terror: return "Terror"; /* illegal */
80 594eb2b8 2021-07-28 op case Rerror: return "Rerror";
81 50428ac0 2021-07-28 op case Tflush: return "Tflush";
82 50428ac0 2021-07-28 op case Rflush: return "Rflush";
83 50428ac0 2021-07-28 op case Twalk: return "Twalk";
84 50428ac0 2021-07-28 op case Rwalk: return "Rwalk";
85 50428ac0 2021-07-28 op case Topen: return "Topen";
86 50428ac0 2021-07-28 op case Ropen: return "Ropen";
87 50428ac0 2021-07-28 op case Tcreate: return "Tcreate";
88 50428ac0 2021-07-28 op case Rcreate: return "Rcreate";
89 50428ac0 2021-07-28 op case Tread: return "Tread";
90 50428ac0 2021-07-28 op case Rread: return "Rread";
91 50428ac0 2021-07-28 op case Twrite: return "Twrite";
92 50428ac0 2021-07-28 op case Rwrite: return "Rwrite";
93 50428ac0 2021-07-28 op case Tclunk: return "Tclunk";
94 50428ac0 2021-07-28 op case Rclunk: return "Rclunk";
95 50428ac0 2021-07-28 op case Tremove: return "Tremove";
96 50428ac0 2021-07-28 op case Rremove: return "Rremove";
97 50428ac0 2021-07-28 op case Tstat: return "Tstat";
98 50428ac0 2021-07-28 op case Rstat: return "Rstat";
99 50428ac0 2021-07-28 op case Twstat: return "Twstat";
100 50428ac0 2021-07-28 op case Rwstat: return "Rwstat";
101 d41445b9 2021-07-26 op default: return "unknown";
102 d41445b9 2021-07-26 op }
103 d41445b9 2021-07-26 op }
104 78b94752 2021-08-01 op
105 423f02f5 2021-12-28 cage const char *
106 423f02f5 2021-12-28 cage pp_qid_type(uint8_t type)
107 423f02f5 2021-12-28 cage {
108 423f02f5 2021-12-28 cage switch (type) {
109 423f02f5 2021-12-28 cage case QTDIR: return "dir";
110 423f02f5 2021-12-28 cage case QTAPPEND: return "append-only";
111 423f02f5 2021-12-28 cage case QTEXCL: return "exclusive";
112 423f02f5 2021-12-28 cage case QTMOUNT: return "mounted-channel";
113 423f02f5 2021-12-28 cage case QTAUTH: return "authentication";
114 423f02f5 2021-12-28 cage case QTTMP: return "non-backed-up";
115 423f02f5 2021-12-28 cage case QTSYMLINK: return "symlink";
116 423f02f5 2021-12-28 cage case QTFILE: return "file";
117 423f02f5 2021-12-28 cage }
118 423f02f5 2021-12-28 cage
119 423f02f5 2021-12-28 cage return "unknown";
120 423f02f5 2021-12-28 cage }
121 423f02f5 2021-12-28 cage
122 78b94752 2021-08-01 op static void
123 78b94752 2021-08-01 op hexdump_ppline(int x, uint8_t *data, size_t len)
124 78b94752 2021-08-01 op {
125 78b94752 2021-08-01 op for (; x < 50; x++)
126 78b94752 2021-08-01 op printf(" ");
127 78b94752 2021-08-01 op
128 78b94752 2021-08-01 op printf("|");
129 78b94752 2021-08-01 op
130 78b94752 2021-08-01 op for (x = 0; x < (int)len; ++x) {
131 78b94752 2021-08-01 op if (isgraph(data[x]))
132 78b94752 2021-08-01 op printf("%c", data[x]);
133 78b94752 2021-08-01 op else
134 78b94752 2021-08-01 op printf(".");
135 78b94752 2021-08-01 op }
136 78b94752 2021-08-01 op
137 78b94752 2021-08-01 op printf("|\n");
138 78b94752 2021-08-01 op }
139 78b94752 2021-08-01 op
140 78b94752 2021-08-01 op void
141 78b94752 2021-08-01 op hexdump(const char *label, uint8_t *data, size_t len)
142 78b94752 2021-08-01 op {
143 78b94752 2021-08-01 op size_t i;
144 78b94752 2021-08-01 op int x, n;
145 78b94752 2021-08-01 op
146 78b94752 2021-08-01 op /*
147 78b94752 2021-08-01 op * Layout:
148 78b94752 2021-08-01 op * === first block === == second block == |........|\n
149 78b94752 2021-08-01 op * first and second block are 8 bytes long (for a total of 48
150 78b94752 2021-08-01 op * columns), plus two separator plus two | plus 16 chars, for
151 78b94752 2021-08-01 op * a total of 68 characters.
152 78b94752 2021-08-01 op */
153 78b94752 2021-08-01 op
154 78b94752 2021-08-01 op printf("\nhexdump \"%s\": (%zu bytes)\n", label, len);
155 78b94752 2021-08-01 op for (x = 0, n = 0, i = 0; i < len; ++i) {
156 78b94752 2021-08-01 op if (i != 0 && i % 8 == 0) {
157 78b94752 2021-08-01 op printf(" ");
158 78b94752 2021-08-01 op x++;
159 78b94752 2021-08-01 op }
160 78b94752 2021-08-01 op
161 78b94752 2021-08-01 op if (n == 16) {
162 78b94752 2021-08-01 op hexdump_ppline(x, &data[i - 16], 16);
163 78b94752 2021-08-01 op x = 0;
164 78b94752 2021-08-01 op n = 0;
165 78b94752 2021-08-01 op }
166 78b94752 2021-08-01 op
167 78b94752 2021-08-01 op printf("%02x ", data[i]);
168 78b94752 2021-08-01 op x += 3;
169 78b94752 2021-08-01 op n++;
170 78b94752 2021-08-01 op }
171 78b94752 2021-08-01 op
172 78b94752 2021-08-01 op if (n != 0)
173 78b94752 2021-08-01 op hexdump_ppline(x, &data[i - n], n);
174 78b94752 2021-08-01 op
175 78b94752 2021-08-01 op printf("\n");
176 78b94752 2021-08-01 op }
177 eff5e4e8 2021-08-06 op
178 eff5e4e8 2021-08-06 op void
179 eff5e4e8 2021-08-06 op imsg_event_add(struct imsgev *iev)
180 eff5e4e8 2021-08-06 op {
181 eff5e4e8 2021-08-06 op iev->events = EV_READ;
182 eff5e4e8 2021-08-06 op if (iev->ibuf.w.queued)
183 eff5e4e8 2021-08-06 op iev->events |= EV_WRITE;
184 eff5e4e8 2021-08-06 op
185 eff5e4e8 2021-08-06 op event_del(&iev->ev);
186 eff5e4e8 2021-08-06 op event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev);
187 eff5e4e8 2021-08-06 op event_add(&iev->ev, NULL);
188 eff5e4e8 2021-08-06 op }
189 eff5e4e8 2021-08-06 op
190 eff5e4e8 2021-08-06 op int
191 eff5e4e8 2021-08-06 op imsg_compose_event(struct imsgev *iev, uint16_t type, uint32_t peerid,
192 eff5e4e8 2021-08-06 op pid_t pid, int fd, const void *data, uint16_t datalen)
193 eff5e4e8 2021-08-06 op {
194 eff5e4e8 2021-08-06 op int ret;
195 eff5e4e8 2021-08-06 op
196 eff5e4e8 2021-08-06 op if ((ret = imsg_compose(&iev->ibuf, type, peerid, pid, fd, data,
197 eff5e4e8 2021-08-06 op datalen) != -1))
198 eff5e4e8 2021-08-06 op imsg_event_add(iev);
199 eff5e4e8 2021-08-06 op
200 eff5e4e8 2021-08-06 op return ret;
201 eff5e4e8 2021-08-06 op }