mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	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.
This commit is contained in:
		@@ -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) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user