Skip to content

Commit 0be1b27

Browse files
cgwaltersopenshift-merge-robot
authored andcommitted
Thread sysroot through install flow
More incremental work on #108
1 parent a4927ef commit 0be1b27

File tree

3 files changed

+12
-10
lines changed

3 files changed

+12
-10
lines changed

src/bootupd.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub(crate) enum ClientRequest {
2323
}
2424

2525
pub(crate) fn install(source_root: &str, dest_root: &str) -> Result<()> {
26+
let source_root = openat::Dir::open(source_root)?;
2627
SavedState::ensure_not_present(dest_root)
2728
.context("failed to install, invalid re-install attempted")?;
2829

@@ -35,7 +36,7 @@ pub(crate) fn install(source_root: &str, dest_root: &str) -> Result<()> {
3536
let mut state = SavedState::default();
3637
for component in components.values() {
3738
let meta = component
38-
.install(source_root, dest_root)
39+
.install(&source_root, dest_root)
3940
.with_context(|| format!("installing component {}", component.name()))?;
4041
state.installed.insert(component.name().into(), meta);
4142
}

src/component.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ pub(crate) trait Component {
4343
/// of a filesystem root, the component should query the mount point to
4444
/// determine the block device.
4545
/// This will be run during a disk image build process.
46-
fn install(&self, src_root: &str, dest_root: &str) -> Result<InstalledContent>;
46+
fn install(&self, src_root: &openat::Dir, dest_root: &str) -> Result<InstalledContent>;
4747

4848
/// Implementation of `bootupd generate-update-metadata` for a given component.
4949
/// This expects to be run during an "image update build" process. For CoreOS

src/efi.rs

+9-8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use std::collections::{BTreeMap, BTreeSet};
88
use std::io::prelude::*;
9+
use std::os::unix::io::AsRawFd;
910
use std::path::{Path, PathBuf};
1011
use std::process::Command;
1112

@@ -102,27 +103,27 @@ impl Component for EFI {
102103
})
103104
}
104105

105-
fn install(&self, src_root: &str, dest_root: &str) -> Result<InstalledContent> {
106-
let src_rootd = openat::Dir::open(src_root)?;
107-
let meta = if let Some(meta) = get_component_update(&src_rootd, self)? {
106+
fn install(&self, src_root: &openat::Dir, dest_root: &str) -> Result<InstalledContent> {
107+
let meta = if let Some(meta) = get_component_update(&src_root, self)? {
108108
meta
109109
} else {
110110
anyhow::bail!("No update metadata for component {} found", self.name());
111111
};
112-
let srcdir = component_updatedir(src_root, self);
113-
let srcd = openat::Dir::open(&srcdir)
114-
.with_context(|| format!("opening src dir {}", srcdir.display()))?;
115-
let ft = crate::filetree::FileTree::new_from_dir(&srcd)?;
112+
let srcdir_name = component_updatedirname(self);
113+
let ft = crate::filetree::FileTree::new_from_dir(&src_root.sub_dir(&srcdir_name)?)?;
116114
let destdir = Path::new(dest_root).join(MOUNT_PATH);
117115
{
118116
let destd = openat::Dir::open(&destdir)
119117
.with_context(|| format!("opening dest dir {}", destdir.display()))?;
120118
validate_esp(&destd)?;
121119
}
120+
// TODO - add some sort of API that allows directly setting the working
121+
// directory to a file descriptor.
122122
let r = std::process::Command::new("cp")
123123
.args(&["-rp", "--reflink=auto"])
124-
.arg(&srcdir)
124+
.arg(&srcdir_name)
125125
.arg(&destdir)
126+
.current_dir(format!("/proc/self/fd/{}", src_root.as_raw_fd()))
126127
.status()?;
127128
if !r.success() {
128129
anyhow::bail!("Failed to copy");

0 commit comments

Comments
 (0)