Mercurial > dropbear
comparison common-channel.c @ 395:dc37bd8563e8 channel-fix
disapproval of revision '5fdf69ca60d1683cdd9f4c2595134bed26394834'
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sat, 03 Feb 2007 08:09:22 +0000 |
parents | 17d097fc111c |
children | a7eb64b9966a |
comparison
equal
deleted
inserted
replaced
394:17d097fc111c | 395:dc37bd8563e8 |
---|---|
201 if (channel->extrabuf == NULL && | 201 if (channel->extrabuf == NULL && |
202 channel->errfd >= 0 && FD_ISSET(channel->errfd, readfds)) { | 202 channel->errfd >= 0 && FD_ISSET(channel->errfd, readfds)) { |
203 send_msg_channel_data(channel, 1, SSH_EXTENDED_DATA_STDERR); | 203 send_msg_channel_data(channel, 1, SSH_EXTENDED_DATA_STDERR); |
204 } | 204 } |
205 | 205 |
206 /* if we can read from the writefd, it might be closed, so we try to | |
207 * see if it has errors */ | |
208 if (channel->writefd >= 0 && channel->writefd != channel->readfd | |
209 && FD_ISSET(channel->writefd, readfds)) { | |
210 if (channel->initconn) { | |
211 /* Handling for "in progress" connection - this is needed | |
212 * to avoid spinning 100% CPU when we connect to a server | |
213 * which doesn't send anything (tcpfwding) */ | |
214 checkinitdone(channel); | |
215 continue; /* Important not to use the channel after | |
216 checkinitdone(), as it may be NULL */ | |
217 } | |
218 ret = write(channel->writefd, NULL, 0); /* Fake write */ | |
219 if (ret < 0 && errno != EINTR && errno != EAGAIN) { | |
220 closewritefd(channel); | |
221 } | |
222 } | |
223 | |
206 /* write to program/pipe stdin */ | 224 /* write to program/pipe stdin */ |
207 if (channel->writefd >= 0 && FD_ISSET(channel->writefd, writefds)) { | 225 if (channel->writefd >= 0 && FD_ISSET(channel->writefd, writefds)) { |
208 if (channel->initconn) { | 226 if (channel->initconn) { |
209 checkinitdone(channel); | 227 checkinitdone(channel); |
210 continue; /* Important not to use the channel after | 228 continue; /* Important not to use the channel after |
425 if (channel->extrabuf == NULL && channel->errfd >= 0) { | 443 if (channel->extrabuf == NULL && channel->errfd >= 0) { |
426 FD_SET(channel->errfd, readfds); | 444 FD_SET(channel->errfd, readfds); |
427 } | 445 } |
428 } | 446 } |
429 | 447 |
430 /* Stuff from the wire */ | 448 /* For checking FD status (ie closure etc) - we don't actually |
449 * read data from writefd */ | |
450 TRACE(("writefd = %d, readfd %d, errfd %d, bufused %d", | |
451 channel->writefd, channel->readfd, | |
452 channel->errfd, | |
453 cbuf_getused(channel->writebuf) )) | |
454 if (channel->writefd >= 0 && channel->writefd != channel->readfd) { | |
455 FD_SET(channel->writefd, readfds); | |
456 } | |
457 | |
458 /* Stuff from the wire, to local program/shell/user etc */ | |
431 if ((channel->writefd >= 0 && cbuf_getused(channel->writebuf) > 0 ) | 459 if ((channel->writefd >= 0 && cbuf_getused(channel->writebuf) > 0 ) |
432 || channel->initconn) { | 460 || channel->initconn) { |
433 | 461 |
434 FD_SET(channel->writefd, writefds); | 462 FD_SET(channel->writefd, writefds); |
435 } | 463 } |