diff --git a/client.c b/client.c
index 73c3358c..fe7a7e54 100644
--- a/client.c
+++ b/client.c
@@ -1,4 +1,4 @@
-/* $Id: client.c,v 1.100 2010-10-24 19:54:41 nicm Exp $ */
+/* $Id: client.c,v 1.101 2011-01-21 23:44:13 tcunha Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -54,7 +54,7 @@ client_connect(char *path, int start_server)
 {
 	struct sockaddr_un	sa;
 	size_t			size;
-	int			fd, mode;
+	int			fd;
 
 	memset(&sa, 0, sizeof sa);
 	sa.sun_family = AF_UNIX;
@@ -84,10 +84,7 @@ client_connect(char *path, int start_server)
 		}
 	}
 
-	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);
 	return (fd);
 
 failed:
diff --git a/cmd-pipe-pane.c b/cmd-pipe-pane.c
index 671902c5..dcaa34ac 100644
--- a/cmd-pipe-pane.c
+++ b/cmd-pipe-pane.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-pipe-pane.c,v 1.16 2011-01-07 14:45:34 tcunha Exp $ */
+/* $Id: cmd-pipe-pane.c,v 1.17 2011-01-21 23:44:13 tcunha Exp $ */
 
 /*
  * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -52,7 +52,7 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
 	struct client		*c;
 	struct window_pane	*wp;
 	char			*command;
-	int			 old_fd, pipe_fd[2], null_fd, mode;
+	int			 old_fd, pipe_fd[2], null_fd;
 
 	if ((c = cmd_find_client(ctx, NULL)) == NULL)
 		return (-1);
@@ -126,10 +126,7 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
 		    NULL, NULL, cmd_pipe_pane_error_callback, wp);
 		bufferevent_enable(wp->pipe_event, EV_WRITE);
 
-		if ((mode = fcntl(wp->pipe_fd, F_GETFL)) == -1)
-			fatal("fcntl failed");
-		if (fcntl(wp->pipe_fd, F_SETFL, mode|O_NONBLOCK) == -1)
-			fatal("fcntl failed");
+		setblocking(wp->pipe_fd, 0);
 		return (0);
 	}
 }
diff --git a/job.c b/job.c
index d22df99a..e2605b65 100644
--- a/job.c
+++ b/job.c
@@ -1,4 +1,4 @@
-/* $Id: job.c,v 1.19 2010-10-24 00:45:57 tcunha Exp $ */
+/* $Id: job.c,v 1.20 2011-01-21 23:44:13 tcunha Exp $ */
 
 /*
  * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -136,7 +136,7 @@ job_free(struct job *job)
 int
 job_run(struct job *job)
 {
-	int	nullfd, out[2], mode;
+	int	nullfd, out[2];
 
 	if (job->fd != -1 || job->pid != -1)
 		return (0);
@@ -176,10 +176,7 @@ job_run(struct job *job)
 		close(out[1]);
 
 		job->fd = out[0];
-		if ((mode = fcntl(job->fd, F_GETFL)) == -1)
-			fatal("fcntl failed");
-		if (fcntl(job->fd, F_SETFL, mode|O_NONBLOCK) == -1)
-			fatal("fcntl failed");
+		setblocking(job->fd, 0);
 
 		if (job->event != NULL)
 			bufferevent_free(job->event);
diff --git a/server-client.c b/server-client.c
index d7d90969..a69d3b23 100644
--- a/server-client.c
+++ b/server-client.c
@@ -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)
diff --git a/server.c b/server.c
index 6095bdd3..8514fbb7 100644
--- a/server.c
+++ b/server.c
@@ -1,4 +1,4 @@
-/* $Id: server.c,v 1.251 2011-01-03 23:27:54 tcunha Exp $ */
+/* $Id: server.c,v 1.252 2011-01-21 23:44:13 tcunha Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -73,7 +73,7 @@ server_create_socket(void)
 	struct sockaddr_un	sa;
 	size_t			size;
 	mode_t			mask;
-	int			fd, mode;
+	int			fd;
 
 	memset(&sa, 0, sizeof sa);
 	sa.sun_family = AF_UNIX;
@@ -94,11 +94,7 @@ server_create_socket(void)
 
 	if (listen(fd, 16) == -1)
 		fatal("listen failed");
-
-	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);
 
 	server_update_socket();
 
diff --git a/tmux.c b/tmux.c
index ca6956ff..83b213d2 100644
--- a/tmux.c
+++ b/tmux.c
@@ -1,4 +1,4 @@
-/* $Id: tmux.c,v 1.233 2011-01-07 14:34:45 tcunha Exp $ */
+/* $Id: tmux.c,v 1.234 2011-01-21 23:44:13 tcunha Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -197,12 +197,25 @@ makesocketpath(const char *label)
 	return (path);
 }
 
+void
+setblocking(int fd, int state)
+{
+	int mode;
+
+	if ((mode = fcntl(fd, F_GETFL)) != -1) {
+		if (!state)
+			mode |= O_NONBLOCK;
+		else
+			mode &= ~O_NONBLOCK;
+		fcntl(fd, F_SETFL, mode);
+	}
+}
+
 __dead void
 shell_exec(const char *shell, const char *shellcmd)
 {
 	const char	*shellname, *ptr;
 	char		*argv0;
-	int		 mode;
 
 	ptr = strrchr(shell, '/');
 	if (ptr != NULL && *(ptr + 1) != '\0')
@@ -215,12 +228,9 @@ shell_exec(const char *shell, const char *shellcmd)
 		xasprintf(&argv0, "%s", shellname);
 	setenv("SHELL", shell, 1);
 
-	if ((mode = fcntl(STDIN_FILENO, F_GETFL)) != -1)
-		fcntl(STDIN_FILENO, F_SETFL, mode & ~O_NONBLOCK);
-	if ((mode = fcntl(STDOUT_FILENO, F_GETFL)) != -1)
-		fcntl(STDOUT_FILENO, F_SETFL, mode & ~O_NONBLOCK);
-	if ((mode = fcntl(STDERR_FILENO, F_GETFL)) != -1)
-		fcntl(STDERR_FILENO, F_SETFL, mode & ~O_NONBLOCK);
+	setblocking(STDIN_FILENO, 1);
+	setblocking(STDOUT_FILENO, 1);
+	setblocking(STDERR_FILENO, 1);
 	closefrom(STDERR_FILENO + 1);
 
 	execl(shell, argv0, "-c", shellcmd, (char *) NULL);
diff --git a/tmux.h b/tmux.h
index 63790eb3..8238fcc1 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1,4 +1,4 @@
-/* $Id: tmux.h,v 1.603 2011-01-07 16:55:40 tcunha Exp $ */
+/* $Id: tmux.h,v 1.604 2011-01-21 23:44:13 tcunha Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -1304,6 +1304,7 @@ void		 logfile(const char *);
 const char	*getshell(void);
 int		 checkshell(const char *);
 int		 areshell(const char *);
+void		 setblocking(int, int);
 __dead void	 shell_exec(const char *, const char *);
 
 /* cfg.c */
diff --git a/tty.c b/tty.c
index 935ffd9c..a45a6099 100644
--- a/tty.c
+++ b/tty.c
@@ -1,4 +1,4 @@
-/* $Id: tty.c,v 1.199 2011-01-07 14:34:45 tcunha Exp $ */
+/* $Id: tty.c,v 1.200 2011-01-21 23:44:13 tcunha Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -165,15 +165,11 @@ void
 tty_start_tty(struct tty *tty)
 {
 	struct termios	 tio;
-	int		 mode;
 
 	if (tty->fd == -1)
 		return;
 
-	if ((mode = fcntl(tty->fd, F_GETFL)) == -1)
-		fatal("fcntl failed");
-	if (fcntl(tty->fd, F_SETFL, mode|O_NONBLOCK) == -1)
-		fatal("fcntl failed");
+	setblocking(tty->fd, 0);
 
 	bufferevent_enable(tty->event, EV_READ|EV_WRITE);
 
@@ -220,7 +216,6 @@ void
 tty_stop_tty(struct tty *tty)
 {
 	struct winsize	ws;
-	int		mode;
 
 	if (!(tty->flags & TTY_STARTED))
 		return;
@@ -251,8 +246,7 @@ tty_stop_tty(struct tty *tty)
 
 	tty_raw(tty, tty_term_string(tty->term, TTYC_RMCUP));
 
-	if ((mode = fcntl(tty->fd, F_GETFL)) != -1)
-		fcntl(tty->fd, F_SETFL, mode & ~O_NONBLOCK);
+	setblocking(tty->fd, 1);
 }
 
 void
diff --git a/window.c b/window.c
index 0fdc1171..027635e6 100644
--- a/window.c
+++ b/window.c
@@ -1,4 +1,4 @@
-/* $Id: window.c,v 1.143 2011-01-07 16:55:40 tcunha Exp $ */
+/* $Id: window.c,v 1.144 2011-01-21 23:44:13 tcunha Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -560,7 +560,6 @@ window_pane_spawn(struct window_pane *wp, const char *cmd, const char *shell,
     const char *cwd, struct environ *env, struct termios *tio, char **cause)
 {
 	struct winsize	 ws;
-	int		 mode;
 	char		*argv0;
 	const char	*ptr;
 	struct termios	 tio2;
@@ -634,10 +633,8 @@ window_pane_spawn(struct window_pane *wp, const char *cmd, const char *shell,
 		fatal("execl failed");
 	}
 
-	if ((mode = fcntl(wp->fd, F_GETFL)) == -1)
-		fatal("fcntl failed");
-	if (fcntl(wp->fd, F_SETFL, mode|O_NONBLOCK) == -1)
-		fatal("fcntl failed");
+	setblocking(wp->fd, 0);
+
 	wp->event = bufferevent_new(wp->fd,
 	    window_pane_read_callback, NULL, window_pane_error_callback, wp);
 	bufferevent_enable(wp->event, EV_READ|EV_WRITE);