diff --git a/hypervisor/src/hypervisor/config.rs b/hypervisor/src/hypervisor/config.rs index 03ecbf4..48d5226 100644 --- a/hypervisor/src/hypervisor/config.rs +++ b/hypervisor/src/hypervisor/config.rs @@ -148,6 +148,12 @@ pub struct Partition { #[serde(default)] pub sockets: Vec, + + #[serde(default)] + pub stdout: Option, + + #[serde(default)] + pub stderr: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] diff --git a/hypervisor/src/hypervisor/partition.rs b/hypervisor/src/hypervisor/partition.rs index 73903b5..2efd8d6 100644 --- a/hypervisor/src/hypervisor/partition.rs +++ b/hypervisor/src/hypervisor/partition.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::fs::OpenOptions; use std::net::{TcpStream, UdpSocket}; use std::os::unix::prelude::{AsRawFd, FromRawFd, OwnedFd, PermissionsExt, RawFd}; use std::os::unix::process::CommandExt; @@ -164,6 +165,27 @@ impl Run { keep.push(udp_io_rx.as_raw_fd()); keep.push(tcp_io_rx.as_raw_fd()); + let mut stdout = None; + if let Some(path) = &base.stdout { + let out = OpenOptions::new() + .create(true) + .append(true) + .open(path) + .unwrap(); + keep.push(out.as_raw_fd()); + stdout = Some(out); + } + let mut stderr = None; + if let Some(path) = &base.stderr { + let err = OpenOptions::new() + .create(true) + .append(true) + .open(path) + .unwrap(); + keep.push(err.as_raw_fd()); + stderr = Some(err); + } + Partition::release_fds(&keep).unwrap(); let ipc_path_inner: PathBuf = PartitionConstants::IPC_SENDER[1..].into(); @@ -243,9 +265,9 @@ impl Run { // Run binary let mut command = Command::new("/bin"); let mut command = command - .stdout(Stdio::null()) + .stdout(stdout.map(|s| s.into()).unwrap_or_else(Stdio::null)) + .stderr(stderr.map(|s| s.into()).unwrap_or_else(Stdio::null)) .stdin(Stdio::null()) - .stderr(Stdio::null()) // Set Partition Name Env .env( PartitionConstants::PARTITION_CONSTANTS_FD, @@ -480,6 +502,8 @@ pub(crate) struct Base { period: Duration, working_dir: TempDir, sockets: Vec, + stdout: Option, + stderr: Option, } impl Base { @@ -559,6 +583,8 @@ impl Partition { sampling_channel, sockets: config.sockets, queuing_channel, + stdout: config.stdout, + stderr: config.stderr, }; // TODO use StartCondition::HmModuleRestart in case of a ModuleRestart!! let run =