Merged latest OpenBSD changes.
diff --git a/auth-rsa.c b/auth-rsa.c
index 076f8a3..3be37ff 100644
--- a/auth-rsa.c
+++ b/auth-rsa.c
@@ -17,7 +17,7 @@
 
 #include "config.h"
 #include "includes.h"
-RCSID("$Id: auth-rsa.c,v 1.2 1999/10/28 03:25:17 damien Exp $");
+RCSID("$Id: auth-rsa.c,v 1.3 1999/10/28 05:23:30 damien Exp $");
 
 #include "rsa.h"
 #include "packet.h"
diff --git a/channels.c b/channels.c
index 38a65a0..29a842f 100644
--- a/channels.c
+++ b/channels.c
@@ -16,7 +16,7 @@
 */
 
 #include "includes.h"
-RCSID("$Id: channels.c,v 1.1 1999/10/27 03:42:44 damien Exp $");
+RCSID("$Id: channels.c,v 1.2 1999/10/28 05:23:30 damien Exp $");
 
 #include "ssh.h"
 #include "packet.h"
@@ -108,7 +108,8 @@
 
 int channel_allocate(int type, int sock, char *remote_name)
 {
-  int i, old_channels;
+  int i, found;
+  Channel *c;
 
   /* Update the maximum file descriptor value. */
   if (sock > channel_max_fd_value)
@@ -128,41 +129,38 @@
     }
 
   /* Try to find a free slot where to put the new channel. */
-  for (i = 0; i < channels_alloc; i++)
+  for (found = -1, i = 0; i < channels_alloc; i++)
     if (channels[i].type == SSH_CHANNEL_FREE)
       {
-	/* Found a free slot.  Initialize the fields and return its number. */
-	buffer_init(&channels[i].input);
-	buffer_init(&channels[i].output);
-	channels[i].self = i;
-	channels[i].type = type;
-	channels[i].x11 = 0;
-	channels[i].sock = sock;
-	channels[i].remote_id = -1;
-	channels[i].remote_name = remote_name;
-        chan_init_iostates(&channels[i]);
-	return i;
+	/* Found a free slot. */
+	found = i;
+	break;
       }
 
-  /* There are no free slots.  Must expand the array. */
-  old_channels = channels_alloc;
-  channels_alloc += 10;
-  channels = xrealloc(channels, channels_alloc * sizeof(Channel));
-  for (i = old_channels; i < channels_alloc; i++)
-    channels[i].type = SSH_CHANNEL_FREE;
+  if (found == -1)
+    {
+      /* There are no free slots.  Take last+1 slot and expand the array.  */
+      found = channels_alloc;
+      channels_alloc += 10;
+      debug("channel: expanding %d", channels_alloc);
+      channels = xrealloc(channels, channels_alloc * sizeof(Channel));
+      for (i = found; i < channels_alloc; i++)
+        channels[i].type = SSH_CHANNEL_FREE;
+    }
 
-  /* We know that the next one after the old maximum channel number is now
-     available.  Initialize and return its number. */
-  buffer_init(&channels[old_channels].input);
-  buffer_init(&channels[old_channels].output);
-  channels[old_channels].self = old_channels;
-  channels[old_channels].type = type;
-  channels[old_channels].x11 = 0;
-  channels[old_channels].sock = sock;
-  channels[old_channels].remote_id = -1;
-  channels[old_channels].remote_name = remote_name;
-  chan_init_iostates(&channels[old_channels]);
-  return old_channels;
+  /* Initialize and return new channel number. */
+  c=&channels[found];
+  buffer_init(&c->input);
+  buffer_init(&c->output);
+  chan_init_iostates(c);
+  c->self = found;
+  c->type = type;
+  c->x11 = 0;
+  c->sock = sock;
+  c->remote_id = -1;
+  c->remote_name = remote_name;
+  debug("channel %d: new [%s]", found, remote_name);
+  return found;
 }
 
 /* Free the channel and close its socket. */
@@ -336,10 +334,10 @@
             packet_put_int(ch->remote_id);
             packet_send();
           }else{
-	    debug("X11 rejected %d 0x%x 0x%x", ch->self, ch->istate, ch->ostate);
+	    debug("X11 rejected %d i%d/o%d", ch->self, ch->istate, ch->ostate);
 	    chan_read_failed(ch);
 	    chan_write_failed(ch);
-	    debug("X11 rejected %d 0x%x 0x%x", ch->self, ch->istate, ch->ostate);
+	    debug("X11 rejected %d i%d/o%d", ch->self, ch->istate, ch->ostate);
 	  }
 	  break;
 
@@ -407,9 +405,9 @@
 		  break;
 		}
 	      remote_hostname = get_remote_hostname(newsock);
-	      snprintf(buf, sizeof buf, "port %d, connection from %.200s port %d",
-		      ch->listening_port, remote_hostname,
-		      get_peer_port(newsock));
+	      snprintf(buf, sizeof buf, "listen port %d:%.100s:%d, connect from %.200s:%d",
+		      ch->listening_port, ch->path, ch->host_port,
+		      remote_hostname, get_peer_port(newsock));
 	      xfree(remote_hostname);
 	      newch = channel_allocate(SSH_CHANNEL_OPENING, newsock, 
 				       xstrdup(buf));
@@ -830,8 +828,9 @@
       case SSH_CHANNEL_X11_OPEN:
       case SSH_CHANNEL_INPUT_DRAINING:
       case SSH_CHANNEL_OUTPUT_DRAINING:
-	snprintf(buf, sizeof buf, "  #%d/%d %.300s\r\n",
-		 c->self,c->type,c->remote_name);
+	snprintf(buf, sizeof buf, "  #%d %.300s (t%d r%d i%d o%d)\r\n",
+		 c->self,c->remote_name,
+		 c->type,c->remote_id, c->istate,c->ostate);
 	buffer_append(&buffer, buf, strlen(buf));
 	continue;
       default:
diff --git a/cipher.c b/cipher.c
index f6f9b00..e611d6c 100644
--- a/cipher.c
+++ b/cipher.c
@@ -13,7 +13,7 @@
 
 #include "config.h"
 #include "includes.h"
-RCSID("$Id: cipher.c,v 1.2 1999/10/28 03:25:17 damien Exp $");
+RCSID("$Id: cipher.c,v 1.3 1999/10/28 05:23:30 damien Exp $");
 
 #include "ssh.h"
 #include "cipher.h"
diff --git a/mpaux.c b/mpaux.c
index b79f781..e1b97a1 100644
--- a/mpaux.c
+++ b/mpaux.c
@@ -16,7 +16,7 @@
 
 #include "config.h"
 #include "includes.h"
-RCSID("$Id: mpaux.c,v 1.2 1999/10/28 03:25:17 damien Exp $");
+RCSID("$Id: mpaux.c,v 1.3 1999/10/28 05:23:30 damien Exp $");
 
 #ifdef HAVE_OPENSSL
 #include <openssl/bn.h>
diff --git a/scp.c b/scp.c
index 6145fde..a592c2a 100644
--- a/scp.c
+++ b/scp.c
@@ -42,11 +42,11 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$Id: scp.c,v 1.1 1999/10/27 03:42:45 damien Exp $
+ *	$Id: scp.c,v 1.2 1999/10/28 05:23:30 damien Exp $
  */
 
 #include "includes.h"
-RCSID("$Id: scp.c,v 1.1 1999/10/27 03:42:45 damien Exp $");
+RCSID("$Id: scp.c,v 1.2 1999/10/28 05:23:30 damien Exp $");
 
 #include "ssh.h"
 #include "xmalloc.h"
@@ -976,7 +976,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$Id: scp.c,v 1.1 1999/10/27 03:42:45 damien Exp $
+ *	$Id: scp.c,v 1.2 1999/10/28 05:23:30 damien Exp $
  */
 
 char *
@@ -1183,7 +1183,7 @@
 		    " - stalled -");
 	} else {
 		remaining = (int)(totalbytes / (statbytes / elapsed) - elapsed);
-		i = elapsed / 3600;
+		i = remaining / 3600;
 		if (i)
 			snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
 			    "%2d:", i);
diff --git a/ssh-add.c b/ssh-add.c
index 5ac3c30..2b4966d 100644
--- a/ssh-add.c
+++ b/ssh-add.c
@@ -14,7 +14,7 @@
 */
 
 #include "includes.h"
-RCSID("$Id: ssh-add.c,v 1.1 1999/10/27 03:42:45 damien Exp $");
+RCSID("$Id: ssh-add.c,v 1.2 1999/10/28 05:23:30 damien Exp $");
 
 #include "rsa.h"
 #include "ssh.h"
@@ -22,11 +22,10 @@
 #include "authfd.h"
 
 void
-delete_file(const char *filename)
+delete_file(AuthenticationConnection *ac, const char *filename)
 {
   RSA *key;
   char *comment;
-  AuthenticationConnection *ac;
 
   key = RSA_new();
   if (!load_public_key(filename, key, &comment))
@@ -35,55 +34,29 @@
       return;
     }
 
-  /* Send the request to the authentication agent. */
-  ac = ssh_get_authentication_connection();
-  if (!ac)
-    {
-      fprintf(stderr,
-	      "Could not open a connection to your authentication agent.\n");
-      RSA_free(key);
-      xfree(comment);
-      return;
-    }
   if (ssh_remove_identity(ac, key))
     fprintf(stderr, "Identity removed: %s (%s)\n", filename, comment);
   else
     fprintf(stderr, "Could not remove identity: %s\n", filename);
   RSA_free(key);
   xfree(comment);
-  ssh_close_authentication_connection(ac);
 }
 
 void
-delete_all()
+delete_all(AuthenticationConnection *ac)
 {
-  AuthenticationConnection *ac;
-  
-  /* Get a connection to the agent. */
-  ac = ssh_get_authentication_connection();
-  if (!ac)
-    {
-      fprintf(stderr,
-	      "Could not open a connection to your authentication agent.\n");
-      return;
-    }
-
   /* Send a request to remove all identities. */
   if (ssh_remove_all_identities(ac))
     fprintf(stderr, "All identities removed.\n");
   else
     fprintf(stderr, "Failed to remove all identitities.\n");
-  
-  /* Close the connection to the agent. */
-  ssh_close_authentication_connection(ac);
 }
 
 void
-add_file(const char *filename)
+add_file(AuthenticationConnection *ac, const char *filename)
 {
   RSA *key;
   RSA *public_key;
-  AuthenticationConnection *ac;
   char *saved_comment, *comment, *pass;
   int first;
   
@@ -131,40 +104,22 @@
 
   xfree(saved_comment);
 
-  /* Send the key to the authentication agent. */
-  ac = ssh_get_authentication_connection();
-  if (!ac)
-    {
-      fprintf(stderr,
-	      "Could not open a connection to your authentication agent.\n");
-      RSA_free(key);
-      xfree(comment);
-      return;
-    }
   if (ssh_add_identity(ac, key, comment))
     fprintf(stderr, "Identity added: %s (%s)\n", filename, comment);
   else
     fprintf(stderr, "Could not add identity: %s\n", filename);
   RSA_free(key);
   xfree(comment);
-  ssh_close_authentication_connection(ac);
 }
 
 void
-list_identities()
+list_identities(AuthenticationConnection *ac)
 {
-  AuthenticationConnection *ac;
   BIGNUM *e, *n;
   int bits, status;
   char *comment;
   int had_identities;
 
-  ac = ssh_get_authentication_connection();
-  if (!ac)
-    {
-      fprintf(stderr, "Could not connect to authentication server.\n");
-      return;
-    }
   e = BN_new();
   n = BN_new();
   had_identities = 0;
@@ -189,12 +144,12 @@
   BN_clear_free(n);
   if (!had_identities)
     printf("The agent has no identities.\n");
-  ssh_close_authentication_connection(ac);
 }
 
 int
-main(int ac, char **av)
+main(int argc, char **argv)
 {
+  AuthenticationConnection *ac = NULL;
   struct passwd *pw;
   char buf[1024];
   int no_files = 1;
@@ -211,30 +166,37 @@
     exit(1);
   }
 
-  for (i = 1; i < ac; i++)
+  /* At first, get a connection to the authentication agent. */
+  ac = ssh_get_authentication_connection();
+  if (ac == NULL) {
+    fprintf(stderr, "Could not open a connection to your authentication agent.\n");
+    exit(1);
+  }
+
+  for (i = 1; i < argc; i++)
     {
-      if (strcmp(av[i], "-l") == 0)
+      if (strcmp(argv[i], "-l") == 0)
 	{
-	  list_identities();
+	  list_identities(ac);
 	  no_files = 0; /* Don't default-add/delete if -l. */
 	  continue;
 	}
-      if (strcmp(av[i], "-d") == 0)
+      if (strcmp(argv[i], "-d") == 0)
 	{
 	  deleting = 1;
 	  continue;
 	}
-      if (strcmp(av[i], "-D") == 0)
+      if (strcmp(argv[i], "-D") == 0)
 	{
-	  delete_all();
+	  delete_all(ac);
 	  no_files = 0;
 	  continue;
 	}
       no_files = 0;
       if (deleting)
-	delete_file(av[i]);
+	delete_file(ac, argv[i]);
       else
-	add_file(av[i]);
+	add_file(ac, argv[i]);
     }
   if (no_files)
     {
@@ -242,13 +204,15 @@
       if (!pw)
 	{
 	  fprintf(stderr, "No user found with uid %d\n", (int)getuid());
+	  ssh_close_authentication_connection(ac);
 	  exit(1);
 	}
       snprintf(buf, sizeof buf, "%s/%s", pw->pw_dir, SSH_CLIENT_IDENTITY);
       if (deleting)
-	delete_file(buf);
+	delete_file(ac, buf);
       else
-	add_file(buf);
+	add_file(ac, buf);
     }
+  ssh_close_authentication_connection(ac);
   exit(0);
 }
diff --git a/ssh-agent.c b/ssh-agent.c
index 562f3cc..56618ad 100644
--- a/ssh-agent.c
+++ b/ssh-agent.c
@@ -15,7 +15,7 @@
 
 #include "config.h"
 #include "includes.h"
-RCSID("$Id: ssh-agent.c,v 1.2 1999/10/28 03:25:17 damien Exp $");
+RCSID("$Id: ssh-agent.c,v 1.3 1999/10/28 05:23:30 damien Exp $");
 
 #include "ssh.h"
 #include "rsa.h"
@@ -536,6 +536,15 @@
 	exit(1);
   }
 
+  /* Create a new session and process group  */
+  if (setsid() < 0) {
+      perror("setsid failed");
+      exit(1);
+  }
+
+  /* Ignore if a client dies while we are sending a reply */
+  signal(SIGPIPE, SIG_IGN);
+
   sock = socket(AF_UNIX, SOCK_STREAM, 0);
   if (sock < 0)
     {
diff --git a/ssh.c b/ssh.c
index 6846267..ed4ceaf 100644
--- a/ssh.c
+++ b/ssh.c
@@ -18,7 +18,7 @@
 */
 
 #include "includes.h"
-RCSID("$Id: ssh.c,v 1.2 1999/10/28 03:25:17 damien Exp $");
+RCSID("$Id: ssh.c,v 1.3 1999/10/28 05:23:30 damien Exp $");
 
 #include "xmalloc.h"
 #include "ssh.h"
@@ -158,8 +158,6 @@
 
 /* Main program for the ssh client. */
 
-uid_t original_real_uid;
-
 int
 main(int ac, char **av)
 {
diff --git a/sshconnect.c b/sshconnect.c
index 647dfbd..4222646 100644
--- a/sshconnect.c
+++ b/sshconnect.c
@@ -16,7 +16,7 @@
 
 #include "config.h"
 #include "includes.h"
-RCSID("$Id: sshconnect.c,v 1.2 1999/10/28 03:25:17 damien Exp $");
+RCSID("$Id: sshconnect.c,v 1.3 1999/10/28 05:23:30 damien Exp $");
 
 #ifdef HAVE_OPENSSL
 #include <openssl/bn.h>