diff options
| author | sodiboo <37938646+sodiboo@users.noreply.github.com> | 2024-04-19 15:02:32 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-19 13:02:32 +0000 |
| commit | b5f7e4bd83dbfc77e0c8b973bc217c9a4cb3f364 (patch) | |
| tree | dbe59c9a19f2e7d94086e9fbb1c28a43e062e16b /src/ipc/server.rs | |
| parent | b98b95883def5cd726c1e96a006f9cd7498d1730 (diff) | |
| download | niri-b5f7e4bd83dbfc77e0c8b973bc217c9a4cb3f364.tar.gz niri-b5f7e4bd83dbfc77e0c8b973bc217c9a4cb3f364.tar.bz2 niri-b5f7e4bd83dbfc77e0c8b973bc217c9a4cb3f364.zip | |
`niri_ipc::Socket`; `niri msg version`; version checking on IPC (#278)
* Implement version checking in IPC
implement version checking; streamed IPC
streamed IPC will allow multiple requests per connection
add nonsense request
change inline struct to json macro
only check version if request actually fails
fix usage of inspect_err (MSRV 1.72.0; stabilized 1.76.0)
"nonsense request" -> "return error"
oneshot connections
* Change some things around
* Unqualify niri_ipc::Transform
---------
Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com>
Diffstat (limited to 'src/ipc/server.rs')
| -rw-r--r-- | src/ipc/server.rs | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/src/ipc/server.rs b/src/ipc/server.rs index 528da716..5e18c16a 100644 --- a/src/ipc/server.rs +++ b/src/ipc/server.rs @@ -8,7 +8,7 @@ use calloop::io::Async; use directories::BaseDirs; use futures_util::io::{AsyncReadExt, BufReader}; use futures_util::{AsyncBufReadExt, AsyncWriteExt}; -use niri_ipc::{Request, Response}; +use niri_ipc::{Reply, Request, Response}; use smithay::desktop::Window; use smithay::reexports::calloop::generic::Generic; use smithay::reexports::calloop::{Interest, LoopHandle, Mode, PostAction}; @@ -18,6 +18,7 @@ use smithay::wayland::shell::xdg::XdgToplevelSurfaceData; use crate::backend::IpcOutputMap; use crate::niri::State; +use crate::utils::version; pub struct IpcServer { pub socket_path: PathBuf, @@ -114,10 +115,18 @@ async fn handle_client(ctx: ClientCtx, stream: Async<'_, UnixStream>) -> anyhow: .await .context("error reading request")?; - let reply = process(&ctx, &buf).map_err(|err| { - warn!("error processing IPC request: {err:?}"); - err.to_string() - }); + let request = serde_json::from_str(&buf) + .context("error parsing request") + .map_err(|err| err.to_string()); + let requested_error = matches!(request, Ok(Request::ReturnError)); + + let reply = request.and_then(|request| process(&ctx, request)); + + if let Err(err) = &reply { + if !requested_error { + warn!("error processing IPC request: {err:?}"); + } + } let buf = serde_json::to_vec(&reply).context("error formatting reply")?; write.write_all(&buf).await.context("error writing reply")?; @@ -125,10 +134,10 @@ async fn handle_client(ctx: ClientCtx, stream: Async<'_, UnixStream>) -> anyhow: Ok(()) } -fn process(ctx: &ClientCtx, buf: &str) -> anyhow::Result<Response> { - let request: Request = serde_json::from_str(buf).context("error parsing request")?; - +fn process(ctx: &ClientCtx, request: Request) -> Reply { let response = match request { + Request::ReturnError => return Err(String::from("example compositor error")), + Request::Version => Response::Version(version()), Request::Outputs => { let ipc_outputs = ctx.ipc_outputs.lock().unwrap().clone(); Response::Outputs(ipc_outputs) |
