disapproval of revision '5fdf69ca60d1683cdd9f4c2595134bed26394834'

--HG--
branch : channel-fix
extra : convert_revision : b24757c764465a206a258bae27ac0509fc56cd16
This commit is contained in:
Matt Johnston 2007-02-03 08:09:22 +00:00
parent 056b92bd4c
commit 41bfa93058

View File

@ -203,6 +203,24 @@ void channelio(fd_set *readfds, fd_set *writefds) {
send_msg_channel_data(channel, 1, SSH_EXTENDED_DATA_STDERR);
}
/* if we can read from the writefd, it might be closed, so we try to
* see if it has errors */
if (channel->writefd >= 0 && channel->writefd != channel->readfd
&& FD_ISSET(channel->writefd, readfds)) {
if (channel->initconn) {
/* Handling for "in progress" connection - this is needed
* to avoid spinning 100% CPU when we connect to a server
* which doesn't send anything (tcpfwding) */
checkinitdone(channel);
continue; /* Important not to use the channel after
checkinitdone(), as it may be NULL */
}
ret = write(channel->writefd, NULL, 0); /* Fake write */
if (ret < 0 && errno != EINTR && errno != EAGAIN) {
closewritefd(channel);
}
}
/* write to program/pipe stdin */
if (channel->writefd >= 0 && FD_ISSET(channel->writefd, writefds)) {
if (channel->initconn) {
@ -427,7 +445,17 @@ void setchannelfds(fd_set *readfds, fd_set *writefds) {
}
}
/* Stuff from the wire */
/* For checking FD status (ie closure etc) - we don't actually
* read data from writefd */
TRACE(("writefd = %d, readfd %d, errfd %d, bufused %d",
channel->writefd, channel->readfd,
channel->errfd,
cbuf_getused(channel->writebuf) ))
if (channel->writefd >= 0 && channel->writefd != channel->readfd) {
FD_SET(channel->writefd, readfds);
}
/* Stuff from the wire, to local program/shell/user etc */
if ((channel->writefd >= 0 && cbuf_getused(channel->writebuf) > 0 )
|| channel->initconn) {