use {
std::os::{
fd::FromRawFd,
linux::net::SocketAddrExt,
unix::net::{SocketAddr, UnixListener, UnixStream},
},
crate::{Result, UdsxUnixStream},
super::{Namaste, RwNamaste},
};
impl<R, W> RwNamaste<R, W> where R: AsRef<[u8]>, W: AsRef<[u8]> {
pub fn read(&mut self) -> Result<()> {
loop {
match &self.read {
None => {
let read = match Namaste::make(&self.read_id) {
Ok(namaste) => namaste,
Err(_) => match self.connect_to(&self.read_id) {
Ok(stream) => Namaste::make_from_unix_listener(unsafe {
UnixListener::from_raw_fd(stream.recv_streams::<_, _, 1>(crate::linux::STREAM_ID)?[usize::MIN])
})?,
Err(_) => continue,
},
};
return match self.connect_to(&self.write_id) {
Ok(_) => Err(err!("Another write is working")),
Err(_) => Ok(self.read = Some(read)),
};
},
Some(_) => return Ok(()),
};
}
}
fn connect_to<B>(&self, address: B) -> Result<UnixStream> where B: AsRef<[u8]> {
UnixStream::connect_addr(&SocketAddr::from_abstract_name(address)?)
}
pub fn write(&mut self) -> Result<()> {
match &self.write {
None => {
let write = Namaste::make(&self.write_id)?;
match self.connect_to(&self.read_id) {
Ok(_) => Err(err!("Another read is working")),
Err(_) => Ok(self.write = Some(write)),
}
},
Some(_) => Ok(()),
}
}
}