running_process/client/
paths.rs1use std::path::PathBuf;
7
8pub fn socket_path(scope_hash: Option<&str>) -> String {
21 #[cfg(unix)]
22 {
23 let _ = std::fs::create_dir_all(runtime_dir_unix());
25 }
26 socket_path_view(scope_hash)
27}
28
29pub fn socket_path_view(scope_hash: Option<&str>) -> String {
32 let suffix = match scope_hash {
33 Some(h) => format!("-{h}"),
34 None => String::new(),
35 };
36
37 #[cfg(windows)]
38 {
39 let username = std::env::var("USERNAME").unwrap_or_else(|_| "unknown".into());
40 format!(r"\\.\pipe\running-process-daemon-{username}{suffix}")
41 }
42
43 #[cfg(unix)]
44 {
45 format!("{}/daemon{suffix}.sock", runtime_dir_unix().display())
46 }
47}
48
49pub fn make_socket_name(path: &str) -> std::io::Result<interprocess::local_socket::Name<'_>> {
55 use interprocess::local_socket::prelude::*;
56
57 #[cfg(unix)]
58 {
59 use interprocess::local_socket::GenericFilePath;
60 path.to_fs_name::<GenericFilePath>()
61 }
62
63 #[cfg(windows)]
64 {
65 use interprocess::local_socket::GenericNamespaced;
66 path.to_ns_name::<GenericNamespaced>()
67 }
68}
69
70pub fn pid_file_path(scope_hash: Option<&str>) -> PathBuf {
75 let path = pid_file_path_view(scope_hash);
76 if let Some(parent) = path.parent() {
77 let _ = std::fs::create_dir_all(parent);
78 }
79 path
80}
81
82pub fn pid_file_path_view(scope_hash: Option<&str>) -> PathBuf {
85 let suffix = match scope_hash {
86 Some(h) => format!("-{h}"),
87 None => String::new(),
88 };
89
90 #[cfg(windows)]
91 {
92 local_app_data_dir().join(format!("daemon{suffix}.pid"))
93 }
94
95 #[cfg(unix)]
96 {
97 runtime_dir_unix().join(format!("daemon{suffix}.pid"))
98 }
99}
100
101pub fn db_path(scope_hash: Option<&str>) -> PathBuf {
107 let path = db_path_view(scope_hash);
108 if let Some(parent) = path.parent() {
109 let _ = std::fs::create_dir_all(parent);
110 }
111 path
112}
113
114pub fn db_path_view(scope_hash: Option<&str>) -> PathBuf {
117 let suffix = match scope_hash {
118 Some(h) => format!("-{h}"),
119 None => String::new(),
120 };
121 data_dir().join(format!("tracked-pids{suffix}.sqlite3"))
122}
123
124pub fn shadow_dir() -> PathBuf {
130 let dir = shadow_dir_view();
131 let _ = std::fs::create_dir_all(&dir);
132 dir
133}
134
135pub fn shadow_dir_view() -> PathBuf {
138 #[cfg(windows)]
139 {
140 local_app_data_dir().join("run")
141 }
142
143 #[cfg(target_os = "macos")]
144 {
145 let home = dirs::home_dir().unwrap_or_else(|| PathBuf::from("/tmp"));
146 home.join("Library/Caches/running-process/run")
147 }
148
149 #[cfg(all(unix, not(target_os = "macos")))]
150 {
151 runtime_dir_unix().join("run")
152 }
153}
154
155pub fn data_dir() -> PathBuf {
159 #[cfg(windows)]
160 {
161 local_app_data_dir()
162 }
163
164 #[cfg(unix)]
165 {
166 state_dir_unix()
167 }
168}
169
170#[cfg(windows)]
175fn local_app_data_dir() -> PathBuf {
176 dirs::data_local_dir()
177 .unwrap_or_else(|| PathBuf::from(r"C:\ProgramData"))
178 .join("running-process")
179}
180
181#[cfg(unix)]
182fn runtime_dir_unix() -> PathBuf {
183 if let Some(d) = std::env::var_os("XDG_RUNTIME_DIR") {
184 PathBuf::from(d).join("running-process")
185 } else {
186 let uid = unsafe { libc::getuid() };
188 PathBuf::from(format!("/tmp/running-process-{uid}"))
189 }
190}
191
192#[cfg(unix)]
193fn state_dir_unix() -> PathBuf {
194 if let Some(d) = std::env::var_os("XDG_STATE_HOME") {
195 PathBuf::from(d).join("running-process")
196 } else if let Some(home) = dirs::home_dir() {
197 home.join(".local/state/running-process")
198 } else {
199 PathBuf::from("/tmp/running-process-state")
200 }
201}