2024-03-27 02:54:39 +00:00
|
|
|
use crate::{
|
|
|
|
childwait::{ChildEvent, ChildWait},
|
|
|
|
death,
|
|
|
|
};
|
2024-02-23 03:25:06 +00:00
|
|
|
use anyhow::Result;
|
2024-03-28 22:38:21 +00:00
|
|
|
use krata::idm::{
|
|
|
|
client::IdmClient,
|
2024-03-30 03:49:13 +00:00
|
|
|
protocol::{idm_event::Event, IdmEvent, IdmExitEvent, IdmPacket},
|
2024-03-28 22:38:21 +00:00
|
|
|
};
|
|
|
|
use log::error;
|
2024-03-27 02:54:39 +00:00
|
|
|
use nix::unistd::Pid;
|
|
|
|
use tokio::select;
|
2024-02-23 03:25:06 +00:00
|
|
|
|
2024-03-15 16:11:35 +00:00
|
|
|
pub struct GuestBackground {
|
2024-03-28 22:38:21 +00:00
|
|
|
idm: IdmClient,
|
2024-02-23 03:25:06 +00:00
|
|
|
child: Pid,
|
|
|
|
wait: ChildWait,
|
|
|
|
}
|
|
|
|
|
2024-03-15 16:11:35 +00:00
|
|
|
impl GuestBackground {
|
2024-03-28 22:38:21 +00:00
|
|
|
pub async fn new(idm: IdmClient, child: Pid) -> Result<GuestBackground> {
|
2024-03-15 16:11:35 +00:00
|
|
|
Ok(GuestBackground {
|
2024-03-28 22:38:21 +00:00
|
|
|
idm,
|
2024-02-23 03:25:06 +00:00
|
|
|
child,
|
|
|
|
wait: ChildWait::new()?,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
pub async fn run(&mut self) -> Result<()> {
|
|
|
|
loop {
|
|
|
|
select! {
|
2024-03-28 22:38:21 +00:00
|
|
|
x = self.idm.receiver.recv() => match x {
|
|
|
|
Some(_packet) => {
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
None => {
|
|
|
|
error!("idm packet channel closed");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2024-02-23 03:25:06 +00:00
|
|
|
event = self.wait.recv() => match event {
|
|
|
|
Some(event) => self.child_event(event).await?,
|
|
|
|
None => {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn child_event(&mut self, event: ChildEvent) -> Result<()> {
|
|
|
|
if event.pid == self.child {
|
2024-03-28 22:38:21 +00:00
|
|
|
self.idm
|
|
|
|
.sender
|
|
|
|
.send(IdmPacket {
|
2024-03-30 03:49:13 +00:00
|
|
|
event: Some(IdmEvent {
|
|
|
|
event: Some(Event::Exit(IdmExitEvent { code: event.status })),
|
|
|
|
}),
|
2024-03-28 22:38:21 +00:00
|
|
|
})
|
|
|
|
.await?;
|
2024-03-27 02:54:39 +00:00
|
|
|
death(event.status).await?;
|
2024-02-23 03:25:06 +00:00
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|