use std::path::PathBuf;
pub fn socket_path(scope_hash: Option<&str>) -> String {
#[cfg(unix)]
{
let _ = std::fs::create_dir_all(runtime_dir_unix());
}
socket_path_view(scope_hash)
}
pub fn socket_path_view(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)]
{
format!("{}/daemon{suffix}.sock", runtime_dir_unix().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 path = pid_file_path_view(scope_hash);
if let Some(parent) = path.parent() {
let _ = std::fs::create_dir_all(parent);
}
path
}
pub fn pid_file_path_view(scope_hash: Option<&str>) -> PathBuf {
let suffix = match scope_hash {
Some(h) => format!("-{h}"),
None => String::new(),
};
#[cfg(windows)]
{
local_app_data_dir().join(format!("daemon{suffix}.pid"))
}
#[cfg(unix)]
{
runtime_dir_unix().join(format!("daemon{suffix}.pid"))
}
}
pub fn db_path(scope_hash: Option<&str>) -> PathBuf {
let path = db_path_view(scope_hash);
if let Some(parent) = path.parent() {
let _ = std::fs::create_dir_all(parent);
}
path
}
pub fn db_path_view(scope_hash: Option<&str>) -> PathBuf {
let suffix = match scope_hash {
Some(h) => format!("-{h}"),
None => String::new(),
};
data_dir().join(format!("tracked-pids{suffix}.sqlite3"))
}
pub fn shadow_dir() -> PathBuf {
let dir = shadow_dir_view();
let _ = std::fs::create_dir_all(&dir);
dir
}
pub fn shadow_dir_view() -> PathBuf {
#[cfg(windows)]
{
local_app_data_dir().join("run")
}
#[cfg(target_os = "macos")]
{
let home = dirs::home_dir().unwrap_or_else(|| PathBuf::from("/tmp"));
home.join("Library/Caches/running-process/run")
}
#[cfg(all(unix, not(target_os = "macos")))]
{
runtime_dir_unix().join("run")
}
}
pub fn data_dir() -> PathBuf {
#[cfg(windows)]
{
local_app_data_dir()
}
#[cfg(unix)]
{
state_dir_unix()
}
}
#[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")
}
}