*/
#include "includes.h"
-RCSID("$OpenBSD: nchan.c,v 1.31 2001/07/17 21:04:57 markus Exp $");
+RCSID("$OpenBSD: nchan.c,v 1.32 2001/10/10 22:18:47 markus Exp $");
#include "ssh1.h"
#include "ssh2.h"
* ssh-1.2.27 as an example.
*
*/
-
+
/* functions manipulating channel states */
/*
* EVENTS update channel input/output states execute ACTIONS
}
int
-chan_is_dead(Channel *c)
+chan_is_dead(Channel *c, int send)
{
if (c->type == SSH_CHANNEL_ZOMBIE) {
debug("channel %d: zombie", c->self);
"read": "write");
} else {
if (!(c->flags & CHAN_CLOSE_SENT)) {
- chan_send_close2(c);
+ if (send) {
+ chan_send_close2(c);
+ } else {
+ /* channel would be dead if we sent a close */
+ if (c->flags & CHAN_CLOSE_RCVD) {
+ debug("channel %d: almost dead",
+ c->self);
+ return 1;
+ }
+ }
}
if ((c->flags & CHAN_CLOSE_SENT) &&
(c->flags & CHAN_CLOSE_RCVD)) {
/*
* shutdown(sock, SHUT_READ) may return ENOTCONN if the
* write side has been closed already. (bug on Linux)
- * HP-UX will return EINVAL.
+ * HP-UX may return ENOTCONN also.
*/
if (shutdown(c->sock, SHUT_RD) < 0
- && (errno != ENOTCONN && errno != EINVAL))
+ && errno != ENOTCONN)
error("channel %d: chan_shutdown_read: "
"shutdown() failed for fd%d [i%d o%d]: %.100s",
c->self, c->sock, c->istate, c->ostate,
- strerror(errno));
+ strerror(errno));
} else {
if (channel_close_fd(&c->rfd) < 0)
log("channel %d: chan_shutdown_read: "