use std::path::PathBuf;
pub fn socket_path(scope_hash: Option<&str>) -> String {
let suffix = match scope_hash {
Some(h) => format!("-{h}"),
None => String::new(),
};
#[cfg(windows)]
{
let username = std::env::var("USERNAME").unwrap_or_else(|_| "unknown".into());
format!(r"\\.\pipe\running-process-daemon-{username}{suffix}")
}
#[cfg(unix)]
{
let dir = runtime_dir_unix();
let _ = std::fs::create_dir_all(&dir);
format!("{}/daemon{suffix}.sock", dir.display())
}
}
pub fn make_socket_name(path: &str) -> std::io::Result<interprocess::local_socket::Name<'_>> {
use interprocess::local_socket::prelude::*;
#[cfg(unix)]
{
use interprocess::local_socket::GenericFilePath;
path.to_fs_name::<GenericFilePath>()
}
#[cfg(windows)]
{
use interprocess::local_socket::GenericNamespaced;
path.to_ns_name::<GenericNamespaced>()
}
}
pub fn pid_file_path(scope_hash: Option<&str>) -> PathBuf {
let suffix = match scope_hash {
Some(h) => format!("-{h}"),
None => String::new(),
};
#[cfg(windows)]
{
let base = local_app_data_dir();
let _ = std::fs::create_dir_all(&base);
base.join(format!("daemon{suffix}.pid"))
}
#[cfg(unix)]
{
let dir = runtime_dir_unix();
let _ = std::fs::create_dir_all(&dir);
dir.join(format!("daemon{suffix}.pid"))
}
}
pub fn db_path(scope_hash: Option<&str>) -> PathBuf {
let suffix = match scope_hash {
Some(h) => format!("-{h}"),
None => String::new(),
};
#[cfg(windows)]
{
let base = local_app_data_dir();
let _ = std::fs::create_dir_all(&base);
base.join(format!("tracked-pids{suffix}.sqlite3"))
}
#[cfg(unix)]
{
let dir = state_dir_unix();
let _ = std::fs::create_dir_all(&dir);
dir.join(format!("tracked-pids{suffix}.sqlite3"))
}
}
pub fn shadow_dir() -> PathBuf {
#[cfg(windows)]
{
let dir = local_app_data_dir().join("run");
let _ = std::fs::create_dir_all(&dir);
dir
}
#[cfg(target_os = "macos")]
{
let home = dirs::home_dir().unwrap_or_else(|| PathBuf::from("/tmp"));
let dir = home.join("Library/Caches/running-process/run");
let _ = std::fs::create_dir_all(&dir);
dir
}
#[cfg(all(unix, not(target_os = "macos")))]
{
let dir = runtime_dir_unix().join("run");
let _ = std::fs::create_dir_all(&dir);
dir
}
}
#[cfg(windows)]
fn local_app_data_dir() -> PathBuf {
dirs::data_local_dir()
.unwrap_or_else(|| PathBuf::from(r"C:\ProgramData"))
.join("running-process")
}
#[cfg(unix)]
fn runtime_dir_unix() -> PathBuf {
if let Some(d) = std::env::var_os("XDG_RUNTIME_DIR") {
PathBuf::from(d).join("running-process")
} else {
let uid = unsafe { libc::getuid() };
PathBuf::from(format!("/tmp/running-process-{uid}"))
}
}
#[cfg(unix)]
fn state_dir_unix() -> PathBuf {
if let Some(d) = std::env::var_os("XDG_STATE_HOME") {
PathBuf::from(d).join("running-process")
} else if let Some(home) = dirs::home_dir() {
home.join(".local/state/running-process")
} else {
PathBuf::from("/tmp/running-process-state")
}
}