authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-05-13 09:53:30-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-05-13 09:54:56-07:00
log5d2f86116fe6c43d772e444d4519c64f33f9969d
tree12c59cf21becaad31121fdc23531740c40a254b7
parent8e3ab28be95de4faca64d5abab21f1948f71510b

std: fix linux.get_errno


2 files changed, 7 insertions(+), 3 deletions(-)

std/linux.zig+1-1
......@@ -222,7 +222,7 @@ pub const AF_MAX = PF_MAX;
222222
223223/// Get the errno from a syscall return value, or 0 for no error.
224224pub fn get_errno(r: isize) -> isize {
225 if (r > -4096) -r else 0
225 if (r > -4096 && r < 0) -r else 0
226226}
227227
228228pub fn mmap(address: ?&u8, length: isize, prot: isize, flags: isize, fd: isize, offset: isize) -> isize {
std/net.zig+6-2
......@@ -7,8 +7,10 @@ pub error Unexpected;
77pub error Io;
88pub error TimedOut;
99pub error ConnectionReset;
10pub error ConnectionRefused;
1011pub error NoMem;
1112pub error NotSocket;
13pub error BadFd;
1214
1315struct Connection {
1416 socket_fd: i32,
......@@ -27,16 +29,18 @@ struct Connection {
2729 }
2830 }
2931
30 pub fn recv(c: Connection, buf: []u8) -> %isize {
32 pub fn recv(c: Connection, buf: []u8) -> %[]u8 {
3133 const recv_ret = linux.recvfrom(c.socket_fd, buf.ptr, buf.len, 0, null, null);
3234 const recv_err = linux.get_errno(recv_ret);
3335 switch (recv_err) {
34 0 => return recv_ret,
36 0 => return buf[0...recv_ret],
3537 errno.EINVAL => unreachable{},
3638 errno.EFAULT => unreachable{},
3739 errno.ENOTSOCK => return error.NotSocket,
3840 errno.EINTR => return error.SigInterrupt,
3941 errno.ENOMEM => return error.NoMem,
42 errno.ECONNREFUSED => return error.ConnectionRefused,
43 errno.EBADF => return error.BadFd,
4044 // TODO more error values
4145 else => return error.Unexpected,
4246 }