╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ─────────────────╮ │src/serve_ssh_protocol.zig│ ╰──────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────╮ │2095 } │ │2096 │ │2097 fn parseChannelId(packet: []const u8, expected_channel: u32) !void { │ │2217 - if (packet.len < 1) return error.EmptyPacket; │ │2098 var r = std.Io.Reader.fixed(packet[1..]); │ │2099 const recipient_channel = try r.takeInt(u32, .big); │ │2100 if (recipient_channel != expected_channel) return error.UnknownChannel;│ ╰─────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────╮ │2109 if (ch.local_window >= budget / 2) return; │ │2110 const add = budget - ch.local_window; │ │2111 ch.local_window += add; │ │2232 - var adj: std.ArrayList(u8) = .empty; │ │2233 - defer adj.deinit(conn.allocator); │ │2234 - try adj.append(conn.allocator, SSH_MSG_CHANNEL_WINDOW_ADJUST); │ │2235 - try writeU32(&adj, conn.allocator, ch.remote_id); │ │2236 - try writeU32(&adj, conn.allocator, add); │ │2237 - try conn.writePacket(&.{adj.items}); │ │2112 + var packet: [9]u8 = undefined; │ │2113 + packet[0] = SSH_MSG_CHANNEL_WINDOW_ADJUST; │ │2114 + std.mem.writeInt(u32, packet[1..5], ch.remote_id, .big); │ │2115 + std.mem.writeInt(u32, packet[5..9], add, .big); │ │2116 + try conn.writePacket(&.{&packet}); │ │2117 } │ │2118 │ │2119 pub fn writeU32(buf: *std.ArrayList(u8), allocator: std.mem.Allocator, value: u32) !void {│ ╰────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────╮ │2155 var reader = std.Io.Reader.fixed(encoded_writer.buffered());│ │2156 var output: [256]u8 = undefined; │ │2157 var writer = std.Io.Writer.fixed(&output); │ │2158 + var idle = IdleState{}; │ │2159 var conn = Conn{ │ │2160 .io = io, │ │2161 .allocator = allocator, │ ╰──────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────╮ │2164 .cs_cipher = Cipher.init(&key, 0), │ │2165 .sc_cipher = Cipher.init(&key, 0), │ │2166 .rekey = undefined, │ │2167 + .idle = &idle, │ │2168 }; │ │2169 const Handler = struct { │ │2170 pub fn handleSession(_: *@This(), _: *SessionCtx, _: Request) !void {│ ╰───────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ───────╮ │src/test/ssh.zig│ ╰────────────────╯ ╭───────────────────────────────────────────╮ │19 output: [2048]u8 = undefined, │ │20 writer: std.Io.Writer = undefined, │ │21 conn: proto.Conn = undefined, │ │22 + idle: proto.IdleState = .{}, │ │23 channel: Channel = undefined, │ │24 sess: proto.SessionCtx = undefined,│ │25 │ ╰───────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │34 .cs_cipher = proto.Cipher.init(&key, 0), │ │35 .sc_cipher = proto.Cipher.init(&key, 0), │ │36 .rekey = undefined, │ │37 + .idle = &self.idle, │ │38 }; │ │39 self.channel = .{ .local_id = 0, .remote_id = 7, .local_window = 1 << 20, .remote_window = 32768, .max_packet = 32768 };│ │40 self.sess = .{ .conn = &self.conn, .channel = &self.channel, .fingerprint = undefined }; │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────╮ │976 │ │977 fn run(self: *ServerTask) void { │ │978 defer self.outgoing.close(self.io);│ │979 + var idle = proto.IdleState{}; │ │980 proto.handleConnection( │ │981 self.io, │ │982 self.allocator, │ ╰────────────────────────────────────────────────╯ ╭─────────────────────────────────╮ │983 self.reader, │ │984 self.writer, │ │985 self.host_key, │ │983 - null, │ │986 + &idle, │ │987 self, │ │988 ) catch |e| { │ │989 self.result = e;│ ╰─────────────────────────────────╯