aboutsummaryrefslogtreecommitdiff
path: root/server-client.c
diff options
context:
space:
mode:
Diffstat (limited to 'server-client.c')
-rw-r--r--server-client.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/server-client.c b/server-client.c
index 6092a234..e690e6ce 100644
--- a/server-client.c
+++ b/server-client.c
@@ -296,6 +296,32 @@ server_client_detach(struct client *c, enum msgtype msgtype)
proc_send_s(c->peer, msgtype, s->name);
}
+/* Execute command to replace a client, */
+void
+server_client_exec(struct client *c, const char *cmd)
+{
+ struct session *s = c->session;
+ char *msg, *shell;
+ size_t cmdsize, shellsize;
+
+ if (*cmd == '\0')
+ return;
+ cmdsize = strlen(cmd) + 1;
+
+ if (s != NULL)
+ shell = options_get_string(s->options, "default-shell");
+ else
+ shell = options_get_string(global_s_options, "default-shell");
+ shellsize = strlen(shell) + 1;
+
+ msg = xmalloc(cmdsize + shellsize);
+ memcpy(msg, cmd, cmdsize);
+ memcpy(msg + cmdsize, shell, shellsize);
+
+ proc_send(c->peer, MSG_EXEC, -1, msg, cmdsize + shellsize);
+ free(msg);
+}
+
/* Check for mouse keys. */
static key_code
server_client_check_mouse(struct client *c)