aboutsummaryrefslogtreecommitdiff
path: root/server-client.c
diff options
context:
space:
mode:
authornicm <nicm>2017-01-13 10:12:12 +0000
committernicm <nicm>2017-01-13 10:12:12 +0000
commit95950bf668cee5a80cd9bbe28d7134a52a240426 (patch)
tree37618ea72fabbd151d60519139e9d816124ca170 /server-client.c
parent24cba5907b5006363ac7f83f31801153f9c23b37 (diff)
downloadrtmux-95950bf668cee5a80cd9bbe28d7134a52a240426.tar.gz
rtmux-95950bf668cee5a80cd9bbe28d7134a52a240426.tar.bz2
rtmux-95950bf668cee5a80cd9bbe28d7134a52a240426.zip
Add -E to detach-client to exec a command to replace the client instead
of exiting it, useful if tmux wasn't exec'd itself. From Jenna Magius.
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)