summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-07-17 20:30:26 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-07-17 20:30:26 +0200
commitac869b81bc84f18a0a5428c059e3779e27020755 (patch)
tree23e6a67af5a9a1c190331738fd55fe47bb6af7d7
parent923217e7e00749335877efd57173a63305dab133 (diff)
downloadrebel-ac869b81bc84f18a0a5428c059e3779e27020755.tar
rebel-ac869b81bc84f18a0a5428c059e3779e27020755.zip
runc: unpack dependency sysroots
-rw-r--r--src/runner/runc/run.rs22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/runner/runc/run.rs b/src/runner/runc/run.rs
index e33ef50..8c7b348 100644
--- a/src/runner/runc/run.rs
+++ b/src/runner/runc/run.rs
@@ -1,5 +1,6 @@
use std::{
- fs, io,
+ fs::{self, File},
+ io,
path::{Path, PathBuf},
process,
};
@@ -16,7 +17,7 @@ use tee_readwrite::TeeWriter;
use crate::{
types::*,
unshare,
- util::{self, ToIOResult},
+ util::{self, tar, ToIOResult},
};
use super::spec;
@@ -78,6 +79,22 @@ fn output_filename(hash: &OutputHash) -> PathBuf {
Path::new("build/state/output").join(format!("{}.tar", hash))
}
+fn unpack_dependencies(task: &Task) -> Result<(), Error> {
+ for dep in task.depends.values() {
+ let filename = output_filename(dep);
+ let file = File::open(filename)?;
+ tar::unpack_filter(file, "build/tmp/runc/depends", |entry| {
+ let path = match entry.path() {
+ Ok(path) => path,
+ Err(_) => return false,
+ };
+ path.starts_with("opt/sysroot")
+ })?;
+ }
+
+ Ok(())
+}
+
fn collect_output(task: Task) -> Result<OutputHash, io::Error> {
let filename = tmp_filename(&task);
let file = util::unix::create_as(
@@ -106,6 +123,7 @@ fn collect_output(task: Task) -> Result<OutputHash, io::Error> {
pub fn handle_task(task: Task) -> Result<OutputHash, Error> {
init_task()?;
+ unpack_dependencies(&task)?;
spec::generate_spec(task.def.run.as_str(), &task.env)
.save("build/tmp/runc/config.json")