diff --git a/ipcd/src/uds/dgram.rs b/ipcd/src/uds/dgram.rs index 98bff30e82..d2077571c4 100644 --- a/ipcd/src/uds/dgram.rs +++ b/ipcd/src/uds/dgram.rs @@ -664,10 +664,8 @@ impl<'sock> SchemeSync for UdsDgramScheme<'sock> { let socket_rc = self.get_socket(id)?; let socket = socket_rc.borrow(); - let path = socket.path.as_ref().ok_or_else(|| { - eprintln!("fpath(id: {}): Socket is unnamed, has no path.", id); - Error::new(ENOENT) - })?; + let empty = String::new(); + let path = socket.path.as_ref().unwrap_or(&empty); Ok(Self::fpath_inner(path, buf)?) } @@ -729,6 +727,21 @@ impl<'sock> SchemeSync for UdsDgramScheme<'sock> { } } + fn fevent(&mut self, id: usize, flags: EventFlags, ctx: &CallerCtx) -> Result { + let socket_rc = self.get_socket(id)?; + let mut socket = socket_rc.borrow_mut(); + + let mut ready = EventFlags::empty(); + if flags.contains(EVENT_READ) && !socket.messages.is_empty() { + ready |= EVENT_READ; + } + if flags.contains(EVENT_WRITE) && socket.peer.is_some() { + ready |= EVENT_WRITE; + } + + Ok(ready) + } + fn fstat(&mut self, id: usize, stat: &mut Stat, ctx: &CallerCtx) -> Result<()> { self.get_socket(id)?; diff --git a/ipcd/src/uds/stream.rs b/ipcd/src/uds/stream.rs index c285936ab9..9d7959a408 100644 --- a/ipcd/src/uds/stream.rs +++ b/ipcd/src/uds/stream.rs @@ -374,15 +374,15 @@ impl<'sock> UdsStreamScheme<'sock> { metadata: &[u64], ctx: &CallerCtx, ) -> Result { - let Some(verb) = SocketCall::try_from_raw(metadata[0] as usize) else { + let Some(verb) = SocketCall::try_from_raw(*metadata.get(0).ok_or(Error::new(EINVAL))? as usize) else { eprintln!("call_inner: Invalid verb in metadata: {:?}", metadata); return Err(Error::new(EINVAL)); }; match verb { SocketCall::Bind => self.handle_bind(id, &payload), SocketCall::Connect => self.handle_connect(id, &payload), - SocketCall::SetSockOpt => self.handle_setsockopt(id, metadata[1] as i32, &payload), - SocketCall::GetSockOpt => self.handle_getsockopt(id, metadata[1] as i32, payload), + SocketCall::SetSockOpt => self.handle_setsockopt(id, *metadata.get(1).ok_or(Error::new(EINVAL))? as i32, &payload), + SocketCall::GetSockOpt => self.handle_getsockopt(id, *metadata.get(1).ok_or(Error::new(EINVAL))? as i32, payload), SocketCall::SendMsg => self.handle_sendmsg(id, payload, ctx), SocketCall::RecvMsg => self.handle_recvmsg(id, payload), SocketCall::Unbind => self.handle_unbind(id), @@ -418,6 +418,9 @@ impl<'sock> UdsStreamScheme<'sock> { socket.state = State::Bound; token = self.rng.next_u64(); socket.issued_token = Some(token); + + //TODO: Hack since relibc does not listen() + socket.start_listening()?; } self.socket_paths.insert(path_owned, socket_rc.clone()); @@ -1076,8 +1079,8 @@ impl<'sock> SchemeSync for UdsStreamScheme<'sock> { fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { let socket_rc = self.get_socket(id)?; let socket = socket_rc.borrow(); - - let path = socket.path.as_ref().ok_or(Error::new(EBADF))?; + let empty = String::new(); + let path = socket.path.as_ref().unwrap_or(&empty); Ok(Self::fpath_inner(path, buf)?) } @@ -1147,6 +1150,23 @@ impl<'sock> SchemeSync for UdsStreamScheme<'sock> { } } + fn fevent(&mut self, id: usize, flags: EventFlags, ctx: &CallerCtx) -> Result { + let socket_rc = self.get_socket(id)?; + let mut socket = socket_rc.borrow_mut(); + + let mut ready = EventFlags::empty(); + if let Some(connection) = &socket.connection { + if flags.contains(EVENT_READ) && !connection.packets.is_empty() { + ready |= EVENT_READ; + } + if flags.contains(EVENT_WRITE) { + ready |= EVENT_WRITE; + } + } + + Ok(ready) + } + fn fstat(&mut self, id: usize, stat: &mut Stat, ctx: &CallerCtx) -> Result<()> { self.get_socket(id)?;