diff options
Diffstat (limited to 'client.c')
-rw-r--r-- | client.c | 20 |
1 files changed, 20 insertions, 0 deletions
@@ -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"); |