mirror of
https://github.com/tmate-io/tmate.git
synced 2025-08-09 21:57:37 +02:00
Sync OpenBSD patchset 834:
Move all calls to fcntl(...O_NONBLOCK) into a function and clear the flag on the stdio file descriptors before closing them (fixes things like "tmux ls && cat").
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
/* $Id: server-client.c,v 1.51 2011-01-07 14:34:45 tcunha Exp $ */
|
||||
/* $Id: server-client.c,v 1.52 2011-01-21 23:44:13 tcunha Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||
@ -52,13 +52,9 @@ void
|
||||
server_client_create(int fd)
|
||||
{
|
||||
struct client *c;
|
||||
int mode;
|
||||
u_int i;
|
||||
|
||||
if ((mode = fcntl(fd, F_GETFL)) == -1)
|
||||
fatal("fcntl failed");
|
||||
if (fcntl(fd, F_SETFL, mode|O_NONBLOCK) == -1)
|
||||
fatal("fcntl failed");
|
||||
setblocking(fd, 0);
|
||||
|
||||
c = xcalloc(1, sizeof *c);
|
||||
c->references = 0;
|
||||
@ -123,16 +119,22 @@ server_client_lost(struct client *c)
|
||||
if (c->flags & CLIENT_TERMINAL)
|
||||
tty_free(&c->tty);
|
||||
|
||||
if (c->stdin_fd != -1)
|
||||
if (c->stdin_fd != -1) {
|
||||
setblocking(c->stdin_fd, 1);
|
||||
close(c->stdin_fd);
|
||||
}
|
||||
if (c->stdin_event != NULL)
|
||||
bufferevent_free(c->stdin_event);
|
||||
if (c->stdout_fd != -1)
|
||||
if (c->stdout_fd != -1) {
|
||||
setblocking(c->stdout_fd, 1);
|
||||
close(c->stdout_fd);
|
||||
}
|
||||
if (c->stdout_event != NULL)
|
||||
bufferevent_free(c->stdout_event);
|
||||
if (c->stderr_fd != -1)
|
||||
if (c->stderr_fd != -1) {
|
||||
setblocking(c->stderr_fd, 1);
|
||||
close(c->stderr_fd);
|
||||
}
|
||||
if (c->stderr_event != NULL)
|
||||
bufferevent_free(c->stderr_event);
|
||||
|
||||
@ -631,6 +633,7 @@ server_client_in_callback(
|
||||
return;
|
||||
|
||||
bufferevent_disable(c->stdin_event, EV_READ|EV_WRITE);
|
||||
setblocking(c->stdin_fd, 1);
|
||||
close(c->stdin_fd);
|
||||
c->stdin_fd = -1;
|
||||
|
||||
@ -646,6 +649,7 @@ server_client_out_callback(
|
||||
struct client *c = data;
|
||||
|
||||
bufferevent_disable(c->stdout_event, EV_READ|EV_WRITE);
|
||||
setblocking(c->stdout_fd, 1);
|
||||
close(c->stdout_fd);
|
||||
c->stdout_fd = -1;
|
||||
}
|
||||
@ -658,6 +662,7 @@ server_client_err_callback(
|
||||
struct client *c = data;
|
||||
|
||||
bufferevent_disable(c->stderr_event, EV_READ|EV_WRITE);
|
||||
setblocking(c->stderr_fd, 1);
|
||||
close(c->stderr_fd);
|
||||
c->stderr_fd = -1;
|
||||
}
|
||||
@ -671,7 +676,6 @@ server_client_msg_dispatch(struct client *c)
|
||||
struct msg_identify_data identifydata;
|
||||
struct msg_environ_data environdata;
|
||||
ssize_t n, datalen;
|
||||
int mode;
|
||||
|
||||
if ((n = imsg_read(&c->ibuf)) == -1 || n == 0)
|
||||
return (-1);
|
||||
@ -711,9 +715,7 @@ server_client_msg_dispatch(struct client *c)
|
||||
NULL, NULL, server_client_in_callback, c);
|
||||
if (c->stdin_event == NULL)
|
||||
fatalx("failed to create stdin event");
|
||||
|
||||
if ((mode = fcntl(c->stdin_fd, F_GETFL)) != -1)
|
||||
fcntl(c->stdin_fd, F_SETFL, mode|O_NONBLOCK);
|
||||
setblocking(c->stdin_fd, 0);
|
||||
|
||||
server_client_msg_identify(c, &identifydata, imsg.fd);
|
||||
break;
|
||||
@ -728,9 +730,8 @@ server_client_msg_dispatch(struct client *c)
|
||||
NULL, NULL, server_client_out_callback, c);
|
||||
if (c->stdout_event == NULL)
|
||||
fatalx("failed to create stdout event");
|
||||
setblocking(c->stdout_fd, 0);
|
||||
|
||||
if ((mode = fcntl(c->stdout_fd, F_GETFL)) != -1)
|
||||
fcntl(c->stdout_fd, F_SETFL, mode|O_NONBLOCK);
|
||||
break;
|
||||
case MSG_STDERR:
|
||||
if (datalen != 0)
|
||||
@ -743,9 +744,8 @@ server_client_msg_dispatch(struct client *c)
|
||||
NULL, NULL, server_client_err_callback, c);
|
||||
if (c->stderr_event == NULL)
|
||||
fatalx("failed to create stderr event");
|
||||
setblocking(c->stderr_fd, 0);
|
||||
|
||||
if ((mode = fcntl(c->stderr_fd, F_GETFL)) != -1)
|
||||
fcntl(c->stderr_fd, F_SETFL, mode|O_NONBLOCK);
|
||||
break;
|
||||
case MSG_RESIZE:
|
||||
if (datalen != 0)
|
||||
|
Reference in New Issue
Block a user