diff --git a/Cargo.lock b/Cargo.lock index bfcbc0d70b..4e3a5023e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1844,6 +1844,7 @@ dependencies = [ "libredox", "log", "redox-log", + "redox-rt", "redox-scheme", "redox_event", "redox_syscall 0.6.0", diff --git a/netstack/Cargo.toml b/netstack/Cargo.toml index 24a1a367ee..20ded16276 100644 --- a/netstack/Cargo.toml +++ b/netstack/Cargo.toml @@ -33,3 +33,6 @@ features = [ "log" ] #For debugging: "log", "verbose" + +[target.'cfg(target_os = "redox")'.dependencies] +redox-rt = { git = "https://gitlab.redox-os.org/redox-os/relibc.git", default-features = false } diff --git a/netstack/src/scheme/icmp.rs b/netstack/src/scheme/icmp.rs index 860795b458..74cca1d071 100644 --- a/netstack/src/scheme/icmp.rs +++ b/netstack/src/scheme/icmp.rs @@ -275,4 +275,12 @@ impl<'a> SchemeSocket for IcmpSocket<'a> { Err(SyscallError::new(syscall::EBADF)) } } + + fn handle_get_peer_name( + &self, + file: &SchemeFile, + buf: &mut [u8], + ) -> SyscallResult { + self.fpath(file, buf) + } } diff --git a/netstack/src/scheme/ip.rs b/netstack/src/scheme/ip.rs index 9dd94d699e..dbcc8efd64 100644 --- a/netstack/src/scheme/ip.rs +++ b/netstack/src/scheme/ip.rs @@ -144,4 +144,12 @@ impl<'a> SchemeSocket for RawSocket<'a> { Ok(i) } + + fn handle_get_peer_name( + &self, + file: &SchemeFile, + buf: &mut [u8], + ) -> SyscallResult { + self.fpath(file, buf) + } } diff --git a/netstack/src/scheme/socket.rs b/netstack/src/scheme/socket.rs index 58bcbadf1f..11e379c731 100644 --- a/netstack/src/scheme/socket.rs +++ b/netstack/src/scheme/socket.rs @@ -10,6 +10,7 @@ use std::rc::Rc; use std::str; use libredox::flag::CLOCK_MONOTONIC; +use redox_rt::protocol::SocketCall; use redox_scheme::{ scheme::{Op, SchemeSync}, CallerCtx, OpenResult, Socket, @@ -17,7 +18,10 @@ use redox_scheme::{ use syscall::data::TimeSpec; use syscall::flag::{EVENT_READ, EVENT_WRITE}; use syscall::schemev2::NewFdFlags; -use syscall::{Error as SyscallError, EventFlags as SyscallEventFlags, Result as SyscallResult}; +use syscall::{ + Error as SyscallError, EventFlags as SyscallEventFlags, Result as SyscallResult, EINVAL, + EOPNOTSUPP, +}; use super::Interface; use crate::router::route_table::RouteTable; @@ -216,6 +220,12 @@ where path: &str, data: &mut Self::SchemeDataT, ) -> SyscallResult>; + + fn handle_get_peer_name( + &self, + file: &SchemeFile, + payload: &mut [u8], + ) -> SyscallResult; } pub struct SocketScheme @@ -395,6 +405,43 @@ where } } + fn call_inner( + &mut self, + fd: usize, + payload: &mut [u8], + metadata: &[u64], + ctx: &CallerCtx, + ) -> SyscallResult { + let file = self + .files + .get_mut(&fd) + .ok_or_else(|| SyscallError::new(syscall::EBADF))?; + // metadata to Vec + let Some(verb) = SocketCall::try_from_raw(metadata[0] as usize) else { + warn!("Invalid verb in metadata: {:?}", metadata); + return Err(SyscallError::new(EINVAL)); + }; + let mut socket_set = self.socket_set.borrow_mut(); + let socket = socket_set.get_mut::(file.socket_handle()); + match verb { + // TODO + // SocketCall::Bind => self.handle_bind(id, &payload), + // SocketCall::Connect => self.handle_connect(id, &payload), + SocketCall::SetSockOpt => { + // currently not used + // self.handle_setsockopt(id, metadata[1] as i32, &payload) + Ok(0) + } + // SocketCall::GetSockOpt => self.handle_getsockopt(id, metadata[1] as i32, payload), + // SocketCall::SendMsg => self.handle_sendmsg(id, payload, ctx), + // SocketCall::RecvMsg => self.handle_recvmsg(id, payload), + // SocketCall::Unbind => self.handle_unbind(id), + // SocketCall::GetToken => self.handle_get_token(id, payload), + SocketCall::GetPeerName => SocketT::handle_get_peer_name(socket, file, payload), + _ => Err(SyscallError::new(EOPNOTSUPP)), + } + } + fn open_inner( &mut self, path: &str, @@ -456,6 +503,16 @@ where self.open_inner(path, flags, ctx.uid, ctx.gid) } + fn call( + &mut self, + id: usize, + payload: &mut [u8], + metadata: &[u64], + ctx: &CallerCtx, + ) -> SyscallResult { + self.call_inner(id, payload, metadata, ctx) + } + fn on_close(&mut self, fd: usize) { if let Some(_null) = self.nulls.remove(&fd) { return; @@ -586,6 +643,7 @@ where .get(&fd) .map(|null| (null.flags, null.uid, null.gid)) { + // dup from empty path to a new path return self.open_inner(path, flags, uid, gid); } diff --git a/netstack/src/scheme/tcp.rs b/netstack/src/scheme/tcp.rs index dcaa90b8c0..62345a848e 100644 --- a/netstack/src/scheme/tcp.rs +++ b/netstack/src/scheme/tcp.rs @@ -300,4 +300,12 @@ impl<'a> SchemeSocket for TcpSocket<'a> { Ok(i) } + + fn handle_get_peer_name( + &self, + file: &SchemeFile, + buf: &mut [u8], + ) -> SyscallResult { + self.fpath(file, buf) + } } diff --git a/netstack/src/scheme/udp.rs b/netstack/src/scheme/udp.rs index b414069899..d5d99aa9e7 100644 --- a/netstack/src/scheme/udp.rs +++ b/netstack/src/scheme/udp.rs @@ -249,4 +249,12 @@ impl<'a> SchemeSocket for UdpSocket<'a> { Ok(i) } + + fn handle_get_peer_name( + &self, + file: &SchemeFile, + buf: &mut [u8], + ) -> SyscallResult { + self.fpath(file, buf) + } }