diff --git a/src/io_interface.zig b/src/io_interface.zig index a29066e..ab41a88 100644 --- a/src/io_interface.zig +++ b/src/io_interface.zig @@ -1215,7 +1215,7 @@ fn netRead(userdata: ?*anyopaque, fd: net.Socket.Handle, data: [][]u8) net.Strea if (buffer.len == 0) continue; - const n = node.readSocket(fd, buffer) catch |err| switch (err) { + const n = node.readSocket(fd, buffer, true) catch |err| switch (err) { error.InvalidHandle => return error.SocketUnconnected, }; copied += n; diff --git a/src/node.zig b/src/node.zig index 79f6392..a314ec6 100644 --- a/src/node.zig +++ b/src/node.zig @@ -417,10 +417,30 @@ pub fn connect(self: *Node, address: Address) ConnectError!Handle { return self.descToHandle(desc); } -pub fn readSocket(self: *Node, handle: Handle, target: []u8) HandleError!usize { - self.scheduler.sleep(10); +pub fn readSocket(self: *Node, handle: Handle, target: []u8, block: bool) HandleError!usize { + if (target.len == 0) + return 0; + const desc = try self.handleToDescOfType(handle, .conn); - return self.network_host.read(&desc.conn, target); + + if (block) { + while (true) { + self.scheduler.sleep(10); + + const num = self.network_host.read(&desc.conn, target); + + if (num > 0) + return num; + + if (num == 0) { + if (!self.network_host.isConnected(&desc.conn)) + return 0; + } + } + unreachable; + } else { + return self.network_host.read(&desc.conn, target); + } } pub const WriteSocketError = HandleError || Network.SendError;