mirror of
https://github.com/tmate-io/tmate.git
synced 2025-08-18 17:38:53 +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:
26
tmux.c
26
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);
|
||||
|
Reference in New Issue
Block a user