summaryrefslogtreecommitdiff
path: root/src/ninep/tree.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/ninep/tree.zig')
-rw-r--r--src/ninep/tree.zig9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/ninep/tree.zig b/src/ninep/tree.zig
index a85a1873..0d328594 100644
--- a/src/ninep/tree.zig
+++ b/src/ninep/tree.zig
@@ -167,6 +167,7 @@ pub const PaneFile = enum(u5) {
pty_ctl,
pty_status,
pty_data,
+ pty_run,
pub fn fileName(f: PaneFile) []const u8 {
return switch (f) {
@@ -174,6 +175,7 @@ pub const PaneFile = enum(u5) {
.pty_ctl => "ctl",
.pty_status => "status",
.pty_data => "data",
+ .pty_run => "run",
else => @tagName(f),
};
}
@@ -193,7 +195,7 @@ pub const PaneFile = enum(u5) {
pub fn inPty(f: PaneFile) bool {
return switch (f) {
- .pty, .pty_ctl, .pty_status, .pty_data => true,
+ .pty, .pty_ctl, .pty_status, .pty_data, .pty_run => true,
else => false,
};
}
@@ -531,6 +533,7 @@ fn open(p: *Pardes, req: Req, target: Target) Reply {
pf.event_reader = pf.event_reader or reader;
if (reader) return .{ .tag = req.tag, .handle = reader_handle };
},
+ .pty_run => return pty.openRun(p, req, t.serial),
.pty_data => if (reads(req.omode)) {
if (pf.pty_readers > 0) return failText(req.tag, e_busy, e_in_use);
pf.pty_readers = 1;
@@ -569,6 +572,8 @@ fn releaseHandle(p: *Pardes, req: Req) Reply {
switch (target) {
.top => {},
.pane => |t| {
+ // A run's open outlives its pane: it still holds the answer.
+ if (t.file == .pty_run) return pty.releaseRun(p, req);
if (t.file != .event and t.file != .pty_data) return .{ .tag = req.tag };
const id = p.paneBySerial(t.serial) orelse return .{ .tag = req.tag };
const pf = &p.fs.panes[id];
@@ -633,6 +638,8 @@ fn read(p: *Pardes, req: Req, target: Target) Reply {
.root, .pane => Reply.fail(req.tag, E.PERM),
},
.pane => |t| {
+ // A run's answer outlives the pane it ran in.
+ if (t.file == .pty_run and req.handle != 0) return pty.readRun(p, req);
const id = p.paneBySerial(t.serial) orelse return Reply.fail(req.tag, E.NOENT);
const pn = p.panes[id].?;
if (t.file.inPty() and !pn.isTerminal()) return Reply.fail(req.tag, E.NOENT);