diff --git a/base/src/tube.rs b/base/src/tube.rs index 613731b06b..fde5e36083 100644 --- a/base/src/tube.rs +++ b/base/src/tube.rs @@ -35,6 +35,8 @@ pub enum Error { SetRecvTimeout(io::Error), #[error("failed to create async tube: {0}")] CreateAsync(cros_async::AsyncError), + #[error("failed to clone UnixSeqpacket: {0}")] + Clone(io::Error), } pub type Result = std::result::Result; @@ -68,6 +70,10 @@ impl Tube { Ok(AsyncTube { inner }) } + pub fn try_clone(&self) -> Result { + self.socket.try_clone().map(Tube::new).map_err(Error::Clone) + } + pub fn send(&self, msg: &T) -> Result<()> { let msg_serialize = SerializeDescriptors::new(&msg); let msg_json = serde_json::to_vec(&msg_serialize).map_err(Error::Json)?; @@ -117,6 +123,15 @@ impl Tube { } } +impl FromRawDescriptor for Tube { + unsafe fn from_raw_descriptor(descriptor: RawDescriptor) -> Self { + Tube { + socket: UnixSeqpacket::from_raw_descriptor(descriptor), + _unsync_marker: PhantomData, + } + } +} + impl AsRawDescriptor for Tube { fn as_raw_descriptor(&self) -> RawDescriptor { self.socket.as_raw_descriptor() diff --git a/sys_util/src/net.rs b/sys_util/src/net.rs index b59fb0f212..d72d874206 100644 --- a/sys_util/src/net.rs +++ b/sys_util/src/net.rs @@ -23,7 +23,10 @@ use libc::{ }; use serde::{Deserialize, Serialize}; -use crate::sock_ctrl_msg::{ScmSocket, SCM_SOCKET_MAX_FD_COUNT}; +use crate::{ + sock_ctrl_msg::{ScmSocket, SCM_SOCKET_MAX_FD_COUNT}, + FromRawDescriptor, +}; use crate::{AsRawDescriptor, RawDescriptor}; /// Assist in handling both IP version 4 and IP version 6. @@ -604,6 +607,12 @@ impl FromRawFd for UnixSeqpacket { } } +impl FromRawDescriptor for UnixSeqpacket { + unsafe fn from_raw_descriptor(descriptor: RawDescriptor) -> Self { + Self { fd: descriptor } + } +} + impl AsRawFd for UnixSeqpacket { fn as_raw_fd(&self) -> RawFd { self.fd