aboutsummaryrefslogtreecommitdiff
path: root/src/ipc/server.rs
diff options
context:
space:
mode:
authorsodiboo <37938646+sodiboo@users.noreply.github.com>2024-04-19 15:02:32 +0200
committerGitHub <noreply@github.com>2024-04-19 13:02:32 +0000
commitb5f7e4bd83dbfc77e0c8b973bc217c9a4cb3f364 (patch)
treedbe59c9a19f2e7d94086e9fbb1c28a43e062e16b /src/ipc/server.rs
parentb98b95883def5cd726c1e96a006f9cd7498d1730 (diff)
downloadniri-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.rs25
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)