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:
Tiago Cunha
2011-01-21 23:44:13 +00:00
parent 6b19621112
commit 492e3aa437
9 changed files with 55 additions and 66 deletions

View File

@ -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)