diff --git a/src/runtime2/stdlib/internet.rs b/src/runtime2/stdlib/internet.rs index 7e5c0518b39a19c71977791222bff3dd54d9dbef..94a37c19530842200f7cc6a7c7119372c035fd01 100644 --- a/src/runtime2/stdlib/internet.rs +++ b/src/runtime2/stdlib/internet.rs @@ -1,5 +1,6 @@ use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; use std::mem::size_of; +use std::io::{Error as IoError, ErrorKind as IoErrorKind}; use libc::{ c_int, @@ -62,7 +63,7 @@ impl SocketTcpClient { /// Receives data from the TCP socket. Returns the number of bytes received. /// More bytes may be present even thought `used < buffer.len()`. - pub fn receive(&self, buffer: &mut [u8]) -> Result { + pub fn receive(&self, buffer: &mut [u8]) -> Result { if self.is_blocking { return self.receive_blocking(buffer); } else { @@ -71,20 +72,20 @@ impl SocketTcpClient { } #[inline] - fn receive_blocking(&self, buffer: &mut [u8]) -> Result { + fn receive_blocking(&self, buffer: &mut [u8]) -> Result { let result = unsafe { let message_pointer = buffer.as_mut_ptr().cast(); libc::recv(self.socket_handle, message_pointer, buffer.len(), 0) }; if result < 0 { - return Err(()); + return Err(IoError::last_os_error()); } return Ok(result as usize); } #[inline] - fn receive_nonblocking(&self, buffer: &mut [u8]) -> Result { + fn receive_nonblocking(&self, buffer: &mut [u8]) -> Result { unsafe { let mut message_pointer = buffer.as_mut_ptr().cast(); let mut remaining = buffer.len(); @@ -94,11 +95,11 @@ impl SocketTcpClient { let result = libc::recv(self.socket_handle, message_pointer, remaining, 0); if result < 0 { // Check reason - let errno = std::io::Error::last_os_error().raw_os_error().expect("os error after failed recv"); - if errno == libc::EWOULDBLOCK || errno == libc::EAGAIN { + let os_error = IoError::last_os_error(); + if os_error.kind() == IoErrorKind::WouldBlock { return Ok(buffer.len() - remaining); } else { - return Err(()); + return Err(os_error); } }