use tokio::io::unix::AsyncFd;
use std::net::SocketAddr;
use std::os::unix::io::RawFd;
#[allow(unused)]
use crate::internal::*;
use crate::{
AssociationId, BindxFlags, ConnStatus, Event, NotificationOrData, SendData, SendInfo,
SubscribeEventAssocId,
};
#[derive(Debug)]
pub struct ConnectedSocket {
inner: AsyncFd<RawFd>,
}
impl ConnectedSocket {
pub fn from_rawfd(rawfd: RawFd) -> std::io::Result<Self> {
Ok(Self {
inner: AsyncFd::new(rawfd)?,
})
}
pub fn shutdown(&self, how: std::net::Shutdown) -> std::io::Result<()> {
shutdown_internal(&self.inner, how)
}
pub fn sctp_bindx(&self, _addrs: &[SocketAddr], _flags: BindxFlags) -> std::io::Result<()> {
Err(std::io::Error::from_raw_os_error(95))
}
pub fn sctp_getpaddrs(&self, assoc_id: AssociationId) -> std::io::Result<Vec<SocketAddr>> {
sctp_getpaddrs_internal(&self.inner, assoc_id)
}
pub fn sctp_getladdrs(&self, assoc_id: AssociationId) -> std::io::Result<Vec<SocketAddr>> {
sctp_getladdrs_internal(&self.inner, assoc_id)
}
pub async fn sctp_recv(&self) -> std::io::Result<NotificationOrData> {
sctp_recvmsg_internal(&self.inner).await
}
pub async fn sctp_send(&self, data: SendData) -> std::io::Result<()> {
sctp_sendmsg_internal(&self.inner, None, data).await
}
#[deprecated(since = "0.2.2", note = "use sctp_subscribe_events instead.")]
pub fn sctp_subscribe_event(
&self,
event: Event,
assoc_id: SubscribeEventAssocId,
) -> std::io::Result<()> {
sctp_subscribe_event_internal(&self.inner, event, assoc_id, true)
}
#[deprecated(since = "0.2.2", note = "use sctp_unsubscribe_events instead.")]
pub fn sctp_unsubscribe_event(
&self,
event: Event,
assoc_id: SubscribeEventAssocId,
) -> std::io::Result<()> {
sctp_subscribe_event_internal(&self.inner, event, assoc_id, false)
}
pub fn sctp_subscribe_events(
&self,
events: &[Event],
assoc_id: SubscribeEventAssocId,
) -> std::io::Result<()> {
let mut failures = vec![];
for ev in events {
let result = sctp_subscribe_event_internal(&self.inner, ev.clone(), assoc_id, true);
if result.is_err() {
failures.push(result.err().unwrap());
}
}
if failures.is_empty() {
Ok(())
} else {
Err(std::io::Error::new(
std::io::ErrorKind::Other,
format!("{:?}", failures),
))
}
}
pub fn sctp_unsubscribe_events(
&self,
events: &[Event],
assoc_id: SubscribeEventAssocId,
) -> std::io::Result<()> {
let mut failures = vec![];
for ev in events {
let result = sctp_subscribe_event_internal(&self.inner, ev.clone(), assoc_id, false);
if result.is_err() {
failures.push(result.err().unwrap());
}
}
if failures.is_empty() {
Ok(())
} else {
Err(std::io::Error::new(
std::io::ErrorKind::Other,
format!("{:?}", failures),
))
}
}
pub fn sctp_request_rcvinfo(&self, on: bool) -> std::io::Result<()> {
request_rcvinfo_internal(&self.inner, on)
}
pub fn sctp_request_nxtinfo(&self, on: bool) -> std::io::Result<()> {
request_nxtinfo_internal(&self.inner, on)
}
pub fn sctp_get_status(&self, assoc_id: AssociationId) -> std::io::Result<ConnStatus> {
sctp_get_status_internal(&self.inner, assoc_id)
}
pub fn sctp_set_default_sendinfo(&self, sendinfo: SendInfo) -> std::io::Result<()> {
sctp_set_default_sendinfo_internal(&self.inner, sendinfo)
}
}
impl Drop for ConnectedSocket {
fn drop(&mut self) {
close_internal(&self.inner);
}
}