提交 ba9a336c authored 作者: Serhij S's avatar Serhij S

custom xdg runtime dir

上级 cadd0f57
use std::{ use std::{
collections::BTreeMap, collections::BTreeMap,
ffi::{OsStr, OsString}, ffi::{OsStr, OsString},
path::Path, path::{Path, PathBuf},
process::Child, process::Child,
thread, thread,
time::Duration, time::Duration,
...@@ -28,6 +28,7 @@ pub struct ServerOptions { ...@@ -28,6 +28,7 @@ pub struct ServerOptions {
wait_for: Option<OsString>, wait_for: Option<OsString>,
kill_delay: Duration, kill_delay: Duration,
spawn_delay: Duration, spawn_delay: Duration,
xdg_runtime_dir: PathBuf,
} }
impl ServerOptions { impl ServerOptions {
...@@ -38,8 +39,9 @@ impl ServerOptions { ...@@ -38,8 +39,9 @@ impl ServerOptions {
kill_command: None, kill_command: None,
env: <_>::default(), env: <_>::default(),
wait_for: None, wait_for: None,
spawn_delay: Duration::from_secs(5),
kill_delay: Duration::from_secs(5), kill_delay: Duration::from_secs(5),
spawn_delay: Duration::from_secs(5),
xdg_runtime_dir: Path::new("/run/roboplc").to_owned(),
} }
} }
/// The command is executed to terminate the previous server instance if there is a conflict /// The command is executed to terminate the previous server instance if there is a conflict
...@@ -53,7 +55,8 @@ impl ServerOptions { ...@@ -53,7 +55,8 @@ impl ServerOptions {
self.env.insert(key.to_string(), value.to_string()); self.env.insert(key.to_string(), value.to_string());
self self
} }
/// Wait for a file (server socket) before starting the application /// Wait for a file (server socket) before starting the application. Relative to
/// XDG_RUNTIME_DIR or absolute path.
pub fn with_wait_for<C: AsRef<OsStr>>(mut self, wait_for: C) -> Self { pub fn with_wait_for<C: AsRef<OsStr>>(mut self, wait_for: C) -> Self {
self.wait_for = Some(wait_for.as_ref().to_owned()); self.wait_for = Some(wait_for.as_ref().to_owned());
self self
...@@ -68,6 +71,11 @@ impl ServerOptions { ...@@ -68,6 +71,11 @@ impl ServerOptions {
self.kill_delay = delay; self.kill_delay = delay;
self self
} }
/// Custom XDG_RUNTIME_DIR (default: /run/roboplc)
pub fn with_xdg_runtime_dir<P: AsRef<Path>>(mut self, path: P) -> Self {
self.xdg_runtime_dir = path.as_ref().to_owned();
self
}
} }
/// Graphics server kind /// Graphics server kind
...@@ -93,7 +101,7 @@ impl ServerKind { ...@@ -93,7 +101,7 @@ impl ServerKind {
}; };
opts = opts opts = opts
.with_env("WAYLAND_DISPLAY", "wayland-1") .with_env("WAYLAND_DISPLAY", "wayland-1")
.with_wait_for("/run/user/0/wayland-1") .with_wait_for("wayland-1")
.with_terminate_previous_command("pkill -KILL weston"); .with_terminate_previous_command("pkill -KILL weston");
opts opts
} }
...@@ -191,15 +199,10 @@ pub fn start_server(server_options: ServerOptions) { ...@@ -191,15 +199,10 @@ pub fn start_server(server_options: ServerOptions) {
} }
} }
} }
#[cfg(target_os = "linux")] while !server_options.xdg_runtime_dir.exists() {
{ thread::sleep(Duration::from_millis(100));
let uid = unsafe { libc::getuid() };
let dir_path = Path::new("/run/user").join(uid.to_string());
while !dir_path.exists() {
thread::sleep(Duration::from_millis(100));
}
} }
std::env::set_var("XDG_RUNTIME_DIR", "/run/user/0"); std::env::set_var("XDG_RUNTIME_DIR", &server_options.xdg_runtime_dir);
for key in server_options.env.keys() { for key in server_options.env.keys() {
std::env::remove_var(key); std::env::remove_var(key);
} }
...@@ -220,11 +223,17 @@ pub fn start_server(server_options: ServerOptions) { ...@@ -220,11 +223,17 @@ pub fn start_server(server_options: ServerOptions) {
std::env::set_var(key, value); std::env::set_var(key, value);
} }
if let Some(wait_for) = server_options.wait_for { if let Some(wait_for) = server_options.wait_for {
let wait_for = Path::new(&wait_for); let wait_path = {
loop { let p = Path::new(&wait_for);
if wait_for.exists() { if p.is_absolute() {
break; p.to_owned()
} else {
Path::new(&server_options.xdg_runtime_dir)
.join(&wait_for)
.to_owned()
} }
};
while !wait_path.exists() {
thread::sleep(Duration::from_millis(100)); thread::sleep(Duration::from_millis(100));
} }
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论