diff options
author | 2020-05-26 08:41:47 +0000 | |
---|---|---|
committer | 2020-05-26 08:41:47 +0000 | |
commit | 54e3eca9da8ca4225bb1894ace92a4bec4a80804 (patch) | |
tree | 79c95b4e1a66020a3754bcaff5f81a408f9627d3 /usr.bin/tmux/server-client.c | |
parent | Use C99 initializers in 'struct filterops' definitions. (diff) | |
download | wireguard-openbsd-54e3eca9da8ca4225bb1894ace92a4bec4a80804.tar.xz wireguard-openbsd-54e3eca9da8ca4225bb1894ace92a4bec4a80804.zip |
Pass the stdout file descriptor from the client as well as stdin and use
them for control clients directly instead of passing everything via the
client.
Diffstat (limited to 'usr.bin/tmux/server-client.c')
-rw-r--r-- | usr.bin/tmux/server-client.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c index 8698954cdac..3631342be6e 100644 --- a/usr.bin/tmux/server-client.c +++ b/usr.bin/tmux/server-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-client.c,v 1.350 2020/05/24 14:45:00 nicm Exp $ */ +/* $OpenBSD: server-client.c,v 1.351 2020/05/26 08:41:47 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com> @@ -223,7 +223,7 @@ server_client_create(int fd) c->environ = environ_create(); c->fd = -1; - c->cwd = NULL; + c->out_fd = -1; c->queue = cmdq_new(); RB_INIT(&c->windows); @@ -338,6 +338,8 @@ server_client_lost(struct client *c) proc_remove_peer(c->peer); c->peer = NULL; + if (c->out_fd != -1) + close(c->out_fd); if (c->fd != -1) { close(c->fd); c->fd = -1; @@ -1573,10 +1575,9 @@ server_client_check_pane_buffer(struct window_pane *wp) out: /* * If there is data remaining, and there are no clients able to consume - * it, do not read any more. This is true when 1) there are attached - * clients 2) all the clients are control clients 3) all of them have - * either the OFF flag set, or are otherwise not able to accept any - * more data for this pane. + * it, do not read any more. This is true when there are attached + * clients, all of which are control clients which are not able to + * accept any more data. */ if (off) bufferevent_disable(wp->event, EV_READ); @@ -1969,6 +1970,7 @@ server_client_dispatch(struct imsg *imsg, void *arg) case MSG_IDENTIFY_TTYNAME: case MSG_IDENTIFY_CWD: case MSG_IDENTIFY_STDIN: + case MSG_IDENTIFY_STDOUT: case MSG_IDENTIFY_ENVIRON: case MSG_IDENTIFY_CLIENTPID: case MSG_IDENTIFY_DONE: @@ -2179,6 +2181,12 @@ server_client_dispatch_identify(struct client *c, struct imsg *imsg) c->fd = imsg->fd; log_debug("client %p IDENTIFY_STDIN %d", c, imsg->fd); break; + case MSG_IDENTIFY_STDOUT: + if (datalen != 0) + fatalx("bad MSG_IDENTIFY_STDOUT size"); + c->out_fd = imsg->fd; + log_debug("client %p IDENTIFY_STDOUT %d", c, imsg->fd); + break; case MSG_IDENTIFY_ENVIRON: if (datalen == 0 || data[datalen - 1] != '\0') fatalx("bad MSG_IDENTIFY_ENVIRON string"); @@ -2207,11 +2215,9 @@ server_client_dispatch_identify(struct client *c, struct imsg *imsg) c->name = name; log_debug("client %p name is %s", c, c->name); - if (c->flags & CLIENT_CONTROL) { - close(c->fd); - c->fd = -1; + if (c->flags & CLIENT_CONTROL) control_start(c); - } else if (c->fd != -1) { + else if (c->fd != -1) { if (tty_init(&c->tty, c) != 0) { close(c->fd); c->fd = -1; @@ -2219,6 +2225,8 @@ server_client_dispatch_identify(struct client *c, struct imsg *imsg) tty_resize(&c->tty); c->flags |= CLIENT_TERMINAL; } + close(c->out_fd); + c->out_fd = -1; } /* @@ -2335,7 +2343,8 @@ void server_client_set_flags(struct client *c, const char *flags) { char *s, *copy, *next; - int flag, not; + uint64_t flag; + int not; s = copy = xstrdup (flags); while ((next = strsep(&s, ",")) != NULL) { |