diff --git a/src/util/rust/sys/linux/tube.rs b/src/util/rust/sys/linux/tube.rs index 29e549a1f81..a7e68bb02f0 100644 --- a/src/util/rust/sys/linux/tube.rs +++ b/src/util/rust/sys/linux/tube.rs @@ -19,6 +19,7 @@ use rustix::net::listen; use rustix::net::recvmsg; use rustix::net::sendmsg; use rustix::net::socket_with; +use rustix::net::sockopt::socket_type; use rustix::net::AddressFamily; use rustix::net::RecvAncillaryBuffer; use rustix::net::RecvAncillaryMessage; @@ -43,6 +44,18 @@ pub struct Tube { socket: OwnedDescriptor, } +impl TryFrom for Tube { + type Error = MesaError; + + fn try_from(socket: OwnedDescriptor) -> Result { + let ty = socket_type(&socket)?; + match ty { + SocketType::SEQPACKET | SocketType::STREAM => Ok(Tube { socket }), + _ => Err(MesaError::Unsupported), + } + } +} + impl TryFrom for TubeType { type Error = std::io::Error; diff --git a/src/util/rust/sys/stub/tube.rs b/src/util/rust/sys/stub/tube.rs index 21420c83476..91a9f9f18e6 100644 --- a/src/util/rust/sys/stub/tube.rs +++ b/src/util/rust/sys/stub/tube.rs @@ -12,6 +12,14 @@ use crate::TubeType; pub struct Tube; pub struct Listener; +impl TryFrom for Tube { + type Error = MesaError; + + fn try_from(_socket: OwnedDescriptor) -> Result { + Err(MesaError::Unsupported) + } +} + impl Tube { pub fn new>(_path: P, _kind: TubeType) -> MesaResult { Err(MesaError::Unsupported) diff --git a/src/util/rust/sys/windows/tube.rs b/src/util/rust/sys/windows/tube.rs index 21420c83476..91a9f9f18e6 100644 --- a/src/util/rust/sys/windows/tube.rs +++ b/src/util/rust/sys/windows/tube.rs @@ -12,6 +12,14 @@ use crate::TubeType; pub struct Tube; pub struct Listener; +impl TryFrom for Tube { + type Error = MesaError; + + fn try_from(_socket: OwnedDescriptor) -> Result { + Err(MesaError::Unsupported) + } +} + impl Tube { pub fn new>(_path: P, _kind: TubeType) -> MesaResult { Err(MesaError::Unsupported)