diff options
| author | Gabriel Schneider <[email protected]> | 2026-10-01 08:19:57 -0300 |
|---|---|---|
| committer | Gabriel Schneider <[email protected]> | 2026-10-01 08:53:11 -0300 |
| commit | c5c9768bed2368c6a341d0400b13b3428c138b6e (patch) | |
| tree | c4c57cb72fd5ad2d26bf0095c1b93f5ceb052b5f | |
| parent | 920f213b3e7a3f93a4c51a5d5549da80a9b1d104 (diff) | |
| download | pardes-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]>
| -rw-r--r-- | src/ninep/ctl.zig | 7 |
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" { |
