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:
Nicholas Marriott
2011-01-08 01:52:36 +00:00
parent 703160b5d6
commit 69cb1f830e
9 changed files with 46 additions and 57 deletions

View File

@ -53,13 +53,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;
@ -124,16 +120,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);
@ -632,6 +634,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;
@ -647,6 +650,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;
}
@ -659,6 +663,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;
}
@ -672,7 +677,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);
@ -712,9 +716,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;
@ -729,9 +731,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)
@ -744,9 +745,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)