Blame


1 fb1a36c0 2022-01-09 op /*
2 1e84c7b7 2022-01-10 op * Copyright (c) 2021, 2022 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 <sys/socket.h>
20 fb1a36c0 2022-01-09 op #include <sys/stat.h>
21 fb1a36c0 2022-01-09 op #include <sys/wait.h>
22 fb1a36c0 2022-01-09 op
23 fb1a36c0 2022-01-09 op #include <assert.h>
24 fb1a36c0 2022-01-09 op #include <endian.h>
25 fb1a36c0 2022-01-09 op #include <errno.h>
26 fb1a36c0 2022-01-09 op #include <fcntl.h>
27 fb1a36c0 2022-01-09 op #include <inttypes.h>
28 fb1a36c0 2022-01-09 op #include <poll.h>
29 fb1a36c0 2022-01-09 op #include <pwd.h>
30 fb1a36c0 2022-01-09 op #include <regex.h>
31 fb1a36c0 2022-01-09 op #include <signal.h>
32 fb1a36c0 2022-01-09 op #include <stdio.h>
33 fb1a36c0 2022-01-09 op #include <stdlib.h>
34 fb1a36c0 2022-01-09 op #include <string.h>
35 fb1a36c0 2022-01-09 op #include <syslog.h>
36 fb1a36c0 2022-01-09 op #include <unistd.h>
37 fb1a36c0 2022-01-09 op
38 fb1a36c0 2022-01-09 op #include "client.h"
39 fb1a36c0 2022-01-09 op #include "kami.h"
40 fb1a36c0 2022-01-09 op #include "kamid.h"
41 fb1a36c0 2022-01-09 op #include "log.h"
42 fb1a36c0 2022-01-09 op #include "script.h"
43 fb1a36c0 2022-01-09 op #include "utils.h"
44 fb1a36c0 2022-01-09 op
45 fb1a36c0 2022-01-09 op #define DEBUG 0
46 fb1a36c0 2022-01-09 op
47 fb1a36c0 2022-01-09 op #ifndef INFTIM
48 fb1a36c0 2022-01-09 op #define INFTIM -1
49 fb1a36c0 2022-01-09 op #endif
50 d08dbf9c 2022-01-28 op
51 d08dbf9c 2022-01-28 op int verbose;
52 fb1a36c0 2022-01-09 op
53 fb1a36c0 2022-01-09 op static const char *argv0;
54 a0ec53a2 2022-01-09 op static const char *dir;
55 a0ec53a2 2022-01-09 op static uid_t uid;
56 fb1a36c0 2022-01-09 op
57 fb1a36c0 2022-01-09 op static uint8_t *lastmsg;
58 fb1a36c0 2022-01-09 op
59 fb1a36c0 2022-01-09 op static struct imsgbuf ibuf;
60 fb1a36c0 2022-01-09 op static int ibuf_inuse;
61 fb1a36c0 2022-01-09 op static int child_out = -1;
62 fb1a36c0 2022-01-09 op
63 fb1a36c0 2022-01-09 op static struct procs procs = TAILQ_HEAD_INITIALIZER(procs);
64 fb1a36c0 2022-01-09 op static struct tests tests = TAILQ_HEAD_INITIALIZER(tests);
65 fb1a36c0 2022-01-09 op
66 fb1a36c0 2022-01-09 op static int ntests;
67 fb1a36c0 2022-01-09 op
68 fb1a36c0 2022-01-09 op static struct opstacks blocks = TAILQ_HEAD_INITIALIZER(blocks);
69 fb1a36c0 2022-01-09 op static struct opstacks args = TAILQ_HEAD_INITIALIZER(args);
70 fb1a36c0 2022-01-09 op
71 fb1a36c0 2022-01-09 op #define STACK_HEIGHT 64
72 fb1a36c0 2022-01-09 op static struct value vstack[STACK_HEIGHT];
73 fb1a36c0 2022-01-09 op static int stackh;
74 fb1a36c0 2022-01-09 op
75 fb1a36c0 2022-01-09 op static struct envs envs = TAILQ_HEAD_INITIALIZER(envs);
76 fb1a36c0 2022-01-09 op
77 fb1a36c0 2022-01-09 op static struct value v_false = {.type = V_NUM, .v = {.num = 0}};
78 fb1a36c0 2022-01-09 op static struct value v_true = {.type = V_NUM, .v = {.num = 1}};
79 fb1a36c0 2022-01-09 op
80 fb1a36c0 2022-01-09 op static uint8_t lasttag;
81 fb1a36c0 2022-01-09 op
82 fb1a36c0 2022-01-09 op static int debug;
83 fb1a36c0 2022-01-09 op static int syntaxcheck;
84 fb1a36c0 2022-01-09 op
85 fb1a36c0 2022-01-09 op static const char *filler;
86 fb1a36c0 2022-01-09 op
87 fb1a36c0 2022-01-09 op static inline void
88 fb1a36c0 2022-01-09 op before_printing(void)
89 fb1a36c0 2022-01-09 op {
90 fb1a36c0 2022-01-09 op if (filler != NULL) {
91 fb1a36c0 2022-01-09 op printf("%s", filler);
92 fb1a36c0 2022-01-09 op filler = NULL;
93 fb1a36c0 2022-01-09 op }
94 fb1a36c0 2022-01-09 op }
95 fb1a36c0 2022-01-09 op
96 fb1a36c0 2022-01-09 op static inline void
97 fb1a36c0 2022-01-09 op check_for_output(void)
98 fb1a36c0 2022-01-09 op {
99 fb1a36c0 2022-01-09 op static char buf[BUFSIZ];
100 fb1a36c0 2022-01-09 op struct pollfd pfd;
101 fb1a36c0 2022-01-09 op ssize_t r;
102 fb1a36c0 2022-01-09 op
103 fb1a36c0 2022-01-09 op pfd.fd = child_out;
104 fb1a36c0 2022-01-09 op pfd.events = POLLIN;
105 fb1a36c0 2022-01-09 op if (poll(&pfd, 1, 0) == -1)
106 fb1a36c0 2022-01-09 op fatal("poll");
107 fb1a36c0 2022-01-09 op
108 fb1a36c0 2022-01-09 op if (!(pfd.revents & POLLIN))
109 fb1a36c0 2022-01-09 op return;
110 fb1a36c0 2022-01-09 op
111 fb1a36c0 2022-01-09 op for (;;) {
112 fb1a36c0 2022-01-09 op if ((r = read(child_out, buf, sizeof(buf))) == -1) {
113 fb1a36c0 2022-01-09 op if (errno == EAGAIN)
114 fb1a36c0 2022-01-09 op break;
115 fb1a36c0 2022-01-09 op fatal("read");
116 fb1a36c0 2022-01-09 op }
117 fb1a36c0 2022-01-09 op if (r == 0)
118 fb1a36c0 2022-01-09 op break;
119 fb1a36c0 2022-01-09 op before_printing();
120 fb1a36c0 2022-01-09 op fwrite(buf, 1, r, stdout);
121 fb1a36c0 2022-01-09 op }
122 fb1a36c0 2022-01-09 op }
123 fb1a36c0 2022-01-09 op
124 fb1a36c0 2022-01-09 op static inline void
125 fb1a36c0 2022-01-09 op peekn(int depth, struct value *v)
126 fb1a36c0 2022-01-09 op {
127 fb1a36c0 2022-01-09 op if (depth > stackh)
128 fb1a36c0 2022-01-09 op errx(1, "can't peek the stack at %d: underflow",
129 fb1a36c0 2022-01-09 op depth);
130 fb1a36c0 2022-01-09 op memcpy(v, &vstack[stackh - depth], sizeof(*v));
131 fb1a36c0 2022-01-09 op
132 fb1a36c0 2022-01-09 op #if DEBUG
133 fb1a36c0 2022-01-09 op printf("peeking(%d) ", depth); pp_val(v); printf("\n");
134 fb1a36c0 2022-01-09 op #endif
135 fb1a36c0 2022-01-09 op }
136 fb1a36c0 2022-01-09 op
137 fb1a36c0 2022-01-09 op static inline void
138 fb1a36c0 2022-01-09 op popv(struct value *v)
139 fb1a36c0 2022-01-09 op {
140 fb1a36c0 2022-01-09 op if (stackh == 0)
141 fb1a36c0 2022-01-09 op errx(1, "can't pop the stack: underflow");
142 fb1a36c0 2022-01-09 op memcpy(v, &vstack[--stackh], sizeof(*v));
143 fb1a36c0 2022-01-09 op
144 fb1a36c0 2022-01-09 op #if DEBUG
145 fb1a36c0 2022-01-09 op printf("popping "); pp_val(v); printf("\n");
146 fb1a36c0 2022-01-09 op #endif
147 fb1a36c0 2022-01-09 op }
148 fb1a36c0 2022-01-09 op
149 fb1a36c0 2022-01-09 op static inline void
150 fb1a36c0 2022-01-09 op popvn(int n)
151 fb1a36c0 2022-01-09 op {
152 fb1a36c0 2022-01-09 op struct value v;
153 fb1a36c0 2022-01-09 op
154 fb1a36c0 2022-01-09 op while (n-- > 0)
155 fb1a36c0 2022-01-09 op popv(&v);
156 fb1a36c0 2022-01-09 op }
157 fb1a36c0 2022-01-09 op
158 fb1a36c0 2022-01-09 op static inline void
159 fb1a36c0 2022-01-09 op pushv(struct value *v)
160 fb1a36c0 2022-01-09 op {
161 fb1a36c0 2022-01-09 op if (stackh == STACK_HEIGHT)
162 fb1a36c0 2022-01-09 op errx(1, "can't push the stack: overflow");
163 fb1a36c0 2022-01-09 op
164 fb1a36c0 2022-01-09 op #if DEBUG
165 fb1a36c0 2022-01-09 op printf("pushing "); pp_val(v); printf("\n");
166 fb1a36c0 2022-01-09 op #endif
167 fb1a36c0 2022-01-09 op
168 fb1a36c0 2022-01-09 op memcpy(&vstack[stackh++], v, sizeof(*v));
169 fb1a36c0 2022-01-09 op }
170 fb1a36c0 2022-01-09 op
171 fb1a36c0 2022-01-09 op static inline void
172 fb1a36c0 2022-01-09 op pushbool(int n)
173 fb1a36c0 2022-01-09 op {
174 fb1a36c0 2022-01-09 op pushv(n ? &v_true : &v_false);
175 fb1a36c0 2022-01-09 op }
176 fb1a36c0 2022-01-09 op
177 fb1a36c0 2022-01-09 op static inline void
178 fb1a36c0 2022-01-09 op pushnum(int64_t n)
179 fb1a36c0 2022-01-09 op {
180 fb1a36c0 2022-01-09 op struct value v;
181 fb1a36c0 2022-01-09 op
182 fb1a36c0 2022-01-09 op v.type = V_NUM;
183 fb1a36c0 2022-01-09 op v.v.num = n;
184 fb1a36c0 2022-01-09 op pushv(&v);
185 fb1a36c0 2022-01-09 op }
186 fb1a36c0 2022-01-09 op
187 fb1a36c0 2022-01-09 op static inline struct opstack *
188 fb1a36c0 2022-01-09 op pushstack(struct opstacks *stack)
189 fb1a36c0 2022-01-09 op {
190 fb1a36c0 2022-01-09 op struct opstack *ops;
191 fb1a36c0 2022-01-09 op
192 fb1a36c0 2022-01-09 op ops = xcalloc(1, sizeof(*ops));
193 fb1a36c0 2022-01-09 op TAILQ_INSERT_HEAD(stack, ops, entry);
194 fb1a36c0 2022-01-09 op return ops;
195 fb1a36c0 2022-01-09 op }
196 fb1a36c0 2022-01-09 op
197 fb1a36c0 2022-01-09 op static inline struct opstack *
198 fb1a36c0 2022-01-09 op peek(struct opstacks *stack)
199 fb1a36c0 2022-01-09 op {
200 fb1a36c0 2022-01-09 op if (TAILQ_EMPTY(stack))
201 fb1a36c0 2022-01-09 op errx(1, "%s: args underflow", __func__);
202 fb1a36c0 2022-01-09 op
203 fb1a36c0 2022-01-09 op return TAILQ_FIRST(stack);
204 fb1a36c0 2022-01-09 op }
205 fb1a36c0 2022-01-09 op
206 fb1a36c0 2022-01-09 op static inline struct op *
207 fb1a36c0 2022-01-09 op finalize(struct opstacks *stack, int *argc)
208 fb1a36c0 2022-01-09 op {
209 fb1a36c0 2022-01-09 op struct opstack *ops;
210 fb1a36c0 2022-01-09 op struct op *op;
211 fb1a36c0 2022-01-09 op
212 fb1a36c0 2022-01-09 op if (TAILQ_EMPTY(stack))
213 fb1a36c0 2022-01-09 op errx(1, "%s: args underflow", __func__);
214 fb1a36c0 2022-01-09 op
215 fb1a36c0 2022-01-09 op ops = peek(stack);
216 fb1a36c0 2022-01-09 op TAILQ_REMOVE(&args, ops, entry);
217 fb1a36c0 2022-01-09 op op = ops->base.next;
218 fb1a36c0 2022-01-09 op
219 fb1a36c0 2022-01-09 op if (argc != NULL)
220 fb1a36c0 2022-01-09 op *argc = ops->counter;
221 fb1a36c0 2022-01-09 op
222 fb1a36c0 2022-01-09 op free(ops);
223 fb1a36c0 2022-01-09 op return op;
224 fb1a36c0 2022-01-09 op }
225 fb1a36c0 2022-01-09 op
226 fb1a36c0 2022-01-09 op static inline void
227 fb1a36c0 2022-01-09 op push(struct opstacks *stack, struct op *op)
228 fb1a36c0 2022-01-09 op {
229 fb1a36c0 2022-01-09 op struct opstack *ops;
230 fb1a36c0 2022-01-09 op
231 fb1a36c0 2022-01-09 op ops = peek(stack);
232 fb1a36c0 2022-01-09 op if (ops->last == NULL) {
233 fb1a36c0 2022-01-09 op ops->base.next = op;
234 fb1a36c0 2022-01-09 op ops->last = op;
235 fb1a36c0 2022-01-09 op } else {
236 fb1a36c0 2022-01-09 op ops->last->next = op;
237 fb1a36c0 2022-01-09 op ops->last = op;
238 fb1a36c0 2022-01-09 op }
239 fb1a36c0 2022-01-09 op
240 fb1a36c0 2022-01-09 op ops->counter++;
241 fb1a36c0 2022-01-09 op }
242 fb1a36c0 2022-01-09 op
243 fb1a36c0 2022-01-09 op static inline void
244 fb1a36c0 2022-01-09 op pushenv(void)
245 fb1a36c0 2022-01-09 op {
246 fb1a36c0 2022-01-09 op struct env *e;
247 fb1a36c0 2022-01-09 op
248 fb1a36c0 2022-01-09 op e = xcalloc(1, sizeof(*e));
249 fb1a36c0 2022-01-09 op TAILQ_INSERT_HEAD(&envs, e, entry);
250 fb1a36c0 2022-01-09 op }
251 fb1a36c0 2022-01-09 op
252 fb1a36c0 2022-01-09 op static inline struct env *
253 fb1a36c0 2022-01-09 op currentenv(void)
254 fb1a36c0 2022-01-09 op {
255 fb1a36c0 2022-01-09 op assert(!TAILQ_EMPTY(&envs));
256 fb1a36c0 2022-01-09 op return TAILQ_FIRST(&envs);
257 fb1a36c0 2022-01-09 op }
258 fb1a36c0 2022-01-09 op
259 fb1a36c0 2022-01-09 op static void
260 fb1a36c0 2022-01-09 op popenv(void)
261 fb1a36c0 2022-01-09 op {
262 fb1a36c0 2022-01-09 op struct env *e;
263 fb1a36c0 2022-01-09 op struct binding *b, *tb;
264 fb1a36c0 2022-01-09 op
265 fb1a36c0 2022-01-09 op e = currentenv();
266 fb1a36c0 2022-01-09 op TAILQ_REMOVE(&envs, e, entry);
267 fb1a36c0 2022-01-09 op
268 fb1a36c0 2022-01-09 op TAILQ_FOREACH_SAFE(b, &e->bindings, entry, tb)
269 fb1a36c0 2022-01-09 op free(b);
270 fb1a36c0 2022-01-09 op
271 fb1a36c0 2022-01-09 op free(e);
272 fb1a36c0 2022-01-09 op }
273 fb1a36c0 2022-01-09 op
274 fb1a36c0 2022-01-09 op static inline int
275 fb1a36c0 2022-01-09 op setvar(char *sym, struct op *op)
276 fb1a36c0 2022-01-09 op {
277 fb1a36c0 2022-01-09 op struct binding *b;
278 fb1a36c0 2022-01-09 op struct env *e;
279 fb1a36c0 2022-01-09 op int ret, height;
280 fb1a36c0 2022-01-09 op
281 fb1a36c0 2022-01-09 op height = stackh;
282 fb1a36c0 2022-01-09 op if ((ret = eval(op)) != EVAL_OK)
283 fb1a36c0 2022-01-09 op return ret;
284 fb1a36c0 2022-01-09 op
285 fb1a36c0 2022-01-09 op if (stackh != height + 1) {
286 fb1a36c0 2022-01-09 op before_printing();
287 fb1a36c0 2022-01-09 op printf("trying to assign to `%s' a void value: ", sym);
288 fb1a36c0 2022-01-09 op pp_op(op);
289 fb1a36c0 2022-01-09 op printf("\n");
290 fb1a36c0 2022-01-09 op return EVAL_ERR;
291 fb1a36c0 2022-01-09 op }
292 fb1a36c0 2022-01-09 op
293 fb1a36c0 2022-01-09 op b = xcalloc(1, sizeof(*b));
294 fb1a36c0 2022-01-09 op b->name = sym;
295 fb1a36c0 2022-01-09 op popv(&b->val);
296 fb1a36c0 2022-01-09 op
297 fb1a36c0 2022-01-09 op e = TAILQ_FIRST(&envs);
298 fb1a36c0 2022-01-09 op TAILQ_INSERT_HEAD(&e->bindings, b, entry);
299 fb1a36c0 2022-01-09 op
300 fb1a36c0 2022-01-09 op return EVAL_OK;
301 fb1a36c0 2022-01-09 op }
302 fb1a36c0 2022-01-09 op
303 fb1a36c0 2022-01-09 op static inline void
304 fb1a36c0 2022-01-09 op setvar_raw(char *sym, struct op *op)
305 fb1a36c0 2022-01-09 op {
306 fb1a36c0 2022-01-09 op struct binding *b;
307 fb1a36c0 2022-01-09 op struct env *e;
308 fb1a36c0 2022-01-09 op
309 fb1a36c0 2022-01-09 op b = xcalloc(1, sizeof(*b));
310 fb1a36c0 2022-01-09 op b->name = sym;
311 fb1a36c0 2022-01-09 op b->raw = op;
312 fb1a36c0 2022-01-09 op
313 fb1a36c0 2022-01-09 op e = TAILQ_FIRST(&envs);
314 fb1a36c0 2022-01-09 op TAILQ_INSERT_HEAD(&e->bindings, b, entry);
315 fb1a36c0 2022-01-09 op }
316 fb1a36c0 2022-01-09 op
317 fb1a36c0 2022-01-09 op static inline int
318 fb1a36c0 2022-01-09 op getvar(const char *sym, struct value *v)
319 fb1a36c0 2022-01-09 op {
320 fb1a36c0 2022-01-09 op struct env *e;
321 fb1a36c0 2022-01-09 op struct binding *b;
322 fb1a36c0 2022-01-09 op
323 fb1a36c0 2022-01-09 op TAILQ_FOREACH(e, &envs, entry) {
324 fb1a36c0 2022-01-09 op TAILQ_FOREACH(b, &e->bindings, entry) {
325 fb1a36c0 2022-01-09 op if (!strcmp(sym, b->name)) {
326 fb1a36c0 2022-01-09 op memcpy(v, &b->val, sizeof(*v));
327 fb1a36c0 2022-01-09 op return EVAL_OK;
328 fb1a36c0 2022-01-09 op }
329 fb1a36c0 2022-01-09 op }
330 fb1a36c0 2022-01-09 op }
331 fb1a36c0 2022-01-09 op
332 fb1a36c0 2022-01-09 op before_printing();
333 fb1a36c0 2022-01-09 op fprintf(stderr, "unbound variable %s\n", sym);
334 fb1a36c0 2022-01-09 op return EVAL_ERR;
335 fb1a36c0 2022-01-09 op }
336 fb1a36c0 2022-01-09 op
337 fb1a36c0 2022-01-09 op static inline int
338 fb1a36c0 2022-01-09 op getvar_raw(const char *sym, struct op **raw)
339 fb1a36c0 2022-01-09 op {
340 fb1a36c0 2022-01-09 op struct env *e;
341 fb1a36c0 2022-01-09 op struct binding *b;
342 fb1a36c0 2022-01-09 op
343 fb1a36c0 2022-01-09 op TAILQ_FOREACH(e, &envs, entry) {
344 fb1a36c0 2022-01-09 op TAILQ_FOREACH(b, &e->bindings, entry) {
345 fb1a36c0 2022-01-09 op if (!strcmp(sym, b->name)) {
346 fb1a36c0 2022-01-09 op *raw = b->raw;
347 fb1a36c0 2022-01-09 op return EVAL_OK;
348 fb1a36c0 2022-01-09 op }
349 fb1a36c0 2022-01-09 op }
350 fb1a36c0 2022-01-09 op }
351 fb1a36c0 2022-01-09 op
352 fb1a36c0 2022-01-09 op return EVAL_ERR;
353 fb1a36c0 2022-01-09 op }
354 fb1a36c0 2022-01-09 op
355 fb1a36c0 2022-01-09 op int
356 fb1a36c0 2022-01-09 op global_set(char *sym, struct op *op)
357 fb1a36c0 2022-01-09 op {
358 fb1a36c0 2022-01-09 op struct binding *b;
359 fb1a36c0 2022-01-09 op struct env *e;
360 fb1a36c0 2022-01-09 op
361 fb1a36c0 2022-01-09 op /* TODO: check for duplicates */
362 fb1a36c0 2022-01-09 op
363 fb1a36c0 2022-01-09 op if (op->type != OP_LITERAL &&
364 fb1a36c0 2022-01-09 op (op->type == OP_CAST && op->v.cast.expr->type != OP_LITERAL))
365 fb1a36c0 2022-01-09 op return 0;
366 fb1a36c0 2022-01-09 op
367 fb1a36c0 2022-01-09 op b = xcalloc(1, sizeof(*b));
368 fb1a36c0 2022-01-09 op b->name = sym;
369 fb1a36c0 2022-01-09 op
370 fb1a36c0 2022-01-09 op /* it's only a cast on a literal! */
371 fb1a36c0 2022-01-09 op if (op->type == OP_CAST) {
372 fb1a36c0 2022-01-09 op if (eval(op) != EVAL_OK) {
373 fb1a36c0 2022-01-09 op free(b);
374 fb1a36c0 2022-01-09 op return 0;
375 fb1a36c0 2022-01-09 op }
376 fb1a36c0 2022-01-09 op popv(&b->val);
377 fb1a36c0 2022-01-09 op } else
378 fb1a36c0 2022-01-09 op memcpy(&b->val, &op->v.literal, sizeof(b->val));
379 fb1a36c0 2022-01-09 op
380 fb1a36c0 2022-01-09 op e = TAILQ_LAST(&envs, envs);
381 fb1a36c0 2022-01-09 op TAILQ_INSERT_HEAD(&e->bindings, b, entry);
382 fb1a36c0 2022-01-09 op
383 fb1a36c0 2022-01-09 op return 1;
384 fb1a36c0 2022-01-09 op }
385 fb1a36c0 2022-01-09 op
386 fb1a36c0 2022-01-09 op struct op *
387 fb1a36c0 2022-01-09 op newop(int type)
388 fb1a36c0 2022-01-09 op {
389 fb1a36c0 2022-01-09 op struct op *op;
390 fb1a36c0 2022-01-09 op
391 fb1a36c0 2022-01-09 op op = xcalloc(1, sizeof(*op));
392 fb1a36c0 2022-01-09 op op->type = type;
393 fb1a36c0 2022-01-09 op
394 fb1a36c0 2022-01-09 op return op;
395 fb1a36c0 2022-01-09 op }
396 fb1a36c0 2022-01-09 op
397 fb1a36c0 2022-01-09 op void
398 fb1a36c0 2022-01-09 op free_op_rec(struct op *op)
399 fb1a36c0 2022-01-09 op {
400 fb1a36c0 2022-01-09 op struct op *n;
401 fb1a36c0 2022-01-09 op
402 fb1a36c0 2022-01-09 op while (op != NULL) {
403 fb1a36c0 2022-01-09 op n = op->next;
404 fb1a36c0 2022-01-09 op free_op(op);
405 fb1a36c0 2022-01-09 op op = n;
406 fb1a36c0 2022-01-09 op }
407 fb1a36c0 2022-01-09 op }
408 fb1a36c0 2022-01-09 op
409 fb1a36c0 2022-01-09 op void
410 fb1a36c0 2022-01-09 op free_op(struct op *op)
411 fb1a36c0 2022-01-09 op {
412 fb1a36c0 2022-01-09 op if (op == NULL)
413 fb1a36c0 2022-01-09 op return;
414 fb1a36c0 2022-01-09 op
415 fb1a36c0 2022-01-09 op switch (op->type) {
416 fb1a36c0 2022-01-09 op case OP_REST:
417 fb1a36c0 2022-01-09 op case OP_LITERAL:
418 fb1a36c0 2022-01-09 op case OP_VARGS:
419 fb1a36c0 2022-01-09 op break;
420 fb1a36c0 2022-01-09 op case OP_ASSIGN:
421 fb1a36c0 2022-01-09 op free(op->v.assign.name);
422 fb1a36c0 2022-01-09 op free_op_rec(op->v.assign.expr);
423 fb1a36c0 2022-01-09 op break;
424 fb1a36c0 2022-01-09 op case OP_ASSERT:
425 fb1a36c0 2022-01-09 op free_op_rec(op->v.assert);
426 fb1a36c0 2022-01-09 op break;
427 fb1a36c0 2022-01-09 op case OP_FUNCALL:
428 fb1a36c0 2022-01-09 op free_op_rec(op->v.funcall.argv);
429 fb1a36c0 2022-01-09 op break;
430 fb1a36c0 2022-01-09 op case OP_VAR:
431 fb1a36c0 2022-01-09 op free(op->v.var);
432 fb1a36c0 2022-01-09 op break;
433 fb1a36c0 2022-01-09 op case OP_CAST:
434 fb1a36c0 2022-01-09 op free_op_rec(op->v.cast.expr);
435 fb1a36c0 2022-01-09 op break;
436 fb1a36c0 2022-01-09 op case OP_CMP_EQ:
437 fb1a36c0 2022-01-09 op case OP_CMP_LEQ:
438 fb1a36c0 2022-01-09 op free_op_rec(op->v.bin_cmp.a);
439 fb1a36c0 2022-01-09 op free_op_rec(op->v.bin_cmp.b);
440 fb1a36c0 2022-01-09 op break;
441 fb1a36c0 2022-01-09 op case OP_FACCESS:
442 fb1a36c0 2022-01-09 op free_op_rec(op->v.faccess.expr);
443 fb1a36c0 2022-01-09 op free(op->v.faccess.field);
444 fb1a36c0 2022-01-09 op break;
445 fb1a36c0 2022-01-09 op case OP_SFAIL:
446 fb1a36c0 2022-01-09 op free(op->v.sfail.msg);
447 fb1a36c0 2022-01-09 op free_op_rec(op->v.sfail.expr);
448 fb1a36c0 2022-01-09 op break;
449 fb1a36c0 2022-01-09 op default:
450 fb1a36c0 2022-01-09 op /* unreachable */
451 fb1a36c0 2022-01-09 op abort();
452 fb1a36c0 2022-01-09 op }
453 fb1a36c0 2022-01-09 op
454 fb1a36c0 2022-01-09 op free(op);
455 fb1a36c0 2022-01-09 op }
456 fb1a36c0 2022-01-09 op
457 fb1a36c0 2022-01-09 op struct op *
458 fb1a36c0 2022-01-09 op op_rest(void)
459 fb1a36c0 2022-01-09 op {
460 fb1a36c0 2022-01-09 op return newop(OP_REST);
461 fb1a36c0 2022-01-09 op }
462 fb1a36c0 2022-01-09 op
463 fb1a36c0 2022-01-09 op struct op *
464 fb1a36c0 2022-01-09 op op_assign(char *sym, struct op *expr)
465 fb1a36c0 2022-01-09 op {
466 fb1a36c0 2022-01-09 op struct op *op;
467 fb1a36c0 2022-01-09 op
468 fb1a36c0 2022-01-09 op op = newop(OP_ASSIGN);
469 fb1a36c0 2022-01-09 op op->v.assign.name = sym;
470 fb1a36c0 2022-01-09 op op->v.assign.expr = expr;
471 fb1a36c0 2022-01-09 op
472 fb1a36c0 2022-01-09 op return op;
473 fb1a36c0 2022-01-09 op }
474 fb1a36c0 2022-01-09 op
475 fb1a36c0 2022-01-09 op struct op *
476 fb1a36c0 2022-01-09 op op_assert(struct op *expr)
477 fb1a36c0 2022-01-09 op {
478 fb1a36c0 2022-01-09 op struct op *op;
479 fb1a36c0 2022-01-09 op
480 fb1a36c0 2022-01-09 op op = newop(OP_ASSERT);
481 fb1a36c0 2022-01-09 op op->v.assert = expr;
482 fb1a36c0 2022-01-09 op
483 fb1a36c0 2022-01-09 op return op;
484 fb1a36c0 2022-01-09 op }
485 fb1a36c0 2022-01-09 op
486 fb1a36c0 2022-01-09 op struct op *
487 fb1a36c0 2022-01-09 op op_var(char *sym)
488 fb1a36c0 2022-01-09 op {
489 fb1a36c0 2022-01-09 op struct op *op;
490 fb1a36c0 2022-01-09 op
491 fb1a36c0 2022-01-09 op op = newop(OP_VAR);
492 fb1a36c0 2022-01-09 op op->v.var = sym;
493 fb1a36c0 2022-01-09 op
494 fb1a36c0 2022-01-09 op return op;
495 fb1a36c0 2022-01-09 op }
496 fb1a36c0 2022-01-09 op
497 fb1a36c0 2022-01-09 op struct op *
498 fb1a36c0 2022-01-09 op op_lit_str(char *str)
499 fb1a36c0 2022-01-09 op {
500 fb1a36c0 2022-01-09 op struct op *op;
501 fb1a36c0 2022-01-09 op
502 fb1a36c0 2022-01-09 op op = newop(OP_LITERAL);
503 fb1a36c0 2022-01-09 op op->v.literal.type = V_STR;
504 fb1a36c0 2022-01-09 op op->v.literal.v.str = str;
505 fb1a36c0 2022-01-09 op
506 fb1a36c0 2022-01-09 op return op;
507 fb1a36c0 2022-01-09 op }
508 fb1a36c0 2022-01-09 op
509 fb1a36c0 2022-01-09 op struct op *
510 fb1a36c0 2022-01-09 op op_lit_num(uint64_t n)
511 fb1a36c0 2022-01-09 op {
512 fb1a36c0 2022-01-09 op struct op *op;
513 fb1a36c0 2022-01-09 op
514 fb1a36c0 2022-01-09 op op = newop(OP_LITERAL);
515 fb1a36c0 2022-01-09 op op->v.literal.type = V_NUM;
516 fb1a36c0 2022-01-09 op op->v.literal.v.num = n;
517 fb1a36c0 2022-01-09 op
518 fb1a36c0 2022-01-09 op return op;
519 fb1a36c0 2022-01-09 op }
520 fb1a36c0 2022-01-09 op
521 fb1a36c0 2022-01-09 op struct op *
522 fb1a36c0 2022-01-09 op op_cmp_eq(struct op *a, struct op *b)
523 fb1a36c0 2022-01-09 op {
524 fb1a36c0 2022-01-09 op struct op *op;
525 fb1a36c0 2022-01-09 op
526 fb1a36c0 2022-01-09 op op = newop(OP_CMP_EQ);
527 fb1a36c0 2022-01-09 op op->v.bin_cmp.a = a;
528 fb1a36c0 2022-01-09 op op->v.bin_cmp.b = b;
529 fb1a36c0 2022-01-09 op
530 fb1a36c0 2022-01-09 op return op;
531 fb1a36c0 2022-01-09 op }
532 fb1a36c0 2022-01-09 op
533 fb1a36c0 2022-01-09 op struct op *
534 fb1a36c0 2022-01-09 op op_cmp_leq(struct op *a, struct op *b)
535 fb1a36c0 2022-01-09 op {
536 fb1a36c0 2022-01-09 op struct op *op;
537 fb1a36c0 2022-01-09 op
538 fb1a36c0 2022-01-09 op op = newop(OP_CMP_LEQ);
539 fb1a36c0 2022-01-09 op op->v.bin_cmp.a = a;
540 fb1a36c0 2022-01-09 op op->v.bin_cmp.b = b;
541 fb1a36c0 2022-01-09 op
542 fb1a36c0 2022-01-09 op return op;
543 fb1a36c0 2022-01-09 op }
544 fb1a36c0 2022-01-09 op
545 fb1a36c0 2022-01-09 op struct op *
546 fb1a36c0 2022-01-09 op op_cast(struct op *expr, int totype)
547 fb1a36c0 2022-01-09 op {
548 fb1a36c0 2022-01-09 op struct op *op;
549 fb1a36c0 2022-01-09 op
550 fb1a36c0 2022-01-09 op op = newop(OP_CAST);
551 fb1a36c0 2022-01-09 op op->v.cast.expr = expr;
552 fb1a36c0 2022-01-09 op op->v.cast.totype = totype;
553 fb1a36c0 2022-01-09 op
554 fb1a36c0 2022-01-09 op return op;
555 fb1a36c0 2022-01-09 op }
556 fb1a36c0 2022-01-09 op
557 fb1a36c0 2022-01-09 op struct op *
558 fb1a36c0 2022-01-09 op op_faccess(struct op *expr, char *field)
559 fb1a36c0 2022-01-09 op {
560 fb1a36c0 2022-01-09 op struct op *op;
561 fb1a36c0 2022-01-09 op
562 fb1a36c0 2022-01-09 op op = newop(OP_FACCESS);
563 fb1a36c0 2022-01-09 op op->v.faccess.expr = expr;
564 fb1a36c0 2022-01-09 op op->v.faccess.field = field;
565 fb1a36c0 2022-01-09 op
566 fb1a36c0 2022-01-09 op return op;
567 fb1a36c0 2022-01-09 op }
568 fb1a36c0 2022-01-09 op
569 fb1a36c0 2022-01-09 op struct op *
570 fb1a36c0 2022-01-09 op op_sfail(struct op *expr, char *msg)
571 fb1a36c0 2022-01-09 op {
572 fb1a36c0 2022-01-09 op struct op *op;
573 fb1a36c0 2022-01-09 op
574 fb1a36c0 2022-01-09 op op = newop(OP_SFAIL);
575 fb1a36c0 2022-01-09 op op->v.sfail.expr = expr;
576 fb1a36c0 2022-01-09 op op->v.sfail.msg = msg;
577 fb1a36c0 2022-01-09 op
578 fb1a36c0 2022-01-09 op return op;
579 fb1a36c0 2022-01-09 op }
580 fb1a36c0 2022-01-09 op
581 fb1a36c0 2022-01-09 op struct op *
582 fb1a36c0 2022-01-09 op op_vargs(void)
583 fb1a36c0 2022-01-09 op {
584 fb1a36c0 2022-01-09 op struct op *op;
585 fb1a36c0 2022-01-09 op
586 fb1a36c0 2022-01-09 op op = newop(OP_VARGS);
587 fb1a36c0 2022-01-09 op
588 fb1a36c0 2022-01-09 op return op;
589 fb1a36c0 2022-01-09 op }
590 fb1a36c0 2022-01-09 op
591 fb1a36c0 2022-01-09 op void
592 fb1a36c0 2022-01-09 op ppf_val(FILE *f, struct value *val)
593 fb1a36c0 2022-01-09 op {
594 fb1a36c0 2022-01-09 op size_t i;
595 fb1a36c0 2022-01-09 op
596 fb1a36c0 2022-01-09 op switch (val->type) {
597 fb1a36c0 2022-01-09 op case V_SYM:
598 fb1a36c0 2022-01-09 op fprintf(f, "%s", val->v.str);
599 fb1a36c0 2022-01-09 op break;
600 fb1a36c0 2022-01-09 op case V_STR:
601 fb1a36c0 2022-01-09 op fprintf(f, "\"%s\"", val->v.str);
602 fb1a36c0 2022-01-09 op break;
603 fb1a36c0 2022-01-09 op case V_NUM:
604 fb1a36c0 2022-01-09 op fprintf(f, "%"PRIi64, val->v.num);
605 fb1a36c0 2022-01-09 op break;
606 fb1a36c0 2022-01-09 op case V_U8:
607 fb1a36c0 2022-01-09 op fprintf(f, "%"PRIu8, val->v.u8);
608 fb1a36c0 2022-01-09 op break;
609 fb1a36c0 2022-01-09 op case V_U16:
610 fb1a36c0 2022-01-09 op fprintf(f, "%"PRIu16, val->v.u16);
611 fb1a36c0 2022-01-09 op break;
612 fb1a36c0 2022-01-09 op case V_U32:
613 fb1a36c0 2022-01-09 op fprintf(f, "%"PRIu32, val->v.u32);
614 fb1a36c0 2022-01-09 op break;
615 fb1a36c0 2022-01-09 op case V_MSG:
616 fb1a36c0 2022-01-09 op fprintf(f, "(");
617 fb1a36c0 2022-01-09 op for (i = 0; i < val->v.msg.len; ++i)
618 fb1a36c0 2022-01-09 op fprintf(f, "%x%s", val->v.msg.msg[i],
619 fb1a36c0 2022-01-09 op i == val->v.msg.len-1 ? "" : " ");
620 fb1a36c0 2022-01-09 op fprintf(f, ")");
621 fb1a36c0 2022-01-09 op break;
622 fb1a36c0 2022-01-09 op case V_QIDVEC:
623 fb1a36c0 2022-01-09 op fprintf(f, "qids[n=%zu]", val->v.qidvec.len);
624 fb1a36c0 2022-01-09 op break;
625 fb1a36c0 2022-01-09 op default:
626 fb1a36c0 2022-01-09 op fprintf(f, "<unknown value>");
627 fb1a36c0 2022-01-09 op break;
628 fb1a36c0 2022-01-09 op }
629 fb1a36c0 2022-01-09 op }
630 fb1a36c0 2022-01-09 op
631 fb1a36c0 2022-01-09 op void
632 fb1a36c0 2022-01-09 op pp_val(struct value *val)
633 fb1a36c0 2022-01-09 op {
634 fb1a36c0 2022-01-09 op ppf_val(stdout, val);
635 fb1a36c0 2022-01-09 op }
636 fb1a36c0 2022-01-09 op
637 fb1a36c0 2022-01-09 op const char *
638 fb1a36c0 2022-01-09 op val_type(struct value *v)
639 fb1a36c0 2022-01-09 op {
640 fb1a36c0 2022-01-09 op switch (v->type) {
641 fb1a36c0 2022-01-09 op case V_SYM: return "symbol";
642 fb1a36c0 2022-01-09 op case V_STR: return "string";
643 fb1a36c0 2022-01-09 op case V_NUM: return "number";
644 fb1a36c0 2022-01-09 op case V_MSG: return "message";
645 fb1a36c0 2022-01-09 op case V_QID: return "qid";
646 fb1a36c0 2022-01-09 op case V_U8: return "u8";
647 fb1a36c0 2022-01-09 op case V_U16: return "u16";
648 fb1a36c0 2022-01-09 op case V_U32: return "u32";
649 fb1a36c0 2022-01-09 op default: return "unknown";
650 fb1a36c0 2022-01-09 op }
651 fb1a36c0 2022-01-09 op }
652 fb1a36c0 2022-01-09 op
653 fb1a36c0 2022-01-09 op int
654 fb1a36c0 2022-01-09 op val_trueish(struct value *a)
655 fb1a36c0 2022-01-09 op {
656 fb1a36c0 2022-01-09 op if (val_isnum(a))
657 fb1a36c0 2022-01-09 op return val_tonum(a);
658 fb1a36c0 2022-01-09 op return 1;
659 fb1a36c0 2022-01-09 op }
660 fb1a36c0 2022-01-09 op
661 fb1a36c0 2022-01-09 op int
662 fb1a36c0 2022-01-09 op val_isnum(struct value *a)
663 fb1a36c0 2022-01-09 op {
664 fb1a36c0 2022-01-09 op return a->type == V_NUM
665 fb1a36c0 2022-01-09 op || a->type == V_U8
666 fb1a36c0 2022-01-09 op || a->type == V_U16
667 fb1a36c0 2022-01-09 op || a->type == V_U32;
668 fb1a36c0 2022-01-09 op }
669 fb1a36c0 2022-01-09 op
670 fb1a36c0 2022-01-09 op int64_t
671 fb1a36c0 2022-01-09 op val_tonum(struct value *a)
672 fb1a36c0 2022-01-09 op {
673 fb1a36c0 2022-01-09 op switch (a->type) {
674 fb1a36c0 2022-01-09 op case V_NUM: return a->v.num;
675 fb1a36c0 2022-01-09 op case V_U8: return a->v.u8;
676 fb1a36c0 2022-01-09 op case V_U16: return a->v.u16;
677 fb1a36c0 2022-01-09 op case V_U32: return a->v.u32;
678 fb1a36c0 2022-01-09 op default:
679 fb1a36c0 2022-01-09 op before_printing();
680 fb1a36c0 2022-01-09 op fprintf(stderr, "%s: given value is not a number\n", __func__);
681 fb1a36c0 2022-01-09 op abort();
682 fb1a36c0 2022-01-09 op }
683 fb1a36c0 2022-01-09 op }
684 fb1a36c0 2022-01-09 op
685 fb1a36c0 2022-01-09 op int
686 fb1a36c0 2022-01-09 op val_eq(struct value *a, struct value *b)
687 fb1a36c0 2022-01-09 op {
688 fb1a36c0 2022-01-09 op if (val_isnum(a) && val_isnum(b))
689 fb1a36c0 2022-01-09 op return val_tonum(a) == val_tonum(b);
690 fb1a36c0 2022-01-09 op
691 fb1a36c0 2022-01-09 op if (a->type != b->type)
692 fb1a36c0 2022-01-09 op return 0;
693 fb1a36c0 2022-01-09 op
694 fb1a36c0 2022-01-09 op switch (a->type) {
695 fb1a36c0 2022-01-09 op case V_STR:
696 fb1a36c0 2022-01-09 op case V_SYM:
697 fb1a36c0 2022-01-09 op return !strcmp(a->v.str, b->v.str);
698 fb1a36c0 2022-01-09 op }
699 fb1a36c0 2022-01-09 op
700 fb1a36c0 2022-01-09 op return 0;
701 fb1a36c0 2022-01-09 op }
702 fb1a36c0 2022-01-09 op
703 fb1a36c0 2022-01-09 op int
704 fb1a36c0 2022-01-09 op val_leq(struct value *a, struct value *b)
705 fb1a36c0 2022-01-09 op {
706 fb1a36c0 2022-01-09 op if (val_isnum(a) && val_isnum(b))
707 fb1a36c0 2022-01-09 op return val_tonum(a) <= val_tonum(b);
708 fb1a36c0 2022-01-09 op return 0;
709 fb1a36c0 2022-01-09 op }
710 fb1a36c0 2022-01-09 op
711 fb1a36c0 2022-01-09 op static inline const char *
712 fb1a36c0 2022-01-09 op pp_totype(int totype)
713 fb1a36c0 2022-01-09 op {
714 fb1a36c0 2022-01-09 op /*
715 fb1a36c0 2022-01-09 op * Not all of these are valid cast type thought, including
716 fb1a36c0 2022-01-09 op * every possibility only to aid debugging.
717 fb1a36c0 2022-01-09 op */
718 fb1a36c0 2022-01-09 op switch (totype) {
719 fb1a36c0 2022-01-09 op case V_STR: return "str";
720 fb1a36c0 2022-01-09 op case V_SYM: return "sym";
721 fb1a36c0 2022-01-09 op case V_NUM: return "num";
722 fb1a36c0 2022-01-09 op case V_QID: return "qid";
723 fb1a36c0 2022-01-09 op case V_U8: return "u8";
724 fb1a36c0 2022-01-09 op case V_U16: return "u16";
725 fb1a36c0 2022-01-09 op case V_U32: return "u32";
726 fb1a36c0 2022-01-09 op default: return "unknown";
727 fb1a36c0 2022-01-09 op }
728 fb1a36c0 2022-01-09 op }
729 fb1a36c0 2022-01-09 op
730 fb1a36c0 2022-01-09 op int
731 fb1a36c0 2022-01-09 op val_cast(struct value *a, int totype)
732 fb1a36c0 2022-01-09 op {
733 fb1a36c0 2022-01-09 op int64_t v;
734 fb1a36c0 2022-01-09 op
735 fb1a36c0 2022-01-09 op #define NUMCAST(val, t, c, totype, max) do { \
736 fb1a36c0 2022-01-09 op if (val > max) { \
737 fb1a36c0 2022-01-09 op before_printing(); \
738 fb1a36c0 2022-01-09 op fprintf(stderr, "can't cast %"PRIu64 \
739 fb1a36c0 2022-01-09 op " to %s\n", val, pp_totype(totype)); \
740 fb1a36c0 2022-01-09 op return EVAL_ERR; \
741 fb1a36c0 2022-01-09 op } \
742 fb1a36c0 2022-01-09 op a->type = totype; \
743 fb1a36c0 2022-01-09 op a->v.t = (c)val; \
744 fb1a36c0 2022-01-09 op return EVAL_OK; \
745 fb1a36c0 2022-01-09 op } while (0)
746 fb1a36c0 2022-01-09 op
747 fb1a36c0 2022-01-09 op if (a->type == totype)
748 fb1a36c0 2022-01-09 op return EVAL_OK;
749 fb1a36c0 2022-01-09 op
750 fb1a36c0 2022-01-09 op if (!val_isnum(a)) {
751 fb1a36c0 2022-01-09 op before_printing();
752 fb1a36c0 2022-01-09 op fprintf(stderr, "can't cast ");
753 fb1a36c0 2022-01-09 op ppf_val(stderr, a);
754 fb1a36c0 2022-01-09 op fprintf(stderr, " to type %s\n", pp_totype(totype));
755 fb1a36c0 2022-01-09 op return EVAL_ERR;
756 fb1a36c0 2022-01-09 op }
757 fb1a36c0 2022-01-09 op
758 fb1a36c0 2022-01-09 op v = a->v.num;
759 fb1a36c0 2022-01-09 op switch (totype) {
760 fb1a36c0 2022-01-09 op case V_U8: NUMCAST(v, u8, uint8_t, totype, UINT8_MAX);
761 fb1a36c0 2022-01-09 op case V_U16: NUMCAST(v, u16, uint16_t, totype, UINT16_MAX);
762 fb1a36c0 2022-01-09 op case V_U32: NUMCAST(v, u32, uint32_t, totype, UINT32_MAX);
763 fb1a36c0 2022-01-09 op default:
764 fb1a36c0 2022-01-09 op before_printing();
765 fb1a36c0 2022-01-09 op fprintf(stderr, "can't cast %"PRIu64" to %s\n",
766 fb1a36c0 2022-01-09 op v, pp_totype(totype));
767 fb1a36c0 2022-01-09 op return EVAL_ERR;
768 fb1a36c0 2022-01-09 op }
769 fb1a36c0 2022-01-09 op
770 fb1a36c0 2022-01-09 op #undef NUMCAST
771 fb1a36c0 2022-01-09 op }
772 fb1a36c0 2022-01-09 op
773 fb1a36c0 2022-01-09 op int
774 fb1a36c0 2022-01-09 op val_faccess(struct value *a, const char *field, struct value *ret)
775 fb1a36c0 2022-01-09 op {
776 fb1a36c0 2022-01-09 op uint8_t mtype;
777 fb1a36c0 2022-01-09 op uint16_t len;
778 fb1a36c0 2022-01-09 op const char *errstr;
779 fb1a36c0 2022-01-09 op
780 fb1a36c0 2022-01-09 op #define MSGTYPE(m) *(m.msg + 4) /* skip the length */
781 fb1a36c0 2022-01-09 op
782 fb1a36c0 2022-01-09 op switch (a->type) {
783 fb1a36c0 2022-01-09 op case V_QID:
784 fb1a36c0 2022-01-09 op /* TODO: add path. needs uint64_t values thought! */
785 fb1a36c0 2022-01-09 op if (!strcmp(field, "vers")) {
786 fb1a36c0 2022-01-09 op ret->type = V_U32;
787 fb1a36c0 2022-01-09 op memcpy(&ret->v.u32, a->v.qid+1, 4);
788 fb1a36c0 2022-01-09 op return EVAL_OK;
789 fb1a36c0 2022-01-09 op } else if (!strcmp(field, "type")) {
790 fb1a36c0 2022-01-09 op ret->type = V_U8;
791 fb1a36c0 2022-01-09 op ret->v.u8 = *a->v.qid;
792 fb1a36c0 2022-01-09 op return EVAL_OK;
793 fb1a36c0 2022-01-09 op }
794 fb1a36c0 2022-01-09 op break;
795 fb1a36c0 2022-01-09 op
796 fb1a36c0 2022-01-09 op case V_MSG:
797 fb1a36c0 2022-01-09 op mtype = MSGTYPE(a->v.msg);
798 fb1a36c0 2022-01-09 op if (!strcmp(field, "type")) {
799 fb1a36c0 2022-01-09 op ret->type = V_U8;
800 fb1a36c0 2022-01-09 op ret->v.u8 = MSGTYPE(a->v.msg);
801 fb1a36c0 2022-01-09 op return EVAL_OK;
802 fb1a36c0 2022-01-09 op } else if (!strcmp(field, "tag")) {
803 fb1a36c0 2022-01-09 op ret->type = V_U16;
804 fb1a36c0 2022-01-09 op memcpy(&ret->v.u16, &a->v.msg.msg[5], 2);
805 fb1a36c0 2022-01-09 op ret->v.u16 = le16toh(ret->v.u16);
806 fb1a36c0 2022-01-09 op return EVAL_OK;
807 fb1a36c0 2022-01-09 op } else if (!strcmp(field, "msize") && mtype == Rversion) {
808 fb1a36c0 2022-01-09 op ret->type = V_U32;
809 fb1a36c0 2022-01-09 op memcpy(&ret->v.u32, &a->v.msg.msg[7], 4);
810 fb1a36c0 2022-01-09 op ret->v.u32 = le32toh(ret->v.u32);
811 fb1a36c0 2022-01-09 op return EVAL_OK;
812 fb1a36c0 2022-01-09 op } else if (!strcmp(field, "qid") && mtype == Rattach) {
813 fb1a36c0 2022-01-09 op ret->type = V_QID;
814 fb1a36c0 2022-01-09 op memcpy(&ret->v.qid, &a->v.msg.msg[7], QIDSIZE);
815 fb1a36c0 2022-01-09 op return EVAL_OK;
816 fb1a36c0 2022-01-09 op } else if (!strcmp(field, "nwqid") && mtype == Rwalk) {
817 fb1a36c0 2022-01-09 op ret->type = V_U16;
818 fb1a36c0 2022-01-09 op memcpy(&ret->v.u16, &a->v.msg.msg[7], 2);
819 fb1a36c0 2022-01-09 op ret->v.u16 = le16toh(ret->v.u16);
820 fb1a36c0 2022-01-09 op return EVAL_OK;
821 fb1a36c0 2022-01-09 op } else if (!strcmp(field, "wqid") && mtype == Rwalk) {
822 fb1a36c0 2022-01-09 op ret->type = V_QIDVEC;
823 fb1a36c0 2022-01-09 op ret->v.qidvec.start = &a->v.msg.msg[9];
824 fb1a36c0 2022-01-09 op memcpy(&len, &a->v.msg.msg[7], 2);
825 fb1a36c0 2022-01-09 op len = le16toh(len);
826 fb1a36c0 2022-01-09 op ret->v.qidvec.len = len;
827 fb1a36c0 2022-01-09 op return EVAL_OK;
828 fb1a36c0 2022-01-09 op }
829 fb1a36c0 2022-01-09 op break;
830 fb1a36c0 2022-01-09 op
831 fb1a36c0 2022-01-09 op case V_QIDVEC:
832 fb1a36c0 2022-01-09 op len = strtonum(field, 0, MAXWELEM, &errstr);
833 fb1a36c0 2022-01-09 op if (errstr != NULL) {
834 fb1a36c0 2022-01-09 op before_printing();
835 fb1a36c0 2022-01-09 op printf("can't access qid #%s: %s\n", field, errstr);
836 fb1a36c0 2022-01-09 op return EVAL_ERR;
837 fb1a36c0 2022-01-09 op }
838 fb1a36c0 2022-01-09 op
839 fb1a36c0 2022-01-09 op if (len >= a->v.qidvec.len) {
840 fb1a36c0 2022-01-09 op before_printing();
841 fb1a36c0 2022-01-09 op printf("can't access qid #%d: out-of-bound "
842 fb1a36c0 2022-01-09 op "(max %zu)\n", len, a->v.qidvec.len);
843 fb1a36c0 2022-01-09 op return EVAL_ERR;
844 fb1a36c0 2022-01-09 op }
845 fb1a36c0 2022-01-09 op
846 fb1a36c0 2022-01-09 op ret->type = V_QID;
847 fb1a36c0 2022-01-09 op memcpy(&ret->v.qid, a->v.qidvec.start + len * QIDSIZE,
848 fb1a36c0 2022-01-09 op QIDSIZE);
849 fb1a36c0 2022-01-09 op
850 fb1a36c0 2022-01-09 op return EVAL_OK;
851 fb1a36c0 2022-01-09 op
852 fb1a36c0 2022-01-09 op default:
853 fb1a36c0 2022-01-09 op break;
854 fb1a36c0 2022-01-09 op }
855 fb1a36c0 2022-01-09 op
856 fb1a36c0 2022-01-09 op before_printing();
857 fb1a36c0 2022-01-09 op printf("can't access field `%s' on type %s (", field, val_type(a));
858 fb1a36c0 2022-01-09 op pp_val(a);
859 fb1a36c0 2022-01-09 op printf(")\n");
860 fb1a36c0 2022-01-09 op return EVAL_ERR;
861 fb1a36c0 2022-01-09 op
862 fb1a36c0 2022-01-09 op #undef MSGTYPE
863 fb1a36c0 2022-01-09 op }
864 fb1a36c0 2022-01-09 op
865 fb1a36c0 2022-01-09 op void
866 fb1a36c0 2022-01-09 op pp_op(struct op *op)
867 fb1a36c0 2022-01-09 op {
868 fb1a36c0 2022-01-09 op struct op *aux;
869 fb1a36c0 2022-01-09 op
870 fb1a36c0 2022-01-09 op switch (op->type) {
871 fb1a36c0 2022-01-09 op case OP_REST:
872 fb1a36c0 2022-01-09 op printf("...");
873 fb1a36c0 2022-01-09 op break;
874 fb1a36c0 2022-01-09 op case OP_ASSIGN:
875 fb1a36c0 2022-01-09 op printf("%s = ", op->v.assign.name);
876 fb1a36c0 2022-01-09 op pp_op(op->v.assign.expr);
877 fb1a36c0 2022-01-09 op break;
878 fb1a36c0 2022-01-09 op case OP_ASSERT:
879 fb1a36c0 2022-01-09 op printf("assert ");
880 fb1a36c0 2022-01-09 op pp_op(op->v.assert);
881 fb1a36c0 2022-01-09 op break;
882 fb1a36c0 2022-01-09 op case OP_FUNCALL:
883 fb1a36c0 2022-01-09 op printf("funcall %s(", op->v.funcall.proc->name);
884 fb1a36c0 2022-01-09 op for (aux = op->v.funcall.argv; aux != NULL; aux = aux->next) {
885 fb1a36c0 2022-01-09 op pp_op(aux);
886 fb1a36c0 2022-01-09 op if (aux->next != NULL)
887 fb1a36c0 2022-01-09 op printf(", ");
888 fb1a36c0 2022-01-09 op }
889 fb1a36c0 2022-01-09 op printf(")");
890 fb1a36c0 2022-01-09 op break;
891 fb1a36c0 2022-01-09 op case OP_LITERAL:
892 fb1a36c0 2022-01-09 op pp_val(&op->v.literal);
893 fb1a36c0 2022-01-09 op break;
894 fb1a36c0 2022-01-09 op case OP_VAR:
895 fb1a36c0 2022-01-09 op printf("%s", op->v.var);
896 fb1a36c0 2022-01-09 op break;
897 fb1a36c0 2022-01-09 op case OP_CAST:
898 fb1a36c0 2022-01-09 op pp_op(op->v.cast.expr);
899 fb1a36c0 2022-01-09 op printf(":");
900 fb1a36c0 2022-01-09 op switch (op->v.cast.totype) {
901 fb1a36c0 2022-01-09 op case V_U8: printf("u8"); break;
902 fb1a36c0 2022-01-09 op case V_U16: printf("u16"); break;
903 fb1a36c0 2022-01-09 op case V_U32: printf("u32"); break;
904 fb1a36c0 2022-01-09 op case V_STR: printf("str"); break;
905 fb1a36c0 2022-01-09 op default: printf("???"); break;
906 fb1a36c0 2022-01-09 op }
907 fb1a36c0 2022-01-09 op break;
908 fb1a36c0 2022-01-09 op case OP_CMP_EQ:
909 fb1a36c0 2022-01-09 op pp_op(op->v.bin_cmp.a);
910 fb1a36c0 2022-01-09 op printf(" == ");
911 fb1a36c0 2022-01-09 op pp_op(op->v.bin_cmp.b);
912 fb1a36c0 2022-01-09 op break;
913 fb1a36c0 2022-01-09 op case OP_CMP_LEQ:
914 fb1a36c0 2022-01-09 op pp_op(op->v.bin_cmp.a);
915 fb1a36c0 2022-01-09 op printf(" <= ");
916 fb1a36c0 2022-01-09 op pp_op(op->v.bin_cmp.b);
917 fb1a36c0 2022-01-09 op break;
918 fb1a36c0 2022-01-09 op case OP_FACCESS:
919 fb1a36c0 2022-01-09 op pp_op(op->v.faccess.expr);
920 fb1a36c0 2022-01-09 op printf(".%s", op->v.faccess.field);
921 fb1a36c0 2022-01-09 op break;
922 fb1a36c0 2022-01-09 op case OP_SFAIL:
923 fb1a36c0 2022-01-09 op printf("should-fail ");
924 fb1a36c0 2022-01-09 op pp_op(op->v.sfail.expr);
925 fb1a36c0 2022-01-09 op if (op->v.sfail.msg != NULL)
926 fb1a36c0 2022-01-09 op printf(": \"%s\"", op->v.sfail.msg);
927 fb1a36c0 2022-01-09 op break;
928 fb1a36c0 2022-01-09 op case OP_VARGS:
929 fb1a36c0 2022-01-09 op printf("vargs");
930 fb1a36c0 2022-01-09 op break;
931 fb1a36c0 2022-01-09 op default:
932 fb1a36c0 2022-01-09 op printf(" ???[%d] ", op->type);
933 fb1a36c0 2022-01-09 op }
934 fb1a36c0 2022-01-09 op }
935 fb1a36c0 2022-01-09 op
936 fb1a36c0 2022-01-09 op void
937 fb1a36c0 2022-01-09 op pp_block(struct op *op)
938 fb1a36c0 2022-01-09 op {
939 fb1a36c0 2022-01-09 op while (op != NULL) {
940 fb1a36c0 2022-01-09 op printf("> ");
941 fb1a36c0 2022-01-09 op pp_op(op);
942 fb1a36c0 2022-01-09 op printf("\n");
943 fb1a36c0 2022-01-09 op
944 fb1a36c0 2022-01-09 op op = op->next;
945 fb1a36c0 2022-01-09 op }
946 fb1a36c0 2022-01-09 op }
947 fb1a36c0 2022-01-09 op
948 fb1a36c0 2022-01-09 op int
949 fb1a36c0 2022-01-09 op eval(struct op *op)
950 fb1a36c0 2022-01-09 op {
951 fb1a36c0 2022-01-09 op struct value a, b;
952 fb1a36c0 2022-01-09 op struct proc *proc;
953 fb1a36c0 2022-01-09 op struct op *t, *tnext;
954 fb1a36c0 2022-01-09 op int i, ret;
955 fb1a36c0 2022-01-09 op
956 fb1a36c0 2022-01-09 op #if DEBUG
957 fb1a36c0 2022-01-09 op pp_op(op);
958 fb1a36c0 2022-01-09 op printf("\n");
959 fb1a36c0 2022-01-09 op #endif
960 fb1a36c0 2022-01-09 op
961 fb1a36c0 2022-01-09 op switch (op->type) {
962 fb1a36c0 2022-01-09 op case OP_REST:
963 fb1a36c0 2022-01-09 op /*
964 fb1a36c0 2022-01-09 op * Try to load the rest argument. Note that it can be
965 fb1a36c0 2022-01-09 op * empty!
966 fb1a36c0 2022-01-09 op */
967 fb1a36c0 2022-01-09 op if ((ret = getvar_raw("...", &t)) == EVAL_OK)
968 fb1a36c0 2022-01-09 op if ((ret = eval(t)) != EVAL_OK)
969 fb1a36c0 2022-01-09 op return ret;
970 fb1a36c0 2022-01-09 op break;
971 fb1a36c0 2022-01-09 op
972 fb1a36c0 2022-01-09 op case OP_ASSIGN:
973 fb1a36c0 2022-01-09 op ret = setvar(op->v.assign.name, op->v.assign.expr);
974 fb1a36c0 2022-01-09 op if (ret != EVAL_OK)
975 fb1a36c0 2022-01-09 op return ret;
976 fb1a36c0 2022-01-09 op break;
977 fb1a36c0 2022-01-09 op
978 fb1a36c0 2022-01-09 op case OP_ASSERT:
979 fb1a36c0 2022-01-09 op if ((ret = eval(op->v.assert)) != EVAL_OK)
980 fb1a36c0 2022-01-09 op return ret;
981 fb1a36c0 2022-01-09 op popv(&a);
982 fb1a36c0 2022-01-09 op if (!val_trueish(&a)) {
983 fb1a36c0 2022-01-09 op before_printing();
984 fb1a36c0 2022-01-09 op printf("assertion failed: ");
985 fb1a36c0 2022-01-09 op pp_op(op->v.assert);
986 fb1a36c0 2022-01-09 op printf("\n");
987 fb1a36c0 2022-01-09 op return EVAL_ERR;
988 fb1a36c0 2022-01-09 op }
989 fb1a36c0 2022-01-09 op break;
990 fb1a36c0 2022-01-09 op
991 fb1a36c0 2022-01-09 op case OP_FUNCALL:
992 fb1a36c0 2022-01-09 op /* assume airity matches */
993 fb1a36c0 2022-01-09 op
994 fb1a36c0 2022-01-09 op proc = op->v.funcall.proc;
995 fb1a36c0 2022-01-09 op if (proc->nativefn != NULL) {
996 fb1a36c0 2022-01-09 op /*
997 fb1a36c0 2022-01-09 op * Push arguments on the stack for builtin
998 fb1a36c0 2022-01-09 op * functions. Counting the height of the
999 fb1a36c0 2022-01-09 op * stack is done to compute the correct number
1000 fb1a36c0 2022-01-09 op * in the vararg case. argc only counts the
1001 fb1a36c0 2022-01-09 op * "syntactical" arguments, i.e. foo(x, ...)
1002 fb1a36c0 2022-01-09 op * has argc == 2, but at runtime argc may be
1003 fb1a36c0 2022-01-09 op * 1, 2 or a greater number!
1004 fb1a36c0 2022-01-09 op */
1005 fb1a36c0 2022-01-09 op
1006 fb1a36c0 2022-01-09 op i = stackh;
1007 fb1a36c0 2022-01-09 op t = op->v.funcall.argv;
1008 fb1a36c0 2022-01-09 op if (t != NULL && (ret = eval(t)) != EVAL_OK)
1009 fb1a36c0 2022-01-09 op return ret;
1010 fb1a36c0 2022-01-09 op i = stackh - i;
1011 fb1a36c0 2022-01-09 op
1012 fb1a36c0 2022-01-09 op assert(i >= 0);
1013 fb1a36c0 2022-01-09 op
1014 fb1a36c0 2022-01-09 op if ((ret = proc->nativefn(i))
1015 fb1a36c0 2022-01-09 op != EVAL_OK)
1016 fb1a36c0 2022-01-09 op return ret;
1017 fb1a36c0 2022-01-09 op } else {
1018 fb1a36c0 2022-01-09 op if (proc->body == NULL) {
1019 fb1a36c0 2022-01-09 op before_printing();
1020 fb1a36c0 2022-01-09 op printf("warn: calling the empty proc `%s'\n",
1021 fb1a36c0 2022-01-09 op proc->name);
1022 fb1a36c0 2022-01-09 op break;
1023 fb1a36c0 2022-01-09 op }
1024 fb1a36c0 2022-01-09 op
1025 fb1a36c0 2022-01-09 op pushenv();
1026 fb1a36c0 2022-01-09 op
1027 fb1a36c0 2022-01-09 op for (t = op->v.funcall.argv, i = 0;
1028 fb1a36c0 2022-01-09 op t != NULL;
1029 fb1a36c0 2022-01-09 op t = t->next, i++) {
1030 fb1a36c0 2022-01-09 op /*
1031 fb1a36c0 2022-01-09 op * Push a pseudo variable `...' (and
1032 fb1a36c0 2022-01-09 op * don't evaluate it) in the vararg
1033 fb1a36c0 2022-01-09 op * case. A special case is when the
1034 fb1a36c0 2022-01-09 op * variable is itself `...'.
1035 fb1a36c0 2022-01-09 op */
1036 fb1a36c0 2022-01-09 op if (proc->vararg && i == proc->minargs) {
1037 fb1a36c0 2022-01-09 op if (t->type != OP_REST)
1038 fb1a36c0 2022-01-09 op setvar_raw(xstrdup("..."), t);
1039 fb1a36c0 2022-01-09 op break;
1040 fb1a36c0 2022-01-09 op }
1041 fb1a36c0 2022-01-09 op
1042 fb1a36c0 2022-01-09 op /*
1043 fb1a36c0 2022-01-09 op * The arguments are a linked list of
1044 fb1a36c0 2022-01-09 op * ops. Setvar will call eval that
1045 fb1a36c0 2022-01-09 op * will evaluate *all* the arguments.
1046 fb1a36c0 2022-01-09 op * The dance here that sets next to
1047 fb1a36c0 2022-01-09 op * NULL and then restores it is to
1048 fb1a36c0 2022-01-09 op * avoid this behaviour.
1049 fb1a36c0 2022-01-09 op */
1050 fb1a36c0 2022-01-09 op tnext = t->next;
1051 fb1a36c0 2022-01-09 op t->next = NULL;
1052 fb1a36c0 2022-01-09 op ret = setvar(proc->args[i], t);
1053 fb1a36c0 2022-01-09 op t->next = tnext;
1054 fb1a36c0 2022-01-09 op
1055 fb1a36c0 2022-01-09 op if (ret != EVAL_OK)
1056 fb1a36c0 2022-01-09 op return ret;
1057 fb1a36c0 2022-01-09 op }
1058 fb1a36c0 2022-01-09 op
1059 fb1a36c0 2022-01-09 op if ((ret = eval(proc->body)) != EVAL_OK)
1060 fb1a36c0 2022-01-09 op return ret;
1061 fb1a36c0 2022-01-09 op
1062 fb1a36c0 2022-01-09 op popenv();
1063 fb1a36c0 2022-01-09 op }
1064 fb1a36c0 2022-01-09 op
1065 fb1a36c0 2022-01-09 op break;
1066 fb1a36c0 2022-01-09 op
1067 fb1a36c0 2022-01-09 op case OP_LITERAL:
1068 fb1a36c0 2022-01-09 op pushv(&op->v.literal);
1069 fb1a36c0 2022-01-09 op break;
1070 fb1a36c0 2022-01-09 op
1071 fb1a36c0 2022-01-09 op case OP_VAR:
1072 fb1a36c0 2022-01-09 op if ((ret = getvar(op->v.var, &a)) != EVAL_OK)
1073 fb1a36c0 2022-01-09 op return ret;
1074 fb1a36c0 2022-01-09 op pushv(&a);
1075 fb1a36c0 2022-01-09 op break;
1076 fb1a36c0 2022-01-09 op
1077 fb1a36c0 2022-01-09 op case OP_CAST:
1078 fb1a36c0 2022-01-09 op if ((ret = eval(op->v.cast.expr)) != EVAL_OK)
1079 fb1a36c0 2022-01-09 op return ret;
1080 fb1a36c0 2022-01-09 op popv(&a);
1081 fb1a36c0 2022-01-09 op if ((ret = val_cast(&a, op->v.cast.totype)) != EVAL_OK)
1082 fb1a36c0 2022-01-09 op return ret;
1083 fb1a36c0 2022-01-09 op pushv(&a);
1084 fb1a36c0 2022-01-09 op break;
1085 fb1a36c0 2022-01-09 op
1086 fb1a36c0 2022-01-09 op case OP_CMP_EQ:
1087 fb1a36c0 2022-01-09 op if ((ret = eval(op->v.bin_cmp.a)) != EVAL_OK)
1088 fb1a36c0 2022-01-09 op return ret;
1089 fb1a36c0 2022-01-09 op if ((ret = eval(op->v.bin_cmp.b)) != EVAL_OK)
1090 fb1a36c0 2022-01-09 op return ret;
1091 fb1a36c0 2022-01-09 op
1092 fb1a36c0 2022-01-09 op popv(&b);
1093 fb1a36c0 2022-01-09 op popv(&a);
1094 fb1a36c0 2022-01-09 op pushbool(val_eq(&a, &b));
1095 fb1a36c0 2022-01-09 op break;
1096 fb1a36c0 2022-01-09 op
1097 fb1a36c0 2022-01-09 op case OP_CMP_LEQ:
1098 fb1a36c0 2022-01-09 op if ((ret = eval(op->v.bin_cmp.a)) != EVAL_OK)
1099 fb1a36c0 2022-01-09 op return ret;
1100 fb1a36c0 2022-01-09 op if ((ret = eval(op->v.bin_cmp.b)) != EVAL_OK)
1101 fb1a36c0 2022-01-09 op return ret;
1102 fb1a36c0 2022-01-09 op
1103 fb1a36c0 2022-01-09 op popv(&b);
1104 fb1a36c0 2022-01-09 op popv(&a);
1105 fb1a36c0 2022-01-09 op pushbool(val_leq(&a, &b));
1106 fb1a36c0 2022-01-09 op break;
1107 fb1a36c0 2022-01-09 op
1108 fb1a36c0 2022-01-09 op case OP_FACCESS:
1109 fb1a36c0 2022-01-09 op if ((ret = eval(op->v.faccess.expr)) != EVAL_OK)
1110 fb1a36c0 2022-01-09 op return ret;
1111 fb1a36c0 2022-01-09 op popv(&a);
1112 fb1a36c0 2022-01-09 op if ((ret = val_faccess(&a, op->v.faccess.field, &b))
1113 fb1a36c0 2022-01-09 op != EVAL_OK)
1114 fb1a36c0 2022-01-09 op return ret;
1115 fb1a36c0 2022-01-09 op pushv(&b);
1116 fb1a36c0 2022-01-09 op break;
1117 fb1a36c0 2022-01-09 op
1118 fb1a36c0 2022-01-09 op case OP_SFAIL:
1119 fb1a36c0 2022-01-09 op if ((ret = eval(op->v.sfail.expr)) == EVAL_OK) {
1120 fb1a36c0 2022-01-09 op before_printing();
1121 fb1a36c0 2022-01-09 op printf("expecting failure");
1122 fb1a36c0 2022-01-09 op if (op->v.sfail.msg != NULL)
1123 fb1a36c0 2022-01-09 op printf(" \"%s\"", op->v.sfail.msg);
1124 fb1a36c0 2022-01-09 op printf("\n");
1125 fb1a36c0 2022-01-09 op printf("expression: ");
1126 fb1a36c0 2022-01-09 op pp_op(op->v.sfail.expr);
1127 fb1a36c0 2022-01-09 op printf("\n");
1128 fb1a36c0 2022-01-09 op return EVAL_ERR;
1129 fb1a36c0 2022-01-09 op }
1130 fb1a36c0 2022-01-09 op if (ret == EVAL_SKIP)
1131 fb1a36c0 2022-01-09 op return ret;
1132 fb1a36c0 2022-01-09 op break;
1133 fb1a36c0 2022-01-09 op
1134 fb1a36c0 2022-01-09 op case OP_VARGS:
1135 fb1a36c0 2022-01-09 op if ((ret = getvar_raw("...", &t)) == EVAL_OK) {
1136 fb1a36c0 2022-01-09 op for (i = 0; t != NULL; t = t->next)
1137 fb1a36c0 2022-01-09 op i++;
1138 fb1a36c0 2022-01-09 op pushnum(i);
1139 fb1a36c0 2022-01-09 op } else
1140 fb1a36c0 2022-01-09 op pushnum(0);
1141 fb1a36c0 2022-01-09 op break;
1142 fb1a36c0 2022-01-09 op
1143 fb1a36c0 2022-01-09 op default:
1144 fb1a36c0 2022-01-09 op before_printing();
1145 fb1a36c0 2022-01-09 op fprintf(stderr, "invalid op, aborting.\n");
1146 fb1a36c0 2022-01-09 op abort();
1147 fb1a36c0 2022-01-09 op }
1148 fb1a36c0 2022-01-09 op
1149 fb1a36c0 2022-01-09 op if (op->next)
1150 fb1a36c0 2022-01-09 op return eval(op->next);
1151 fb1a36c0 2022-01-09 op return EVAL_OK;
1152 fb1a36c0 2022-01-09 op }
1153 fb1a36c0 2022-01-09 op
1154 fb1a36c0 2022-01-09 op void
1155 fb1a36c0 2022-01-09 op prepare_funcall(void)
1156 fb1a36c0 2022-01-09 op {
1157 fb1a36c0 2022-01-09 op pushstack(&args);
1158 fb1a36c0 2022-01-09 op }
1159 fb1a36c0 2022-01-09 op
1160 fb1a36c0 2022-01-09 op void
1161 fb1a36c0 2022-01-09 op push_arg(struct op *op)
1162 fb1a36c0 2022-01-09 op {
1163 fb1a36c0 2022-01-09 op push(&args, op);
1164 fb1a36c0 2022-01-09 op }
1165 fb1a36c0 2022-01-09 op
1166 fb1a36c0 2022-01-09 op struct op *
1167 fb1a36c0 2022-01-09 op op_funcall(struct proc *proc)
1168 fb1a36c0 2022-01-09 op {
1169 fb1a36c0 2022-01-09 op struct op *op, *argv;
1170 fb1a36c0 2022-01-09 op int argc;
1171 fb1a36c0 2022-01-09 op
1172 fb1a36c0 2022-01-09 op argv = finalize(&args, &argc);
1173 fb1a36c0 2022-01-09 op
1174 fb1a36c0 2022-01-09 op op = newop(OP_FUNCALL);
1175 fb1a36c0 2022-01-09 op op->v.funcall.proc = proc;
1176 fb1a36c0 2022-01-09 op op->v.funcall.argv = argv;
1177 fb1a36c0 2022-01-09 op op->v.funcall.argc = argc;
1178 fb1a36c0 2022-01-09 op
1179 fb1a36c0 2022-01-09 op return op;
1180 fb1a36c0 2022-01-09 op }
1181 fb1a36c0 2022-01-09 op
1182 fb1a36c0 2022-01-09 op void
1183 fb1a36c0 2022-01-09 op add_builtin_proc(const char *name, int (*fn)(int), int argc, int vararg)
1184 fb1a36c0 2022-01-09 op {
1185 fb1a36c0 2022-01-09 op struct proc *proc;
1186 fb1a36c0 2022-01-09 op
1187 fb1a36c0 2022-01-09 op proc = xcalloc(1, sizeof(*proc));
1188 fb1a36c0 2022-01-09 op proc->name = xstrdup(name);
1189 fb1a36c0 2022-01-09 op proc->nativefn = fn;
1190 fb1a36c0 2022-01-09 op proc->minargs = argc;
1191 fb1a36c0 2022-01-09 op proc->vararg = vararg;
1192 fb1a36c0 2022-01-09 op
1193 fb1a36c0 2022-01-09 op TAILQ_INSERT_HEAD(&procs, proc, entry);
1194 fb1a36c0 2022-01-09 op }
1195 fb1a36c0 2022-01-09 op
1196 fb1a36c0 2022-01-09 op void
1197 fb1a36c0 2022-01-09 op prepare_proc(void)
1198 fb1a36c0 2022-01-09 op {
1199 fb1a36c0 2022-01-09 op pushstack(&args);
1200 fb1a36c0 2022-01-09 op }
1201 fb1a36c0 2022-01-09 op
1202 fb1a36c0 2022-01-09 op int
1203 fb1a36c0 2022-01-09 op proc_setup_body(void)
1204 fb1a36c0 2022-01-09 op {
1205 fb1a36c0 2022-01-09 op struct opstack *argv;
1206 fb1a36c0 2022-01-09 op struct op *op;
1207 fb1a36c0 2022-01-09 op int i;
1208 fb1a36c0 2022-01-09 op
1209 fb1a36c0 2022-01-09 op argv = peek(&args);
1210 fb1a36c0 2022-01-09 op for (i = 0, op = argv->base.next; op != NULL; i++) {
1211 fb1a36c0 2022-01-09 op /*
1212 fb1a36c0 2022-01-09 op * TODO: should free the whole list on error but..,
1213 fb1a36c0 2022-01-09 op * we're gonna exit real soon(tm)!
1214 fb1a36c0 2022-01-09 op */
1215 fb1a36c0 2022-01-09 op if (op->type != OP_VAR && op->type != OP_REST)
1216 fb1a36c0 2022-01-09 op return 0;
1217 fb1a36c0 2022-01-09 op
1218 fb1a36c0 2022-01-09 op op = op->next;
1219 fb1a36c0 2022-01-09 op }
1220 fb1a36c0 2022-01-09 op
1221 fb1a36c0 2022-01-09 op assert(i == argv->counter);
1222 fb1a36c0 2022-01-09 op pushstack(&blocks);
1223 fb1a36c0 2022-01-09 op return 1;
1224 fb1a36c0 2022-01-09 op }
1225 fb1a36c0 2022-01-09 op
1226 fb1a36c0 2022-01-09 op void
1227 fb1a36c0 2022-01-09 op proc_done(char *name)
1228 fb1a36c0 2022-01-09 op {
1229 fb1a36c0 2022-01-09 op struct proc *proc;
1230 fb1a36c0 2022-01-09 op struct op *op, *next, *argv, *body;
1231 fb1a36c0 2022-01-09 op int i, argc;
1232 fb1a36c0 2022-01-09 op
1233 fb1a36c0 2022-01-09 op argv = finalize(&args, &argc);
1234 fb1a36c0 2022-01-09 op body = finalize(&blocks, NULL);
1235 fb1a36c0 2022-01-09 op
1236 fb1a36c0 2022-01-09 op proc = xcalloc(1, sizeof(*proc));
1237 fb1a36c0 2022-01-09 op proc->name = name;
1238 fb1a36c0 2022-01-09 op proc->minargs = argc;
1239 fb1a36c0 2022-01-09 op
1240 fb1a36c0 2022-01-09 op for (i = 0, op = argv; op != NULL; ++i) {
1241 fb1a36c0 2022-01-09 op if (op->type == OP_REST) {
1242 fb1a36c0 2022-01-09 op proc->vararg = 1;
1243 fb1a36c0 2022-01-09 op proc->minargs = i;
1244 fb1a36c0 2022-01-09 op break;
1245 fb1a36c0 2022-01-09 op }
1246 fb1a36c0 2022-01-09 op
1247 fb1a36c0 2022-01-09 op proc->args[i] = xstrdup(op->v.var);
1248 fb1a36c0 2022-01-09 op
1249 fb1a36c0 2022-01-09 op next = op->next;
1250 fb1a36c0 2022-01-09 op free_op(op);
1251 fb1a36c0 2022-01-09 op op = next;
1252 fb1a36c0 2022-01-09 op }
1253 fb1a36c0 2022-01-09 op assert(i == argc || (proc->vararg && i == proc->minargs));
1254 fb1a36c0 2022-01-09 op
1255 fb1a36c0 2022-01-09 op proc->body = body;
1256 fb1a36c0 2022-01-09 op
1257 fb1a36c0 2022-01-09 op TAILQ_INSERT_HEAD(&procs, proc, entry);
1258 fb1a36c0 2022-01-09 op }
1259 fb1a36c0 2022-01-09 op
1260 fb1a36c0 2022-01-09 op void
1261 fb1a36c0 2022-01-09 op block_push(struct op *op)
1262 fb1a36c0 2022-01-09 op {
1263 fb1a36c0 2022-01-09 op push(&blocks, op);
1264 fb1a36c0 2022-01-09 op }
1265 fb1a36c0 2022-01-09 op
1266 fb1a36c0 2022-01-09 op struct proc *
1267 fb1a36c0 2022-01-09 op proc_by_name(const char *name)
1268 fb1a36c0 2022-01-09 op {
1269 fb1a36c0 2022-01-09 op struct proc *p;
1270 fb1a36c0 2022-01-09 op
1271 fb1a36c0 2022-01-09 op TAILQ_FOREACH(p, &procs, entry) {
1272 fb1a36c0 2022-01-09 op if (!strcmp(p->name, name))
1273 fb1a36c0 2022-01-09 op return p;
1274 fb1a36c0 2022-01-09 op }
1275 fb1a36c0 2022-01-09 op
1276 fb1a36c0 2022-01-09 op return NULL;
1277 fb1a36c0 2022-01-09 op }
1278 fb1a36c0 2022-01-09 op
1279 fb1a36c0 2022-01-09 op void
1280 fb1a36c0 2022-01-09 op prepare_test(void)
1281 fb1a36c0 2022-01-09 op {
1282 fb1a36c0 2022-01-09 op pushstack(&blocks);
1283 fb1a36c0 2022-01-09 op }
1284 fb1a36c0 2022-01-09 op
1285 fb1a36c0 2022-01-09 op void
1286 a0ec53a2 2022-01-09 op test_done(int shouldfail, char *name)
1287 fb1a36c0 2022-01-09 op {
1288 fb1a36c0 2022-01-09 op struct test *test;
1289 fb1a36c0 2022-01-09 op
1290 fb1a36c0 2022-01-09 op test = xcalloc(1, sizeof(*test));
1291 fb1a36c0 2022-01-09 op test->shouldfail = shouldfail;
1292 fb1a36c0 2022-01-09 op test->name = name;
1293 fb1a36c0 2022-01-09 op test->body = finalize(&blocks, NULL);
1294 fb1a36c0 2022-01-09 op
1295 7c94ab42 2022-01-10 op TAILQ_INSERT_TAIL(&tests, test, entry);
1296 fb1a36c0 2022-01-09 op
1297 fb1a36c0 2022-01-09 op ntests++;
1298 fb1a36c0 2022-01-09 op }
1299 fb1a36c0 2022-01-09 op
1300 fb1a36c0 2022-01-09 op static int
1301 fb1a36c0 2022-01-09 op builtin_print(int argc)
1302 fb1a36c0 2022-01-09 op {
1303 fb1a36c0 2022-01-09 op struct value v;
1304 fb1a36c0 2022-01-09 op int i;
1305 fb1a36c0 2022-01-09 op
1306 fb1a36c0 2022-01-09 op before_printing();
1307 fb1a36c0 2022-01-09 op
1308 fb1a36c0 2022-01-09 op for (i = argc; i > 0; --i) {
1309 fb1a36c0 2022-01-09 op peekn(i, &v);
1310 fb1a36c0 2022-01-09 op if (v.type == V_STR)
1311 fb1a36c0 2022-01-09 op printf("%s", v.v.str);
1312 fb1a36c0 2022-01-09 op else
1313 fb1a36c0 2022-01-09 op pp_val(&v);
1314 fb1a36c0 2022-01-09 op printf(" ");
1315 fb1a36c0 2022-01-09 op }
1316 fb1a36c0 2022-01-09 op
1317 fb1a36c0 2022-01-09 op printf("\n");
1318 fb1a36c0 2022-01-09 op
1319 fb1a36c0 2022-01-09 op popvn(argc);
1320 fb1a36c0 2022-01-09 op
1321 fb1a36c0 2022-01-09 op return EVAL_OK;
1322 fb1a36c0 2022-01-09 op }
1323 fb1a36c0 2022-01-09 op
1324 fb1a36c0 2022-01-09 op static int
1325 fb1a36c0 2022-01-09 op builtin_debug(int argc)
1326 fb1a36c0 2022-01-09 op {
1327 fb1a36c0 2022-01-09 op if (debug)
1328 fb1a36c0 2022-01-09 op return builtin_print(argc);
1329 fb1a36c0 2022-01-09 op
1330 fb1a36c0 2022-01-09 op popvn(argc);
1331 fb1a36c0 2022-01-09 op return EVAL_OK;
1332 fb1a36c0 2022-01-09 op }
1333 fb1a36c0 2022-01-09 op
1334 fb1a36c0 2022-01-09 op static int
1335 fb1a36c0 2022-01-09 op builtin_skip(int argc)
1336 fb1a36c0 2022-01-09 op {
1337 fb1a36c0 2022-01-09 op return EVAL_SKIP;
1338 fb1a36c0 2022-01-09 op }
1339 fb1a36c0 2022-01-09 op
1340 fb1a36c0 2022-01-09 op static int
1341 fb1a36c0 2022-01-09 op builtin_iota(int argc)
1342 fb1a36c0 2022-01-09 op {
1343 fb1a36c0 2022-01-09 op struct value v;
1344 fb1a36c0 2022-01-09 op
1345 fb1a36c0 2022-01-09 op v.type = V_U16;
1346 fb1a36c0 2022-01-09 op if ((v.v.u16 = ++lasttag) == 255)
1347 fb1a36c0 2022-01-09 op v.v.u16 = ++lasttag;
1348 fb1a36c0 2022-01-09 op
1349 fb1a36c0 2022-01-09 op pushv(&v);
1350 fb1a36c0 2022-01-09 op return EVAL_OK;
1351 fb1a36c0 2022-01-09 op }
1352 fb1a36c0 2022-01-09 op
1353 fb1a36c0 2022-01-09 op static int
1354 fb1a36c0 2022-01-09 op builtin_send(int argc)
1355 fb1a36c0 2022-01-09 op {
1356 fb1a36c0 2022-01-09 op struct ibuf *buf;
1357 fb1a36c0 2022-01-09 op struct value v;
1358 fb1a36c0 2022-01-09 op uint32_t len;
1359 fb1a36c0 2022-01-09 op uint16_t slen;
1360 fb1a36c0 2022-01-09 op int i;
1361 fb1a36c0 2022-01-09 op
1362 fb1a36c0 2022-01-09 op check_for_output();
1363 fb1a36c0 2022-01-09 op
1364 fb1a36c0 2022-01-09 op /*
1365 fb1a36c0 2022-01-09 op * Compute the length of the packet. 4 is for the initial
1366 fb1a36c0 2022-01-09 op * length field
1367 fb1a36c0 2022-01-09 op */
1368 fb1a36c0 2022-01-09 op len = 4;
1369 fb1a36c0 2022-01-09 op
1370 fb1a36c0 2022-01-09 op for (i = argc; i > 0; --i) {
1371 fb1a36c0 2022-01-09 op peekn(i, &v);
1372 fb1a36c0 2022-01-09 op switch (v.type) {
1373 fb1a36c0 2022-01-09 op case V_STR:
1374 fb1a36c0 2022-01-09 op len += 2; /* count */
1375 fb1a36c0 2022-01-09 op len += strlen(v.v.str);
1376 fb1a36c0 2022-01-09 op break;
1377 fb1a36c0 2022-01-09 op
1378 fb1a36c0 2022-01-09 op case V_U8:
1379 fb1a36c0 2022-01-09 op len += 1;
1380 fb1a36c0 2022-01-09 op break;
1381 fb1a36c0 2022-01-09 op
1382 fb1a36c0 2022-01-09 op case V_U16:
1383 fb1a36c0 2022-01-09 op len += 2;
1384 fb1a36c0 2022-01-09 op break;
1385 fb1a36c0 2022-01-09 op
1386 fb1a36c0 2022-01-09 op case V_U32:
1387 fb1a36c0 2022-01-09 op len += 4;
1388 fb1a36c0 2022-01-09 op break;
1389 fb1a36c0 2022-01-09 op
1390 fb1a36c0 2022-01-09 op default:
1391 fb1a36c0 2022-01-09 op before_printing();
1392 fb1a36c0 2022-01-09 op printf("%s: can't serialize ", __func__);
1393 fb1a36c0 2022-01-09 op pp_val(&v);
1394 fb1a36c0 2022-01-09 op printf("\n");
1395 fb1a36c0 2022-01-09 op return EVAL_ERR;
1396 fb1a36c0 2022-01-09 op }
1397 fb1a36c0 2022-01-09 op }
1398 fb1a36c0 2022-01-09 op
1399 fb1a36c0 2022-01-09 op if (len > UINT16_MAX) {
1400 fb1a36c0 2022-01-09 op before_printing();
1401 fb1a36c0 2022-01-09 op printf("%s: message size too long: got %d when max is %d\n",
1402 fb1a36c0 2022-01-09 op __func__, len, UINT16_MAX);
1403 fb1a36c0 2022-01-09 op return EVAL_ERR;
1404 fb1a36c0 2022-01-09 op }
1405 fb1a36c0 2022-01-09 op
1406 fb1a36c0 2022-01-09 op if ((buf = imsg_create(&ibuf, IMSG_BUF, 0, 0, len)) == NULL)
1407 fb1a36c0 2022-01-09 op fatal("imsg_create(%d)", len);
1408 fb1a36c0 2022-01-09 op
1409 fb1a36c0 2022-01-09 op len = htole32(len);
1410 fb1a36c0 2022-01-09 op imsg_add(buf, &len, sizeof(len));
1411 fb1a36c0 2022-01-09 op
1412 fb1a36c0 2022-01-09 op for (i = argc; i > 0; --i) {
1413 fb1a36c0 2022-01-09 op peekn(i, &v);
1414 fb1a36c0 2022-01-09 op switch (v.type) {
1415 fb1a36c0 2022-01-09 op case V_STR:
1416 fb1a36c0 2022-01-09 op slen = strlen(v.v.str);
1417 fb1a36c0 2022-01-09 op slen = htole16(slen);
1418 fb1a36c0 2022-01-09 op imsg_add(buf, &slen, sizeof(slen));
1419 fb1a36c0 2022-01-09 op imsg_add(buf, v.v.str, strlen(v.v.str));
1420 fb1a36c0 2022-01-09 op break;
1421 fb1a36c0 2022-01-09 op
1422 fb1a36c0 2022-01-09 op case V_U8:
1423 fb1a36c0 2022-01-09 op imsg_add(buf, &v.v.u8, 1);
1424 fb1a36c0 2022-01-09 op break;
1425 fb1a36c0 2022-01-09 op
1426 fb1a36c0 2022-01-09 op case V_U16:
1427 fb1a36c0 2022-01-09 op v.v.u16 = htole16(v.v.u16);
1428 fb1a36c0 2022-01-09 op imsg_add(buf, &v.v.u16, 2);
1429 fb1a36c0 2022-01-09 op break;
1430 fb1a36c0 2022-01-09 op
1431 fb1a36c0 2022-01-09 op case V_U32:
1432 fb1a36c0 2022-01-09 op v.v.u32 = htole32(v.v.u32);
1433 fb1a36c0 2022-01-09 op imsg_add(buf, &v.v.u32, 4);
1434 fb1a36c0 2022-01-09 op break;
1435 fb1a36c0 2022-01-09 op }
1436 fb1a36c0 2022-01-09 op }
1437 fb1a36c0 2022-01-09 op
1438 fb1a36c0 2022-01-09 op imsg_close(&ibuf, buf);
1439 fb1a36c0 2022-01-09 op
1440 fb1a36c0 2022-01-09 op if (imsg_flush(&ibuf) == -1) {
1441 fb1a36c0 2022-01-09 op i = errno;
1442 fb1a36c0 2022-01-09 op before_printing();
1443 fb1a36c0 2022-01-09 op printf("%s: imsg_flush failed: %s\n", __func__, strerror(i));
1444 fb1a36c0 2022-01-09 op return EVAL_ERR;
1445 fb1a36c0 2022-01-09 op }
1446 fb1a36c0 2022-01-09 op
1447 fb1a36c0 2022-01-09 op check_for_output();
1448 fb1a36c0 2022-01-09 op return EVAL_OK;
1449 fb1a36c0 2022-01-09 op }
1450 fb1a36c0 2022-01-09 op
1451 fb1a36c0 2022-01-09 op static int
1452 fb1a36c0 2022-01-09 op builtin_recv(int argc)
1453 fb1a36c0 2022-01-09 op {
1454 fb1a36c0 2022-01-09 op struct pollfd pfd;
1455 fb1a36c0 2022-01-09 op struct value v;
1456 fb1a36c0 2022-01-09 op struct imsg imsg;
1457 fb1a36c0 2022-01-09 op ssize_t n, datalen;
1458 fb1a36c0 2022-01-09 op int serrno;
1459 fb1a36c0 2022-01-09 op
1460 fb1a36c0 2022-01-09 op if (lastmsg != NULL) {
1461 fb1a36c0 2022-01-09 op free(lastmsg);
1462 fb1a36c0 2022-01-09 op lastmsg = NULL;
1463 fb1a36c0 2022-01-09 op }
1464 fb1a36c0 2022-01-09 op
1465 fb1a36c0 2022-01-09 op pfd.fd = ibuf.fd;
1466 fb1a36c0 2022-01-09 op pfd.events = POLLIN;
1467 fb1a36c0 2022-01-09 op if (poll(&pfd, 1, INFTIM) == -1) {
1468 fb1a36c0 2022-01-09 op serrno = errno;
1469 fb1a36c0 2022-01-09 op before_printing();
1470 fb1a36c0 2022-01-09 op printf("%s: poll failed: %s\n", __func__, strerror(serrno));
1471 fb1a36c0 2022-01-09 op return EVAL_ERR;
1472 fb1a36c0 2022-01-09 op }
1473 fb1a36c0 2022-01-09 op
1474 fb1a36c0 2022-01-09 op again:
1475 fb1a36c0 2022-01-09 op if ((n = imsg_read(&ibuf)) == -1) {
1476 fb1a36c0 2022-01-09 op if (errno == EAGAIN)
1477 fb1a36c0 2022-01-09 op goto again;
1478 fb1a36c0 2022-01-09 op fatal("imsg_read");
1479 fb1a36c0 2022-01-09 op }
1480 fb1a36c0 2022-01-09 op if (n == 0) {
1481 fb1a36c0 2022-01-09 op disconnect:
1482 fb1a36c0 2022-01-09 op before_printing();
1483 fb1a36c0 2022-01-09 op printf("child disconnected\n");
1484 fb1a36c0 2022-01-09 op return EVAL_ERR;
1485 fb1a36c0 2022-01-09 op }
1486 fb1a36c0 2022-01-09 op
1487 fb1a36c0 2022-01-09 op nextmessage:
1488 fb1a36c0 2022-01-09 op check_for_output();
1489 fb1a36c0 2022-01-09 op
1490 fb1a36c0 2022-01-09 op /* read only one message */
1491 fb1a36c0 2022-01-09 op if ((n = imsg_get(&ibuf, &imsg)) == -1)
1492 fb1a36c0 2022-01-09 op fatal("imsg_get");
1493 fb1a36c0 2022-01-09 op if (n == 0)
1494 fb1a36c0 2022-01-09 op goto disconnect;
1495 fb1a36c0 2022-01-09 op
1496 fb1a36c0 2022-01-09 op datalen = imsg.hdr.len - IMSG_HEADER_SIZE;
1497 fb1a36c0 2022-01-09 op switch (imsg.hdr.type) {
1498 fb1a36c0 2022-01-09 op case IMSG_BUF:
1499 fb1a36c0 2022-01-09 op v.type = V_MSG;
1500 fb1a36c0 2022-01-09 op if ((v.v.msg.msg = malloc(datalen)) == NULL)
1501 fb1a36c0 2022-01-09 op fatal("malloc");
1502 fb1a36c0 2022-01-09 op memcpy(v.v.msg.msg, imsg.data, datalen);
1503 fb1a36c0 2022-01-09 op v.v.msg.len = datalen;
1504 fb1a36c0 2022-01-09 op pushv(&v);
1505 fb1a36c0 2022-01-09 op imsg_free(&imsg);
1506 fb1a36c0 2022-01-09 op return EVAL_OK;
1507 fb1a36c0 2022-01-09 op
1508 fb1a36c0 2022-01-09 op case IMSG_CLOSE:
1509 fb1a36c0 2022-01-09 op before_printing();
1510 fb1a36c0 2022-01-09 op printf("subprocess closed the connection\n");
1511 fb1a36c0 2022-01-09 op imsg_free(&imsg);
1512 fb1a36c0 2022-01-09 op return EVAL_ERR;
1513 fb1a36c0 2022-01-09 op
1514 fb1a36c0 2022-01-09 op case IMSG_MSIZE:
1515 fb1a36c0 2022-01-09 op imsg_free(&imsg);
1516 fb1a36c0 2022-01-09 op goto nextmessage;
1517 fb1a36c0 2022-01-09 op
1518 fb1a36c0 2022-01-09 op default:
1519 fb1a36c0 2022-01-09 op before_printing();
1520 fb1a36c0 2022-01-09 op printf("got unknown message from subprocess: %d\n",
1521 fb1a36c0 2022-01-09 op imsg.hdr.type);
1522 fb1a36c0 2022-01-09 op imsg_free(&imsg);
1523 fb1a36c0 2022-01-09 op return EVAL_ERR;
1524 fb1a36c0 2022-01-09 op }
1525 fb1a36c0 2022-01-09 op }
1526 fb1a36c0 2022-01-09 op
1527 fb1a36c0 2022-01-09 op static pid_t
1528 fb1a36c0 2022-01-09 op spawn_client_proc(void)
1529 fb1a36c0 2022-01-09 op {
1530 fb1a36c0 2022-01-09 op const char *argv[4];
1531 fb1a36c0 2022-01-09 op int p[2], out[2], argc = 0;
1532 fb1a36c0 2022-01-09 op pid_t pid;
1533 fb1a36c0 2022-01-09 op
1534 fb1a36c0 2022-01-09 op if (child_out != -1)
1535 fb1a36c0 2022-01-09 op close(child_out);
1536 fb1a36c0 2022-01-09 op
1537 fb1a36c0 2022-01-09 op if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
1538 fb1a36c0 2022-01-09 op PF_UNSPEC, p) == -1)
1539 fb1a36c0 2022-01-09 op fatal("socketpair");
1540 fb1a36c0 2022-01-09 op
1541 fb1a36c0 2022-01-09 op if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
1542 fb1a36c0 2022-01-09 op PF_UNSPEC, out) == -1)
1543 fb1a36c0 2022-01-09 op fatal("socketpair");
1544 fb1a36c0 2022-01-09 op
1545 fb1a36c0 2022-01-09 op switch (pid = fork()) {
1546 fb1a36c0 2022-01-09 op case -1:
1547 fb1a36c0 2022-01-09 op fatal("cannot fork");
1548 fb1a36c0 2022-01-09 op case 0:
1549 fb1a36c0 2022-01-09 op break;
1550 fb1a36c0 2022-01-09 op default:
1551 fb1a36c0 2022-01-09 op close(p[1]);
1552 fb1a36c0 2022-01-09 op close(out[1]);
1553 fb1a36c0 2022-01-09 op child_out = out[0];
1554 fb1a36c0 2022-01-09 op if (ibuf_inuse) {
1555 fb1a36c0 2022-01-09 op msgbuf_clear(&ibuf.w);
1556 fb1a36c0 2022-01-09 op close(ibuf.fd);
1557 fb1a36c0 2022-01-09 op }
1558 fb1a36c0 2022-01-09 op imsg_init(&ibuf, p[0]);
1559 fb1a36c0 2022-01-09 op ibuf_inuse = 1;
1560 fb1a36c0 2022-01-09 op return pid;
1561 fb1a36c0 2022-01-09 op }
1562 fb1a36c0 2022-01-09 op
1563 fb1a36c0 2022-01-09 op close(p[0]);
1564 fb1a36c0 2022-01-09 op close(out[0]);
1565 fb1a36c0 2022-01-09 op
1566 fb1a36c0 2022-01-09 op if (dup2(out[1], 1) == -1 ||
1567 fb1a36c0 2022-01-09 op dup2(out[1], 2) == -1)
1568 fb1a36c0 2022-01-09 op fatal("dup2");
1569 fb1a36c0 2022-01-09 op
1570 fb1a36c0 2022-01-09 op if (p[1] != 3) {
1571 fb1a36c0 2022-01-09 op if (dup2(p[1], 3) == -1)
1572 fb1a36c0 2022-01-09 op fatal("cannot setup imsg fd");
1573 fb1a36c0 2022-01-09 op } else if (fcntl(F_SETFD, 0) == -1)
1574 fb1a36c0 2022-01-09 op fatal("cannot setup imsg fd");
1575 fb1a36c0 2022-01-09 op
1576 fb1a36c0 2022-01-09 op argv[argc++] = argv0;
1577 fb1a36c0 2022-01-09 op argv[argc++] = "-Tc";
1578 fb1a36c0 2022-01-09 op
1579 fb1a36c0 2022-01-09 op #if DEBUG
1580 fb1a36c0 2022-01-09 op argv[argc++] = "-v";
1581 fb1a36c0 2022-01-09 op #endif
1582 fb1a36c0 2022-01-09 op
1583 fb1a36c0 2022-01-09 op argv[argc++] = NULL;
1584 fb1a36c0 2022-01-09 op
1585 fb1a36c0 2022-01-09 op execvp(argv0, (char *const *)argv);
1586 fb1a36c0 2022-01-09 op fatal("execvp");
1587 fb1a36c0 2022-01-09 op }
1588 fb1a36c0 2022-01-09 op
1589 fb1a36c0 2022-01-09 op static void
1590 fb1a36c0 2022-01-09 op prepare_child_for_test(struct test *t)
1591 fb1a36c0 2022-01-09 op {
1592 1e84c7b7 2022-01-10 op struct passwd *pw;
1593 1e84c7b7 2022-01-10 op struct kd_auth_proc rauth;
1594 fb1a36c0 2022-01-09 op
1595 a0ec53a2 2022-01-09 op if ((pw = getpwuid(uid)) == NULL)
1596 a0ec53a2 2022-01-09 op fatal("getpwuid(%d)", uid);
1597 fb1a36c0 2022-01-09 op
1598 1e84c7b7 2022-01-10 op memset(&rauth, 0, sizeof(rauth));
1599 1e84c7b7 2022-01-10 op strlcpy(rauth.uname, pw->pw_name, sizeof(rauth.uname));
1600 1e84c7b7 2022-01-10 op strlcpy(rauth.dir, dir, sizeof(rauth.dir));
1601 1e84c7b7 2022-01-10 op
1602 fb1a36c0 2022-01-09 op imsg_compose(&ibuf, IMSG_AUTH, 0, 0, -1,
1603 1e84c7b7 2022-01-10 op &rauth, sizeof(rauth));
1604 fb1a36c0 2022-01-09 op
1605 fb1a36c0 2022-01-09 op if (imsg_flush(&ibuf) == -1)
1606 fb1a36c0 2022-01-09 op fatal("imsg_flush");
1607 fb1a36c0 2022-01-09 op }
1608 fb1a36c0 2022-01-09 op
1609 fb1a36c0 2022-01-09 op static int
1610 fb1a36c0 2022-01-09 op run_test(struct test *t)
1611 fb1a36c0 2022-01-09 op {
1612 fb1a36c0 2022-01-09 op pid_t pid;
1613 fb1a36c0 2022-01-09 op int ret;
1614 fb1a36c0 2022-01-09 op
1615 fb1a36c0 2022-01-09 op #if DEBUG
1616 fb1a36c0 2022-01-09 op before_printing();
1617 fb1a36c0 2022-01-09 op puts("=====================");
1618 fb1a36c0 2022-01-09 op pp_block(t->body);
1619 fb1a36c0 2022-01-09 op puts("=====================");
1620 fb1a36c0 2022-01-09 op #endif
1621 fb1a36c0 2022-01-09 op
1622 fb1a36c0 2022-01-09 op if (stackh != 0)
1623 fb1a36c0 2022-01-09 op popvn(stackh);
1624 fb1a36c0 2022-01-09 op
1625 fb1a36c0 2022-01-09 op if (t->body == NULL) {
1626 fb1a36c0 2022-01-09 op before_printing();
1627 fb1a36c0 2022-01-09 op printf("no instructions, skipping...\n");
1628 fb1a36c0 2022-01-09 op return EVAL_SKIP;
1629 fb1a36c0 2022-01-09 op }
1630 fb1a36c0 2022-01-09 op
1631 fb1a36c0 2022-01-09 op pid = spawn_client_proc();
1632 fb1a36c0 2022-01-09 op prepare_child_for_test(t);
1633 fb1a36c0 2022-01-09 op ret = eval(t->body);
1634 fb1a36c0 2022-01-09 op
1635 fb1a36c0 2022-01-09 op imsg_compose(&ibuf, IMSG_CONN_GONE, 0, 0, -1, NULL, 0);
1636 fb1a36c0 2022-01-09 op imsg_flush(&ibuf);
1637 fb1a36c0 2022-01-09 op
1638 fb1a36c0 2022-01-09 op while (waitpid(pid, NULL, 0) != pid)
1639 fb1a36c0 2022-01-09 op ; /* nop */
1640 fb1a36c0 2022-01-09 op
1641 fb1a36c0 2022-01-09 op check_for_output();
1642 fb1a36c0 2022-01-09 op
1643 fb1a36c0 2022-01-09 op if (t->shouldfail) {
1644 fb1a36c0 2022-01-09 op if (ret == EVAL_OK) {
1645 fb1a36c0 2022-01-09 op before_printing();
1646 fb1a36c0 2022-01-09 op printf("test was expected to fail\n");
1647 fb1a36c0 2022-01-09 op return EVAL_ERR;
1648 fb1a36c0 2022-01-09 op } else if (ret == EVAL_ERR)
1649 fb1a36c0 2022-01-09 op return EVAL_OK;
1650 fb1a36c0 2022-01-09 op }
1651 fb1a36c0 2022-01-09 op
1652 fb1a36c0 2022-01-09 op return ret;
1653 fb1a36c0 2022-01-09 op }
1654 fb1a36c0 2022-01-09 op
1655 fb1a36c0 2022-01-09 op int
1656 fb1a36c0 2022-01-09 op main(int argc, char **argv)
1657 fb1a36c0 2022-01-09 op {
1658 a0ec53a2 2022-01-09 op struct stat sb;
1659 fb1a36c0 2022-01-09 op struct test *t;
1660 fb1a36c0 2022-01-09 op int ch, i, r, passed = 0, failed = 0, skipped = 0;
1661 fb1a36c0 2022-01-09 op int runclient = 0;
1662 fb1a36c0 2022-01-09 op const char *pat = NULL;
1663 fb1a36c0 2022-01-09 op regex_t reg;
1664 fb1a36c0 2022-01-09 op
1665 fb1a36c0 2022-01-09 op assert(argv0 = argv[0]);
1666 fb1a36c0 2022-01-09 op
1667 fb1a36c0 2022-01-09 op signal(SIGPIPE, SIG_IGN);
1668 fb1a36c0 2022-01-09 op
1669 fb1a36c0 2022-01-09 op log_init(1, LOG_DAEMON);
1670 fb1a36c0 2022-01-09 op log_setverbose(1);
1671 fb1a36c0 2022-01-09 op
1672 fb1a36c0 2022-01-09 op /* prepare the global env */
1673 fb1a36c0 2022-01-09 op pushenv();
1674 fb1a36c0 2022-01-09 op
1675 fb1a36c0 2022-01-09 op add_builtin_proc("print", builtin_print, 1, 1);
1676 fb1a36c0 2022-01-09 op add_builtin_proc("debug", builtin_debug, 1, 1);
1677 fb1a36c0 2022-01-09 op add_builtin_proc("skip", builtin_skip, 0, 0);
1678 fb1a36c0 2022-01-09 op add_builtin_proc("iota", builtin_iota, 0, 0);
1679 fb1a36c0 2022-01-09 op add_builtin_proc("send", builtin_send, 2, 1);
1680 fb1a36c0 2022-01-09 op add_builtin_proc("recv", builtin_recv, 0, 0);
1681 fb1a36c0 2022-01-09 op
1682 a0ec53a2 2022-01-09 op while ((ch = getopt(argc, argv, "nT:r:vx:")) != -1) {
1683 fb1a36c0 2022-01-09 op switch (ch) {
1684 fb1a36c0 2022-01-09 op case 'n':
1685 fb1a36c0 2022-01-09 op syntaxcheck = 1;
1686 fb1a36c0 2022-01-09 op break;
1687 fb1a36c0 2022-01-09 op case 'T':
1688 fb1a36c0 2022-01-09 op assert(*optarg == 'c');
1689 fb1a36c0 2022-01-09 op runclient = 1;
1690 fb1a36c0 2022-01-09 op break;
1691 a0ec53a2 2022-01-09 op case 'r':
1692 a0ec53a2 2022-01-09 op dir = optarg;
1693 a0ec53a2 2022-01-09 op break;
1694 fb1a36c0 2022-01-09 op case 'v':
1695 fb1a36c0 2022-01-09 op debug = 1;
1696 fb1a36c0 2022-01-09 op break;
1697 fb1a36c0 2022-01-09 op case 'x':
1698 fb1a36c0 2022-01-09 op pat = optarg;
1699 fb1a36c0 2022-01-09 op break;
1700 fb1a36c0 2022-01-09 op default:
1701 fb1a36c0 2022-01-09 op fprintf(stderr, "Usage: %s [-nv] [files...]\n",
1702 fb1a36c0 2022-01-09 op *argv);
1703 fb1a36c0 2022-01-09 op exit(1);
1704 fb1a36c0 2022-01-09 op }
1705 fb1a36c0 2022-01-09 op }
1706 fb1a36c0 2022-01-09 op argc -= optind;
1707 fb1a36c0 2022-01-09 op argv += optind;
1708 fb1a36c0 2022-01-09 op
1709 fb1a36c0 2022-01-09 op if (runclient)
1710 fb1a36c0 2022-01-09 op client(1, debug);
1711 fb1a36c0 2022-01-09 op
1712 a0ec53a2 2022-01-09 op if (dir == NULL)
1713 a0ec53a2 2022-01-09 op fatal("missing root test dir");
1714 1e84c7b7 2022-01-10 op
1715 a0ec53a2 2022-01-09 op if (stat(dir, &sb) == -1)
1716 a0ec53a2 2022-01-09 op fatal("stat(\"%s\")", dir);
1717 a0ec53a2 2022-01-09 op uid = sb.st_uid;
1718 a0ec53a2 2022-01-09 op
1719 fb1a36c0 2022-01-09 op if (pat == NULL)
1720 fb1a36c0 2022-01-09 op pat = ".*";
1721 fb1a36c0 2022-01-09 op
1722 ba8b636b 2022-01-09 op if (regcomp(&reg, pat, REG_ICASE | REG_NOSUB) != 0)
1723 fb1a36c0 2022-01-09 op fatalx("invalid regexp: %s", pat);
1724 fb1a36c0 2022-01-09 op
1725 fb1a36c0 2022-01-09 op for (i = 0; i < argc; ++i)
1726 fb1a36c0 2022-01-09 op loadfile(argv[i]);
1727 fb1a36c0 2022-01-09 op
1728 fb1a36c0 2022-01-09 op if (syntaxcheck) {
1729 fb1a36c0 2022-01-09 op fprintf(stderr, "files OK\n");
1730 fb1a36c0 2022-01-09 op return 0;
1731 fb1a36c0 2022-01-09 op }
1732 fb1a36c0 2022-01-09 op
1733 fb1a36c0 2022-01-09 op /* Check for root privileges. */
1734 fb1a36c0 2022-01-09 op if (geteuid())
1735 fb1a36c0 2022-01-09 op fatalx("need root privileges");
1736 fb1a36c0 2022-01-09 op
1737 fb1a36c0 2022-01-09 op i = 0;
1738 fb1a36c0 2022-01-09 op TAILQ_FOREACH(t, &tests, entry) {
1739 fb1a36c0 2022-01-09 op if (regexec(&reg, t->name, 0, NULL, 0) != 0)
1740 fb1a36c0 2022-01-09 op continue;
1741 fb1a36c0 2022-01-09 op
1742 fb1a36c0 2022-01-09 op printf("===> [%d/%d] running test \"%s\"... ", i+1, ntests,
1743 fb1a36c0 2022-01-09 op t->name);
1744 fb1a36c0 2022-01-09 op fflush(stdout);
1745 fb1a36c0 2022-01-09 op
1746 fb1a36c0 2022-01-09 op filler = "\n";
1747 fb1a36c0 2022-01-09 op r = run_test(t);
1748 fb1a36c0 2022-01-09 op if (filler == NULL)
1749 fb1a36c0 2022-01-09 op printf("=> test ");
1750 fb1a36c0 2022-01-09 op
1751 fb1a36c0 2022-01-09 op switch (r) {
1752 fb1a36c0 2022-01-09 op case EVAL_OK:
1753 fb1a36c0 2022-01-09 op printf("passed\n");
1754 fb1a36c0 2022-01-09 op passed++;
1755 fb1a36c0 2022-01-09 op break;
1756 fb1a36c0 2022-01-09 op case EVAL_ERR:
1757 fb1a36c0 2022-01-09 op failed++;
1758 fb1a36c0 2022-01-09 op printf("failed\n");
1759 fb1a36c0 2022-01-09 op break;
1760 fb1a36c0 2022-01-09 op case EVAL_SKIP:
1761 fb1a36c0 2022-01-09 op printf("skipped\n");
1762 fb1a36c0 2022-01-09 op skipped++;
1763 fb1a36c0 2022-01-09 op break;
1764 fb1a36c0 2022-01-09 op }
1765 fb1a36c0 2022-01-09 op
1766 fb1a36c0 2022-01-09 op if (filler == NULL)
1767 fb1a36c0 2022-01-09 op printf("\n");
1768 fb1a36c0 2022-01-09 op i++;
1769 fb1a36c0 2022-01-09 op }
1770 fb1a36c0 2022-01-09 op
1771 fb1a36c0 2022-01-09 op printf("\n");
1772 fb1a36c0 2022-01-09 op printf("%d/%d passed (%d skipped and %d failed)\n",
1773 fb1a36c0 2022-01-09 op passed, i, skipped, failed);
1774 fb1a36c0 2022-01-09 op
1775 fb1a36c0 2022-01-09 op popenv();
1776 fb1a36c0 2022-01-09 op free(lastmsg);
1777 fb1a36c0 2022-01-09 op regfree(&reg);
1778 fb1a36c0 2022-01-09 op
1779 fb1a36c0 2022-01-09 op return failed != 0;
1780 fb1a36c0 2022-01-09 op }