monoio/net/unix/seq_packet/
mod.rs1use std::{
5 io,
6 os::unix::prelude::{AsRawFd, RawFd},
7 path::Path,
8};
9
10use super::{
11 socket_addr::{local_addr, pair, peer_addr, socket_addr},
12 SocketAddr,
13};
14use crate::{
15 buf::{IoBuf, IoBufMut},
16 driver::{op::Op, shared_fd::SharedFd},
17 net::new_socket,
18};
19
20mod listener;
21pub use listener::UnixSeqpacketListener;
22
23pub struct UnixSeqpacket {
25 fd: SharedFd,
26}
27
28impl UnixSeqpacket {
29 pub(crate) fn from_shared_fd(fd: SharedFd) -> Self {
30 Self { fd }
31 }
32
33 pub fn pair() -> io::Result<(Self, Self)> {
35 let (a, b) = pair(libc::SOCK_SEQPACKET)?;
36 Ok((
37 Self::from_shared_fd(SharedFd::new::<false>(a)?),
38 Self::from_shared_fd(SharedFd::new::<false>(b)?),
39 ))
40 }
41
42 pub async fn connect<P: AsRef<Path>>(path: P) -> io::Result<Self> {
44 let (addr, addr_len) = socket_addr(path.as_ref())?;
45 Self::inner_connect(addr, addr_len).await
46 }
47
48 pub async fn connect_addr(addr: SocketAddr) -> io::Result<Self> {
50 let (addr, addr_len) = addr.into_parts();
51 Self::inner_connect(addr, addr_len).await
52 }
53
54 #[inline(always)]
55 async fn inner_connect(
56 sockaddr: libc::sockaddr_un,
57 socklen: libc::socklen_t,
58 ) -> io::Result<Self> {
59 let socket = new_socket(libc::AF_UNIX, libc::SOCK_SEQPACKET)?;
60 let op = Op::connect_unix(SharedFd::new::<false>(socket)?, sockaddr, socklen)?;
61 let completion = op.await;
62 completion.meta.result?;
63
64 Ok(Self::from_shared_fd(completion.data.fd))
65 }
66
67 pub fn local_addr(&self) -> io::Result<SocketAddr> {
69 local_addr(self.as_raw_fd())
70 }
71
72 pub fn peer_addr(&self) -> io::Result<SocketAddr> {
74 peer_addr(self.as_raw_fd())
75 }
76
77 pub async fn readable(&self, relaxed: bool) -> io::Result<()> {
88 let op = Op::poll_read(&self.fd, relaxed).unwrap();
89 op.wait().await
90 }
91
92 pub async fn writable(&self, relaxed: bool) -> io::Result<()> {
103 let op = Op::poll_write(&self.fd, relaxed).unwrap();
104 op.wait().await
105 }
106
107 pub async fn send_to<T: IoBuf, P: AsRef<Path>>(
110 &self,
111 buf: T,
112 path: P,
113 ) -> crate::BufResult<usize, T> {
114 let addr = match crate::net::unix::socket_addr::socket_addr(path.as_ref()) {
115 Ok(addr) => addr,
116 Err(e) => return (Err(e), buf),
117 };
118 let op = Op::send_msg_unix(
119 self.fd.clone(),
120 buf,
121 Some(SocketAddr::from_parts(addr.0, addr.1)),
122 )
123 .unwrap();
124 op.wait().await
125 }
126
127 pub async fn recv_from<T: IoBufMut>(&self, buf: T) -> crate::BufResult<(usize, SocketAddr), T> {
130 let op = Op::recv_msg_unix(self.fd.clone(), buf).unwrap();
131 op.wait().await
132 }
133
134 pub async fn send<T: IoBuf>(&self, buf: T) -> crate::BufResult<usize, T> {
136 let op = Op::send_msg_unix(self.fd.clone(), buf, None).unwrap();
137 op.wait().await
138 }
139
140 pub async fn recv<T: IoBufMut>(&self, buf: T) -> crate::BufResult<usize, T> {
143 let op = Op::recv(self.fd.clone(), buf).unwrap();
144 op.result().await
145 }
146}
147
148impl AsRawFd for UnixSeqpacket {
149 #[inline]
150 fn as_raw_fd(&self) -> RawFd {
151 self.fd.raw_fd()
152 }
153}
154
155impl std::fmt::Debug for UnixSeqpacket {
156 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
157 f.debug_struct("UnixSeqpacket")
158 .field("fd", &self.fd)
159 .finish()
160 }
161}