Skip to main content

veyron_wire/
socket.rs

1use std::os::unix::fs::PermissionsExt;
2use std::path::PathBuf;
3
4/// Resolves the same private runtime directory the kernel uses, so SDKs
5/// pick the identical default socket location when `VEYRON_SOCKET_PATH`
6/// is unset. Order: `$XDG_RUNTIME_DIR`, `/run/user/<uid>`, `~/.veyron/run`.
7pub fn default_private_dir() -> Option<PathBuf> {
8    if let Ok(runtime_dir) = std::env::var("XDG_RUNTIME_DIR") {
9        return Some(PathBuf::from(runtime_dir));
10    }
11
12    let uid = nix::unistd::Uid::current().as_raw();
13    let run_user_dir = PathBuf::from(format!("/run/user/{uid}"));
14    if run_user_dir.is_dir() {
15        return Some(run_user_dir);
16    }
17
18    if let Ok(home) = std::env::var("HOME") {
19        let dir = PathBuf::from(home).join(".veyron").join("run");
20        if std::fs::create_dir_all(&dir).is_ok()
21            && std::fs::set_permissions(&dir, std::fs::Permissions::from_mode(0o700)).is_ok()
22        {
23            return Some(dir);
24        }
25    }
26
27    None
28}
29
30pub fn default_socket_path() -> String {
31    default_private_dir()
32        .map(|dir| dir.join("veyron.sock").to_string_lossy().to_string())
33        .unwrap_or_default()
34}