--- servconf.c.orig	Thu Jan 17 05:35:34 2002
+++ servconf.c	Fri Jun 21 16:22:56 2002
@@ -88,8 +88,8 @@
 void initialize_server_options(ServerOptions *options)
 {
   memset(options, 0, sizeof(*options));
-  options->port = -1;
-  options->listen_addr.s_addr = INADDR_ANY;
+  options->num_ports = 0;
+  options->listen_addrs = NULL;
   options->host_key_file = NULL;
   options->random_seed_file = NULL;
   options->pid_file = NULL;
@@ -99,6 +99,9 @@
   options->permit_root_login = -1;
   options->ignore_rhosts = -1;
   options->ignore_root_rhosts = -1;
+#ifdef ENABLE_LOG_AUTH
+  options->log_auth = -1;
+#endif /* ENABLE_LOG_AUTH */
   options->quiet_mode = -1;
   options->fascist_logging = -1;
   options->print_motd = -1;
@@ -145,17 +148,33 @@
 
 void fill_default_server_options(ServerOptions *options)
 {
-  if (options->port == -1)
+  struct addrinfo hints, *ai, *aitop;
+  char strport[PORTSTRLEN];
+  int i;
+
+  if (options->num_ports == 0)
+    options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
+  if (options->listen_addrs == NULL)
     {
-      struct servent *sp;
+      for (i = 0; i < options->num_ports; i++)
+	{
+	  memset(&hints, 0, sizeof(hints));
+	  hints.ai_flags = AI_PASSIVE;
+	  hints.ai_family = IPv4or6;
+	  hints.ai_socktype = SOCK_STREAM;
+	  sprintf(strport, "%d", options->ports[i]);
+	  if (getaddrinfo(NULL, strport, &hints, &aitop) != 0)
+	    {
+	      fprintf(stderr, "fatal: getaddrinfo: Cannot get anyaddr.\n");
+	      exit(1);
+	    }
+	  for (ai = aitop; ai->ai_next; ai = ai->ai_next);
+	  ai->ai_next = options->listen_addrs;
+	  options->listen_addrs = aitop;
+	}
+      /* freeaddrinfo(options->listen_addrs) in sshd.c */
+      }
 
-      sp = getservbyname(SSH_SERVICE_NAME, "tcp");
-      if (sp)
-        options->port = ntohs(sp->s_port);
-      else
-        options->port = SSH_DEFAULT_PORT;
-      endservent();
-    }
   if (options->host_key_file == NULL)
     options->host_key_file = HOST_KEY_FILE;
   if (options->random_seed_file == NULL)
@@ -250,6 +269,9 @@
 {
   sPort, sHostKeyFile, sServerKeyBits, sLoginGraceTime, sKeyRegenerationTime,
   sPermitRootLogin, sQuietMode, sFascistLogging, sLogFacility,
+#ifdef ENABLE_LOG_AUTH
+  sLogAuth,
+#endif /* ENABLE_LOG_AUTH */
   sRhostsAuthentication, sRhostsRSAAuthentication, sRSAAuthentication,
   sTISAuthentication, sPasswordAuthentication, sAllowHosts, sDenyHosts,
   sListenAddress, sPrintMotd, sIgnoreRhosts, sX11Forwarding, sX11DisplayOffset,
@@ -282,6 +304,9 @@
   { "quietmode", sQuietMode },
   { "fascistlogging", sFascistLogging },
   { "syslogfacility", sLogFacility },
+#ifdef ENABLE_LOG_AUTH
+  { "logauth", sLogAuth },
+#endif /* ENABLE_LOG_AUTH */
   { "rhostsauthentication", sRhostsAuthentication },
   { "rhostsrsaauthentication", sRhostsRSAAuthentication },
   { "rsaauthentication", sRSAAuthentication },
@@ -375,6 +400,9 @@
   char *cp, **charptr;
   int linenum, *intptr, i, value;
   ServerOpCodes opcode;
+  struct addrinfo hints, *ai, *aitop;
+  char strport[PORTSTRLEN];
+  int gaierr;
 
   f = fopen(filename, "r");
   if (!f)
@@ -397,7 +425,14 @@
       switch (opcode)
         {
         case sPort:
-          intptr = &options->port;
+	  if (options->num_ports >= MAX_PORTS)
+	    {
+	      fprintf(stderr, "%s line %d: too many ports.\n",
+		      filename, linenum);
+	      exit(1);
+	    }
+	  options->ports[options->num_ports] = -1;
+	  intptr = &options->ports[options->num_ports++];
         parse_int:
           cp = strtok(NULL, WHITESPACE);
           if (!cp)
@@ -460,12 +495,26 @@
                       filename, linenum);
               exit(1);
             }
-#ifdef BROKEN_INET_ADDR
-          options->listen_addr.s_addr = inet_network(cp);
-#else /* BROKEN_INET_ADDR */
-          options->listen_addr.s_addr = inet_addr(cp);
-#endif /* BROKEN_INET_ADDR */
-          break;
+	  if (options->num_ports == 0)
+	    options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
+	  for (i = 0; i < options->num_ports; i++)
+	    {
+	      memset(&hints, 0, sizeof(hints));
+	      hints.ai_family = IPv4or6;
+	      hints.ai_socktype = SOCK_STREAM;
+	      sprintf(strport, "%d", options->ports[i]);
+	      if ((gaierr = getaddrinfo(cp, strport, &hints, &aitop)) != 0)
+		{
+		  fprintf(stderr, "%s line %d: bad addr or host. (%s)\n",
+			  filename, linenum, gai_strerror(gaierr));
+		  exit(1);
+		}
+	      for (ai = aitop; ai->ai_next; ai = ai->ai_next);
+	      ai->ai_next = options->listen_addrs;
+	      options->listen_addrs = aitop;
+	    }
+	  strtok(cp, WHITESPACE);	/* getaddrinfo() may use strtok() */
+  	  break;
 
         case sHostKeyFile:
           charptr = &options->host_key_file;
@@ -539,6 +588,12 @@
           if (*intptr == -1)
             *intptr = value;
           break;
+
+#ifdef ENABLE_LOG_AUTH
+	case sLogAuth:
+	  intptr = &options->log_auth;
+	  goto parse_flag;
+#endif /* ENABLE_LOG_AUTH */
 
         case sIgnoreRhosts:
           intptr = &options->ignore_rhosts;
