X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fptyfwd.c;h=d44d70bf9f47046245d0f7230fd9b7a6b8519df4;hp=85fc8f1b34f5c6770ad052d041e6d74e0f44dcd1;hb=638ca89c53e2b897cfb3f627f4acbc7d09af2f4c;hpb=e7d43b3cc30764138c90eaaf95d3d8f49e448890 diff --git a/src/shared/ptyfwd.c b/src/shared/ptyfwd.c index 85fc8f1b3..d44d70bf9 100644 --- a/src/shared/ptyfwd.c +++ b/src/shared/ptyfwd.c @@ -78,9 +78,9 @@ static int process_pty_loop(int master, sigset_t *mask, pid_t kill_pid, int sign assert(kill_pid == 0 || kill_pid > 1); assert(signo >= 0 && signo < _NSIG); - fd_nonblock(STDIN_FILENO, 1); - fd_nonblock(STDOUT_FILENO, 1); - fd_nonblock(master, 1); + fd_nonblock(STDIN_FILENO, true); + fd_nonblock(STDOUT_FILENO, true); + fd_nonblock(master, true); signal_fd = signalfd(-1, mask, SFD_NONBLOCK|SFD_CLOEXEC); if (signal_fd < 0) { @@ -343,8 +343,8 @@ static int process_pty_loop(int master, sigset_t *mask, pid_t kill_pid, int sign int process_pty(int master, sigset_t *mask, pid_t kill_pid, int signo) { struct termios saved_stdin_attr, raw_stdin_attr; struct termios saved_stdout_attr, raw_stdout_attr; - struct termios master_attr; - bool saved_stdin = false, saved_stdout = false; + bool saved_stdin = false; + bool saved_stdout = false; struct winsize ws; int r; @@ -369,11 +369,6 @@ int process_pty(int master, sigset_t *mask, pid_t kill_pid, int signo) { tcsetattr(STDOUT_FILENO, TCSANOW, &raw_stdout_attr); } - if (tcgetattr(master, &master_attr) >= 0) { - cfmakeraw(&master_attr); - tcsetattr(master, TCSANOW, &master_attr); - } - r = process_pty_loop(master, mask, kill_pid, signo); if (saved_stdout) @@ -381,6 +376,11 @@ int process_pty(int master, sigset_t *mask, pid_t kill_pid, int signo) { if (saved_stdin) tcsetattr(STDIN_FILENO, TCSANOW, &saved_stdin_attr); + /* STDIN/STDOUT should not be nonblocking normally, so let's + * unconditionally reset it */ + fd_nonblock(STDIN_FILENO, false); + fd_nonblock(STDOUT_FILENO, false); + return r; }