use std::path::PathBuf;
use std::process::Command;
use std::sync::Arc;
use super::hub_session::{HubHost, HubSessionError};
use super::{ShmTransport, close_peer_fd};
use crate::Transport;
#[cfg(unix)]
use std::os::unix::io::RawFd;
#[cfg(unix)]
pub struct HubPeerTicket {
pub hub_path: PathBuf,
pub peer_id: u16,
pub doorbell_fd: RawFd,
}
#[cfg(unix)]
impl HubPeerTicket {
pub fn apply_to_command<'a>(&self, cmd: &'a mut Command) -> &'a mut Command {
cmd.arg(format!("--hub-path={}", self.hub_path.display()))
.arg(format!("--peer-id={}", self.peer_id))
.arg(format!("--doorbell-fd={}", self.doorbell_fd))
}
}
#[cfg(unix)]
impl Drop for HubPeerTicket {
fn drop(&mut self) {
close_peer_fd(self.doorbell_fd);
}
}
#[cfg(unix)]
impl HubHost {
pub fn add_peer_transport(
self: &Arc<Self>,
) -> Result<(Transport, HubPeerTicket), HubSessionError> {
let peer_info = self.add_peer()?;
let transport = Transport::Shm(ShmTransport::hub_host_peer(
self.clone(),
peer_info.peer_id,
peer_info.doorbell,
));
let ticket = HubPeerTicket {
hub_path: self.path().to_path_buf(),
peer_id: peer_info.peer_id,
doorbell_fd: peer_info.peer_doorbell_fd,
};
Ok((transport, ticket))
}
}