diff --git a/netstack/src/router/mod.rs b/netstack/src/router/mod.rs index cf4decab4a..c997bc5b49 100644 --- a/netstack/src/router/mod.rs +++ b/netstack/src/router/mod.rs @@ -547,7 +547,7 @@ fn infer_context( out_dev: None, src_addr: IpAddress::Ipv6(ipv6.src_addr()), dst_addr: IpAddress::Ipv6(ipv6.dst_addr()), - protocol: smoltcp::wire::IpProtocol::from(transport_proto), + protocol: smoltcp::wire::IpProtocol::from(transport_proto).into(), src_port, dst_port, packet, diff --git a/netstack/src/scheme/mod.rs b/netstack/src/scheme/mod.rs index 8b0a6a141a..f6720ba889 100644 --- a/netstack/src/scheme/mod.rs +++ b/netstack/src/scheme/mod.rs @@ -182,7 +182,7 @@ impl Smolnetd { // elsewhere; from_raw_fd transfers ownership // to the new File. unsafe { - File::from_raw_fd(nf.into_raw()) + File::from_raw_fd(nf.into_raw() as i32) }); link.set_mac_address(hw_addr); devices.borrow_mut().push(link); @@ -196,7 +196,7 @@ impl Smolnetd { time_file: // SAFETY: caller guarantees time_file is a live Fd not // aliased elsewhere; from_raw_fd transfers ownership // to the new File. - unsafe { File::from_raw_fd(time_file.into_raw()) }, + unsafe { File::from_raw_fd(time_file.into_raw() as i32) }, ip_scheme: IpScheme::new( "ip", Rc::clone(&iface), diff --git a/netstack/src/scheme/netcfg/mod.rs b/netstack/src/scheme/netcfg/mod.rs index 81417455ac..f6eaac6040 100644 --- a/netstack/src/scheme/netcfg/mod.rs +++ b/netstack/src/scheme/netcfg/mod.rs @@ -170,7 +170,8 @@ fn mk_root_node( let lo = devs.get("loopback"); let lo_state = lo.map(|d| d.link_state()).unwrap_or("missing"); let mut iface_summary = format!("lo={}", lo_state); - for (name, dev) in devs.iter() { + for dev in devs.iter() { + let name = dev.name().as_ref(); if name != "loopback" { iface_summary.push_str(&format!(" {}={}", name, dev.link_state())); } diff --git a/netstack/src/scheme/tcp.rs b/netstack/src/scheme/tcp.rs index 2ba9824b88..28da52a70a 100644 --- a/netstack/src/scheme/tcp.rs +++ b/netstack/src/scheme/tcp.rs @@ -8,6 +8,9 @@ use syscall; use syscall::{Error as SyscallError, Result as SyscallResult}; use anyhow::Context as _; +use redox_scheme::CallerCtx; +use libredox::protocol::SocketCall; + use super::socket::{Context, DupResult, SchemeFile, SchemeSocket, SocketFile}; use super::{parse_endpoint, SchemeWrapper, SocketSet}; use crate::port_set::PortSet; @@ -69,14 +72,21 @@ impl<'a> SchemeSocket for TcpSocket<'a> { // 0x4000 on Linux. We declare it locally so the // bitwise check below works on both hosts. const MSG_NOSIGNAL: u16 = 0x4000; + let send_result = |s: &mut Self| { + let r = s.send_slice(payload); + match r { + Ok(n) => Ok(n as usize), + Err(_e) => Ok(0), + } + }; if flags & MSG_NOSIGNAL != 0 { let mut old_mask: libc::sigset_t = unsafe { std::mem::zeroed() }; let mut block_mask: libc::sigset_t = unsafe { std::mem::zeroed() }; unsafe { libc::sigemptyset(&mut block_mask) }; unsafe { libc::sigaddset(&mut block_mask, libc::SIGPIPE) }; if unsafe { libc::pthread_sigmask(libc::SIG_BLOCK, &block_mask, &mut old_mask) } == 0 { - let written = self.send_slice(payload); - if written < 0 { + let written = send_result(self); + if let Ok(0) = written { self.close(); let mut ts: libc::timespec = unsafe { std::mem::zeroed() }; @@ -93,14 +103,14 @@ impl<'a> SchemeSocket for TcpSocket<'a> { unsafe { libc::pthread_sigmask(libc::SIG_SETMASK, &old_mask, std::ptr::null_mut()); } - Ok(written.max(0) as usize) + written } else { // pthread_sigmask failed; fall through to plain // send without suppression. - Ok(self.send_slice(payload).max(0) as usize) + send_result(self) } } else { - Ok(self.send_slice(payload).max(0) as usize) + send_result(self) } } _ => Err(SyscallError::new(syscall::EOPNOTSUPP)), diff --git a/netstack/src/scheme_pool.rs b/netstack/src/scheme_pool.rs index 37b8f54831..1b10f59eea 100644 --- a/netstack/src/scheme_pool.rs +++ b/netstack/src/scheme_pool.rs @@ -187,7 +187,7 @@ impl SchemePool { self.stats.get(name).map(|s| s.as_ref()) } - pub fn submit(&self, name: &str, bytes_hint: usize) -> bool { + pub fn submit(&self, name: &'static str, bytes_hint: usize) -> bool { let worker = match self.workers.get(name) { Some(w) => w, None => {