[BACK]Return to servconf.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/servconf.c between version 1.53 and 1.53.2.4

version 1.53, 2000/10/14 12:12:09 version 1.53.2.4, 2001/05/07 21:09:33
Line 12 
Line 12 
 #include "includes.h"  #include "includes.h"
 RCSID("$OpenBSD$");  RCSID("$OpenBSD$");
   
   #ifdef KRB4
   #include <krb.h>
   #endif
   #ifdef AFS
   #include <kafs.h>
   #endif
   
 #include "ssh.h"  #include "ssh.h"
   #include "log.h"
 #include "servconf.h"  #include "servconf.h"
 #include "xmalloc.h"  #include "xmalloc.h"
 #include "compat.h"  #include "compat.h"
   #include "pathnames.h"
   #include "tildexpand.h"
   #include "misc.h"
   #include "cipher.h"
   #include "kex.h"
   #include "mac.h"
   
 /* add listen address */  void add_listen_addr(ServerOptions *options, char *addr, u_short port);
 void add_listen_addr(ServerOptions *options, char *addr);  void add_one_listen_addr(ServerOptions *options, char *addr, u_short port);
   
   /* AF_UNSPEC or AF_INET or AF_INET6 */
   extern int IPv4or6;
   
 /* Initializes the server options to their default values. */  /* Initializes the server options to their default values. */
   
 void  void
Line 29 
Line 46 
         options->num_ports = 0;          options->num_ports = 0;
         options->ports_from_cmdline = 0;          options->ports_from_cmdline = 0;
         options->listen_addrs = NULL;          options->listen_addrs = NULL;
         options->host_key_file = NULL;          options->num_host_key_files = 0;
         options->host_dsa_key_file = NULL;  
         options->pid_file = NULL;          options->pid_file = NULL;
         options->server_key_bits = -1;          options->server_key_bits = -1;
         options->login_grace_time = -1;          options->login_grace_time = -1;
         options->key_regeneration_time = -1;          options->key_regeneration_time = -1;
         options->permit_root_login = -1;          options->permit_root_login = PERMIT_NOT_SET;
         options->ignore_rhosts = -1;          options->ignore_rhosts = -1;
         options->ignore_user_known_hosts = -1;          options->ignore_user_known_hosts = -1;
         options->print_motd = -1;          options->print_motd = -1;
           options->print_lastlog = -1;
         options->check_mail = -1;          options->check_mail = -1;
         options->x11_forwarding = -1;          options->x11_forwarding = -1;
         options->x11_display_offset = -1;          options->x11_display_offset = -1;
Line 49 
Line 66 
         options->log_level = (LogLevel) - 1;          options->log_level = (LogLevel) - 1;
         options->rhosts_authentication = -1;          options->rhosts_authentication = -1;
         options->rhosts_rsa_authentication = -1;          options->rhosts_rsa_authentication = -1;
           options->hostbased_authentication = -1;
           options->hostbased_uses_name_from_packet_only = -1;
         options->rsa_authentication = -1;          options->rsa_authentication = -1;
         options->dsa_authentication = -1;          options->pubkey_authentication = -1;
 #ifdef KRB4  #ifdef KRB4
         options->kerberos_authentication = -1;          options->kerberos_authentication = -1;
         options->kerberos_or_local_passwd = -1;          options->kerberos_or_local_passwd = -1;
Line 62 
Line 81 
 #endif  #endif
         options->password_authentication = -1;          options->password_authentication = -1;
         options->kbd_interactive_authentication = -1;          options->kbd_interactive_authentication = -1;
 #ifdef SKEY          options->challenge_reponse_authentication = -1;
         options->skey_authentication = -1;  
 #endif  
         options->permit_empty_passwd = -1;          options->permit_empty_passwd = -1;
         options->use_login = -1;          options->use_login = -1;
         options->allow_tcp_forwarding = -1;          options->allow_tcp_forwarding = -1;
Line 73 
Line 90 
         options->num_allow_groups = 0;          options->num_allow_groups = 0;
         options->num_deny_groups = 0;          options->num_deny_groups = 0;
         options->ciphers = NULL;          options->ciphers = NULL;
           options->macs = NULL;
         options->protocol = SSH_PROTO_UNKNOWN;          options->protocol = SSH_PROTO_UNKNOWN;
         options->gateway_ports = -1;          options->gateway_ports = -1;
         options->num_subsystems = 0;          options->num_subsystems = 0;
         options->max_startups_begin = -1;          options->max_startups_begin = -1;
         options->max_startups_rate = -1;          options->max_startups_rate = -1;
         options->max_startups = -1;          options->max_startups = -1;
           options->banner = NULL;
           options->reverse_mapping_check = -1;
           options->client_alive_interval = -1;
           options->client_alive_count_max = -1;
 }  }
   
 void  void
 fill_default_server_options(ServerOptions *options)  fill_default_server_options(ServerOptions *options)
 {  {
           if (options->protocol == SSH_PROTO_UNKNOWN)
                   options->protocol = SSH_PROTO_1|SSH_PROTO_2;
           if (options->num_host_key_files == 0) {
                   /* fill default hostkeys for protocols */
                   if (options->protocol & SSH_PROTO_1)
                           options->host_key_files[options->num_host_key_files++] = _PATH_HOST_KEY_FILE;
                   if (options->protocol & SSH_PROTO_2)
                           options->host_key_files[options->num_host_key_files++] = _PATH_HOST_DSA_KEY_FILE;
           }
         if (options->num_ports == 0)          if (options->num_ports == 0)
                 options->ports[options->num_ports++] = SSH_DEFAULT_PORT;                  options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
         if (options->listen_addrs == NULL)          if (options->listen_addrs == NULL)
                 add_listen_addr(options, NULL);                  add_listen_addr(options, NULL, 0);
         if (options->host_key_file == NULL)  
                 options->host_key_file = HOST_KEY_FILE;  
         if (options->host_dsa_key_file == NULL)  
                 options->host_dsa_key_file = HOST_DSA_KEY_FILE;  
         if (options->pid_file == NULL)          if (options->pid_file == NULL)
                 options->pid_file = SSH_DAEMON_PID_FILE;                  options->pid_file = _PATH_SSH_DAEMON_PID_FILE;
         if (options->server_key_bits == -1)          if (options->server_key_bits == -1)
                 options->server_key_bits = 768;                  options->server_key_bits = 768;
         if (options->login_grace_time == -1)          if (options->login_grace_time == -1)
                 options->login_grace_time = 600;                  options->login_grace_time = 600;
         if (options->key_regeneration_time == -1)          if (options->key_regeneration_time == -1)
                 options->key_regeneration_time = 3600;                  options->key_regeneration_time = 3600;
         if (options->permit_root_login == -1)          if (options->permit_root_login == PERMIT_NOT_SET)
                 options->permit_root_login = 1;                 /* yes */                  options->permit_root_login = PERMIT_YES;
         if (options->ignore_rhosts == -1)          if (options->ignore_rhosts == -1)
                 options->ignore_rhosts = 1;                  options->ignore_rhosts = 1;
         if (options->ignore_user_known_hosts == -1)          if (options->ignore_user_known_hosts == -1)
Line 110 
Line 137 
                 options->check_mail = 0;                  options->check_mail = 0;
         if (options->print_motd == -1)          if (options->print_motd == -1)
                 options->print_motd = 1;                  options->print_motd = 1;
           if (options->print_lastlog == -1)
                   options->print_lastlog = 1;
         if (options->x11_forwarding == -1)          if (options->x11_forwarding == -1)
                 options->x11_forwarding = 0;                  options->x11_forwarding = 0;
         if (options->x11_display_offset == -1)          if (options->x11_display_offset == -1)
Line 130 
Line 159 
                 options->rhosts_authentication = 0;                  options->rhosts_authentication = 0;
         if (options->rhosts_rsa_authentication == -1)          if (options->rhosts_rsa_authentication == -1)
                 options->rhosts_rsa_authentication = 0;                  options->rhosts_rsa_authentication = 0;
           if (options->hostbased_authentication == -1)
                   options->hostbased_authentication = 0;
           if (options->hostbased_uses_name_from_packet_only == -1)
                   options->hostbased_uses_name_from_packet_only = 0;
         if (options->rsa_authentication == -1)          if (options->rsa_authentication == -1)
                 options->rsa_authentication = 1;                  options->rsa_authentication = 1;
         if (options->dsa_authentication == -1)          if (options->pubkey_authentication == -1)
                 options->dsa_authentication = 1;                  options->pubkey_authentication = 1;
 #ifdef KRB4  #ifdef KRB4
         if (options->kerberos_authentication == -1)          if (options->kerberos_authentication == -1)
                 options->kerberos_authentication = (access(KEYFILE, R_OK) == 0);                  options->kerberos_authentication = (access(KEYFILE, R_OK) == 0);
Line 152 
Line 185 
                 options->password_authentication = 1;                  options->password_authentication = 1;
         if (options->kbd_interactive_authentication == -1)          if (options->kbd_interactive_authentication == -1)
                 options->kbd_interactive_authentication = 0;                  options->kbd_interactive_authentication = 0;
 #ifdef SKEY          if (options->challenge_reponse_authentication == -1)
         if (options->skey_authentication == -1)                  options->challenge_reponse_authentication = 1;
                 options->skey_authentication = 1;  
 #endif  
         if (options->permit_empty_passwd == -1)          if (options->permit_empty_passwd == -1)
                 options->permit_empty_passwd = 0;                  options->permit_empty_passwd = 0;
         if (options->use_login == -1)          if (options->use_login == -1)
                 options->use_login = 0;                  options->use_login = 0;
         if (options->allow_tcp_forwarding == -1)          if (options->allow_tcp_forwarding == -1)
                 options->allow_tcp_forwarding = 1;                  options->allow_tcp_forwarding = 1;
         if (options->protocol == SSH_PROTO_UNKNOWN)  
                 options->protocol = SSH_PROTO_1|SSH_PROTO_2;  
         if (options->gateway_ports == -1)          if (options->gateway_ports == -1)
                 options->gateway_ports = 0;                  options->gateway_ports = 0;
         if (options->max_startups == -1)          if (options->max_startups == -1)
Line 172 
Line 201 
                 options->max_startups_rate = 100;               /* 100% */                  options->max_startups_rate = 100;               /* 100% */
         if (options->max_startups_begin == -1)          if (options->max_startups_begin == -1)
                 options->max_startups_begin = options->max_startups;                  options->max_startups_begin = options->max_startups;
           if (options->reverse_mapping_check == -1)
                   options->reverse_mapping_check = 0;
           if (options->client_alive_interval == -1)
                   options->client_alive_interval = 0;
           if (options->client_alive_count_max == -1)
                   options->client_alive_count_max = 3;
 }  }
   
 /* Keyword tokens. */  /* Keyword tokens. */
Line 186 
Line 221 
 #ifdef AFS  #ifdef AFS
         sKerberosTgtPassing, sAFSTokenPassing,          sKerberosTgtPassing, sAFSTokenPassing,
 #endif  #endif
 #ifdef SKEY          sChallengeResponseAuthentication,
         sSkeyAuthentication,  
 #endif  
         sPasswordAuthentication, sKbdInteractiveAuthentication, sListenAddress,          sPasswordAuthentication, sKbdInteractiveAuthentication, sListenAddress,
         sPrintMotd, sIgnoreRhosts, sX11Forwarding, sX11DisplayOffset,          sPrintMotd, sPrintLastLog, sIgnoreRhosts,
         sStrictModes, sEmptyPasswd, sRandomSeedFile, sKeepAlives, sCheckMail,          sX11Forwarding, sX11DisplayOffset,
           sStrictModes, sEmptyPasswd, sKeepAlives, sCheckMail,
         sUseLogin, sAllowTcpForwarding,          sUseLogin, sAllowTcpForwarding,
         sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups,          sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups,
         sIgnoreUserKnownHosts, sHostDSAKeyFile, sCiphers, sProtocol, sPidFile,          sIgnoreUserKnownHosts, sCiphers, sMacs, sProtocol, sPidFile,
         sGatewayPorts, sDSAAuthentication, sXAuthLocation, sSubsystem, sMaxStartups          sGatewayPorts, sPubkeyAuthentication, sXAuthLocation, sSubsystem, sMaxStartups,
           sBanner, sReverseMappingCheck, sHostbasedAuthentication,
           sHostbasedUsesNameFromPacketOnly, sClientAliveInterval,
           sClientAliveCountMax
 } ServerOpCodes;  } ServerOpCodes;
   
 /* Textual representation of the tokens. */  /* Textual representation of the tokens. */
Line 205 
Line 242 
 } keywords[] = {  } keywords[] = {
         { "port", sPort },          { "port", sPort },
         { "hostkey", sHostKeyFile },          { "hostkey", sHostKeyFile },
         { "hostdsakey", sHostDSAKeyFile },          { "hostdsakey", sHostKeyFile },                                 /* alias */
         { "pidfile", sPidFile },          { "pidfile", sPidFile },
         { "serverkeybits", sServerKeyBits },          { "serverkeybits", sServerKeyBits },
         { "logingracetime", sLoginGraceTime },          { "logingracetime", sLoginGraceTime },
         { "keyregenerationinterval", sKeyRegenerationTime },          { "keyregenerationinterval", sKeyRegenerationTime },
Line 215 
Line 252 
         { "loglevel", sLogLevel },          { "loglevel", sLogLevel },
         { "rhostsauthentication", sRhostsAuthentication },          { "rhostsauthentication", sRhostsAuthentication },
         { "rhostsrsaauthentication", sRhostsRSAAuthentication },          { "rhostsrsaauthentication", sRhostsRSAAuthentication },
           { "hostbasedauthentication", sHostbasedAuthentication },
           { "hostbasedusesnamefrompacketonly", sHostbasedUsesNameFromPacketOnly },
         { "rsaauthentication", sRSAAuthentication },          { "rsaauthentication", sRSAAuthentication },
         { "dsaauthentication", sDSAAuthentication },          { "pubkeyauthentication", sPubkeyAuthentication },
           { "dsaauthentication", sPubkeyAuthentication },                 /* alias */
 #ifdef KRB4  #ifdef KRB4
         { "kerberosauthentication", sKerberosAuthentication },          { "kerberosauthentication", sKerberosAuthentication },
         { "kerberosorlocalpasswd", sKerberosOrLocalPasswd },          { "kerberosorlocalpasswd", sKerberosOrLocalPasswd },
Line 228 
Line 268 
 #endif  #endif
         { "passwordauthentication", sPasswordAuthentication },          { "passwordauthentication", sPasswordAuthentication },
         { "kbdinteractiveauthentication", sKbdInteractiveAuthentication },          { "kbdinteractiveauthentication", sKbdInteractiveAuthentication },
 #ifdef SKEY          { "challengeresponseauthentication", sChallengeResponseAuthentication },
         { "skeyauthentication", sSkeyAuthentication },          { "skeyauthentication", sChallengeResponseAuthentication }, /* alias */
 #endif  
         { "checkmail", sCheckMail },          { "checkmail", sCheckMail },
         { "listenaddress", sListenAddress },          { "listenaddress", sListenAddress },
         { "printmotd", sPrintMotd },          { "printmotd", sPrintMotd },
           { "printlastlog", sPrintLastLog },
         { "ignorerhosts", sIgnoreRhosts },          { "ignorerhosts", sIgnoreRhosts },
         { "ignoreuserknownhosts", sIgnoreUserKnownHosts },          { "ignoreuserknownhosts", sIgnoreUserKnownHosts },
         { "x11forwarding", sX11Forwarding },          { "x11forwarding", sX11Forwarding },
Line 242 
Line 282 
         { "strictmodes", sStrictModes },          { "strictmodes", sStrictModes },
         { "permitemptypasswords", sEmptyPasswd },          { "permitemptypasswords", sEmptyPasswd },
         { "uselogin", sUseLogin },          { "uselogin", sUseLogin },
         { "randomseed", sRandomSeedFile },  
         { "keepalive", sKeepAlives },          { "keepalive", sKeepAlives },
         { "allowtcpforwarding", sAllowTcpForwarding },          { "allowtcpforwarding", sAllowTcpForwarding },
         { "allowusers", sAllowUsers },          { "allowusers", sAllowUsers },
Line 250 
Line 289 
         { "allowgroups", sAllowGroups },          { "allowgroups", sAllowGroups },
         { "denygroups", sDenyGroups },          { "denygroups", sDenyGroups },
         { "ciphers", sCiphers },          { "ciphers", sCiphers },
           { "macs", sMacs },
         { "protocol", sProtocol },          { "protocol", sProtocol },
         { "gatewayports", sGatewayPorts },          { "gatewayports", sGatewayPorts },
         { "subsystem", sSubsystem },          { "subsystem", sSubsystem },
         { "maxstartups", sMaxStartups },          { "maxstartups", sMaxStartups },
           { "banner", sBanner },
           { "reversemappingcheck", sReverseMappingCheck },
           { "clientaliveinterval", sClientAliveInterval },
           { "clientalivecountmax", sClientAliveCountMax },
         { NULL, 0 }          { NULL, 0 }
 };  };
   
 /*  /*
  * Returns the number of the token pointed to by cp of length len. Never   * Returns the number of the token pointed to by cp or sBadOption.
  * returns if the token is not known.  
  */   */
   
 static ServerOpCodes  static ServerOpCodes
 parse_token(const char *cp, const char *filename,  parse_token(const char *cp, const char *filename,
             int linenum)              int linenum)
 {  {
         unsigned int i;          u_int i;
   
         for (i = 0; keywords[i].name; i++)          for (i = 0; keywords[i].name; i++)
                 if (strcasecmp(cp, keywords[i].name) == 0)                  if (strcasecmp(cp, keywords[i].name) == 0)
                         return keywords[i].opcode;                          return keywords[i].opcode;
   
         fprintf(stderr, "%s: line %d: Bad configuration option: %s\n",          error("%s: line %d: Bad configuration option: %s",
                 filename, linenum, cp);              filename, linenum, cp);
         return sBadOption;          return sBadOption;
 }  }
   
 /*  
  * add listen address  
  */  
 void  void
 add_listen_addr(ServerOptions *options, char *addr)  add_listen_addr(ServerOptions *options, char *addr, u_short port)
 {  {
         extern int IPv4or6;  
         struct addrinfo hints, *ai, *aitop;  
         char strport[NI_MAXSERV];  
         int gaierr;  
         int i;          int i;
   
         if (options->num_ports == 0)          if (options->num_ports == 0)
                 options->ports[options->num_ports++] = SSH_DEFAULT_PORT;                  options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
         for (i = 0; i < options->num_ports; i++) {          if (port == 0)
                 memset(&hints, 0, sizeof(hints));                  for (i = 0; i < options->num_ports; i++)
                 hints.ai_family = IPv4or6;                          add_one_listen_addr(options, addr, options->ports[i]);
                 hints.ai_socktype = SOCK_STREAM;          else
                 hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;                  add_one_listen_addr(options, addr, port);
                 snprintf(strport, sizeof strport, "%d", options->ports[i]);  
                 if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)  
                         fatal("bad addr or host: %s (%s)\n",  
                             addr ? addr : "<NULL>",  
                             gai_strerror(gaierr));  
                 for (ai = aitop; ai->ai_next; ai = ai->ai_next)  
                         ;  
                 ai->ai_next = options->listen_addrs;  
                 options->listen_addrs = aitop;  
         }  
 }  }
   
   void
   add_one_listen_addr(ServerOptions *options, char *addr, u_short port)
   {
           struct addrinfo hints, *ai, *aitop;
           char strport[NI_MAXSERV];
           int gaierr;
   
           memset(&hints, 0, sizeof(hints));
           hints.ai_family = IPv4or6;
           hints.ai_socktype = SOCK_STREAM;
           hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;
           snprintf(strport, sizeof strport, "%d", port);
           if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)
                   fatal("bad addr or host: %s (%s)",
                       addr ? addr : "<NULL>",
                       gai_strerror(gaierr));
           for (ai = aitop; ai->ai_next; ai = ai->ai_next)
                   ;
           ai->ai_next = options->listen_addrs;
           options->listen_addrs = aitop;
   }
   
 /* Reads the server configuration file. */  /* Reads the server configuration file. */
   
 void  void
Line 315 
Line 363 
 {  {
         FILE *f;          FILE *f;
         char line[1024];          char line[1024];
         char *cp, **charptr, *arg;          char *cp, **charptr, *arg, *p;
         int linenum, *intptr, value;          int linenum, *intptr, value;
         int bad_options = 0;          int bad_options = 0;
         ServerOpCodes opcode;          ServerOpCodes opcode;
Line 334 
Line 382 
                 /* Ignore leading whitespace */                  /* Ignore leading whitespace */
                 if (*arg == '\0')                  if (*arg == '\0')
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                 if (!*arg || *arg == '#')                  if (!arg || !*arg || *arg == '#')
                         continue;                          continue;
                   intptr = NULL;
                   charptr = NULL;
                 opcode = parse_token(arg, filename, linenum);                  opcode = parse_token(arg, filename, linenum);
                 switch (opcode) {                  switch (opcode) {
                 case sBadOption:                  case sBadOption:
Line 349 
Line 399 
                                 fatal("%s line %d: ports must be specified before "                                  fatal("%s line %d: ports must be specified before "
                                     "ListenAdress.\n", filename, linenum);                                      "ListenAdress.\n", filename, linenum);
                         if (options->num_ports >= MAX_PORTS)                          if (options->num_ports >= MAX_PORTS)
                                 fatal("%s line %d: too many ports.\n",                                  fatal("%s line %d: too many ports.",
                                     filename, linenum);                                      filename, linenum);
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         if (!arg || *arg == '\0')                          if (!arg || *arg == '\0')
                                 fatal("%s line %d: missing port number.\n",                                  fatal("%s line %d: missing port number.",
                                     filename, linenum);                                      filename, linenum);
                         options->ports[options->num_ports++] = atoi(arg);                          options->ports[options->num_ports++] = a2port(arg);
                           if (options->ports[options->num_ports-1] == 0)
                                   fatal("%s line %d: Badly formatted port number.",
                                       filename, linenum);
                         break;                          break;
   
                 case sServerKeyBits:                  case sServerKeyBits:
                         intptr = &options->server_key_bits;                          intptr = &options->server_key_bits;
 parse_int:  parse_int:
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         if (!arg || *arg == '\0') {                          if (!arg || *arg == '\0')
                                 fprintf(stderr, "%s line %d: missing integer value.\n",                                  fatal("%s line %d: missing integer value.",
                                         filename, linenum);                                      filename, linenum);
                                 exit(1);  
                         }  
                         value = atoi(arg);                          value = atoi(arg);
                         if (*intptr == -1)                          if (*intptr == -1)
                                 *intptr = value;                                  *intptr = value;
Line 382 
Line 433 
   
                 case sListenAddress:                  case sListenAddress:
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         if (!arg || *arg == '\0')                          if (!arg || *arg == '\0' || strncmp(arg, "[]", 2) == 0)
                                 fatal("%s line %d: missing inet addr.\n",                                  fatal("%s line %d: missing inet addr.",
                                     filename, linenum);                                      filename, linenum);
                         add_listen_addr(options, arg);                          if (*arg == '[') {
                                   if ((p = strchr(arg, ']')) == NULL)
                                           fatal("%s line %d: bad ipv6 inet addr usage.",
                                               filename, linenum);
                                   arg++;
                                   memmove(p, p+1, strlen(p+1)+1);
                           } else if (((p = strchr(arg, ':')) == NULL) ||
                                       (strchr(p+1, ':') != NULL)) {
                                   add_listen_addr(options, arg, 0);
                                   break;
                           }
                           if (*p == ':') {
                                   u_short port;
   
                                   p++;
                                   if (*p == '\0')
                                           fatal("%s line %d: bad inet addr:port usage.",
                                               filename, linenum);
                                   else {
                                           *(p-1) = '\0';
                                           if ((port = a2port(p)) == 0)
                                                   fatal("%s line %d: bad port number.",
                                                       filename, linenum);
                                           add_listen_addr(options, arg, port);
                                   }
                           } else if (*p == '\0')
                                   add_listen_addr(options, arg, 0);
                           else
                                   fatal("%s line %d: bad inet addr usage.",
                                       filename, linenum);
                         break;                          break;
   
                 case sHostKeyFile:                  case sHostKeyFile:
                 case sHostDSAKeyFile:                          intptr = &options->num_host_key_files;
                         charptr = (opcode == sHostKeyFile ) ?                          if (*intptr >= MAX_HOSTKEYS)
                             &options->host_key_file : &options->host_dsa_key_file;                                  fatal("%s line %d: too many host keys specified (max %d).",
                                       filename, linenum, MAX_HOSTKEYS);
                           charptr = &options->host_key_files[*intptr];
 parse_filename:  parse_filename:
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         if (!arg || *arg == '\0') {                          if (!arg || *arg == '\0')
                                 fprintf(stderr, "%s line %d: missing file name.\n",                                  fatal("%s line %d: missing file name.",
                                     filename, linenum);                                      filename, linenum);
                                 exit(1);                          if (*charptr == NULL) {
                         }  
                         if (*charptr == NULL)  
                                 *charptr = tilde_expand_filename(arg, getuid());                                  *charptr = tilde_expand_filename(arg, getuid());
                                   /* increase optional counter */
                                   if (intptr != NULL)
                                           *intptr = *intptr + 1;
                           }
                         break;                          break;
   
                 case sPidFile:                  case sPidFile:
                         charptr = &options->pid_file;                          charptr = &options->pid_file;
                         goto parse_filename;                          goto parse_filename;
   
                 case sRandomSeedFile:  
                         fprintf(stderr, "%s line %d: \"randomseed\" option is obsolete.\n",  
                                 filename, linenum);  
                         arg = strdelim(&cp);  
                         break;  
   
                 case sPermitRootLogin:                  case sPermitRootLogin:
                         intptr = &options->permit_root_login;                          intptr = &options->permit_root_login;
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         if (!arg || *arg == '\0') {                          if (!arg || *arg == '\0')
                                 fprintf(stderr, "%s line %d: missing yes/without-password/no argument.\n",                                  fatal("%s line %d: missing yes/"
                                         filename, linenum);                                      "without-password/forced-commands-only/no "
                                 exit(1);                                      "argument.", filename, linenum);
                         }                          value = 0;      /* silence compiler */
                         if (strcmp(arg, "without-password") == 0)                          if (strcmp(arg, "without-password") == 0)
                                 value = 2;                                  value = PERMIT_NO_PASSWD;
                           else if (strcmp(arg, "forced-commands-only") == 0)
                                   value = PERMIT_FORCED_ONLY;
                         else if (strcmp(arg, "yes") == 0)                          else if (strcmp(arg, "yes") == 0)
                                 value = 1;                                  value = PERMIT_YES;
                         else if (strcmp(arg, "no") == 0)                          else if (strcmp(arg, "no") == 0)
                                 value = 0;                                  value = PERMIT_NO;
                         else {                          else
                                 fprintf(stderr, "%s line %d: Bad yes/without-password/no argument: %s\n",                                  fatal("%s line %d: Bad yes/"
                                         filename, linenum, arg);                                      "without-password/forced-commands-only/no "
                                 exit(1);                                      "argument: %s", filename, linenum, arg);
                         }  
                         if (*intptr == -1)                          if (*intptr == -1)
                                 *intptr = value;                                  *intptr = value;
                         break;                          break;
Line 440 
Line 519 
                         intptr = &options->ignore_rhosts;                          intptr = &options->ignore_rhosts;
 parse_flag:  parse_flag:
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         if (!arg || *arg == '\0') {                          if (!arg || *arg == '\0')
                                 fprintf(stderr, "%s line %d: missing yes/no argument.\n",                                  fatal("%s line %d: missing yes/no argument.",
                                         filename, linenum);                                      filename, linenum);
                                 exit(1);                          value = 0;      /* silence compiler */
                         }  
                         if (strcmp(arg, "yes") == 0)                          if (strcmp(arg, "yes") == 0)
                                 value = 1;                                  value = 1;
                         else if (strcmp(arg, "no") == 0)                          else if (strcmp(arg, "no") == 0)
                                 value = 0;                                  value = 0;
                         else {                          else
                                 fprintf(stderr, "%s line %d: Bad yes/no argument: %s\n",                                  fatal("%s line %d: Bad yes/no argument: %s",
                                         filename, linenum, arg);                                          filename, linenum, arg);
                                 exit(1);  
                         }  
                         if (*intptr == -1)                          if (*intptr == -1)
                                 *intptr = value;                                  *intptr = value;
                         break;                          break;
Line 470 
Line 546 
                         intptr = &options->rhosts_rsa_authentication;                          intptr = &options->rhosts_rsa_authentication;
                         goto parse_flag;                          goto parse_flag;
   
                   case sHostbasedAuthentication:
                           intptr = &options->hostbased_authentication;
                           goto parse_flag;
   
                   case sHostbasedUsesNameFromPacketOnly:
                           intptr = &options->hostbased_uses_name_from_packet_only;
                           goto parse_flag;
   
                 case sRSAAuthentication:                  case sRSAAuthentication:
                         intptr = &options->rsa_authentication;                          intptr = &options->rsa_authentication;
                         goto parse_flag;                          goto parse_flag;
   
                 case sDSAAuthentication:                  case sPubkeyAuthentication:
                         intptr = &options->dsa_authentication;                          intptr = &options->pubkey_authentication;
                         goto parse_flag;                          goto parse_flag;
   
 #ifdef KRB4  #ifdef KRB4
Line 514 
Line 598 
                         intptr = &options->check_mail;                          intptr = &options->check_mail;
                         goto parse_flag;                          goto parse_flag;
   
 #ifdef SKEY                  case sChallengeResponseAuthentication:
                 case sSkeyAuthentication:                          intptr = &options->challenge_reponse_authentication;
                         intptr = &options->skey_authentication;  
                         goto parse_flag;                          goto parse_flag;
 #endif  
   
                 case sPrintMotd:                  case sPrintMotd:
                         intptr = &options->print_motd;                          intptr = &options->print_motd;
                         goto parse_flag;                          goto parse_flag;
   
                   case sPrintLastLog:
                           intptr = &options->print_lastlog;
                           goto parse_flag;
   
                 case sX11Forwarding:                  case sX11Forwarding:
                         intptr = &options->x11_forwarding;                          intptr = &options->x11_forwarding;
                         goto parse_flag;                          goto parse_flag;
Line 535 
Line 621 
                 case sXAuthLocation:                  case sXAuthLocation:
                         charptr = &options->xauth_location;                          charptr = &options->xauth_location;
                         goto parse_filename;                          goto parse_filename;
   
                 case sStrictModes:                  case sStrictModes:
                         intptr = &options->strict_modes;                          intptr = &options->strict_modes;
                         goto parse_flag;                          goto parse_flag;
Line 556 
Line 642 
                         intptr = &options->gateway_ports;                          intptr = &options->gateway_ports;
                         goto parse_flag;                          goto parse_flag;
   
                   case sReverseMappingCheck:
                           intptr = &options->reverse_mapping_check;
                           goto parse_flag;
   
                 case sLogFacility:                  case sLogFacility:
                         intptr = (int *) &options->log_facility;                          intptr = (int *) &options->log_facility;
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         value = log_facility_number(arg);                          value = log_facility_number(arg);
                         if (value == (SyslogFacility) - 1)                          if (value == (SyslogFacility) - 1)
                                 fatal("%.200s line %d: unsupported log facility '%s'\n",                                  fatal("%.200s line %d: unsupported log facility '%s'",
                                     filename, linenum, arg ? arg : "<NONE>");                                      filename, linenum, arg ? arg : "<NONE>");
                         if (*intptr == -1)                          if (*intptr == -1)
                                 *intptr = (SyslogFacility) value;                                  *intptr = (SyslogFacility) value;
Line 572 
Line 662 
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         value = log_level_number(arg);                          value = log_level_number(arg);
                         if (value == (LogLevel) - 1)                          if (value == (LogLevel) - 1)
                                 fatal("%.200s line %d: unsupported log level '%s'\n",                                  fatal("%.200s line %d: unsupported log level '%s'",
                                     filename, linenum, arg ? arg : "<NONE>");                                      filename, linenum, arg ? arg : "<NONE>");
                         if (*intptr == -1)                          if (*intptr == -1)
                                 *intptr = (LogLevel) value;                                  *intptr = (LogLevel) value;
Line 585 
Line 675 
                 case sAllowUsers:                  case sAllowUsers:
                         while ((arg = strdelim(&cp)) && *arg != '\0') {                          while ((arg = strdelim(&cp)) && *arg != '\0') {
                                 if (options->num_allow_users >= MAX_ALLOW_USERS)                                  if (options->num_allow_users >= MAX_ALLOW_USERS)
                                         fatal("%s line %d: too many allow users.\n",                                          fatal("%s line %d: too many allow users.",
                                             filename, linenum);                                              filename, linenum);
                                 options->allow_users[options->num_allow_users++] = xstrdup(arg);                                  options->allow_users[options->num_allow_users++] = xstrdup(arg);
                         }                          }
Line 594 
Line 684 
                 case sDenyUsers:                  case sDenyUsers:
                         while ((arg = strdelim(&cp)) && *arg != '\0') {                          while ((arg = strdelim(&cp)) && *arg != '\0') {
                                 if (options->num_deny_users >= MAX_DENY_USERS)                                  if (options->num_deny_users >= MAX_DENY_USERS)
                                         fatal( "%s line %d: too many deny users.\n",                                          fatal( "%s line %d: too many deny users.",
                                             filename, linenum);                                              filename, linenum);
                                 options->deny_users[options->num_deny_users++] = xstrdup(arg);                                  options->deny_users[options->num_deny_users++] = xstrdup(arg);
                         }                          }
Line 603 
Line 693 
                 case sAllowGroups:                  case sAllowGroups:
                         while ((arg = strdelim(&cp)) && *arg != '\0') {                          while ((arg = strdelim(&cp)) && *arg != '\0') {
                                 if (options->num_allow_groups >= MAX_ALLOW_GROUPS)                                  if (options->num_allow_groups >= MAX_ALLOW_GROUPS)
                                         fatal("%s line %d: too many allow groups.\n",                                          fatal("%s line %d: too many allow groups.",
                                             filename, linenum);                                              filename, linenum);
                                 options->allow_groups[options->num_allow_groups++] = xstrdup(arg);                                  options->allow_groups[options->num_allow_groups++] = xstrdup(arg);
                         }                          }
Line 612 
Line 702 
                 case sDenyGroups:                  case sDenyGroups:
                         while ((arg = strdelim(&cp)) && *arg != '\0') {                          while ((arg = strdelim(&cp)) && *arg != '\0') {
                                 if (options->num_deny_groups >= MAX_DENY_GROUPS)                                  if (options->num_deny_groups >= MAX_DENY_GROUPS)
                                         fatal("%s line %d: too many deny groups.\n",                                          fatal("%s line %d: too many deny groups.",
                                             filename, linenum);                                              filename, linenum);
                                 options->deny_groups[options->num_deny_groups++] = xstrdup(arg);                                  options->deny_groups[options->num_deny_groups++] = xstrdup(arg);
                         }                          }
Line 629 
Line 719 
                                 options->ciphers = xstrdup(arg);                                  options->ciphers = xstrdup(arg);
                         break;                          break;
   
                   case sMacs:
                           arg = strdelim(&cp);
                           if (!arg || *arg == '\0')
                                   fatal("%s line %d: Missing argument.", filename, linenum);
                           if (!mac_valid(arg))
                                   fatal("%s line %d: Bad SSH2 mac spec '%s'.",
                                       filename, linenum, arg ? arg : "<NONE>");
                           if (options->macs == NULL)
                                   options->macs = xstrdup(arg);
                           break;
   
                 case sProtocol:                  case sProtocol:
                         intptr = &options->protocol;                          intptr = &options->protocol;
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
Line 684 
Line 785 
                         intptr = &options->max_startups;                          intptr = &options->max_startups;
                         goto parse_int;                          goto parse_int;
   
                   case sBanner:
                           charptr = &options->banner;
                           goto parse_filename;
                   case sClientAliveInterval:
                           intptr = &options->client_alive_interval;
                           goto parse_int;
                   case sClientAliveCountMax:
                           intptr = &options->client_alive_count_max;
                           goto parse_int;
                 default:                  default:
                         fprintf(stderr, "%s line %d: Missing handler for opcode %s (%d)\n",                          fatal("%s line %d: Missing handler for opcode %s (%d)",
                                 filename, linenum, arg, opcode);                              filename, linenum, arg, opcode);
                         exit(1);  
                 }                  }
                 if ((arg = strdelim(&cp)) != NULL && *arg != '\0') {                  if ((arg = strdelim(&cp)) != NULL && *arg != '\0')
                         fprintf(stderr,                          fatal("%s line %d: garbage at end of line; \"%.200s\".",
                                 "%s line %d: garbage at end of line; \"%.200s\".\n",                              filename, linenum, arg);
                                 filename, linenum, arg);  
                         exit(1);  
                 }  
         }          }
         fclose(f);          fclose(f);
         if (bad_options > 0) {          if (bad_options > 0)
                 fprintf(stderr, "%s: terminating, %d bad configuration options\n",                  fatal("%s: terminating, %d bad configuration options",
                         filename, bad_options);                      filename, bad_options);
                 exit(1);  
         }  
 }  }

Legend:
Removed from v.1.53  
changed lines
  Added in v.1.53.2.4