1511b41d2SMark Murray /* 2511b41d2SMark Murray * 3511b41d2SMark Murray * servconf.c 4511b41d2SMark Murray * 5511b41d2SMark Murray * Author: Tatu Ylonen <ylo@cs.hut.fi> 6511b41d2SMark Murray * 7511b41d2SMark Murray * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 8511b41d2SMark Murray * All rights reserved 9511b41d2SMark Murray * 10511b41d2SMark Murray * Created: Mon Aug 21 15:48:58 1995 ylo 11511b41d2SMark Murray * 1242f71286SMark Murray * $FreeBSD$ 13511b41d2SMark Murray */ 14511b41d2SMark Murray 15511b41d2SMark Murray #include "includes.h" 16511b41d2SMark Murray RCSID("$Id: servconf.c,v 1.29 2000/01/04 00:07:59 markus Exp $"); 17511b41d2SMark Murray 18511b41d2SMark Murray #include "ssh.h" 19511b41d2SMark Murray #include "servconf.h" 20511b41d2SMark Murray #include "xmalloc.h" 21511b41d2SMark Murray 22511b41d2SMark Murray /* add listen address */ 23511b41d2SMark Murray void add_listen_addr(ServerOptions *options, char *addr); 24511b41d2SMark Murray 25511b41d2SMark Murray /* Initializes the server options to their default values. */ 26511b41d2SMark Murray 27511b41d2SMark Murray void 28511b41d2SMark Murray initialize_server_options(ServerOptions *options) 29511b41d2SMark Murray { 30511b41d2SMark Murray memset(options, 0, sizeof(*options)); 31511b41d2SMark Murray options->num_ports = 0; 32511b41d2SMark Murray options->ports_from_cmdline = 0; 33511b41d2SMark Murray options->listen_addrs = NULL; 34511b41d2SMark Murray options->host_key_file = NULL; 35511b41d2SMark Murray options->server_key_bits = -1; 36511b41d2SMark Murray options->login_grace_time = -1; 37511b41d2SMark Murray options->key_regeneration_time = -1; 38511b41d2SMark Murray options->permit_root_login = -1; 39511b41d2SMark Murray options->ignore_rhosts = -1; 40511b41d2SMark Murray options->ignore_user_known_hosts = -1; 41511b41d2SMark Murray options->print_motd = -1; 42511b41d2SMark Murray options->check_mail = -1; 43511b41d2SMark Murray options->x11_forwarding = -1; 44511b41d2SMark Murray options->x11_display_offset = -1; 45511b41d2SMark Murray options->strict_modes = -1; 46511b41d2SMark Murray options->keepalives = -1; 47511b41d2SMark Murray options->log_facility = (SyslogFacility) - 1; 48511b41d2SMark Murray options->log_level = (LogLevel) - 1; 49511b41d2SMark Murray options->rhosts_authentication = -1; 50511b41d2SMark Murray options->rhosts_rsa_authentication = -1; 51511b41d2SMark Murray options->rsa_authentication = -1; 52511b41d2SMark Murray #ifdef KRB4 53511b41d2SMark Murray options->kerberos_authentication = -1; 54511b41d2SMark Murray options->kerberos_or_local_passwd = -1; 55511b41d2SMark Murray options->kerberos_ticket_cleanup = -1; 56511b41d2SMark Murray #endif 57511b41d2SMark Murray #ifdef AFS 58511b41d2SMark Murray options->kerberos_tgt_passing = -1; 59511b41d2SMark Murray options->afs_token_passing = -1; 60511b41d2SMark Murray #endif 61511b41d2SMark Murray options->password_authentication = -1; 62511b41d2SMark Murray #ifdef SKEY 63511b41d2SMark Murray options->skey_authentication = -1; 64511b41d2SMark Murray #endif 65511b41d2SMark Murray options->permit_empty_passwd = -1; 66511b41d2SMark Murray options->use_login = -1; 67511b41d2SMark Murray options->num_allow_users = 0; 68511b41d2SMark Murray options->num_deny_users = 0; 69511b41d2SMark Murray options->num_allow_groups = 0; 70511b41d2SMark Murray options->num_deny_groups = 0; 7142f71286SMark Murray options->connections_per_period = 0; 7242f71286SMark Murray options->connections_period = 0; 73511b41d2SMark Murray } 74511b41d2SMark Murray 75511b41d2SMark Murray void 76511b41d2SMark Murray fill_default_server_options(ServerOptions *options) 77511b41d2SMark Murray { 78511b41d2SMark Murray if (options->num_ports == 0) 79511b41d2SMark Murray options->ports[options->num_ports++] = SSH_DEFAULT_PORT; 80511b41d2SMark Murray if (options->listen_addrs == NULL) 81511b41d2SMark Murray add_listen_addr(options, NULL); 82511b41d2SMark Murray if (options->host_key_file == NULL) 83511b41d2SMark Murray options->host_key_file = HOST_KEY_FILE; 84511b41d2SMark Murray if (options->server_key_bits == -1) 85511b41d2SMark Murray options->server_key_bits = 768; 86511b41d2SMark Murray if (options->login_grace_time == -1) 87511b41d2SMark Murray options->login_grace_time = 600; 88511b41d2SMark Murray if (options->key_regeneration_time == -1) 89511b41d2SMark Murray options->key_regeneration_time = 3600; 90511b41d2SMark Murray if (options->permit_root_login == -1) 91511b41d2SMark Murray options->permit_root_login = 1; /* yes */ 92511b41d2SMark Murray if (options->ignore_rhosts == -1) 93511b41d2SMark Murray options->ignore_rhosts = 0; 94511b41d2SMark Murray if (options->ignore_user_known_hosts == -1) 95511b41d2SMark Murray options->ignore_user_known_hosts = 0; 96511b41d2SMark Murray if (options->check_mail == -1) 97511b41d2SMark Murray options->check_mail = 0; 98511b41d2SMark Murray if (options->print_motd == -1) 99511b41d2SMark Murray options->print_motd = 1; 100511b41d2SMark Murray if (options->x11_forwarding == -1) 101511b41d2SMark Murray options->x11_forwarding = 1; 102511b41d2SMark Murray if (options->x11_display_offset == -1) 103511b41d2SMark Murray options->x11_display_offset = 1; 104511b41d2SMark Murray if (options->strict_modes == -1) 105511b41d2SMark Murray options->strict_modes = 1; 106511b41d2SMark Murray if (options->keepalives == -1) 107511b41d2SMark Murray options->keepalives = 1; 108511b41d2SMark Murray if (options->log_facility == (SyslogFacility) (-1)) 109511b41d2SMark Murray options->log_facility = SYSLOG_FACILITY_AUTH; 110511b41d2SMark Murray if (options->log_level == (LogLevel) (-1)) 111511b41d2SMark Murray options->log_level = SYSLOG_LEVEL_INFO; 112511b41d2SMark Murray if (options->rhosts_authentication == -1) 113511b41d2SMark Murray options->rhosts_authentication = 0; 114511b41d2SMark Murray if (options->rhosts_rsa_authentication == -1) 115511b41d2SMark Murray options->rhosts_rsa_authentication = 1; 116511b41d2SMark Murray if (options->rsa_authentication == -1) 117511b41d2SMark Murray options->rsa_authentication = 1; 118511b41d2SMark Murray #ifdef KRB4 119511b41d2SMark Murray if (options->kerberos_authentication == -1) 120511b41d2SMark Murray options->kerberos_authentication = (access(KEYFILE, R_OK) == 0); 121511b41d2SMark Murray if (options->kerberos_or_local_passwd == -1) 122511b41d2SMark Murray options->kerberos_or_local_passwd = 1; 123511b41d2SMark Murray if (options->kerberos_ticket_cleanup == -1) 124511b41d2SMark Murray options->kerberos_ticket_cleanup = 1; 125511b41d2SMark Murray #endif /* KRB4 */ 126511b41d2SMark Murray #ifdef AFS 127511b41d2SMark Murray if (options->kerberos_tgt_passing == -1) 128511b41d2SMark Murray options->kerberos_tgt_passing = 0; 129511b41d2SMark Murray if (options->afs_token_passing == -1) 130511b41d2SMark Murray options->afs_token_passing = k_hasafs(); 131511b41d2SMark Murray #endif /* AFS */ 132511b41d2SMark Murray if (options->password_authentication == -1) 133511b41d2SMark Murray options->password_authentication = 1; 134511b41d2SMark Murray #ifdef SKEY 135511b41d2SMark Murray if (options->skey_authentication == -1) 136511b41d2SMark Murray options->skey_authentication = 1; 137511b41d2SMark Murray #endif 138511b41d2SMark Murray if (options->permit_empty_passwd == -1) 139511b41d2SMark Murray options->permit_empty_passwd = 1; 140511b41d2SMark Murray if (options->use_login == -1) 141511b41d2SMark Murray options->use_login = 0; 142511b41d2SMark Murray } 143511b41d2SMark Murray 144511b41d2SMark Murray #define WHITESPACE " \t\r\n" 145511b41d2SMark Murray 146511b41d2SMark Murray /* Keyword tokens. */ 147511b41d2SMark Murray typedef enum { 148511b41d2SMark Murray sBadOption, /* == unknown option */ 149511b41d2SMark Murray sPort, sHostKeyFile, sServerKeyBits, sLoginGraceTime, sKeyRegenerationTime, 150511b41d2SMark Murray sPermitRootLogin, sLogFacility, sLogLevel, 151511b41d2SMark Murray sRhostsAuthentication, sRhostsRSAAuthentication, sRSAAuthentication, 152511b41d2SMark Murray #ifdef KRB4 153511b41d2SMark Murray sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTicketCleanup, 154511b41d2SMark Murray #endif 155511b41d2SMark Murray #ifdef AFS 156511b41d2SMark Murray sKerberosTgtPassing, sAFSTokenPassing, 157511b41d2SMark Murray #endif 158511b41d2SMark Murray #ifdef SKEY 159511b41d2SMark Murray sSkeyAuthentication, 160511b41d2SMark Murray #endif 161511b41d2SMark Murray sPasswordAuthentication, sListenAddress, 162511b41d2SMark Murray sPrintMotd, sIgnoreRhosts, sX11Forwarding, sX11DisplayOffset, 163511b41d2SMark Murray sStrictModes, sEmptyPasswd, sRandomSeedFile, sKeepAlives, sCheckMail, 164511b41d2SMark Murray sUseLogin, sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups, 16542f71286SMark Murray sIgnoreUserKnownHosts, sConnectionsPerPeriod 166511b41d2SMark Murray } ServerOpCodes; 167511b41d2SMark Murray 168511b41d2SMark Murray /* Textual representation of the tokens. */ 169511b41d2SMark Murray static struct { 170511b41d2SMark Murray const char *name; 171511b41d2SMark Murray ServerOpCodes opcode; 172511b41d2SMark Murray } keywords[] = { 173511b41d2SMark Murray { "port", sPort }, 174511b41d2SMark Murray { "hostkey", sHostKeyFile }, 175511b41d2SMark Murray { "serverkeybits", sServerKeyBits }, 176511b41d2SMark Murray { "logingracetime", sLoginGraceTime }, 177511b41d2SMark Murray { "keyregenerationinterval", sKeyRegenerationTime }, 178511b41d2SMark Murray { "permitrootlogin", sPermitRootLogin }, 179511b41d2SMark Murray { "syslogfacility", sLogFacility }, 180511b41d2SMark Murray { "loglevel", sLogLevel }, 181511b41d2SMark Murray { "rhostsauthentication", sRhostsAuthentication }, 182511b41d2SMark Murray { "rhostsrsaauthentication", sRhostsRSAAuthentication }, 183511b41d2SMark Murray { "rsaauthentication", sRSAAuthentication }, 184511b41d2SMark Murray #ifdef KRB4 185511b41d2SMark Murray { "kerberosauthentication", sKerberosAuthentication }, 186511b41d2SMark Murray { "kerberosorlocalpasswd", sKerberosOrLocalPasswd }, 187511b41d2SMark Murray { "kerberosticketcleanup", sKerberosTicketCleanup }, 188511b41d2SMark Murray #endif 189511b41d2SMark Murray #ifdef AFS 190511b41d2SMark Murray { "kerberostgtpassing", sKerberosTgtPassing }, 191511b41d2SMark Murray { "afstokenpassing", sAFSTokenPassing }, 192511b41d2SMark Murray #endif 193511b41d2SMark Murray { "passwordauthentication", sPasswordAuthentication }, 194511b41d2SMark Murray #ifdef SKEY 195511b41d2SMark Murray { "skeyauthentication", sSkeyAuthentication }, 196511b41d2SMark Murray #endif 197511b41d2SMark Murray { "checkmail", sCheckMail }, 198511b41d2SMark Murray { "listenaddress", sListenAddress }, 199511b41d2SMark Murray { "printmotd", sPrintMotd }, 200511b41d2SMark Murray { "ignorerhosts", sIgnoreRhosts }, 201511b41d2SMark Murray { "ignoreuserknownhosts", sIgnoreUserKnownHosts }, 202511b41d2SMark Murray { "x11forwarding", sX11Forwarding }, 203511b41d2SMark Murray { "x11displayoffset", sX11DisplayOffset }, 204511b41d2SMark Murray { "strictmodes", sStrictModes }, 205511b41d2SMark Murray { "permitemptypasswords", sEmptyPasswd }, 206511b41d2SMark Murray { "uselogin", sUseLogin }, 207511b41d2SMark Murray { "randomseed", sRandomSeedFile }, 208511b41d2SMark Murray { "keepalive", sKeepAlives }, 209511b41d2SMark Murray { "allowusers", sAllowUsers }, 210511b41d2SMark Murray { "denyusers", sDenyUsers }, 211511b41d2SMark Murray { "allowgroups", sAllowGroups }, 212511b41d2SMark Murray { "denygroups", sDenyGroups }, 21342f71286SMark Murray { "connectionsperperiod", sConnectionsPerPeriod }, 214511b41d2SMark Murray { NULL, 0 } 215511b41d2SMark Murray }; 216511b41d2SMark Murray 217511b41d2SMark Murray /* 218511b41d2SMark Murray * Returns the number of the token pointed to by cp of length len. Never 219511b41d2SMark Murray * returns if the token is not known. 220511b41d2SMark Murray */ 221511b41d2SMark Murray 222511b41d2SMark Murray static ServerOpCodes 223511b41d2SMark Murray parse_token(const char *cp, const char *filename, 224511b41d2SMark Murray int linenum) 225511b41d2SMark Murray { 226511b41d2SMark Murray unsigned int i; 227511b41d2SMark Murray 228511b41d2SMark Murray for (i = 0; keywords[i].name; i++) 229511b41d2SMark Murray if (strcasecmp(cp, keywords[i].name) == 0) 230511b41d2SMark Murray return keywords[i].opcode; 231511b41d2SMark Murray 232511b41d2SMark Murray fprintf(stderr, "%s: line %d: Bad configuration option: %s\n", 233511b41d2SMark Murray filename, linenum, cp); 234511b41d2SMark Murray return sBadOption; 235511b41d2SMark Murray } 236511b41d2SMark Murray 237511b41d2SMark Murray /* 238511b41d2SMark Murray * add listen address 239511b41d2SMark Murray */ 240511b41d2SMark Murray void 241511b41d2SMark Murray add_listen_addr(ServerOptions *options, char *addr) 242511b41d2SMark Murray { 243511b41d2SMark Murray extern int IPv4or6; 244511b41d2SMark Murray struct addrinfo hints, *ai, *aitop; 245511b41d2SMark Murray char strport[NI_MAXSERV]; 246511b41d2SMark Murray int gaierr; 247511b41d2SMark Murray int i; 248511b41d2SMark Murray 249511b41d2SMark Murray if (options->num_ports == 0) 250511b41d2SMark Murray options->ports[options->num_ports++] = SSH_DEFAULT_PORT; 251511b41d2SMark Murray for (i = 0; i < options->num_ports; i++) { 252511b41d2SMark Murray memset(&hints, 0, sizeof(hints)); 253511b41d2SMark Murray hints.ai_family = IPv4or6; 254511b41d2SMark Murray hints.ai_socktype = SOCK_STREAM; 255511b41d2SMark Murray hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0; 256511b41d2SMark Murray snprintf(strport, sizeof strport, "%d", options->ports[i]); 257511b41d2SMark Murray if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0) 258511b41d2SMark Murray fatal("bad addr or host: %s (%s)\n", 259511b41d2SMark Murray addr ? addr : "<NULL>", 260511b41d2SMark Murray gai_strerror(gaierr)); 261511b41d2SMark Murray for (ai = aitop; ai->ai_next; ai = ai->ai_next) 262511b41d2SMark Murray ; 263511b41d2SMark Murray ai->ai_next = options->listen_addrs; 264511b41d2SMark Murray options->listen_addrs = aitop; 265511b41d2SMark Murray } 266511b41d2SMark Murray } 267511b41d2SMark Murray 268511b41d2SMark Murray /* Reads the server configuration file. */ 269511b41d2SMark Murray 270511b41d2SMark Murray void 271511b41d2SMark Murray read_server_config(ServerOptions *options, const char *filename) 272511b41d2SMark Murray { 273511b41d2SMark Murray FILE *f; 274511b41d2SMark Murray char line[1024]; 275511b41d2SMark Murray char *cp, **charptr; 276511b41d2SMark Murray int linenum, *intptr, value; 277511b41d2SMark Murray int bad_options = 0; 278511b41d2SMark Murray ServerOpCodes opcode; 279511b41d2SMark Murray 280511b41d2SMark Murray f = fopen(filename, "r"); 281511b41d2SMark Murray if (!f) { 282511b41d2SMark Murray perror(filename); 283511b41d2SMark Murray exit(1); 284511b41d2SMark Murray } 285511b41d2SMark Murray linenum = 0; 286511b41d2SMark Murray while (fgets(line, sizeof(line), f)) { 287511b41d2SMark Murray linenum++; 288511b41d2SMark Murray cp = line + strspn(line, WHITESPACE); 289511b41d2SMark Murray if (!*cp || *cp == '#') 290511b41d2SMark Murray continue; 291511b41d2SMark Murray cp = strtok(cp, WHITESPACE); 292511b41d2SMark Murray opcode = parse_token(cp, filename, linenum); 293511b41d2SMark Murray switch (opcode) { 294511b41d2SMark Murray case sBadOption: 295511b41d2SMark Murray bad_options++; 296511b41d2SMark Murray continue; 297511b41d2SMark Murray case sPort: 298511b41d2SMark Murray /* ignore ports from configfile if cmdline specifies ports */ 299511b41d2SMark Murray if (options->ports_from_cmdline) 300511b41d2SMark Murray continue; 301511b41d2SMark Murray if (options->listen_addrs != NULL) 302511b41d2SMark Murray fatal("%s line %d: ports must be specified before " 303511b41d2SMark Murray "ListenAdress.\n", filename, linenum); 304511b41d2SMark Murray if (options->num_ports >= MAX_PORTS) 305511b41d2SMark Murray fatal("%s line %d: too many ports.\n", 306511b41d2SMark Murray filename, linenum); 307511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 308511b41d2SMark Murray if (!cp) 309511b41d2SMark Murray fatal("%s line %d: missing port number.\n", 310511b41d2SMark Murray filename, linenum); 311511b41d2SMark Murray options->ports[options->num_ports++] = atoi(cp); 312511b41d2SMark Murray break; 313511b41d2SMark Murray 314511b41d2SMark Murray case sServerKeyBits: 315511b41d2SMark Murray intptr = &options->server_key_bits; 316511b41d2SMark Murray parse_int: 317511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 318511b41d2SMark Murray if (!cp) { 319511b41d2SMark Murray fprintf(stderr, "%s line %d: missing integer value.\n", 320511b41d2SMark Murray filename, linenum); 321511b41d2SMark Murray exit(1); 322511b41d2SMark Murray } 32342f71286SMark Murray if (sscanf(cp, " %d ", &value) != 1) { 32442f71286SMark Murray fprintf(stderr, "%s line %d: invalid integer value.\n", 32542f71286SMark Murray filename, linenum); 32642f71286SMark Murray exit(1); 32742f71286SMark Murray } 328511b41d2SMark Murray if (*intptr == -1) 329511b41d2SMark Murray *intptr = value; 330511b41d2SMark Murray break; 331511b41d2SMark Murray 332511b41d2SMark Murray case sLoginGraceTime: 333511b41d2SMark Murray intptr = &options->login_grace_time; 334511b41d2SMark Murray goto parse_int; 335511b41d2SMark Murray 336511b41d2SMark Murray case sKeyRegenerationTime: 337511b41d2SMark Murray intptr = &options->key_regeneration_time; 338511b41d2SMark Murray goto parse_int; 339511b41d2SMark Murray 340511b41d2SMark Murray case sListenAddress: 341511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 342511b41d2SMark Murray if (!cp) 343511b41d2SMark Murray fatal("%s line %d: missing inet addr.\n", 344511b41d2SMark Murray filename, linenum); 345511b41d2SMark Murray add_listen_addr(options, cp); 346511b41d2SMark Murray break; 347511b41d2SMark Murray 348511b41d2SMark Murray case sHostKeyFile: 349511b41d2SMark Murray charptr = &options->host_key_file; 350511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 351511b41d2SMark Murray if (!cp) { 352511b41d2SMark Murray fprintf(stderr, "%s line %d: missing file name.\n", 353511b41d2SMark Murray filename, linenum); 354511b41d2SMark Murray exit(1); 355511b41d2SMark Murray } 356511b41d2SMark Murray if (*charptr == NULL) 357511b41d2SMark Murray *charptr = tilde_expand_filename(cp, getuid()); 358511b41d2SMark Murray break; 359511b41d2SMark Murray 360511b41d2SMark Murray case sRandomSeedFile: 361511b41d2SMark Murray fprintf(stderr, "%s line %d: \"randomseed\" option is obsolete.\n", 362511b41d2SMark Murray filename, linenum); 363511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 364511b41d2SMark Murray break; 365511b41d2SMark Murray 366511b41d2SMark Murray case sPermitRootLogin: 367511b41d2SMark Murray intptr = &options->permit_root_login; 368511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 369511b41d2SMark Murray if (!cp) { 370511b41d2SMark Murray fprintf(stderr, "%s line %d: missing yes/without-password/no argument.\n", 371511b41d2SMark Murray filename, linenum); 372511b41d2SMark Murray exit(1); 373511b41d2SMark Murray } 374511b41d2SMark Murray if (strcmp(cp, "without-password") == 0) 375511b41d2SMark Murray value = 2; 376511b41d2SMark Murray else if (strcmp(cp, "yes") == 0) 377511b41d2SMark Murray value = 1; 378511b41d2SMark Murray else if (strcmp(cp, "no") == 0) 379511b41d2SMark Murray value = 0; 380511b41d2SMark Murray else { 381511b41d2SMark Murray fprintf(stderr, "%s line %d: Bad yes/without-password/no argument: %s\n", 382511b41d2SMark Murray filename, linenum, cp); 383511b41d2SMark Murray exit(1); 384511b41d2SMark Murray } 385511b41d2SMark Murray if (*intptr == -1) 386511b41d2SMark Murray *intptr = value; 387511b41d2SMark Murray break; 388511b41d2SMark Murray 389511b41d2SMark Murray case sIgnoreRhosts: 390511b41d2SMark Murray intptr = &options->ignore_rhosts; 391511b41d2SMark Murray parse_flag: 392511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 393511b41d2SMark Murray if (!cp) { 394511b41d2SMark Murray fprintf(stderr, "%s line %d: missing yes/no argument.\n", 395511b41d2SMark Murray filename, linenum); 396511b41d2SMark Murray exit(1); 397511b41d2SMark Murray } 398511b41d2SMark Murray if (strcmp(cp, "yes") == 0) 399511b41d2SMark Murray value = 1; 400511b41d2SMark Murray else if (strcmp(cp, "no") == 0) 401511b41d2SMark Murray value = 0; 402511b41d2SMark Murray else { 403511b41d2SMark Murray fprintf(stderr, "%s line %d: Bad yes/no argument: %s\n", 404511b41d2SMark Murray filename, linenum, cp); 405511b41d2SMark Murray exit(1); 406511b41d2SMark Murray } 407511b41d2SMark Murray if (*intptr == -1) 408511b41d2SMark Murray *intptr = value; 409511b41d2SMark Murray break; 410511b41d2SMark Murray 411511b41d2SMark Murray case sIgnoreUserKnownHosts: 412511b41d2SMark Murray intptr = &options->ignore_user_known_hosts; 413511b41d2SMark Murray goto parse_int; 414511b41d2SMark Murray 415511b41d2SMark Murray case sRhostsAuthentication: 416511b41d2SMark Murray intptr = &options->rhosts_authentication; 417511b41d2SMark Murray goto parse_flag; 418511b41d2SMark Murray 419511b41d2SMark Murray case sRhostsRSAAuthentication: 420511b41d2SMark Murray intptr = &options->rhosts_rsa_authentication; 421511b41d2SMark Murray goto parse_flag; 422511b41d2SMark Murray 423511b41d2SMark Murray case sRSAAuthentication: 424511b41d2SMark Murray intptr = &options->rsa_authentication; 425511b41d2SMark Murray goto parse_flag; 426511b41d2SMark Murray 427511b41d2SMark Murray #ifdef KRB4 428511b41d2SMark Murray case sKerberosAuthentication: 429511b41d2SMark Murray intptr = &options->kerberos_authentication; 430511b41d2SMark Murray goto parse_flag; 431511b41d2SMark Murray 432511b41d2SMark Murray case sKerberosOrLocalPasswd: 433511b41d2SMark Murray intptr = &options->kerberos_or_local_passwd; 434511b41d2SMark Murray goto parse_flag; 435511b41d2SMark Murray 436511b41d2SMark Murray case sKerberosTicketCleanup: 437511b41d2SMark Murray intptr = &options->kerberos_ticket_cleanup; 438511b41d2SMark Murray goto parse_flag; 439511b41d2SMark Murray #endif 440511b41d2SMark Murray 441511b41d2SMark Murray #ifdef AFS 442511b41d2SMark Murray case sKerberosTgtPassing: 443511b41d2SMark Murray intptr = &options->kerberos_tgt_passing; 444511b41d2SMark Murray goto parse_flag; 445511b41d2SMark Murray 446511b41d2SMark Murray case sAFSTokenPassing: 447511b41d2SMark Murray intptr = &options->afs_token_passing; 448511b41d2SMark Murray goto parse_flag; 449511b41d2SMark Murray #endif 450511b41d2SMark Murray 451511b41d2SMark Murray case sPasswordAuthentication: 452511b41d2SMark Murray intptr = &options->password_authentication; 453511b41d2SMark Murray goto parse_flag; 454511b41d2SMark Murray 455511b41d2SMark Murray case sCheckMail: 456511b41d2SMark Murray intptr = &options->check_mail; 457511b41d2SMark Murray goto parse_flag; 458511b41d2SMark Murray 459511b41d2SMark Murray #ifdef SKEY 460511b41d2SMark Murray case sSkeyAuthentication: 461511b41d2SMark Murray intptr = &options->skey_authentication; 462511b41d2SMark Murray goto parse_flag; 463511b41d2SMark Murray #endif 464511b41d2SMark Murray 465511b41d2SMark Murray case sPrintMotd: 466511b41d2SMark Murray intptr = &options->print_motd; 467511b41d2SMark Murray goto parse_flag; 468511b41d2SMark Murray 469511b41d2SMark Murray case sX11Forwarding: 470511b41d2SMark Murray intptr = &options->x11_forwarding; 471511b41d2SMark Murray goto parse_flag; 472511b41d2SMark Murray 473511b41d2SMark Murray case sX11DisplayOffset: 474511b41d2SMark Murray intptr = &options->x11_display_offset; 475511b41d2SMark Murray goto parse_int; 476511b41d2SMark Murray 477511b41d2SMark Murray case sStrictModes: 478511b41d2SMark Murray intptr = &options->strict_modes; 479511b41d2SMark Murray goto parse_flag; 480511b41d2SMark Murray 481511b41d2SMark Murray case sKeepAlives: 482511b41d2SMark Murray intptr = &options->keepalives; 483511b41d2SMark Murray goto parse_flag; 484511b41d2SMark Murray 485511b41d2SMark Murray case sEmptyPasswd: 486511b41d2SMark Murray intptr = &options->permit_empty_passwd; 487511b41d2SMark Murray goto parse_flag; 488511b41d2SMark Murray 489511b41d2SMark Murray case sUseLogin: 490511b41d2SMark Murray intptr = &options->use_login; 491511b41d2SMark Murray goto parse_flag; 492511b41d2SMark Murray 493511b41d2SMark Murray case sLogFacility: 494511b41d2SMark Murray intptr = (int *) &options->log_facility; 495511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 496511b41d2SMark Murray value = log_facility_number(cp); 497511b41d2SMark Murray if (value == (SyslogFacility) - 1) 498511b41d2SMark Murray fatal("%.200s line %d: unsupported log facility '%s'\n", 499511b41d2SMark Murray filename, linenum, cp ? cp : "<NONE>"); 500511b41d2SMark Murray if (*intptr == -1) 501511b41d2SMark Murray *intptr = (SyslogFacility) value; 502511b41d2SMark Murray break; 503511b41d2SMark Murray 504511b41d2SMark Murray case sLogLevel: 505511b41d2SMark Murray intptr = (int *) &options->log_level; 506511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 507511b41d2SMark Murray value = log_level_number(cp); 508511b41d2SMark Murray if (value == (LogLevel) - 1) 509511b41d2SMark Murray fatal("%.200s line %d: unsupported log level '%s'\n", 510511b41d2SMark Murray filename, linenum, cp ? cp : "<NONE>"); 511511b41d2SMark Murray if (*intptr == -1) 512511b41d2SMark Murray *intptr = (LogLevel) value; 513511b41d2SMark Murray break; 514511b41d2SMark Murray 515511b41d2SMark Murray case sAllowUsers: 516511b41d2SMark Murray while ((cp = strtok(NULL, WHITESPACE))) { 51742f71286SMark Murray if (options->num_allow_users >= MAX_ALLOW_USERS) 51842f71286SMark Murray fatal("%.200s line %d: too many allow users.\n", filename, 51942f71286SMark Murray linenum); 520511b41d2SMark Murray options->allow_users[options->num_allow_users++] = xstrdup(cp); 521511b41d2SMark Murray } 522511b41d2SMark Murray break; 523511b41d2SMark Murray 524511b41d2SMark Murray case sDenyUsers: 525511b41d2SMark Murray while ((cp = strtok(NULL, WHITESPACE))) { 52642f71286SMark Murray if (options->num_deny_users >= MAX_DENY_USERS) 52742f71286SMark Murray fatal("%.200s line %d: too many deny users.\n", filename, 52842f71286SMark Murray linenum); 529511b41d2SMark Murray options->deny_users[options->num_deny_users++] = xstrdup(cp); 530511b41d2SMark Murray } 531511b41d2SMark Murray break; 532511b41d2SMark Murray 533511b41d2SMark Murray case sAllowGroups: 534511b41d2SMark Murray while ((cp = strtok(NULL, WHITESPACE))) { 53542f71286SMark Murray if (options->num_allow_groups >= MAX_ALLOW_GROUPS) 53642f71286SMark Murray fatal("%.200s line %d: too many allow groups.\n", filename, 53742f71286SMark Murray linenum); 538511b41d2SMark Murray options->allow_groups[options->num_allow_groups++] = xstrdup(cp); 539511b41d2SMark Murray } 540511b41d2SMark Murray break; 541511b41d2SMark Murray 542511b41d2SMark Murray case sDenyGroups: 543511b41d2SMark Murray while ((cp = strtok(NULL, WHITESPACE))) { 54442f71286SMark Murray if (options->num_deny_groups >= MAX_DENY_GROUPS) 54542f71286SMark Murray fatal("%.200s line %d: too many deny groups.\n", filename, 54642f71286SMark Murray linenum); 547511b41d2SMark Murray options->deny_groups[options->num_deny_groups++] = xstrdup(cp); 548511b41d2SMark Murray } 549511b41d2SMark Murray break; 550511b41d2SMark Murray 55142f71286SMark Murray case sConnectionsPerPeriod: 55242f71286SMark Murray cp = strtok(NULL, WHITESPACE); 55342f71286SMark Murray if (cp == NULL) 55442f71286SMark Murray fatal("%.200s line %d: missing (>= 0) number argument.\n", 555511b41d2SMark Murray filename, linenum); 55642f71286SMark Murray if (sscanf(cp, " %u/%u ", &options->connections_per_period, 55742f71286SMark Murray &options->connections_period) != 2) 55842f71286SMark Murray fatal("%.200s line %d: invalid numerical argument(s).\n", 55942f71286SMark Murray filename, linenum); 56042f71286SMark Murray if (options->connections_per_period != 0 && 56142f71286SMark Murray options->connections_period == 0) 56242f71286SMark Murray fatal("%.200s line %d: invalid connections period.\n", 56342f71286SMark Murray filename, linenum); 56442f71286SMark Murray break; 56542f71286SMark Murray 56642f71286SMark Murray default: 56742f71286SMark Murray fatal("%.200s line %d: Missing handler for opcode %s (%d)\n", 56842f71286SMark Murray filename, linenum, cp, opcode); 569511b41d2SMark Murray } 57042f71286SMark Murray if (strtok(NULL, WHITESPACE) != NULL) 57142f71286SMark Murray fatal("%.200s line %d: garbage at end of line.\n", filename, 57242f71286SMark Murray linenum); 573511b41d2SMark Murray } 574511b41d2SMark Murray fclose(f); 57542f71286SMark Murray if (bad_options > 0) 57642f71286SMark Murray fatal("%.200s: terminating, %d bad configuration options\n", 577511b41d2SMark Murray filename, bad_options); 578511b41d2SMark Murray } 579