changeset 396:e7c1a77d2921

disapproval of revision '2186a678a5f79ef432f6593a10e3e13df2a313d5'
author Matt Johnston <matt@ucc.asn.au>
date Sat, 03 Feb 2007 08:09:55 +0000
parents d6b8815a9b5e
children 2908122e9eed 59c7938af2bd
files common-channel.c svr-chansession.c
diffstat 2 files changed, 26 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/common-channel.c	Sun Jun 11 16:19:32 2006 +0000
+++ b/common-channel.c	Sat Feb 03 08:09:55 2007 +0000
@@ -181,7 +181,6 @@
 
 	struct Channel *channel;
 	unsigned int i;
-	int ret;
 
 	/* iterate through all the possible channels */
 	for (i = 0; i < ses.chansize; i++) {
@@ -205,8 +204,7 @@
 
 		/* if we can read from the writefd, it might be closed, so we try to
 		 * see if it has errors */
-		if (IS_DROPBEAR_SERVER && channel->writefd >= 0 
-				&& channel->writefd != channel->readfd
+		if (channel->writefd >= 0 && channel->writefd != channel->readfd
 				&& FD_ISSET(channel->writefd, readfds)) {
 			if (channel->initconn) {
 				/* Handling for "in progress" connection - this is needed
@@ -261,27 +259,27 @@
 				channel->writebuf,
 				channel->writebuf ? 0 : cbuf_getused(channel->extrabuf)))
 
-	/* server chansession channels are special, since readfd mightn't
-	 * close in the case of "sleep 4 & echo blah" until the sleep is up */
-	if (channel->type->checkclose) {
-		if (channel->type->checkclose(channel)) {
-			closewritefd(channel);
-			closereadfd(channel, channel->readfd);
-			closereadfd(channel, channel->errfd);
+	if (!channel->sentclosed) {
+
+		/* check for exited - currently only used for server sessions,
+		 * if the shell has exited etc */
+		if (channel->type->checkclose) {
+			if (channel->type->checkclose(channel)) {
+				closewritefd(channel);
+			}
 		}
-	}
 
-	if (!channel->senteof
-		&& channel->readfd == FD_CLOSED 
-		&& (channel->extrabuf == NULL || channel->errfd == FD_CLOSED)) {
-		send_msg_channel_eof(channel);
-	}
+		if (!channel->senteof
+			&& channel->readfd == FD_CLOSED 
+			&& (channel->extrabuf != NULL || channel->errfd == FD_CLOSED)) {
+			send_msg_channel_eof(channel);
+		}
 
-	if (!channel->sentclosed
-		&& channel->writefd == FD_CLOSED
-		&& channel->readfd == FD_CLOSED
-		&& (channel->extrabuf == NULL || channel->errfd == FD_CLOSED)) {
-		send_msg_channel_close(channel);
+		if (channel->writefd == FD_CLOSED
+			&& channel->readfd == FD_CLOSED
+			&& (channel->extrabuf != NULL || channel->errfd == FD_CLOSED)) {
+			send_msg_channel_close(channel);
+		}
 	}
 
 	/* When either party wishes to terminate the channel, it sends
@@ -446,22 +444,20 @@
 			}
 		}
 
+		/* 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) ))
-
-		/* For checking FD status (ie closure etc) - we don't actually
-		 * read data from writefd. We don't want to do this for the client,
-		 * since redirection to /dev/null will make it spin in the select */
-		if (IS_DROPBEAR_SERVER && channel->writefd >= 0 
-				&& channel->writefd != channel->readfd) {
+		if (channel->writefd >= 0 && channel->writefd != channel->readfd) {
 			FD_SET(channel->writefd, readfds);
 		}
 
-		/* Stuff from the wire */
+		/* Stuff from the wire, to local program/shell/user etc */
 		if ((channel->writefd >= 0 && cbuf_getused(channel->writebuf) > 0 )
 				|| channel->initconn) {
+
 				FD_SET(channel->writefd, writefds);
 		}
 
--- a/svr-chansession.c	Sun Jun 11 16:19:32 2006 +0000
+++ b/svr-chansession.c	Sat Feb 03 08:09:55 2007 +0000
@@ -67,7 +67,8 @@
 extern char** environ;
 
 static int sesscheckclose(struct Channel *channel) {
-	return channel->writefd == -1;
+	struct ChanSess *chansess = (struct ChanSess*)channel->typedata;
+	return chansess->exit.exitpid >= 0;
 }
 
 /* Handler for childs exiting, store the state for return to the client */