- markus@cvs.openbsd.org 2001/06/12 10:58:29
     [session.c]
     merge session_free into session_close()
     merge pty_cleanup_proc into session_pty_cleanup()
diff --git a/ChangeLog b/ChangeLog
index 8de93d1..602ef88 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+20010613
+- OpenBSD CVS Sync
+   - markus@cvs.openbsd.org 2001/06/12 10:58:29
+     [session.c]
+     merge session_free into session_close()
+     merge pty_cleanup_proc into session_pty_cleanup()
+
 20010612
  - scp.c ID update (upstream synced vfsprintf() from us)
  - OpenBSD CVS Sync
@@ -5616,4 +5623,4 @@
  - Wrote replacements for strlcpy and mkdtemp
  - Released 1.0pre1
 
-$Id: ChangeLog,v 1.1280 2001/06/12 00:23:12 mouring Exp $
+$Id: ChangeLog,v 1.1281 2001/06/13 04:35:43 mouring Exp $
diff --git a/session.c b/session.c
index 4dfca35..8999f8c 100644
--- a/session.c
+++ b/session.c
@@ -33,7 +33,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: session.c,v 1.84 2001/06/11 10:18:24 markus Exp $");
+RCSID("$OpenBSD: session.c,v 1.85 2001/06/12 10:58:29 markus Exp $");
 
 #include "ssh.h"
 #include "ssh1.h"
@@ -121,7 +121,7 @@
 
 Session *session_new(void);
 void	session_set_fds(Session *s, int fdin, int fdout, int fderr);
-void	session_pty_cleanup(Session *s);
+void	session_pty_cleanup(void *session);
 void	session_proctitle(Session *s);
 int	session_setup_x11fwd(Session *s);
 void	session_close(Session *s);
@@ -232,27 +232,6 @@
 }
 
 /*
- * Function to perform cleanup if we get aborted abnormally (e.g., due to a
- * dropped connection).
- */
-void
-pty_cleanup_proc(void *session)
-{
-	Session *s=session;
-	if (s == NULL)
-		fatal("pty_cleanup_proc: no session");
-	debug("pty_cleanup_proc: %s", s->tty);
-
-	if (s->pid != 0) {
-		/* Record that the user has logged out. */
-		record_logout(s->pid, s->tty);
-	}
-
-	/* Release the pseudo-tty. */
-	pty_release(s->tty);
-}
-
-/*
  * Prepares for an interactive session.  This is called after the user has
  * been successfully authenticated.  During this message exchange, pseudo
  * terminals are allocated, X11, TCP/IP, and authentication agent forwardings
@@ -311,7 +290,7 @@
 				error("Failed to allocate pty.");
 				break;
 			}
-			fatal_add_cleanup(pty_cleanup_proc, (void *)s);
+			fatal_add_cleanup(session_pty_cleanup, (void *)s);
 			pty_setowner(s->pw, s->tty);
 
 			/* Get TERM from the packet.  Note that the value may be of arbitrary length. */
@@ -1552,7 +1531,6 @@
 		debug("session_new: init");
 		for(i = 0; i < MAX_SESSIONS; i++) {
 			sessions[i].used = 0;
-			sessions[i].self = i;
 		}
 		did_init = 1;
 	}
@@ -1564,6 +1542,7 @@
 			s->ptyfd = -1;
 			s->ttyfd = -1;
 			s->used = 1;
+			s->self = i;
 			debug("session_new: session %d", i);
 			return s;
 		}
@@ -1680,7 +1659,7 @@
 	 * Add a cleanup function to clear the utmp entry and record logout
 	 * time in case we call fatal() (e.g., the connection gets closed).
 	 */
-	fatal_add_cleanup(pty_cleanup_proc, (void *)s);
+	fatal_add_cleanup(session_pty_cleanup, (void *)s);
 	pty_setowner(s->pw, s->tty);
 	/* Get window size from the packet. */
 	pty_change_window_size(s->ptyfd, s->row, s->col, s->xpixel, s->ypixel);
@@ -1864,19 +1843,27 @@
 	    1);
 }
 
+/*
+ * Function to perform pty cleanup. Also called if we get aborted abnormally
+ * (e.g., due to a dropped connection).
+ */
 void
-session_pty_cleanup(Session *s)
+session_pty_cleanup(void *session)
 {
-	if (s == NULL || s->ttyfd == -1)
+	Session *s = session;
+
+	if (s == NULL) {
+		error("session_pty_cleanup: no session");
+		return;
+	}
+	if (s->ttyfd == -1)
 		return;
 
 	debug("session_pty_cleanup: session %d release %s", s->self, s->tty);
 
-	/* Cancel the cleanup function. */
-	fatal_remove_cleanup(pty_cleanup_proc, (void *)s);
-
 	/* Record that the user has logged out. */
-	record_logout(s->pid, s->tty);
+	if (s->pid != 0)
+		record_logout(s->pid, s->tty);
 
 	/* Release the pseudo-tty. */
 	pty_release(s->tty);
@@ -1898,7 +1885,7 @@
 		fatal("session_close: no session");
 	c = channel_lookup(s->chanid);
 	if (c == NULL)
-		fatal("session_close: session %d: no channel %d",
+		fatal("session_exit_message: session %d: no channel %d",
 		    s->self, s->chanid);
 	debug("session_exit_message: session %d channel %d pid %d",
 	    s->self, s->chanid, s->pid);
@@ -1940,9 +1927,13 @@
 }
 
 void
-session_free(Session *s)
+session_close(Session *s)
 {
-	debug("session_free: session %d pid %d", s->self, s->pid);
+	debug("session_close: session %d pid %d", s->self, s->pid);
+	if (s->ttyfd != -1) {
+		fatal_remove_cleanup(session_pty_cleanup, (void *)s);
+		session_pty_cleanup(s);
+	}
 	if (s->term)
 		xfree(s->term);
 	if (s->display)
@@ -1952,13 +1943,6 @@
 	if (s->auth_proto)
 		xfree(s->auth_proto);
 	s->used = 0;
-}
-
-void
-session_close(Session *s)
-{
-	session_pty_cleanup(s);
-	session_free(s);
 	session_proctitle(s);
 }