use std::path::PathBuf;
pub fn runtime_dir() -> PathBuf {
if let Some(dir) = std::env::var_os("XDG_RUNTIME_DIR") {
return PathBuf::from(dir);
}
private_temp_subdir().unwrap_or_else(std::env::temp_dir)
}
fn private_temp_subdir() -> Option<PathBuf> {
use std::os::unix::fs::{DirBuilderExt, MetadataExt, PermissionsExt};
let uid = rustix::process::getuid().as_raw();
let dir = std::env::temp_dir().join(format!("wlr-utils-{uid}"));
match std::fs::DirBuilder::new().mode(0o700).create(&dir) {
Ok(()) => Some(dir),
Err(e) if e.kind() == std::io::ErrorKind::AlreadyExists => {
let md = std::fs::metadata(&dir).ok()?;
let private = md.permissions().mode() & 0o077 == 0;
(md.is_dir() && md.uid() == uid && private).then_some(dir)
}
Err(_) => None,
}
}