completely broke interactive logins. The problem, or at least one of the
problems, was that in interactive use stdin, stdout, and stderr tend to be
the same file, so setting O_NONBLOCK on the latter two also sets it on the
former. Thus, we need to cope with all of them being non-blocking.
git-svn-id: svn://svn.tartarus.org/sgt/putty@7742
cda61777-01e9-0310-a592-
d414129be87e
ret = write(fd, senddata, sendlen);
if (ret > 0)
bufchain_consume(chain, ret);
ret = write(fd, senddata, sendlen);
if (ret > 0)
bufchain_consume(chain, ret);
- else if (ret < 0 && errno != EWOULDBLOCK) {
perror(is_stderr ? "stderr: write" : "stdout: write");
exit(1);
}
perror(is_stderr ? "stderr: write" : "stdout: write");
exit(1);
}
local_tty = (tcgetattr(STDIN_FILENO, &orig_termios) == 0);
atexit(cleanup_termios);
ldisc_update(NULL, 1, 1);
local_tty = (tcgetattr(STDIN_FILENO, &orig_termios) == 0);
atexit(cleanup_termios);
ldisc_update(NULL, 1, 1);
-
- {
- int fl;
- /*
- * Make sure that stdout/err are non-blocking.
- */
- if ((fl = fcntl(STDOUT_FILENO, F_GETFL)) == -1 ||
- fcntl(STDOUT_FILENO, F_SETFL, fl | O_NONBLOCK) == -1) {
- perror("stdout");
- exit(1);
- }
- if ((fl = fcntl(STDERR_FILENO, F_GETFL)) == -1 ||
- fcntl(STDERR_FILENO, F_SETFL, fl | O_NONBLOCK) == -1) {
- perror("stderr");
- exit(1);
- }
- }
sending = FALSE;
now = GETTICKCOUNT();
sending = FALSE;
now = GETTICKCOUNT();