=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/client.c,v retrieving revision 1.114 retrieving revision 1.115 diff -u -r1.114 -r1.115 --- src/usr.bin/tmux/client.c 2016/10/03 22:52:11 1.114 +++ src/usr.bin/tmux/client.c 2017/01/13 10:12:12 1.115 @@ -1,4 +1,4 @@ -/* $OpenBSD: client.c,v 1.114 2016/10/03 22:52:11 nicm Exp $ */ +/* $OpenBSD: client.c,v 1.115 2017/01/13 10:12:12 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -51,6 +51,8 @@ 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 @@ /* 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) @@ -653,6 +663,16 @@ client_exitreason = CLIENT_EXIT_DETACHED_HUP; else 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: