Skip to content

Commit eb8af30

Browse files
feat: configurable state dir at compile time (#36)
* feat: configurable state dir at compile time * fix: error handling in base image install Avoid panic on permission denied
1 parent b9851fb commit eb8af30

2 files changed

Lines changed: 19 additions & 10 deletions

File tree

src/base_image.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -97,25 +97,22 @@ where
9797
for dir in dest.read_dir()? {
9898
let path = dir?.path();
9999
if let Err(err) = chmod_dirs(&path, |mode| mode | 0o700) {
100-
log::error!(
100+
bail!(
101101
"could not fix permissions for {}: {}",
102102
path.display(),
103103
err
104104
);
105-
bail!(err);
106105
}
107106
if path.is_dir() {
108107
if let Err(err) = fs::remove_dir_all(&path) {
109-
log::error!("could not remove {}: {}", path.display(), err);
110-
bail!(err);
108+
bail!("could not remove {}: {}", path.display(), err);
111109
}
112110
} else if let Err(err) = fs::remove_file(&path) {
113-
log::error!("could not remove {}: {}", path.display(), err);
114-
bail!(err);
111+
bail!("could not remove {}: {}", path.display(), err);
115112
}
116113
}
117-
} else {
118-
fs::create_dir_all(dest).unwrap();
114+
} else if let Err(err) = fs::create_dir_all(dest) {
115+
bail!("could not create {}: {}", dest.display(), err);
119116
}
120117

121118
log::info!("unpacking base image into {}", dest.display());

src/bin/dive.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,21 +50,33 @@ fn get_lead_pid(container_id: &str) -> Option<i32> {
5050
.or_else(|| pid_lookup(container_id))
5151
}
5252

53+
fn base_state_dir() -> PathBuf {
54+
let cfg_state_dir = option_env!("CONFIG_STATE_DIR");
55+
if std::env::var_os("XDG_STATE_HOME").is_none() {
56+
cfg_state_dir
57+
.map(PathBuf::from)
58+
.or(dirs::state_dir())
59+
.unwrap()
60+
} else {
61+
dirs::state_dir().unwrap()
62+
}
63+
}
64+
5365
fn get_img_dir(args: &Args) -> PathBuf {
5466
if let Ok(img_dir) = std::env::var(ENV_IMG_DIR) {
5567
return PathBuf::from(img_dir);
5668
}
5769
if args.img_dir.is_some() {
5870
return PathBuf::from(args.img_dir.clone().unwrap());
5971
}
60-
dirs::state_dir().unwrap().join(APP_NAME).join(IMG_DIR)
72+
base_state_dir().join(APP_NAME).join(IMG_DIR)
6173
}
6274

6375
fn get_state_dir() -> PathBuf {
6476
if let Ok(ovl_dir) = std::env::var(ENV_STATE_DIR) {
6577
return PathBuf::from(ovl_dir);
6678
}
67-
dirs::state_dir().unwrap().join(APP_NAME)
79+
base_state_dir().join(APP_NAME)
6880
}
6981

7082
fn init_logging() {

0 commit comments

Comments
 (0)