zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 5d2f86116fe6c43d772e444d4519c64f33f9969d (tree)
parent 8e3ab28be95de4faca64d5abab21f1948f71510b
Author: Andrew Kelley <superjoe30@gmail.com>
Date:   Fri, 13 May 2016 09:53:30 -0700

std: fix linux.get_errno

Diffstat:
Mstd/linux.zig | 2+-
Mstd/net.zig | 8++++++--
2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/std/linux.zig b/std/linux.zig @@ -222,7 +222,7 @@ pub const AF_MAX = PF_MAX; /// Get the errno from a syscall return value, or 0 for no error. pub fn get_errno(r: isize) -> isize { - if (r > -4096) -r else 0 + if (r > -4096 && r < 0) -r else 0 } pub fn mmap(address: ?&u8, length: isize, prot: isize, flags: isize, fd: isize, offset: isize) -> isize { diff --git a/std/net.zig b/std/net.zig @@ -7,8 +7,10 @@ pub error Unexpected; pub error Io; pub error TimedOut; pub error ConnectionReset; +pub error ConnectionRefused; pub error NoMem; pub error NotSocket; +pub error BadFd; struct Connection { socket_fd: i32, @@ -27,16 +29,18 @@ struct Connection { } } - pub fn recv(c: Connection, buf: []u8) -> %isize { + pub fn recv(c: Connection, buf: []u8) -> %[]u8 { const recv_ret = linux.recvfrom(c.socket_fd, buf.ptr, buf.len, 0, null, null); const recv_err = linux.get_errno(recv_ret); switch (recv_err) { - 0 => return recv_ret, + 0 => return buf[0...recv_ret], errno.EINVAL => unreachable{}, errno.EFAULT => unreachable{}, errno.ENOTSOCK => return error.NotSocket, errno.EINTR => return error.SigInterrupt, errno.ENOMEM => return error.NoMem, + errno.ECONNREFUSED => return error.ConnectionRefused, + errno.EBADF => return error.BadFd, // TODO more error values else => return error.Unexpected, }