summaryrefslogtreecommitdiffstats
path: root/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 /client.c
parent24cba5907b5006363ac7f83f31801153f9c23b37 (diff)
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 'client.c')
-rw-r--r--client.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/client.c b/client.c
index 4d00f39b..551a01b2 100644
--- a/client.c
+++ b/client.c
@@ -51,6 +51,8 @@ static enum {
static int client_exitval;
static enum msgtype client_exittype;
static const char *client_exitsession;
+static const char *client_execshell;
+static const char *client_execcmd;
static int client_attached;
static __dead void client_exec(const char *,const char *);
@@ -358,6 +360,14 @@ client_main(struct event_base *base, int argc, char **argv, int flags,
/* Start main loop. */
proc_loop(client_proc, NULL);
+ /* Run command if user requested exec, instead of exiting. */
+ if (client_exittype == MSG_EXEC) {
+ if (client_flags & CLIENT_CONTROLCONTROL)
+ tcsetattr(STDOUT_FILENO, TCSAFLUSH, &saved_tio);
+ clear_signals(0);
+ client_exec(client_execshell, client_execcmd);
+ }
+
/* Print the exit message, if any, and exit. */
if (client_attached) {
if (client_exitreason != CLIENT_EXIT_NONE)
@@ -655,6 +665,16 @@ client_dispatch_attached(struct imsg *imsg)
client_exitreason = CLIENT_EXIT_DETACHED;
proc_send(client_peer, MSG_EXITING, -1, NULL, 0);
break;
+ case MSG_EXEC:
+ if (datalen == 0 || data[datalen - 1] != '\0' ||
+ strlen(data) + 1 == (size_t)datalen)
+ fatalx("bad MSG_EXEC string");
+ client_execcmd = xstrdup(data);
+ client_execshell = xstrdup(data + strlen(data) + 1);
+
+ client_exittype = imsg->hdr.type;
+ proc_send(client_peer, MSG_EXITING, -1, NULL, 0);
+ break;
case MSG_EXIT:
if (datalen != 0 && datalen != sizeof (int))
fatalx("bad MSG_EXIT size");