mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Push stdout and stderr to clients more aggressively, and add an event to
continue if the send fails.
This commit is contained in:
		
							
								
								
									
										44
									
								
								server-fn.c
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								server-fn.c
									
									
									
									
									
								
							@@ -450,50 +450,6 @@ server_callback_identify(unused int fd, unused short events, void *data)
 | 
			
		||||
	server_clear_identify(c);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Push stdout to client if possible. */
 | 
			
		||||
void
 | 
			
		||||
server_push_stdout(struct client *c)
 | 
			
		||||
{
 | 
			
		||||
	struct msg_stdout_data data;
 | 
			
		||||
	size_t                 size;
 | 
			
		||||
 | 
			
		||||
	size = EVBUFFER_LENGTH(c->stdout_data);
 | 
			
		||||
	if (size == 0)
 | 
			
		||||
		return;
 | 
			
		||||
	if (size > sizeof data.data)
 | 
			
		||||
		size = sizeof data.data;
 | 
			
		||||
 | 
			
		||||
	memcpy(data.data, EVBUFFER_DATA(c->stdout_data), size);
 | 
			
		||||
	data.size = size;
 | 
			
		||||
 | 
			
		||||
	if (proc_send(c->peer, MSG_STDOUT, -1, &data, sizeof data) == 0)
 | 
			
		||||
		evbuffer_drain(c->stdout_data, size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Push stderr to client if possible. */
 | 
			
		||||
void
 | 
			
		||||
server_push_stderr(struct client *c)
 | 
			
		||||
{
 | 
			
		||||
	struct msg_stderr_data data;
 | 
			
		||||
	size_t                 size;
 | 
			
		||||
 | 
			
		||||
	if (c->stderr_data == c->stdout_data) {
 | 
			
		||||
		server_push_stdout(c);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	size = EVBUFFER_LENGTH(c->stderr_data);
 | 
			
		||||
	if (size == 0)
 | 
			
		||||
		return;
 | 
			
		||||
	if (size > sizeof data.data)
 | 
			
		||||
		size = sizeof data.data;
 | 
			
		||||
 | 
			
		||||
	memcpy(data.data, EVBUFFER_DATA(c->stderr_data), size);
 | 
			
		||||
	data.size = size;
 | 
			
		||||
 | 
			
		||||
	if (proc_send(c->peer, MSG_STDERR, -1, &data, sizeof data) == 0)
 | 
			
		||||
		evbuffer_drain(c->stderr_data, size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Set stdin callback. */
 | 
			
		||||
int
 | 
			
		||||
server_set_stdin_callback(struct client *c, void (*cb)(struct client *, int,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user