summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-10-01 08:19:57 -0300
committerGabriel Schneider <[email protected]>2026-10-01 08:53:11 -0300
commitc5c9768bed2368c6a341d0400b13b3428c138b6e (patch)
treec4c57cb72fd5ad2d26bf0095c1b93f5ceb052b5f /src
parent920f213b3e7a3f93a4c51a5d5549da80a9b1d104 (diff)
downloadpardes-c5c9768bed2368c6a341d0400b13b3428c138b6e.tar.gz
pardes-c5c9768bed2368c6a341d0400b13b3428c138b6e.zip
/pager given a file that is not a directory says so, ENOTDIR, not `no such directory`
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/ninep/ctl.zig7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/ninep/ctl.zig b/src/ninep/ctl.zig
index 5827a4ed..c5e47d5d 100644
--- a/src/ninep/ctl.zig
+++ b/src/ninep/ctl.zig
@@ -665,8 +665,12 @@ pub fn writePager(p: *Pardes, req: Req) Reply {
var shown: [256]u8 = undefined;
return tree.failText(req.tag, E.INVAL, std.fmt.bufPrint(&p.fs.ename, "pager: invalid directory \"{s}\": must be absolute", .{blanked(dir[0..@min(dir.len, shown.len)], &shown)}) catch "pager: invalid directory: must be absolute");
}
- if (comptime pardes.hosted) if (dir.len > 0) if (pardes.filesystem.localPath(dir)) |local| if (!exec_line.isDirectory(local))
+ if (comptime pardes.hosted) if (dir.len > 0) if (pardes.filesystem.localPath(dir)) |local| if (!exec_line.isDirectory(local)) {
+ // A file there is no directory, ENOTDIR; nothing there, ENOENT.
+ if (exec_line.kindOf(local) != null)
+ return tree.failText(req.tag, E.NOTDIR, std.fmt.bufPrint(&p.fs.ename, "pager: {s}: not a directory", .{dir[0..@min(dir.len, 256)]}) catch "pager: not a directory");
return tree.failText(req.tag, E.NOENT, std.fmt.bufPrint(&p.fs.ename, "pager: {s}: no such directory", .{dir[0..@min(dir.len, 256)]}) catch "pager: no such directory");
+ };
// Nor one that may not be written, as a file's name there is refused.
if (comptime pardes.hosted) if (dir.len > 0) if (pardes.filesystem.localPath(dir)) |local| if (pardes.filesystem.deniedAbove(local))
return tree.failText(req.tag, E.PERM, std.fmt.bufPrint(&p.fs.ename, "pager: {s}: permission denied", .{dir[0..@min(dir.len, 256)]}) catch "pager: permission denied");
@@ -4072,6 +4076,7 @@ test "pager answers its +Pager on the open that asked, whatever another client e
try testing.expectEqual(E.INVAL, relative.errno());
try testing.expectEqualStrings("pager: invalid directory \"relative\": must be absolute", relative.reply.ename);
try testing.expectEqual(E.NOENT, wr(p, pager, "/tmp/pardes-surely-missing-dir\n").errno());
+ try testing.expectEqual(E.NOTDIR, wr(p, pager, "/etc/passwd\n").errno());
}
test "a command pane an exec open was answered is leased to it while it stays open: another client's command gets a pane of its own" {