From cc0087891b6952290f473c1bfa09f2b4a4d9c690 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 20 Oct 2025 09:02:36 +0000 Subject: [PATCH 1/2] feat: configurable state dir at compile time --- src/bin/dive.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/bin/dive.rs b/src/bin/dive.rs index fe4add3..cdfdc0a 100644 --- a/src/bin/dive.rs +++ b/src/bin/dive.rs @@ -50,6 +50,18 @@ fn get_lead_pid(container_id: &str) -> Option { .or_else(|| pid_lookup(container_id)) } +fn base_state_dir() -> PathBuf { + let cfg_state_dir = option_env!("CONFIG_STATE_DIR"); + if std::env::var_os("XDG_STATE_HOME").is_none() { + cfg_state_dir + .map(PathBuf::from) + .or(dirs::state_dir()) + .unwrap() + } else { + dirs::state_dir().unwrap() + } +} + fn get_img_dir(args: &Args) -> PathBuf { if let Ok(img_dir) = std::env::var(ENV_IMG_DIR) { return PathBuf::from(img_dir); @@ -57,14 +69,14 @@ fn get_img_dir(args: &Args) -> PathBuf { if args.img_dir.is_some() { return PathBuf::from(args.img_dir.clone().unwrap()); } - dirs::state_dir().unwrap().join(APP_NAME).join(IMG_DIR) + base_state_dir().join(APP_NAME).join(IMG_DIR) } fn get_state_dir() -> PathBuf { if let Ok(ovl_dir) = std::env::var(ENV_STATE_DIR) { return PathBuf::from(ovl_dir); } - dirs::state_dir().unwrap().join(APP_NAME) + base_state_dir().join(APP_NAME) } fn init_logging() { From 71b86956966c524258b5be9c999633f4566a2ff8 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 20 Oct 2025 09:03:56 +0000 Subject: [PATCH 2/2] fix: error handling in base image install Avoid panic on permission denied --- src/base_image.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/base_image.rs b/src/base_image.rs index 6f3cb79..50d7873 100644 --- a/src/base_image.rs +++ b/src/base_image.rs @@ -97,25 +97,22 @@ where for dir in dest.read_dir()? { let path = dir?.path(); if let Err(err) = chmod_dirs(&path, |mode| mode | 0o700) { - log::error!( + bail!( "could not fix permissions for {}: {}", path.display(), err ); - bail!(err); } if path.is_dir() { if let Err(err) = fs::remove_dir_all(&path) { - log::error!("could not remove {}: {}", path.display(), err); - bail!(err); + bail!("could not remove {}: {}", path.display(), err); } } else if let Err(err) = fs::remove_file(&path) { - log::error!("could not remove {}: {}", path.display(), err); - bail!(err); + bail!("could not remove {}: {}", path.display(), err); } } - } else { - fs::create_dir_all(dest).unwrap(); + } else if let Err(err) = fs::create_dir_all(dest) { + bail!("could not create {}: {}", dest.display(), err); } log::info!("unpacking base image into {}", dest.display());