X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fptyfwd.c;h=72aa59efb7e30be87ce82e8accd8470cae6a20a2;hb=0371ca0dac1d70b2e5060a3c4e6fbbc2bdbd8671;hp=85a0ddc2ecbe3b866b2913e09909b0293da60533;hpb=eaf73b061604c028aa28f960870a9b46aab2f76a;p=elogind.git diff --git a/src/shared/ptyfwd.c b/src/shared/ptyfwd.c index 85a0ddc2e..72aa59efb 100644 --- a/src/shared/ptyfwd.c +++ b/src/shared/ptyfwd.c @@ -341,29 +341,40 @@ 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_attr; - bool saved = false; + struct termios saved_stdin_attr, raw_stdin_attr; + struct termios saved_stdout_attr, raw_stdout_attr; + bool saved_stdin = false; + bool saved_stdout = false; struct winsize ws; int r; if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) >= 0) ioctl(master, TIOCSWINSZ, &ws); - if (tcgetattr(STDIN_FILENO, &saved_attr) >= 0) { - struct termios raw_attr; - saved = true; + if (tcgetattr(STDIN_FILENO, &saved_stdin_attr) >= 0) { + saved_stdin = true; - raw_attr = saved_attr; - cfmakeraw(&raw_attr); - raw_attr.c_lflag &= ~ECHO; - - tcsetattr(STDIN_FILENO, TCSANOW, &raw_attr); + raw_stdin_attr = saved_stdin_attr; + cfmakeraw(&raw_stdin_attr); + raw_stdin_attr.c_oflag = saved_stdin_attr.c_oflag; + tcsetattr(STDIN_FILENO, TCSANOW, &raw_stdin_attr); + } + if (tcgetattr(STDOUT_FILENO, &saved_stdout_attr) >= 0) { + saved_stdout = true; + + raw_stdout_attr = saved_stdout_attr; + cfmakeraw(&raw_stdout_attr); + raw_stdout_attr.c_iflag = saved_stdout_attr.c_iflag; + raw_stdout_attr.c_lflag = saved_stdout_attr.c_lflag; + tcsetattr(STDOUT_FILENO, TCSANOW, &raw_stdout_attr); } r = process_pty_loop(master, mask, kill_pid, signo); - if (saved) - tcsetattr(STDIN_FILENO, TCSANOW, &saved_attr); + if (saved_stdout) + tcsetattr(STDOUT_FILENO, TCSANOW, &saved_stdout_attr); + if (saved_stdin) + tcsetattr(STDIN_FILENO, TCSANOW, &saved_stdin_attr); return r;