diff options
Diffstat (limited to 'src/ninep')
| -rw-r--r-- | src/ninep/events.zig | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/ninep/events.zig b/src/ninep/events.zig index 8fae6eab..d60c07ad 100644 --- a/src/ninep/events.zig +++ b/src/ninep/events.zig @@ -492,7 +492,18 @@ pub fn readLog(p: *Pardes, req: Req) Reply { slot.next += 1; slot.part = 0; } - return .{ .tag = req.tag, .payload = .{ .staged = @intCast(n) } }; + // This is the last read a Restore lets through: it takes every + // whole record that fits, or they were lost with the hangup. + if (p.fs.hanging_up and slot.part == 0) { + at += 4 + len; + while (at + 4 <= q.buf.items.len) : (slot.next += 1) { + const more = std.mem.readInt(u32, q.buf.items[at..][0..4], .little); + if (out.items.len + more > req.size) break; + out.appendSlice(p.gpa, q.buf.items[at + 4 ..][0..more]) catch break; + at += 4 + more; + } + } + return .{ .tag = req.tag, .payload = .{ .staged = @intCast(out.items.len) } }; } at += 4 + len; } |
