2 * Empire - A multi-player, client/server Internet based war game.
3 * Copyright (C) 1986-2015, Dave Pare, Jeff Bailey, Thomas Ruschak,
4 * Ken Stevens, Steve McClure, Markus Armbruster
6 * Empire is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 * See files README, COPYING and CREDITS in the root of the source
22 * tree for related information and legal notices. It is expected
23 * that future projects/authors will amend these files as needed.
27 * secure.c: Check redir etc. to protect against tampering deity
29 * Known contributors to this file:
30 * Markus Armbruster, 2007-2017
42 static struct ring recent_input;
45 * Remember input @inp for a while.
52 while (ring_putc(&recent_input, inp) < 0) {
53 eol = ring_search(&recent_input, "\n", 0);
55 ring_discard(&recent_input, eol + 1);
60 * Can you still remember a line of input that ends with @tail?
61 * It must end with a newline.
64 seen_input(char *tail)
66 size_t len = strlen(tail);
68 assert(len && tail[len - 1] == '\n');
69 return ring_search(&recent_input, tail, 0) >= 0;
73 * Can you still remember input that looks like an execute @arg?
74 * @arg must end with a newline.
77 seen_exec_input(char *arg)
79 size_t len = strlen(arg);
81 unsigned char buf[RING_SIZE + 1];
83 assert(len && arg[len - 1] == '\n');
87 /* find next line ending with arg */
88 n = ring_search(&recent_input, arg, n + 1);
92 /* extract command (same or previous line) */
94 if (ring_peek(&recent_input, i) == '\n')
98 for (; i >= 0 && (ch = ring_peek(&recent_input, i)) != '\n'; i--)
101 /* compare command */
102 for (; isspace(buf[j]); j++) ;
103 for (i = j; buf[i] && !isspace(buf[i]); i++) ;
104 if (i - j >= 2 && !strncmp("execute", (char *)buf + j, i - j))