aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-01-27 08:28:02 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-01-27 08:30:22 +0300
commit0226d9aec2fabc215c1bff8f7d37260370b5ad07 (patch)
treef864a3be06fec9166fb4ebe302853552a4199de3 /src
parent902222675af78b07d01b905fd3a76fc1df89e55e (diff)
downloadniri-0226d9aec2fabc215c1bff8f7d37260370b5ad07.tar.gz
niri-0226d9aec2fabc215c1bff8f7d37260370b5ad07.tar.bz2
niri-0226d9aec2fabc215c1bff8f7d37260370b5ad07.zip
Don't create on-disk sockets in tests
Diffstat (limited to 'src')
-rw-r--r--src/ipc/server.rs59
-rw-r--r--src/main.rs8
-rw-r--r--src/niri.rs44
-rw-r--r--src/tests/server.rs1
4 files changed, 72 insertions, 40 deletions
diff --git a/src/ipc/server.rs b/src/ipc/server.rs
index f8b661e1..6706928a 100644
--- a/src/ipc/server.rs
+++ b/src/ipc/server.rs
@@ -1,5 +1,6 @@
use std::cell::RefCell;
use std::collections::HashSet;
+use std::ffi::OsStr;
use std::os::unix::net::{UnixListener, UnixStream};
use std::path::PathBuf;
use std::rc::Rc;
@@ -33,7 +34,10 @@ use crate::window::Mapped;
const EVENT_STREAM_BUFFER_SIZE: usize = 64;
pub struct IpcServer {
- pub socket_path: PathBuf,
+ /// Path to the IPC socket.
+ ///
+ /// This is `None` when creating `IpcServer` without a socket.
+ pub socket_path: Option<PathBuf>,
event_streams: Rc<RefCell<Vec<EventStreamSender>>>,
event_stream_state: Rc<RefCell<EventStreamState>>,
}
@@ -60,31 +64,38 @@ struct EventStreamSender {
impl IpcServer {
pub fn start(
event_loop: &LoopHandle<'static, State>,
- wayland_socket_name: &str,
+ wayland_socket_name: Option<&OsStr>,
) -> anyhow::Result<Self> {
let _span = tracy_client::span!("Ipc::start");
- let socket_name = format!("niri.{wayland_socket_name}.{}.sock", process::id());
- let mut socket_path = socket_dir();
- socket_path.push(socket_name);
-
- let listener = UnixListener::bind(&socket_path).context("error binding socket")?;
- listener
- .set_nonblocking(true)
- .context("error setting socket to non-blocking")?;
-
- let source = Generic::new(listener, Interest::READ, Mode::Level);
- event_loop
- .insert_source(source, |_, socket, state| {
- match socket.accept() {
- Ok((stream, _)) => on_new_ipc_client(state, stream),
- Err(e) if e.kind() == io::ErrorKind::WouldBlock => (),
- Err(e) => return Err(e),
- }
+ let socket_path = if let Some(wayland_socket_name) = wayland_socket_name {
+ let wayland_socket_name = wayland_socket_name.to_string_lossy();
+ let socket_name = format!("niri.{wayland_socket_name}.{}.sock", process::id());
+ let mut socket_path = socket_dir();
+ socket_path.push(socket_name);
+
+ let listener = UnixListener::bind(&socket_path).context("error binding socket")?;
+ listener
+ .set_nonblocking(true)
+ .context("error setting socket to non-blocking")?;
+
+ let source = Generic::new(listener, Interest::READ, Mode::Level);
+ event_loop
+ .insert_source(source, |_, socket, state| {
+ match socket.accept() {
+ Ok((stream, _)) => on_new_ipc_client(state, stream),
+ Err(e) if e.kind() == io::ErrorKind::WouldBlock => (),
+ Err(e) => return Err(e),
+ }
+
+ Ok(PostAction::Continue)
+ })
+ .unwrap();
- Ok(PostAction::Continue)
- })
- .unwrap();
+ Some(socket_path)
+ } else {
+ None
+ };
Ok(Self {
socket_path,
@@ -119,7 +130,9 @@ impl IpcServer {
impl Drop for IpcServer {
fn drop(&mut self) {
- let _ = unlink(&self.socket_path);
+ if let Some(socket_path) = &self.socket_path {
+ let _ = unlink(socket_path);
+ }
}
}
diff --git a/src/main.rs b/src/main.rs
index 51ff0a5e..772c3a5f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -181,11 +181,12 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
event_loop.get_signal(),
display,
false,
+ true,
)
.unwrap();
// Set WAYLAND_DISPLAY for children.
- let socket_name = &state.niri.socket_name;
+ let socket_name = state.niri.socket_name.as_deref().unwrap();
env::set_var("WAYLAND_DISPLAY", socket_name);
info!(
"listening on Wayland socket: {}",
@@ -194,8 +195,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
// Set NIRI_SOCKET for children.
if let Some(ipc) = &state.niri.ipc_server {
- env::set_var(SOCKET_PATH_ENV, &ipc.socket_path);
- info!("IPC listening on: {}", ipc.socket_path.to_string_lossy());
+ let socket_path = ipc.socket_path.as_deref().unwrap();
+ env::set_var(SOCKET_PATH_ENV, socket_path);
+ info!("IPC listening on: {}", socket_path.to_string_lossy());
}
if cli.session {
diff --git a/src/niri.rs b/src/niri.rs
index b35e0773..64d5f30c 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -181,7 +181,11 @@ pub struct Niri {
pub scheduler: Scheduler<()>,
pub stop_signal: LoopSignal,
pub display_handle: DisplayHandle,
- pub socket_name: OsString,
+
+ /// Name of the Wayland socket.
+ ///
+ /// This is `None` when creating `Niri` without a Wayland socket.
+ pub socket_name: Option<OsString>,
pub start_time: Instant,
@@ -550,6 +554,7 @@ impl State {
stop_signal: LoopSignal,
display: Display<State>,
headless: bool,
+ create_wayland_socket: bool,
) -> Result<Self, Box<dyn std::error::Error>> {
let _span = tracy_client::span!("State::new");
@@ -571,7 +576,14 @@ impl State {
Backend::Tty(tty)
};
- let mut niri = Niri::new(config.clone(), event_loop, stop_signal, display, &backend);
+ let mut niri = Niri::new(
+ config.clone(),
+ event_loop,
+ stop_signal,
+ display,
+ &backend,
+ create_wayland_socket,
+ );
backend.init(&mut niri);
let mut state = Self { backend, niri };
@@ -1743,6 +1755,7 @@ impl Niri {
stop_signal: LoopSignal,
display: Display<State>,
backend: &Backend,
+ create_wayland_socket: bool,
) -> Self {
let _span = tracy_client::span!("Niri::new");
@@ -1929,19 +1942,22 @@ impl Niri {
)
.unwrap();
- let socket_source = ListeningSocketSource::new_auto().unwrap();
- let socket_name = socket_source.socket_name().to_os_string();
- event_loop
- .insert_source(socket_source, move |client, _, state| {
- state.niri.insert_client(NewClient {
- client,
- restricted: false,
- credentials_unknown: false,
- });
- })
- .unwrap();
+ let socket_name = create_wayland_socket.then(|| {
+ let socket_source = ListeningSocketSource::new_auto().unwrap();
+ let socket_name = socket_source.socket_name().to_os_string();
+ event_loop
+ .insert_source(socket_source, move |client, _, state| {
+ state.niri.insert_client(NewClient {
+ client,
+ restricted: false,
+ credentials_unknown: false,
+ });
+ })
+ .unwrap();
+ socket_name
+ });
- let ipc_server = match IpcServer::start(&event_loop, &socket_name.to_string_lossy()) {
+ let ipc_server = match IpcServer::start(&event_loop, socket_name.as_deref()) {
Ok(server) => Some(server),
Err(err) => {
warn!("error starting IPC server: {err:?}");
diff --git a/src/tests/server.rs b/src/tests/server.rs
index 7f6403a4..ea1f913b 100644
--- a/src/tests/server.rs
+++ b/src/tests/server.rs
@@ -22,6 +22,7 @@ impl Server {
event_loop.get_signal(),
display,
true,
+ false,
)
.unwrap();