|
6 | 6 |
|
7 | 7 | use std::collections::{BTreeMap, BTreeSet};
|
8 | 8 | use std::io::prelude::*;
|
| 9 | +use std::os::unix::io::AsRawFd; |
9 | 10 | use std::path::{Path, PathBuf};
|
10 | 11 | use std::process::Command;
|
11 | 12 |
|
@@ -102,27 +103,27 @@ impl Component for EFI {
|
102 | 103 | })
|
103 | 104 | }
|
104 | 105 |
|
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)? { |
108 | 108 | meta
|
109 | 109 | } else {
|
110 | 110 | anyhow::bail!("No update metadata for component {} found", self.name());
|
111 | 111 | };
|
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)?)?; |
116 | 114 | let destdir = Path::new(dest_root).join(MOUNT_PATH);
|
117 | 115 | {
|
118 | 116 | let destd = openat::Dir::open(&destdir)
|
119 | 117 | .with_context(|| format!("opening dest dir {}", destdir.display()))?;
|
120 | 118 | validate_esp(&destd)?;
|
121 | 119 | }
|
| 120 | + // TODO - add some sort of API that allows directly setting the working |
| 121 | + // directory to a file descriptor. |
122 | 122 | let r = std::process::Command::new("cp")
|
123 | 123 | .args(&["-rp", "--reflink=auto"])
|
124 |
| - .arg(&srcdir) |
| 124 | + .arg(&srcdir_name) |
125 | 125 | .arg(&destdir)
|
| 126 | + .current_dir(format!("/proc/self/fd/{}", src_root.as_raw_fd())) |
126 | 127 | .status()?;
|
127 | 128 | if !r.success() {
|
128 | 129 | anyhow::bail!("Failed to copy");
|
|
0 commit comments