summaryrefslogtreecommitdiffstats
path: root/zellij-server/src/plugins/zellij_exports.rs
diff options
context:
space:
mode:
Diffstat (limited to 'zellij-server/src/plugins/zellij_exports.rs')
-rw-r--r--zellij-server/src/plugins/zellij_exports.rs41
1 files changed, 38 insertions, 3 deletions
diff --git a/zellij-server/src/plugins/zellij_exports.rs b/zellij-server/src/plugins/zellij_exports.rs
index 8791e128e..e6787c240 100644
--- a/zellij-server/src/plugins/zellij_exports.rs
+++ b/zellij-server/src/plugins/zellij_exports.rs
@@ -18,10 +18,14 @@ use std::{
use wasmer::{imports, AsStoreMut, Function, FunctionEnv, FunctionEnvMut, Imports};
use wasmer_wasi::WasiEnv;
use zellij_utils::data::{
- CommandType, ConnectToSession, HttpVerb, MessageToPlugin, PermissionStatus, PermissionType,
- PluginPermission,
+ CommandType, ConnectToSession, HttpVerb, LayoutInfo, MessageToPlugin, PermissionStatus,
+ PermissionType, PluginPermission,
};
use zellij_utils::input::permission::PermissionCache;
+use zellij_utils::{
+ interprocess::local_socket::LocalSocketStream,
+ ipc::{ClientToServerMsg, IpcSenderWithContext},
+};
use url::Url;
@@ -225,6 +229,7 @@ fn host_run_plugin_command(env: FunctionEnvMut<ForeignFunctionEnv>) {
connect_to_session.name,
connect_to_session.tab_position,
connect_to_session.pane_id,
+ connect_to_session.layout,
)?,
PluginCommand::DeleteDeadSession(session_name) => {
delete_dead_session(session_name)?
@@ -252,6 +257,8 @@ fn host_run_plugin_command(env: FunctionEnvMut<ForeignFunctionEnv>) {
cli_pipe_output(env, pipe_name, output)?
},
PluginCommand::MessageToPlugin(message) => message_to_plugin(env, message)?,
+ PluginCommand::DisconnectOtherClients => disconnect_other_clients(env),
+ PluginCommand::KillSessions(session_list) => kill_sessions(session_list),
},
(PermissionStatus::Denied, permission) => {
log::error!(
@@ -900,6 +907,7 @@ fn switch_session(
session_name: Option<String>,
tab_position: Option<usize>,
pane_id: Option<(u32, bool)>,
+ layout: Option<LayoutInfo>,
) -> Result<()> {
// pane_id is (id, is_plugin)
let err_context = || format!("Failed to switch session");
@@ -909,6 +917,7 @@ fn switch_session(
name: session_name,
tab_position,
pane_id,
+ layout,
};
env.plugin_env
.senders
@@ -1278,6 +1287,30 @@ fn rename_session(env: &ForeignFunctionEnv, new_session_name: String) {
apply_action!(action, error_msg, env);
}
+fn disconnect_other_clients(env: &ForeignFunctionEnv) {
+ let _ = env
+ .plugin_env
+ .senders
+ .send_to_server(ServerInstruction::DisconnectAllClientsExcept(
+ env.plugin_env.client_id,
+ ))
+ .context("failed to send disconnect other clients instruction");
+}
+
+fn kill_sessions(session_names: Vec<String>) {
+ for session_name in session_names {
+ let path = &*ZELLIJ_SOCK_DIR.join(&session_name);
+ match LocalSocketStream::connect(path) {
+ Ok(stream) => {
+ let _ = IpcSenderWithContext::new(stream).send(ClientToServerMsg::KillSession);
+ },
+ Err(e) => {
+ log::error!("Failed to kill session {}: {:?}", session_name, e);
+ },
+ };
+ }
+}
+
// Custom panic handler for plugins.
//
// This is called when a panic occurs in a plugin. Since most panics will likely originate in the
@@ -1406,7 +1439,9 @@ fn check_command_permission(
| PluginCommand::DeleteDeadSession(..)
| PluginCommand::DeleteAllDeadSessions
| PluginCommand::RenameSession(..)
- | PluginCommand::RenameTab(..) => PermissionType::ChangeApplicationState,
+ | PluginCommand::RenameTab(..)
+ | PluginCommand::DisconnectOtherClients
+ | PluginCommand::KillSessions(..) => PermissionType::ChangeApplicationState,
PluginCommand::UnblockCliPipeInput(..)
| PluginCommand::BlockCliPipeInput(..)
| PluginCommand::CliPipeOutput(..) => PermissionType::ReadCliPipes,