summaryrefslogtreecommitdiff
path: root/src/ninep
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-10-01 08:32:20 -0300
committerGabriel Schneider <[email protected]>2026-10-01 08:53:11 -0300
commitc4bc85b8da17ae2a191d0c73424e17fde8b6391e (patch)
tree82c3d3fb35d736123d01b1271224c2484f15a7a1 /src/ninep
parentb7eb31674e01c992cafc91518e161258b921bd33 (diff)
downloadpardes-c4bc85b8da17ae2a191d0c73424e17fde8b6391e.tar.gz
pardes-c4bc85b8da17ae2a191d0c73424e17fde8b6391e.zip
A look of `./x` that is not there is a miss, as `x` and `/abs/x` are: the write answered, the err logged, not ENOENT
`./x` and `../x` failed their write with ENOENT while every other name that opens nothing was a miss the write was still answered with. They are misses now too, said and logged `look: ./x: no such file`. A pane's own directory gone stays a failure. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Diffstat (limited to 'src/ninep')
-rw-r--r--src/ninep/ctl.zig16
-rw-r--r--src/ninep/tree.zig8
2 files changed, 17 insertions, 7 deletions
diff --git a/src/ninep/ctl.zig b/src/ninep/ctl.zig
index 6c9ee2da..2b366de0 100644
--- a/src/ninep/ctl.zig
+++ b/src/ninep/ctl.zig
@@ -3224,7 +3224,7 @@ test "/index shows a name as the log does: a newline in it is \\n, a control byt
try testing.expect(std.mem.indexOf(u8, rd(p, @intFromEnum(tree.TopFile.index), 0, 4096).bytes, "/tmp/back\\\\nslash") != null);
}
-test "a look at a ./ or ../ name that is not there names the file, ENOENT; a plain one is looked for as text" {
+test "a look at a ./ or ../ name that is not there is a miss naming the file; a plain one is looked for as text" {
const p = try withFile(testing.allocator, "x\n");
defer p.deinit();
var tmp = testing.tmpDir(.{});
@@ -3236,9 +3236,9 @@ test "a look at a ./ or ../ name that is not there names the file, ENOENT; a pla
_ = wr(p, Node.of(serialOf(p), .name), try std.fmt.bufPrint(&line, "{s}/many/a.txt\n", .{dir}));
for ([_][]const u8{ "./zz.txt", "../zz.txt" }) |name| {
const r = wr(p, Node.of(serialOf(p), .look), try std.fmt.bufPrint(&line, "{s}\n", .{name}));
- try testing.expectEqual(E.NOENT, r.errno());
+ try testing.expectEqual(Status.ok, r.reply.status);
var want: [64]u8 = undefined;
- try testing.expectEqualStrings(try std.fmt.bufPrint(&want, "look: {s}: no such file", .{name}), r.reply.ename);
+ try testing.expect(th.logHas(p, try std.fmt.bufPrint(&want, "look: {s}: no such file", .{name})));
}
try testing.expectEqual(Status.ok, wr(p, Node.of(serialOf(p), .look), "zz.txt\n").reply.status);
try testing.expect(th.logHas(p, "look: no match for \"zz.txt\""));
@@ -4323,3 +4323,13 @@ test "a collapsed pane's ctl says so" {
try testing.expect(p.panes[id].?.collapsed);
try testing.expect(std.mem.endsWith(u8, rd(p, Node.of(serialOf(p), .ctl), 0, 4096).bytes, " collapsed "));
}
+
+test "a look of ./x that is not there is a miss, as x and /abs/x are: answered, the err logged" {
+ const p = try withFile(testing.allocator, "x\n");
+ defer p.deinit();
+ for ([_][]const u8{ "./zzq-nosuch.txt\n", "zzq-nosuch.txt\n", "/zzq-nosuch.txt\n" }) |line| {
+ const r = wr(p, Node.of(serialOf(p), .look), line);
+ try testing.expectEqual(Status.ok, r.reply.status);
+ }
+ try testing.expect(th.logHas(p, "look: ./zzq-nosuch.txt: no such file"));
+}
diff --git a/src/ninep/tree.zig b/src/ninep/tree.zig
index e5d1c848..e566482c 100644
--- a/src/ninep/tree.zig
+++ b/src/ninep/tree.zig
@@ -495,14 +495,14 @@ test "a reason past 128 bytes keeps its end: the path in it gives up its middle"
const words = "why " ** 40 ++ "the reason";
try testing.expect(std.mem.endsWith(u8, fitErr(words, &out), "the reason"));
try testing.expectEqualStrings("short", fitErr("short", &out));
- // Through the tree: a look at a long ./ name not there says why at the end.
+ // Through the tree: a look at a long ./ name not there, a miss, says
+ // why at the end of its err record, the name giving up its middle.
const p = try th.withFile(testing.allocator, "x\n");
defer p.deinit();
var line: [512]u8 = undefined;
const r = th.wr(p, Node.of(serialOf(p), .look), try std.fmt.bufPrint(&line, "./{s}x.txt\n", .{"no-such-dir/" ** 20}));
- try testing.expectEqual(Status.err, r.reply.status);
- try testing.expect(r.reply.ename.len <= 128);
- try testing.expect(std.mem.endsWith(u8, r.reply.ename, "no such file") or std.mem.endsWith(u8, r.reply.ename, "no such directory"));
+ try testing.expectEqual(Status.ok, r.reply.status);
+ try testing.expect(th.logHas(p, "x.txt: no such file"));
}
/// A refusal with no reason of its own said in Plan 9's words, not the C