summaryrefslogtreecommitdiff
path: root/usr.bin/tmux
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2010-07-28 22:15:16 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2010-07-28 22:15:16 +0000
commit3e8fb44970dc49d57ba805e4d04327565931d385 (patch)
treee493bba2ff9d841ba231a77872accf3a9c5d0313 /usr.bin/tmux
parent3903ec1f48bbae92c39629cac0911966d41de3bb (diff)
dup() the stdin fd so it isn't closed twice (once for stdin, once for tty).
Diffstat (limited to 'usr.bin/tmux')
-rw-r--r--usr.bin/tmux/server-client.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c
index 2da6ca7ac48..72cf9a1239a 100644
--- a/usr.bin/tmux/server-client.c
+++ b/usr.bin/tmux/server-client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server-client.c,v 1.36 2010/07/24 20:11:59 nicm Exp $ */
+/* $OpenBSD: server-client.c,v 1.37 2010/07/28 22:15:15 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -648,9 +648,11 @@ server_client_msg_dispatch(struct client *c)
fatalx("MSG_IDENTIFY missing fd");
memcpy(&identifydata, imsg.data, sizeof identifydata);
- c->stdin_fd = imsg.fd;
- c->stdin_event = bufferevent_new(imsg.fd, NULL, NULL,
- server_client_in_callback, c);
+ c->stdin_fd = dup(imsg.fd);
+ if (c->stdin_fd == -1)
+ fatal("dup failed");
+ c->stdin_event = bufferevent_new(c->stdin_fd,
+ NULL, NULL, server_client_in_callback, c);
if (c->stdin_event == NULL)
fatalx("failed to create stdin event");
@@ -668,14 +670,14 @@ server_client_msg_dispatch(struct client *c)
fatalx("MSG_STDOUT missing fd");
c->stdout_fd = imsg.fd;
- c->stdout_event = bufferevent_new(imsg.fd, NULL, NULL,
- server_client_out_callback, c);
+ c->stdout_event = bufferevent_new(c->stdout_fd,
+ NULL, NULL, server_client_out_callback, c);
if (c->stdout_event == NULL)
fatalx("failed to create stdout event");
- if ((mode = fcntl(imsg.fd, F_GETFL)) != -1)
- fcntl(imsg.fd, F_SETFL, mode|O_NONBLOCK);
- if (fcntl(imsg.fd, F_SETFD, FD_CLOEXEC) == -1)
+ if ((mode = fcntl(c->stdout_fd, F_GETFL)) != -1)
+ fcntl(c->stdout_fd, F_SETFL, mode|O_NONBLOCK);
+ if (fcntl(c->stdout_fd, F_SETFD, FD_CLOEXEC) == -1)
fatal("fcntl failed");
break;
case MSG_STDERR:
@@ -685,14 +687,14 @@ server_client_msg_dispatch(struct client *c)
fatalx("MSG_STDERR missing fd");
c->stderr_fd = imsg.fd;
- c->stderr_event = bufferevent_new(imsg.fd, NULL, NULL,
- server_client_err_callback, c);
+ c->stderr_event = bufferevent_new(c->stderr_fd,
+ NULL, NULL, server_client_err_callback, c);
if (c->stderr_event == NULL)
fatalx("failed to create stderr event");
- if ((mode = fcntl(imsg.fd, F_GETFL)) != -1)
- fcntl(imsg.fd, F_SETFL, mode|O_NONBLOCK);
- if (fcntl(imsg.fd, F_SETFD, FD_CLOEXEC) == -1)
+ if ((mode = fcntl(c->stderr_fd, F_GETFL)) != -1)
+ fcntl(c->stderr_fd, F_SETFL, mode|O_NONBLOCK);
+ if (fcntl(c->stderr_fd, F_SETFD, FD_CLOEXEC) == -1)
fatal("fcntl failed");
break;
case MSG_RESIZE: