From 45165b0192325867771acc0e27a443100b700b3e Mon Sep 17 00:00:00 2001 From: Zuhaitz Méndez Fernández de Aránguiz Date: Sat, 31 Jan 2026 22:35:26 +0000 Subject: Improved networking example --- std/net.zc | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'std') diff --git a/std/net.zc b/std/net.zc index d410a4d..826b795 100644 --- a/std/net.zc +++ b/std/net.zc @@ -63,26 +63,28 @@ extern fn _z_net_write(fd: int, buf: const char*, n: usize) -> isize; struct TcpStream { - fd: int; + handle: int; } +extern fn strerror(errnum: int) -> char*; + impl TcpStream { fn read(self, buf: char*, len: usize) -> Result { - let n = read(self.fd, (void*)buf, len); - if (n < 0) return Result::Err("Read failed"); + let n = read(self.handle - 1, (void*)buf, len); + if (n < 0) return Result::Err(strerror(errno)); return Result::Ok((usize)n); } fn write(self, buf: char*, len: usize) -> Result { - let n = _z_net_write(self.fd, buf, len); + let n = _z_net_write(self.handle - 1, buf, len); if (n < 0) return Result::Err("Write failed"); return Result::Ok((usize)n); } fn close(self) { - if (self.fd >= 0) { - close(self.fd); - self.fd = -1; + if (self.handle > 0) { + close(self.handle - 1); + self.handle = 0; } } @@ -94,7 +96,7 @@ impl TcpStream { if (res == -1) { close(fd); return Result::Err("Invalid address"); } if (res == -2) { close(fd); return Result::Err("Connection failed"); } - return Result::Ok(TcpStream { fd: fd }); + return Result::Ok(TcpStream { handle: fd + 1 }); } } @@ -105,7 +107,7 @@ impl Drop for TcpStream { } struct TcpListener { - fd: int; + handle: int; } impl TcpListener { @@ -118,19 +120,19 @@ impl TcpListener { if (res == -2) { close(fd); return Result::Err("Bind failed"); } if (res == -3) { close(fd); return Result::Err("Listen failed"); } - return Result::Ok(TcpListener { fd: fd }); + return Result::Ok(TcpListener { handle: fd + 1 }); } fn accept(self) -> Result { - let client_fd = _z_net_accept(self.fd); + let client_fd = _z_net_accept(self.handle - 1); if (client_fd < 0) return Result::Err("Accept failed"); - return Result::Ok(TcpStream { fd: client_fd }); + return Result::Ok(TcpStream { handle: client_fd + 1 }); } fn close(self) { - if (self.fd >= 0) { - close(self.fd); - self.fd = -1; + if (self.handle > 0) { + close(self.handle - 1); + self.handle = 0; } } } -- cgit v1.2.3