summaryrefslogtreecommitdiff
path: root/src/ninep/ctl.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/ninep/ctl.zig')
-rw-r--r--src/ninep/ctl.zig7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/ninep/ctl.zig b/src/ninep/ctl.zig
index 599dd0d6..ac5d64d8 100644
--- a/src/ninep/ctl.zig
+++ b/src/ninep/ctl.zig
@@ -203,6 +203,7 @@ pub fn command(p: *Pardes, req: Req, serial: ?u32, exec: bool, in_tag: bool) Rep
for (text) |c| if ((c < ' ' and c != '\t' and c != '\n') or c == 0x7f) return tree.failText(req.tag, E.INVAL, e_control);
if (exec) if (tooLong(req, text)) |refusal| return refusal;
if (!apply) continue;
+ if (p.fs.edit_answer_at != null) return tree.failText(req.tag, E.INVAL, e_after_edit);
var id = if (serial) |s| p.paneBySerial(s) orelse break else p.active;
// No pane at all: the root's look and exec act in the session's
// directory. An exec runs as the workspace tag's; a look from a
@@ -259,6 +260,11 @@ pub fn tooLong(req: Req, line: []const u8) ?Reply {
pub const e_control = "invalid command line: it holds a control character (or DEL) other than a tab";
+/// An Edit whose `<`, `|` or `>` commands are running answers its write
+/// when they are done (edit_cmd.zig); a line after it in the same write
+/// would run before them, on the text they are about to change.
+pub const e_after_edit = "invalid command line: an Edit running commands ends its write; write what follows after it";
+
/// Runs one click (`run`) as a 9P write's: a builtin that fails there fails
/// the write, with its words and an err record, and no msg, as a ctl line
/// does (runBuiltin). The refusal, or null.
@@ -959,6 +965,7 @@ pub fn writePane(p: *Pardes, req: Req, pane: *Pane) Reply {
var it = Messages.init(p, req.data);
while (it.next()) |line_in| {
if (line_in.len == 0 or exec_line.isComment(line_in)) continue;
+ if (apply and p.fs.edit_answer_at != null) return tree.failText(req.tag, E.INVAL, e_after_edit);
// A line before this one may have closed the pane (`Del`).
if (apply and p.paneBySerial(serial) == null) return Reply.fail(req.tag, E.NOENT);
// acme's ctl words: done by the file that replaces each, or the