summaryrefslogtreecommitdiff
path: root/src/pardes.zig
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-09-29 03:37:13 -0300
committerGabriel Schneider <[email protected]>2026-10-01 00:12:15 -0300
commit98e94b86a7c38e2bf4d66e57144fc9329906bb3b (patch)
tree61a7c596cd54dbc4d7a0b17243f592b2fb4bab80 /src/pardes.zig
parentd067c77813f9ce9fcc64b33e6b0284510ac02185 (diff)
downloadpardes-98e94b86a7c38e2bf4d66e57144fc9329906bb3b.tar.gz
pardes-98e94b86a7c38e2bf4d66e57144fc9329906bb3b.zip
Tty and Shell refuse a directory: not a shell
A directory passes access(X_OK), so Tty /etc made a pane whose shell exited 127 and Shell /etc was taken. The shell lookup now refuses a directory, and both say "not a shell: /etc is a directory" (Tty and Shell share one refusal, host_io.Shell.refusal). shellset's golden takes the shared wording (re-recorded by name). Co-Authored-By: Claude Opus 5.5 <[email protected]>
Diffstat (limited to 'src/pardes.zig')
-rw-r--r--src/pardes.zig4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/pardes.zig b/src/pardes.zig
index 9297c829..72fd4d46 100644
--- a/src/pardes.zig
+++ b/src/pardes.zig
@@ -1807,6 +1807,10 @@ test "Tty+fish, one word a tag can hold, opens a terminal on that shell" {
try std.testing.expect(std.mem.indexOf(u8, caller.msg[0..caller.msg_len], "no shell \"/nonexistent\"") != null);
try std.testing.expect(p.executeBuiltinLine(0, "Tty fsh-not-a-shell"));
try std.testing.expect(caller.shell == null);
+ // A directory passes access(X_OK); it is no shell either.
+ try std.testing.expect(p.executeBuiltinLine(0, "Tty /etc"));
+ try std.testing.expect(p.active == before);
+ try std.testing.expect(std.mem.indexOf(u8, caller.msg[0..caller.msg_len], "Tty: not a shell: /etc is a directory") != null);
// Only a word that says so splits at `+`: `Dump+x.zon` is no Dump.
try std.testing.expect(!p.executeBuiltinLine(0, "Dump+x.zon"));
try std.testing.expect(!p.executeBuiltinLine(0, "Msg+hello"));