aboutsummaryrefslogtreecommitdiff
path: root/server-client.c
diff options
context:
space:
mode:
Diffstat (limited to 'server-client.c')
-rw-r--r--server-client.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/server-client.c b/server-client.c
index 5c8f4940..d4fa92dc 100644
--- a/server-client.c
+++ b/server-client.c
@@ -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) {