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" 16fe5fd017SMark Murray RCSID("$Id: servconf.c,v 1.30 2000/02/24 18:22:16 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 53fe5fd017SMark Murray options->krb4_authentication = -1; 54fe5fd017SMark Murray options->krb4_or_local_passwd = -1; 55fe5fd017SMark Murray options->krb4_ticket_cleanup = -1; 56511b41d2SMark Murray #endif 57fe5fd017SMark Murray #ifdef KRB5 58fe5fd017SMark Murray options->krb5_authentication = -1; 59fe5fd017SMark Murray options->krb5_tgt_passing = -1; 60fe5fd017SMark Murray #endif /* KRB5 */ 61511b41d2SMark Murray #ifdef AFS 62fe5fd017SMark Murray options->krb4_tgt_passing = -1; 63511b41d2SMark Murray options->afs_token_passing = -1; 64511b41d2SMark Murray #endif 65511b41d2SMark Murray options->password_authentication = -1; 66511b41d2SMark Murray #ifdef SKEY 67511b41d2SMark Murray options->skey_authentication = -1; 68511b41d2SMark Murray #endif 69511b41d2SMark Murray options->permit_empty_passwd = -1; 70511b41d2SMark Murray options->use_login = -1; 71511b41d2SMark Murray options->num_allow_users = 0; 72511b41d2SMark Murray options->num_deny_users = 0; 73511b41d2SMark Murray options->num_allow_groups = 0; 74511b41d2SMark Murray options->num_deny_groups = 0; 7542f71286SMark Murray options->connections_per_period = 0; 7642f71286SMark Murray options->connections_period = 0; 77511b41d2SMark Murray } 78511b41d2SMark Murray 79511b41d2SMark Murray void 80511b41d2SMark Murray fill_default_server_options(ServerOptions *options) 81511b41d2SMark Murray { 82511b41d2SMark Murray if (options->num_ports == 0) 83511b41d2SMark Murray options->ports[options->num_ports++] = SSH_DEFAULT_PORT; 84511b41d2SMark Murray if (options->listen_addrs == NULL) 85511b41d2SMark Murray add_listen_addr(options, NULL); 86511b41d2SMark Murray if (options->host_key_file == NULL) 87511b41d2SMark Murray options->host_key_file = HOST_KEY_FILE; 88511b41d2SMark Murray if (options->server_key_bits == -1) 89511b41d2SMark Murray options->server_key_bits = 768; 90511b41d2SMark Murray if (options->login_grace_time == -1) 91511b41d2SMark Murray options->login_grace_time = 600; 92511b41d2SMark Murray if (options->key_regeneration_time == -1) 93511b41d2SMark Murray options->key_regeneration_time = 3600; 94511b41d2SMark Murray if (options->permit_root_login == -1) 95511b41d2SMark Murray options->permit_root_login = 1; /* yes */ 96511b41d2SMark Murray if (options->ignore_rhosts == -1) 97fe5fd017SMark Murray options->ignore_rhosts = 1; 98511b41d2SMark Murray if (options->ignore_user_known_hosts == -1) 99511b41d2SMark Murray options->ignore_user_known_hosts = 0; 100511b41d2SMark Murray if (options->check_mail == -1) 101511b41d2SMark Murray options->check_mail = 0; 102511b41d2SMark Murray if (options->print_motd == -1) 103511b41d2SMark Murray options->print_motd = 1; 104511b41d2SMark Murray if (options->x11_forwarding == -1) 105511b41d2SMark Murray options->x11_forwarding = 1; 106511b41d2SMark Murray if (options->x11_display_offset == -1) 107fe5fd017SMark Murray options->x11_display_offset = 10; 108511b41d2SMark Murray if (options->strict_modes == -1) 109511b41d2SMark Murray options->strict_modes = 1; 110511b41d2SMark Murray if (options->keepalives == -1) 111511b41d2SMark Murray options->keepalives = 1; 112511b41d2SMark Murray if (options->log_facility == (SyslogFacility) (-1)) 113511b41d2SMark Murray options->log_facility = SYSLOG_FACILITY_AUTH; 114511b41d2SMark Murray if (options->log_level == (LogLevel) (-1)) 115511b41d2SMark Murray options->log_level = SYSLOG_LEVEL_INFO; 116511b41d2SMark Murray if (options->rhosts_authentication == -1) 117511b41d2SMark Murray options->rhosts_authentication = 0; 118511b41d2SMark Murray if (options->rhosts_rsa_authentication == -1) 119fe5fd017SMark Murray options->rhosts_rsa_authentication = 0; 120511b41d2SMark Murray if (options->rsa_authentication == -1) 121511b41d2SMark Murray options->rsa_authentication = 1; 122511b41d2SMark Murray #ifdef KRB4 123fe5fd017SMark Murray if (options->krb4_authentication == -1) 124fe5fd017SMark Murray options->krb4_authentication = (access(KEYFILE, R_OK) == 0); 125fe5fd017SMark Murray if (options->krb4_or_local_passwd == -1) 126fe5fd017SMark Murray options->krb4_or_local_passwd = 1; 127fe5fd017SMark Murray if (options->krb4_ticket_cleanup == -1) 128fe5fd017SMark Murray options->krb4_ticket_cleanup = 1; 129511b41d2SMark Murray #endif /* KRB4 */ 130fe5fd017SMark Murray #ifdef KRB5 131fe5fd017SMark Murray if (options->krb5_authentication == -1) 132fe5fd017SMark Murray options->krb5_authentication = 1; 133fe5fd017SMark Murray if (options->krb5_tgt_passing == -1) 134fe5fd017SMark Murray options->krb5_tgt_passing = 1; 135fe5fd017SMark Murray #endif /* KRB5 */ 136511b41d2SMark Murray #ifdef AFS 137fe5fd017SMark Murray if (options->krb4_tgt_passing == -1) 138fe5fd017SMark Murray options->krb4_tgt_passing = 0; 139511b41d2SMark Murray if (options->afs_token_passing == -1) 140511b41d2SMark Murray options->afs_token_passing = k_hasafs(); 141511b41d2SMark Murray #endif /* AFS */ 142511b41d2SMark Murray if (options->password_authentication == -1) 143511b41d2SMark Murray options->password_authentication = 1; 144511b41d2SMark Murray #ifdef SKEY 145511b41d2SMark Murray if (options->skey_authentication == -1) 146511b41d2SMark Murray options->skey_authentication = 1; 147511b41d2SMark Murray #endif 148511b41d2SMark Murray if (options->permit_empty_passwd == -1) 149fe5fd017SMark Murray options->permit_empty_passwd = 0; 150511b41d2SMark Murray if (options->use_login == -1) 151511b41d2SMark Murray options->use_login = 0; 152511b41d2SMark Murray } 153511b41d2SMark Murray 154511b41d2SMark Murray #define WHITESPACE " \t\r\n" 155511b41d2SMark Murray 156511b41d2SMark Murray /* Keyword tokens. */ 157511b41d2SMark Murray typedef enum { 158511b41d2SMark Murray sBadOption, /* == unknown option */ 159511b41d2SMark Murray sPort, sHostKeyFile, sServerKeyBits, sLoginGraceTime, sKeyRegenerationTime, 160511b41d2SMark Murray sPermitRootLogin, sLogFacility, sLogLevel, 161511b41d2SMark Murray sRhostsAuthentication, sRhostsRSAAuthentication, sRSAAuthentication, 162511b41d2SMark Murray #ifdef KRB4 163fe5fd017SMark Murray sKrb4Authentication, sKrb4OrLocalPasswd, sKrb4TicketCleanup, 164511b41d2SMark Murray #endif 165fe5fd017SMark Murray #ifdef KRB5 166fe5fd017SMark Murray sKrb5Authentication, sKrb5TgtPassing, 167fe5fd017SMark Murray #endif /* KRB5 */ 168511b41d2SMark Murray #ifdef AFS 169fe5fd017SMark Murray sKrb4TgtPassing, sAFSTokenPassing, 170511b41d2SMark Murray #endif 171511b41d2SMark Murray #ifdef SKEY 172511b41d2SMark Murray sSkeyAuthentication, 173511b41d2SMark Murray #endif 174511b41d2SMark Murray sPasswordAuthentication, sListenAddress, 175511b41d2SMark Murray sPrintMotd, sIgnoreRhosts, sX11Forwarding, sX11DisplayOffset, 176511b41d2SMark Murray sStrictModes, sEmptyPasswd, sRandomSeedFile, sKeepAlives, sCheckMail, 177511b41d2SMark Murray sUseLogin, sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups, 17842f71286SMark Murray sIgnoreUserKnownHosts, sConnectionsPerPeriod 179511b41d2SMark Murray } ServerOpCodes; 180511b41d2SMark Murray 181511b41d2SMark Murray /* Textual representation of the tokens. */ 182511b41d2SMark Murray static struct { 183511b41d2SMark Murray const char *name; 184511b41d2SMark Murray ServerOpCodes opcode; 185511b41d2SMark Murray } keywords[] = { 186511b41d2SMark Murray { "port", sPort }, 187511b41d2SMark Murray { "hostkey", sHostKeyFile }, 188511b41d2SMark Murray { "serverkeybits", sServerKeyBits }, 189511b41d2SMark Murray { "logingracetime", sLoginGraceTime }, 190511b41d2SMark Murray { "keyregenerationinterval", sKeyRegenerationTime }, 191511b41d2SMark Murray { "permitrootlogin", sPermitRootLogin }, 192511b41d2SMark Murray { "syslogfacility", sLogFacility }, 193511b41d2SMark Murray { "loglevel", sLogLevel }, 194511b41d2SMark Murray { "rhostsauthentication", sRhostsAuthentication }, 195511b41d2SMark Murray { "rhostsrsaauthentication", sRhostsRSAAuthentication }, 196511b41d2SMark Murray { "rsaauthentication", sRSAAuthentication }, 197511b41d2SMark Murray #ifdef KRB4 198fe5fd017SMark Murray { "kerberos4authentication", sKrb4Authentication }, 199fe5fd017SMark Murray { "kerberos4orlocalpasswd", sKrb4OrLocalPasswd }, 200fe5fd017SMark Murray { "kerberos4ticketcleanup", sKrb4TicketCleanup }, 201511b41d2SMark Murray #endif 202fe5fd017SMark Murray #ifdef KRB5 203fe5fd017SMark Murray { "kerberos5authentication", sKrb5Authentication }, 204fe5fd017SMark Murray { "kerberos5tgtpassing", sKrb5TgtPassing }, 205fe5fd017SMark Murray #endif /* KRB5 */ 206511b41d2SMark Murray #ifdef AFS 207fe5fd017SMark Murray { "kerberos4tgtpassing", sKrb4TgtPassing }, 208511b41d2SMark Murray { "afstokenpassing", sAFSTokenPassing }, 209511b41d2SMark Murray #endif 210511b41d2SMark Murray { "passwordauthentication", sPasswordAuthentication }, 211511b41d2SMark Murray #ifdef SKEY 212511b41d2SMark Murray { "skeyauthentication", sSkeyAuthentication }, 213511b41d2SMark Murray #endif 214511b41d2SMark Murray { "checkmail", sCheckMail }, 215511b41d2SMark Murray { "listenaddress", sListenAddress }, 216511b41d2SMark Murray { "printmotd", sPrintMotd }, 217511b41d2SMark Murray { "ignorerhosts", sIgnoreRhosts }, 218511b41d2SMark Murray { "ignoreuserknownhosts", sIgnoreUserKnownHosts }, 219511b41d2SMark Murray { "x11forwarding", sX11Forwarding }, 220511b41d2SMark Murray { "x11displayoffset", sX11DisplayOffset }, 221511b41d2SMark Murray { "strictmodes", sStrictModes }, 222511b41d2SMark Murray { "permitemptypasswords", sEmptyPasswd }, 223511b41d2SMark Murray { "uselogin", sUseLogin }, 224511b41d2SMark Murray { "randomseed", sRandomSeedFile }, 225511b41d2SMark Murray { "keepalive", sKeepAlives }, 226511b41d2SMark Murray { "allowusers", sAllowUsers }, 227511b41d2SMark Murray { "denyusers", sDenyUsers }, 228511b41d2SMark Murray { "allowgroups", sAllowGroups }, 229511b41d2SMark Murray { "denygroups", sDenyGroups }, 23042f71286SMark Murray { "connectionsperperiod", sConnectionsPerPeriod }, 231511b41d2SMark Murray { NULL, 0 } 232511b41d2SMark Murray }; 233511b41d2SMark Murray 234511b41d2SMark Murray /* 235511b41d2SMark Murray * Returns the number of the token pointed to by cp of length len. Never 236511b41d2SMark Murray * returns if the token is not known. 237511b41d2SMark Murray */ 238511b41d2SMark Murray 239511b41d2SMark Murray static ServerOpCodes 240511b41d2SMark Murray parse_token(const char *cp, const char *filename, 241511b41d2SMark Murray int linenum) 242511b41d2SMark Murray { 243511b41d2SMark Murray unsigned int i; 244511b41d2SMark Murray 245511b41d2SMark Murray for (i = 0; keywords[i].name; i++) 246511b41d2SMark Murray if (strcasecmp(cp, keywords[i].name) == 0) 247511b41d2SMark Murray return keywords[i].opcode; 248511b41d2SMark Murray 249511b41d2SMark Murray fprintf(stderr, "%s: line %d: Bad configuration option: %s\n", 250511b41d2SMark Murray filename, linenum, cp); 251511b41d2SMark Murray return sBadOption; 252511b41d2SMark Murray } 253511b41d2SMark Murray 254511b41d2SMark Murray /* 255511b41d2SMark Murray * add listen address 256511b41d2SMark Murray */ 257511b41d2SMark Murray void 258511b41d2SMark Murray add_listen_addr(ServerOptions *options, char *addr) 259511b41d2SMark Murray { 260511b41d2SMark Murray extern int IPv4or6; 261511b41d2SMark Murray struct addrinfo hints, *ai, *aitop; 262511b41d2SMark Murray char strport[NI_MAXSERV]; 263511b41d2SMark Murray int gaierr; 264511b41d2SMark Murray int i; 265511b41d2SMark Murray 266511b41d2SMark Murray if (options->num_ports == 0) 267511b41d2SMark Murray options->ports[options->num_ports++] = SSH_DEFAULT_PORT; 268511b41d2SMark Murray for (i = 0; i < options->num_ports; i++) { 269511b41d2SMark Murray memset(&hints, 0, sizeof(hints)); 270511b41d2SMark Murray hints.ai_family = IPv4or6; 271511b41d2SMark Murray hints.ai_socktype = SOCK_STREAM; 272511b41d2SMark Murray hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0; 273511b41d2SMark Murray snprintf(strport, sizeof strport, "%d", options->ports[i]); 274511b41d2SMark Murray if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0) 275511b41d2SMark Murray fatal("bad addr or host: %s (%s)\n", 276511b41d2SMark Murray addr ? addr : "<NULL>", 277511b41d2SMark Murray gai_strerror(gaierr)); 278511b41d2SMark Murray for (ai = aitop; ai->ai_next; ai = ai->ai_next) 279511b41d2SMark Murray ; 280511b41d2SMark Murray ai->ai_next = options->listen_addrs; 281511b41d2SMark Murray options->listen_addrs = aitop; 282511b41d2SMark Murray } 283511b41d2SMark Murray } 284511b41d2SMark Murray 285511b41d2SMark Murray /* Reads the server configuration file. */ 286511b41d2SMark Murray 287511b41d2SMark Murray void 288511b41d2SMark Murray read_server_config(ServerOptions *options, const char *filename) 289511b41d2SMark Murray { 290511b41d2SMark Murray FILE *f; 291511b41d2SMark Murray char line[1024]; 292511b41d2SMark Murray char *cp, **charptr; 293511b41d2SMark Murray int linenum, *intptr, value; 294511b41d2SMark Murray int bad_options = 0; 295511b41d2SMark Murray ServerOpCodes opcode; 296511b41d2SMark Murray 297511b41d2SMark Murray f = fopen(filename, "r"); 298511b41d2SMark Murray if (!f) { 299511b41d2SMark Murray perror(filename); 300511b41d2SMark Murray exit(1); 301511b41d2SMark Murray } 302511b41d2SMark Murray linenum = 0; 303511b41d2SMark Murray while (fgets(line, sizeof(line), f)) { 304511b41d2SMark Murray linenum++; 305511b41d2SMark Murray cp = line + strspn(line, WHITESPACE); 306511b41d2SMark Murray if (!*cp || *cp == '#') 307511b41d2SMark Murray continue; 308511b41d2SMark Murray cp = strtok(cp, WHITESPACE); 309511b41d2SMark Murray opcode = parse_token(cp, filename, linenum); 310511b41d2SMark Murray switch (opcode) { 311511b41d2SMark Murray case sBadOption: 312511b41d2SMark Murray bad_options++; 313511b41d2SMark Murray continue; 314511b41d2SMark Murray case sPort: 315511b41d2SMark Murray /* ignore ports from configfile if cmdline specifies ports */ 316511b41d2SMark Murray if (options->ports_from_cmdline) 317511b41d2SMark Murray continue; 318511b41d2SMark Murray if (options->listen_addrs != NULL) 319511b41d2SMark Murray fatal("%s line %d: ports must be specified before " 320511b41d2SMark Murray "ListenAdress.\n", filename, linenum); 321511b41d2SMark Murray if (options->num_ports >= MAX_PORTS) 322511b41d2SMark Murray fatal("%s line %d: too many ports.\n", 323511b41d2SMark Murray filename, linenum); 324511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 325511b41d2SMark Murray if (!cp) 326511b41d2SMark Murray fatal("%s line %d: missing port number.\n", 327511b41d2SMark Murray filename, linenum); 328511b41d2SMark Murray options->ports[options->num_ports++] = atoi(cp); 329511b41d2SMark Murray break; 330511b41d2SMark Murray 331511b41d2SMark Murray case sServerKeyBits: 332511b41d2SMark Murray intptr = &options->server_key_bits; 333511b41d2SMark Murray parse_int: 334511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 335511b41d2SMark Murray if (!cp) { 336511b41d2SMark Murray fprintf(stderr, "%s line %d: missing integer value.\n", 337511b41d2SMark Murray filename, linenum); 338511b41d2SMark Murray exit(1); 339511b41d2SMark Murray } 34042f71286SMark Murray if (sscanf(cp, " %d ", &value) != 1) { 34142f71286SMark Murray fprintf(stderr, "%s line %d: invalid integer value.\n", 34242f71286SMark Murray filename, linenum); 34342f71286SMark Murray exit(1); 34442f71286SMark Murray } 345511b41d2SMark Murray if (*intptr == -1) 346511b41d2SMark Murray *intptr = value; 347511b41d2SMark Murray break; 348511b41d2SMark Murray 349511b41d2SMark Murray case sLoginGraceTime: 350511b41d2SMark Murray intptr = &options->login_grace_time; 351511b41d2SMark Murray goto parse_int; 352511b41d2SMark Murray 353511b41d2SMark Murray case sKeyRegenerationTime: 354511b41d2SMark Murray intptr = &options->key_regeneration_time; 355511b41d2SMark Murray goto parse_int; 356511b41d2SMark Murray 357511b41d2SMark Murray case sListenAddress: 358511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 359511b41d2SMark Murray if (!cp) 360511b41d2SMark Murray fatal("%s line %d: missing inet addr.\n", 361511b41d2SMark Murray filename, linenum); 362511b41d2SMark Murray add_listen_addr(options, cp); 363511b41d2SMark Murray break; 364511b41d2SMark Murray 365511b41d2SMark Murray case sHostKeyFile: 366511b41d2SMark Murray charptr = &options->host_key_file; 367511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 368511b41d2SMark Murray if (!cp) { 369511b41d2SMark Murray fprintf(stderr, "%s line %d: missing file name.\n", 370511b41d2SMark Murray filename, linenum); 371511b41d2SMark Murray exit(1); 372511b41d2SMark Murray } 373511b41d2SMark Murray if (*charptr == NULL) 374511b41d2SMark Murray *charptr = tilde_expand_filename(cp, getuid()); 375511b41d2SMark Murray break; 376511b41d2SMark Murray 377511b41d2SMark Murray case sRandomSeedFile: 378511b41d2SMark Murray fprintf(stderr, "%s line %d: \"randomseed\" option is obsolete.\n", 379511b41d2SMark Murray filename, linenum); 380511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 381511b41d2SMark Murray break; 382511b41d2SMark Murray 383511b41d2SMark Murray case sPermitRootLogin: 384511b41d2SMark Murray intptr = &options->permit_root_login; 385511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 386511b41d2SMark Murray if (!cp) { 387511b41d2SMark Murray fprintf(stderr, "%s line %d: missing yes/without-password/no argument.\n", 388511b41d2SMark Murray filename, linenum); 389511b41d2SMark Murray exit(1); 390511b41d2SMark Murray } 391511b41d2SMark Murray if (strcmp(cp, "without-password") == 0) 392511b41d2SMark Murray value = 2; 393511b41d2SMark Murray else if (strcmp(cp, "yes") == 0) 394511b41d2SMark Murray value = 1; 395511b41d2SMark Murray else if (strcmp(cp, "no") == 0) 396511b41d2SMark Murray value = 0; 397511b41d2SMark Murray else { 398511b41d2SMark Murray fprintf(stderr, "%s line %d: Bad yes/without-password/no argument: %s\n", 399511b41d2SMark Murray filename, linenum, cp); 400511b41d2SMark Murray exit(1); 401511b41d2SMark Murray } 402511b41d2SMark Murray if (*intptr == -1) 403511b41d2SMark Murray *intptr = value; 404511b41d2SMark Murray break; 405511b41d2SMark Murray 406511b41d2SMark Murray case sIgnoreRhosts: 407511b41d2SMark Murray intptr = &options->ignore_rhosts; 408511b41d2SMark Murray parse_flag: 409511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 410511b41d2SMark Murray if (!cp) { 411511b41d2SMark Murray fprintf(stderr, "%s line %d: missing yes/no argument.\n", 412511b41d2SMark Murray filename, linenum); 413511b41d2SMark Murray exit(1); 414511b41d2SMark Murray } 415511b41d2SMark Murray if (strcmp(cp, "yes") == 0) 416511b41d2SMark Murray value = 1; 417511b41d2SMark Murray else if (strcmp(cp, "no") == 0) 418511b41d2SMark Murray value = 0; 419511b41d2SMark Murray else { 420511b41d2SMark Murray fprintf(stderr, "%s line %d: Bad yes/no argument: %s\n", 421511b41d2SMark Murray filename, linenum, cp); 422511b41d2SMark Murray exit(1); 423511b41d2SMark Murray } 424511b41d2SMark Murray if (*intptr == -1) 425511b41d2SMark Murray *intptr = value; 426511b41d2SMark Murray break; 427511b41d2SMark Murray 428511b41d2SMark Murray case sIgnoreUserKnownHosts: 429511b41d2SMark Murray intptr = &options->ignore_user_known_hosts; 430511b41d2SMark Murray goto parse_int; 431511b41d2SMark Murray 432511b41d2SMark Murray case sRhostsAuthentication: 433511b41d2SMark Murray intptr = &options->rhosts_authentication; 434511b41d2SMark Murray goto parse_flag; 435511b41d2SMark Murray 436511b41d2SMark Murray case sRhostsRSAAuthentication: 437511b41d2SMark Murray intptr = &options->rhosts_rsa_authentication; 438511b41d2SMark Murray goto parse_flag; 439511b41d2SMark Murray 440511b41d2SMark Murray case sRSAAuthentication: 441511b41d2SMark Murray intptr = &options->rsa_authentication; 442511b41d2SMark Murray goto parse_flag; 443511b41d2SMark Murray 444511b41d2SMark Murray #ifdef KRB4 445fe5fd017SMark Murray case sKrb4Authentication: 446fe5fd017SMark Murray intptr = &options->krb4_authentication; 447511b41d2SMark Murray goto parse_flag; 448511b41d2SMark Murray 449fe5fd017SMark Murray case sKrb4OrLocalPasswd: 450fe5fd017SMark Murray intptr = &options->krb4_or_local_passwd; 451511b41d2SMark Murray goto parse_flag; 452511b41d2SMark Murray 453fe5fd017SMark Murray case sKrb4TicketCleanup: 454fe5fd017SMark Murray intptr = &options->krb4_ticket_cleanup; 455511b41d2SMark Murray goto parse_flag; 456511b41d2SMark Murray #endif 457511b41d2SMark Murray 458fe5fd017SMark Murray #ifdef KRB5 459fe5fd017SMark Murray case sKrb5Authentication: 460fe5fd017SMark Murray intptr = &options->krb5_authentication; 461fe5fd017SMark Murray goto parse_flag; 462fe5fd017SMark Murray 463fe5fd017SMark Murray case sKrb5TgtPassing: 464fe5fd017SMark Murray intptr = &options->krb5_tgt_passing; 465fe5fd017SMark Murray goto parse_flag; 466fe5fd017SMark Murray #endif /* KRB5 */ 467fe5fd017SMark Murray 468511b41d2SMark Murray #ifdef AFS 469fe5fd017SMark Murray case sKrb4TgtPassing: 470fe5fd017SMark Murray intptr = &options->krb4_tgt_passing; 471511b41d2SMark Murray goto parse_flag; 472511b41d2SMark Murray 473511b41d2SMark Murray case sAFSTokenPassing: 474511b41d2SMark Murray intptr = &options->afs_token_passing; 475511b41d2SMark Murray goto parse_flag; 476511b41d2SMark Murray #endif 477511b41d2SMark Murray 478511b41d2SMark Murray case sPasswordAuthentication: 479511b41d2SMark Murray intptr = &options->password_authentication; 480511b41d2SMark Murray goto parse_flag; 481511b41d2SMark Murray 482511b41d2SMark Murray case sCheckMail: 483511b41d2SMark Murray intptr = &options->check_mail; 484511b41d2SMark Murray goto parse_flag; 485511b41d2SMark Murray 486511b41d2SMark Murray #ifdef SKEY 487511b41d2SMark Murray case sSkeyAuthentication: 488511b41d2SMark Murray intptr = &options->skey_authentication; 489511b41d2SMark Murray goto parse_flag; 490511b41d2SMark Murray #endif 491511b41d2SMark Murray 492511b41d2SMark Murray case sPrintMotd: 493511b41d2SMark Murray intptr = &options->print_motd; 494511b41d2SMark Murray goto parse_flag; 495511b41d2SMark Murray 496511b41d2SMark Murray case sX11Forwarding: 497511b41d2SMark Murray intptr = &options->x11_forwarding; 498511b41d2SMark Murray goto parse_flag; 499511b41d2SMark Murray 500511b41d2SMark Murray case sX11DisplayOffset: 501511b41d2SMark Murray intptr = &options->x11_display_offset; 502511b41d2SMark Murray goto parse_int; 503511b41d2SMark Murray 504511b41d2SMark Murray case sStrictModes: 505511b41d2SMark Murray intptr = &options->strict_modes; 506511b41d2SMark Murray goto parse_flag; 507511b41d2SMark Murray 508511b41d2SMark Murray case sKeepAlives: 509511b41d2SMark Murray intptr = &options->keepalives; 510511b41d2SMark Murray goto parse_flag; 511511b41d2SMark Murray 512511b41d2SMark Murray case sEmptyPasswd: 513511b41d2SMark Murray intptr = &options->permit_empty_passwd; 514511b41d2SMark Murray goto parse_flag; 515511b41d2SMark Murray 516511b41d2SMark Murray case sUseLogin: 517511b41d2SMark Murray intptr = &options->use_login; 518511b41d2SMark Murray goto parse_flag; 519511b41d2SMark Murray 520511b41d2SMark Murray case sLogFacility: 521511b41d2SMark Murray intptr = (int *) &options->log_facility; 522511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 523511b41d2SMark Murray value = log_facility_number(cp); 524511b41d2SMark Murray if (value == (SyslogFacility) - 1) 525511b41d2SMark Murray fatal("%.200s line %d: unsupported log facility '%s'\n", 526511b41d2SMark Murray filename, linenum, cp ? cp : "<NONE>"); 527511b41d2SMark Murray if (*intptr == -1) 528511b41d2SMark Murray *intptr = (SyslogFacility) value; 529511b41d2SMark Murray break; 530511b41d2SMark Murray 531511b41d2SMark Murray case sLogLevel: 532511b41d2SMark Murray intptr = (int *) &options->log_level; 533511b41d2SMark Murray cp = strtok(NULL, WHITESPACE); 534511b41d2SMark Murray value = log_level_number(cp); 535511b41d2SMark Murray if (value == (LogLevel) - 1) 536511b41d2SMark Murray fatal("%.200s line %d: unsupported log level '%s'\n", 537511b41d2SMark Murray filename, linenum, cp ? cp : "<NONE>"); 538511b41d2SMark Murray if (*intptr == -1) 539511b41d2SMark Murray *intptr = (LogLevel) value; 540511b41d2SMark Murray break; 541511b41d2SMark Murray 542511b41d2SMark Murray case sAllowUsers: 543511b41d2SMark Murray while ((cp = strtok(NULL, WHITESPACE))) { 54442f71286SMark Murray if (options->num_allow_users >= MAX_ALLOW_USERS) 54542f71286SMark Murray fatal("%.200s line %d: too many allow users.\n", filename, 54642f71286SMark Murray linenum); 547511b41d2SMark Murray options->allow_users[options->num_allow_users++] = xstrdup(cp); 548511b41d2SMark Murray } 549511b41d2SMark Murray break; 550511b41d2SMark Murray 551511b41d2SMark Murray case sDenyUsers: 552511b41d2SMark Murray while ((cp = strtok(NULL, WHITESPACE))) { 55342f71286SMark Murray if (options->num_deny_users >= MAX_DENY_USERS) 55442f71286SMark Murray fatal("%.200s line %d: too many deny users.\n", filename, 55542f71286SMark Murray linenum); 556511b41d2SMark Murray options->deny_users[options->num_deny_users++] = xstrdup(cp); 557511b41d2SMark Murray } 558511b41d2SMark Murray break; 559511b41d2SMark Murray 560511b41d2SMark Murray case sAllowGroups: 561511b41d2SMark Murray while ((cp = strtok(NULL, WHITESPACE))) { 56242f71286SMark Murray if (options->num_allow_groups >= MAX_ALLOW_GROUPS) 56342f71286SMark Murray fatal("%.200s line %d: too many allow groups.\n", filename, 56442f71286SMark Murray linenum); 565511b41d2SMark Murray options->allow_groups[options->num_allow_groups++] = xstrdup(cp); 566511b41d2SMark Murray } 567511b41d2SMark Murray break; 568511b41d2SMark Murray 569511b41d2SMark Murray case sDenyGroups: 570511b41d2SMark Murray while ((cp = strtok(NULL, WHITESPACE))) { 57142f71286SMark Murray if (options->num_deny_groups >= MAX_DENY_GROUPS) 57242f71286SMark Murray fatal("%.200s line %d: too many deny groups.\n", filename, 57342f71286SMark Murray linenum); 574511b41d2SMark Murray options->deny_groups[options->num_deny_groups++] = xstrdup(cp); 575511b41d2SMark Murray } 576511b41d2SMark Murray break; 577511b41d2SMark Murray 57842f71286SMark Murray case sConnectionsPerPeriod: 57942f71286SMark Murray cp = strtok(NULL, WHITESPACE); 58042f71286SMark Murray if (cp == NULL) 58142f71286SMark Murray fatal("%.200s line %d: missing (>= 0) number argument.\n", 582511b41d2SMark Murray filename, linenum); 58342f71286SMark Murray if (sscanf(cp, " %u/%u ", &options->connections_per_period, 58442f71286SMark Murray &options->connections_period) != 2) 58542f71286SMark Murray fatal("%.200s line %d: invalid numerical argument(s).\n", 58642f71286SMark Murray filename, linenum); 58742f71286SMark Murray if (options->connections_per_period != 0 && 58842f71286SMark Murray options->connections_period == 0) 58942f71286SMark Murray fatal("%.200s line %d: invalid connections period.\n", 59042f71286SMark Murray filename, linenum); 59142f71286SMark Murray break; 59242f71286SMark Murray 59342f71286SMark Murray default: 59442f71286SMark Murray fatal("%.200s line %d: Missing handler for opcode %s (%d)\n", 59542f71286SMark Murray filename, linenum, cp, opcode); 596511b41d2SMark Murray } 59742f71286SMark Murray if (strtok(NULL, WHITESPACE) != NULL) 59842f71286SMark Murray fatal("%.200s line %d: garbage at end of line.\n", filename, 59942f71286SMark Murray linenum); 600511b41d2SMark Murray } 601511b41d2SMark Murray fclose(f); 60242f71286SMark Murray if (bad_options > 0) 60342f71286SMark Murray fatal("%.200s: terminating, %d bad configuration options\n", 604511b41d2SMark Murray filename, bad_options); 605511b41d2SMark Murray } 606