blob: 063bd467dcc62e76dbe4c8de916dd53a22df7099 [file] [log] [blame]
Damien Millerd4a8b7e1999-10-27 13:42:43 +10001/*
Damien Miller95def091999-11-25 00:26:21 +11002 *
3 * readconf.c
4 *
5 * Author: Tatu Ylonen <ylo@cs.hut.fi>
6 *
7 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
8 * All rights reserved
9 *
10 * Created: Sat Apr 22 00:03:10 1995 ylo
11 *
12 * Functions for reading the configuration files.
13 *
14 */
Damien Millerd4a8b7e1999-10-27 13:42:43 +100015
16#include "includes.h"
Damien Miller95def091999-11-25 00:26:21 +110017RCSID("$Id: readconf.c,v 1.5 1999/11/24 13:26:22 damien Exp $");
Damien Millerd4a8b7e1999-10-27 13:42:43 +100018
19#include "ssh.h"
20#include "cipher.h"
21#include "readconf.h"
22#include "xmalloc.h"
23
24/* Format of the configuration file:
25
26 # Configuration data is parsed as follows:
27 # 1. command line options
28 # 2. user-specific file
29 # 3. system-wide file
30 # Any configuration value is only changed the first time it is set.
31 # Thus, host-specific definitions should be at the beginning of the
32 # configuration file, and defaults at the end.
33
34 # Host-specific declarations. These may override anything above. A single
35 # host may match multiple declarations; these are processed in the order
36 # that they are given in.
37
38 Host *.ngs.fi ngs.fi
39 FallBackToRsh no
40
41 Host fake.com
42 HostName another.host.name.real.org
43 User blaah
44 Port 34289
45 ForwardX11 no
46 ForwardAgent no
47
48 Host books.com
49 RemoteForward 9999 shadows.cs.hut.fi:9999
50 Cipher 3des
51
52 Host fascist.blob.com
53 Port 23123
54 User tylonen
55 RhostsAuthentication no
56 PasswordAuthentication no
57
58 Host puukko.hut.fi
59 User t35124p
60 ProxyCommand ssh-proxy %h %p
61
62 Host *.fr
63 UseRsh yes
64
65 Host *.su
66 Cipher none
67 PasswordAuthentication no
68
69 # Defaults for various options
70 Host *
71 ForwardAgent no
72 ForwardX11 yes
73 RhostsAuthentication yes
74 PasswordAuthentication yes
75 RSAAuthentication yes
76 RhostsRSAAuthentication yes
77 FallBackToRsh no
78 UseRsh no
79 StrictHostKeyChecking yes
80 KeepAlives no
81 IdentityFile ~/.ssh/identity
82 Port 22
83 EscapeChar ~
84
85*/
86
87/* Keyword tokens. */
88
Damien Miller95def091999-11-25 00:26:21 +110089typedef enum {
90 oBadOption,
91 oForwardAgent, oForwardX11, oGatewayPorts, oRhostsAuthentication,
92 oPasswordAuthentication, oRSAAuthentication, oFallBackToRsh, oUseRsh,
93 oSkeyAuthentication,
Damien Millerd4a8b7e1999-10-27 13:42:43 +100094#ifdef KRB4
Damien Miller95def091999-11-25 00:26:21 +110095 oKerberosAuthentication,
Damien Millerd4a8b7e1999-10-27 13:42:43 +100096#endif /* KRB4 */
97#ifdef AFS
Damien Miller95def091999-11-25 00:26:21 +110098 oKerberosTgtPassing, oAFSTokenPassing,
Damien Millerd4a8b7e1999-10-27 13:42:43 +100099#endif
Damien Miller95def091999-11-25 00:26:21 +1100100 oIdentityFile, oHostName, oPort, oCipher, oRemoteForward, oLocalForward,
101 oUser, oHost, oEscapeChar, oRhostsRSAAuthentication, oProxyCommand,
102 oGlobalKnownHostsFile, oUserKnownHostsFile, oConnectionAttempts,
103 oBatchMode, oCheckHostIP, oStrictHostKeyChecking, oCompression,
104 oCompressionLevel, oKeepAlives, oNumberOfPasswordPrompts, oTISAuthentication,
105 oUsePrivilegedPort, oLogLevel
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000106} OpCodes;
107
108/* Textual representations of the tokens. */
109
Damien Miller95def091999-11-25 00:26:21 +1100110static struct {
111 const char *name;
112 OpCodes opcode;
113} keywords[] = {
114 { "forwardagent", oForwardAgent },
115 { "forwardx11", oForwardX11 },
116 { "gatewayports", oGatewayPorts },
117 { "useprivilegedport", oUsePrivilegedPort },
118 { "rhostsauthentication", oRhostsAuthentication },
119 { "passwordauthentication", oPasswordAuthentication },
120 { "rsaauthentication", oRSAAuthentication },
121 { "skeyauthentication", oSkeyAuthentication },
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000122#ifdef KRB4
Damien Miller95def091999-11-25 00:26:21 +1100123 { "kerberosauthentication", oKerberosAuthentication },
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000124#endif /* KRB4 */
125#ifdef AFS
Damien Miller95def091999-11-25 00:26:21 +1100126 { "kerberostgtpassing", oKerberosTgtPassing },
127 { "afstokenpassing", oAFSTokenPassing },
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000128#endif
Damien Miller95def091999-11-25 00:26:21 +1100129 { "fallbacktorsh", oFallBackToRsh },
130 { "usersh", oUseRsh },
131 { "identityfile", oIdentityFile },
132 { "hostname", oHostName },
133 { "proxycommand", oProxyCommand },
134 { "port", oPort },
135 { "cipher", oCipher },
136 { "remoteforward", oRemoteForward },
137 { "localforward", oLocalForward },
138 { "user", oUser },
139 { "host", oHost },
140 { "escapechar", oEscapeChar },
141 { "rhostsrsaauthentication", oRhostsRSAAuthentication },
142 { "globalknownhostsfile", oGlobalKnownHostsFile },
143 { "userknownhostsfile", oUserKnownHostsFile },
144 { "connectionattempts", oConnectionAttempts },
145 { "batchmode", oBatchMode },
146 { "checkhostip", oCheckHostIP },
147 { "stricthostkeychecking", oStrictHostKeyChecking },
148 { "compression", oCompression },
149 { "compressionlevel", oCompressionLevel },
150 { "keepalive", oKeepAlives },
151 { "numberofpasswordprompts", oNumberOfPasswordPrompts },
152 { "tisauthentication", oTISAuthentication },
153 { "loglevel", oLogLevel },
154 { NULL, 0 }
Damien Miller5ce662a1999-11-11 17:57:39 +1100155};
156
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000157/* Characters considered whitespace in strtok calls. */
158#define WHITESPACE " \t\r\n"
159
160
161/* Adds a local TCP/IP port forward to options. Never returns if there
162 is an error. */
163
Damien Miller95def091999-11-25 00:26:21 +1100164void
165add_local_forward(Options *options, int port, const char *host,
166 int host_port)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000167{
Damien Miller95def091999-11-25 00:26:21 +1100168 Forward *fwd;
169 extern uid_t original_real_uid;
170 if ((port & 0xffff) != port)
171 fatal("Requested forwarding of nonexistent port %d.", port);
172 if (port < IPPORT_RESERVED && original_real_uid != 0)
173 fatal("Privileged ports can only be forwarded by root.\n");
174 if (options->num_local_forwards >= SSH_MAX_FORWARDS_PER_DIRECTION)
175 fatal("Too many local forwards (max %d).", SSH_MAX_FORWARDS_PER_DIRECTION);
176 fwd = &options->local_forwards[options->num_local_forwards++];
177 fwd->port = port;
178 fwd->host = xstrdup(host);
179 fwd->host_port = host_port;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000180}
181
182/* Adds a remote TCP/IP port forward to options. Never returns if there
183 is an error. */
184
Damien Miller95def091999-11-25 00:26:21 +1100185void
186add_remote_forward(Options *options, int port, const char *host,
187 int host_port)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000188{
Damien Miller95def091999-11-25 00:26:21 +1100189 Forward *fwd;
190 if (options->num_remote_forwards >= SSH_MAX_FORWARDS_PER_DIRECTION)
191 fatal("Too many remote forwards (max %d).",
192 SSH_MAX_FORWARDS_PER_DIRECTION);
193 fwd = &options->remote_forwards[options->num_remote_forwards++];
194 fwd->port = port;
195 fwd->host = xstrdup(host);
196 fwd->host_port = host_port;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000197}
198
199/* Returns the number of the token pointed to by cp of length len.
200 Never returns if the token is not known. */
201
Damien Miller95def091999-11-25 00:26:21 +1100202static OpCodes
203parse_token(const char *cp, const char *filename, int linenum)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000204{
Damien Miller95def091999-11-25 00:26:21 +1100205 unsigned int i;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000206
Damien Miller95def091999-11-25 00:26:21 +1100207 for (i = 0; keywords[i].name; i++)
208 if (strcmp(cp, keywords[i].name) == 0)
209 return keywords[i].opcode;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000210
Damien Miller95def091999-11-25 00:26:21 +1100211 fprintf(stderr, "%s: line %d: Bad configuration option: %s\n",
212 filename, linenum, cp);
213 return oBadOption;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000214}
215
216/* Processes a single option line as used in the configuration files.
217 This only sets those values that have not already been set. */
218
Damien Miller2ccf6611999-11-15 15:25:10 +1100219int
220process_config_line(Options *options, const char *host,
Damien Miller95def091999-11-25 00:26:21 +1100221 char *line, const char *filename, int linenum,
222 int *activep)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000223{
Damien Miller95def091999-11-25 00:26:21 +1100224 char buf[256], *cp, *string, **charptr;
225 int opcode, *intptr, value, fwd_port, fwd_host_port;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000226
Damien Miller95def091999-11-25 00:26:21 +1100227 /* Skip leading whitespace. */
228 cp = line + strspn(line, WHITESPACE);
229 if (!*cp || *cp == '\n' || *cp == '#')
230 return 0;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000231
Damien Miller95def091999-11-25 00:26:21 +1100232 /* Get the keyword. (Each line is supposed to begin with a
233 keyword). */
234 cp = strtok(cp, WHITESPACE);
235 {
236 char *t = cp;
237 for (; *t != 0; t++)
238 if ('A' <= *t && *t <= 'Z')
239 *t = *t - 'A' + 'a'; /* tolower */
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000240
Damien Miller95def091999-11-25 00:26:21 +1100241 }
242 opcode = parse_token(cp, filename, linenum);
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000243
Damien Miller95def091999-11-25 00:26:21 +1100244 switch (opcode) {
245 case oBadOption:
246 return -1; /* don't panic, but count bad options */
247 /* NOTREACHED */
248 case oForwardAgent:
249 intptr = &options->forward_agent;
250parse_flag:
251 cp = strtok(NULL, WHITESPACE);
252 if (!cp)
253 fatal("%.200s line %d: Missing yes/no argument.", filename, linenum);
254 value = 0; /* To avoid compiler warning... */
255 if (strcmp(cp, "yes") == 0 || strcmp(cp, "true") == 0)
256 value = 1;
257 else if (strcmp(cp, "no") == 0 || strcmp(cp, "false") == 0)
258 value = 0;
259 else
260 fatal("%.200s line %d: Bad yes/no argument.", filename, linenum);
261 if (*activep && *intptr == -1)
262 *intptr = value;
263 break;
264
265 case oForwardX11:
266 intptr = &options->forward_x11;
267 goto parse_flag;
268
269 case oGatewayPorts:
270 intptr = &options->gateway_ports;
271 goto parse_flag;
272
273 case oUsePrivilegedPort:
274 intptr = &options->use_privileged_port;
275 goto parse_flag;
276
277 case oRhostsAuthentication:
278 intptr = &options->rhosts_authentication;
279 goto parse_flag;
280
281 case oPasswordAuthentication:
282 intptr = &options->password_authentication;
283 goto parse_flag;
284
285 case oRSAAuthentication:
286 intptr = &options->rsa_authentication;
287 goto parse_flag;
288
289 case oRhostsRSAAuthentication:
290 intptr = &options->rhosts_rsa_authentication;
291 goto parse_flag;
292
293 case oTISAuthentication:
294 /* fallthrough, there is no difference on the client side */
295 case oSkeyAuthentication:
296 intptr = &options->skey_authentication;
297 goto parse_flag;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000298
299#ifdef KRB4
Damien Miller95def091999-11-25 00:26:21 +1100300 case oKerberosAuthentication:
301 intptr = &options->kerberos_authentication;
302 goto parse_flag;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000303#endif /* KRB4 */
304
305#ifdef AFS
Damien Miller95def091999-11-25 00:26:21 +1100306 case oKerberosTgtPassing:
307 intptr = &options->kerberos_tgt_passing;
308 goto parse_flag;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000309
Damien Miller95def091999-11-25 00:26:21 +1100310 case oAFSTokenPassing:
311 intptr = &options->afs_token_passing;
312 goto parse_flag;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000313#endif
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000314
Damien Miller95def091999-11-25 00:26:21 +1100315 case oFallBackToRsh:
316 intptr = &options->fallback_to_rsh;
317 goto parse_flag;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000318
Damien Miller95def091999-11-25 00:26:21 +1100319 case oUseRsh:
320 intptr = &options->use_rsh;
321 goto parse_flag;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000322
Damien Miller95def091999-11-25 00:26:21 +1100323 case oBatchMode:
324 intptr = &options->batch_mode;
325 goto parse_flag;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000326
Damien Miller95def091999-11-25 00:26:21 +1100327 case oCheckHostIP:
328 intptr = &options->check_host_ip;
329 goto parse_flag;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000330
Damien Miller95def091999-11-25 00:26:21 +1100331 case oStrictHostKeyChecking:
332 intptr = &options->strict_host_key_checking;
333 cp = strtok(NULL, WHITESPACE);
334 if (!cp)
335 fatal("%.200s line %d: Missing yes/no argument.",
336 filename, linenum);
337 value = 0; /* To avoid compiler warning... */
338 if (strcmp(cp, "yes") == 0 || strcmp(cp, "true") == 0)
339 value = 1;
340 else if (strcmp(cp, "no") == 0 || strcmp(cp, "false") == 0)
341 value = 0;
342 else if (strcmp(cp, "ask") == 0)
343 value = 2;
344 else
345 fatal("%.200s line %d: Bad yes/no/ask argument.", filename, linenum);
346 if (*activep && *intptr == -1)
347 *intptr = value;
348 break;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000349
Damien Miller95def091999-11-25 00:26:21 +1100350 case oCompression:
351 intptr = &options->compression;
352 goto parse_flag;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000353
Damien Miller95def091999-11-25 00:26:21 +1100354 case oKeepAlives:
355 intptr = &options->keepalives;
356 goto parse_flag;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000357
Damien Miller95def091999-11-25 00:26:21 +1100358 case oNumberOfPasswordPrompts:
359 intptr = &options->number_of_password_prompts;
360 goto parse_int;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000361
Damien Miller95def091999-11-25 00:26:21 +1100362 case oCompressionLevel:
363 intptr = &options->compression_level;
364 goto parse_int;
365
366 case oIdentityFile:
367 cp = strtok(NULL, WHITESPACE);
368 if (!cp)
369 fatal("%.200s line %d: Missing argument.", filename, linenum);
370 if (*activep) {
371 if (options->num_identity_files >= SSH_MAX_IDENTITY_FILES)
372 fatal("%.200s line %d: Too many identity files specified (max %d).",
373 filename, linenum, SSH_MAX_IDENTITY_FILES);
374 options->identity_files[options->num_identity_files++] = xstrdup(cp);
375 }
376 break;
377
378 case oUser:
379 charptr = &options->user;
380parse_string:
381 cp = strtok(NULL, WHITESPACE);
382 if (!cp)
383 fatal("%.200s line %d: Missing argument.", filename, linenum);
384 if (*activep && *charptr == NULL)
385 *charptr = xstrdup(cp);
386 break;
387
388 case oGlobalKnownHostsFile:
389 charptr = &options->system_hostfile;
390 goto parse_string;
391
392 case oUserKnownHostsFile:
393 charptr = &options->user_hostfile;
394 goto parse_string;
395
396 case oHostName:
397 charptr = &options->hostname;
398 goto parse_string;
399
400 case oProxyCommand:
401 charptr = &options->proxy_command;
402 string = xstrdup("");
403 while ((cp = strtok(NULL, WHITESPACE)) != NULL) {
404 string = xrealloc(string, strlen(string) + strlen(cp) + 2);
405 strcat(string, " ");
406 strcat(string, cp);
407 }
408 if (*activep && *charptr == NULL)
409 *charptr = string;
410 else
411 xfree(string);
412 return 0;
413
414 case oPort:
415 intptr = &options->port;
416parse_int:
417 cp = strtok(NULL, WHITESPACE);
418 if (!cp)
419 fatal("%.200s line %d: Missing argument.", filename, linenum);
420 if (cp[0] < '0' || cp[0] > '9')
421 fatal("%.200s line %d: Bad number.", filename, linenum);
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000422#if 0
Damien Miller95def091999-11-25 00:26:21 +1100423 value = atoi(cp);
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000424#else
Damien Miller95def091999-11-25 00:26:21 +1100425 {
426 char *ptr;
427 value = strtol(cp, &ptr, 0); /* Octal, decimal, or
428 hex format? */
429 if (cp == ptr)
430 fatal("%.200s line %d: Bad number.", filename, linenum);
431 }
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000432#endif
Damien Miller95def091999-11-25 00:26:21 +1100433 if (*activep && *intptr == -1)
434 *intptr = value;
435 break;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000436
Damien Miller95def091999-11-25 00:26:21 +1100437 case oConnectionAttempts:
438 intptr = &options->connection_attempts;
439 goto parse_int;
Damien Miller5ce662a1999-11-11 17:57:39 +1100440
Damien Miller95def091999-11-25 00:26:21 +1100441 case oCipher:
442 intptr = &options->cipher;
443 cp = strtok(NULL, WHITESPACE);
444 value = cipher_number(cp);
445 if (value == -1)
446 fatal("%.200s line %d: Bad cipher '%s'.",
447 filename, linenum, cp ? cp : "<NONE>");
448 if (*activep && *intptr == -1)
449 *intptr = value;
450 break;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000451
Damien Miller95def091999-11-25 00:26:21 +1100452 case oLogLevel:
453 intptr = (int *) &options->log_level;
454 cp = strtok(NULL, WHITESPACE);
455 value = log_level_number(cp);
456 if (value == (LogLevel) - 1)
457 fatal("%.200s line %d: unsupported log level '%s'\n",
458 filename, linenum, cp ? cp : "<NONE>");
459 if (*activep && (LogLevel) * intptr == -1)
460 *intptr = (LogLevel) value;
461 break;
462
463 case oRemoteForward:
464 cp = strtok(NULL, WHITESPACE);
465 if (!cp)
466 fatal("%.200s line %d: Missing argument.", filename, linenum);
467 if (cp[0] < '0' || cp[0] > '9')
468 fatal("%.200s line %d: Badly formatted port number.",
469 filename, linenum);
470 fwd_port = atoi(cp);
471 cp = strtok(NULL, WHITESPACE);
472 if (!cp)
473 fatal("%.200s line %d: Missing second argument.",
474 filename, linenum);
475 if (sscanf(cp, "%255[^:]:%d", buf, &fwd_host_port) != 2)
476 fatal("%.200s line %d: Badly formatted host:port.",
477 filename, linenum);
478 if (*activep)
479 add_remote_forward(options, fwd_port, buf, fwd_host_port);
480 break;
481
482 case oLocalForward:
483 cp = strtok(NULL, WHITESPACE);
484 if (!cp)
485 fatal("%.200s line %d: Missing argument.", filename, linenum);
486 if (cp[0] < '0' || cp[0] > '9')
487 fatal("%.200s line %d: Badly formatted port number.",
488 filename, linenum);
489 fwd_port = atoi(cp);
490 cp = strtok(NULL, WHITESPACE);
491 if (!cp)
492 fatal("%.200s line %d: Missing second argument.",
493 filename, linenum);
494 if (sscanf(cp, "%255[^:]:%d", buf, &fwd_host_port) != 2)
495 fatal("%.200s line %d: Badly formatted host:port.",
496 filename, linenum);
497 if (*activep)
498 add_local_forward(options, fwd_port, buf, fwd_host_port);
499 break;
500
501 case oHost:
502 *activep = 0;
503 while ((cp = strtok(NULL, WHITESPACE)) != NULL)
504 if (match_pattern(host, cp)) {
505 debug("Applying options for %.100s", cp);
506 *activep = 1;
507 break;
508 }
509 /* Avoid garbage check below, as strtok already returned
510 NULL. */
511 return 0;
512
513 case oEscapeChar:
514 intptr = &options->escape_char;
515 cp = strtok(NULL, WHITESPACE);
516 if (!cp)
517 fatal("%.200s line %d: Missing argument.", filename, linenum);
518 if (cp[0] == '^' && cp[2] == 0 &&
519 (unsigned char) cp[1] >= 64 && (unsigned char) cp[1] < 128)
520 value = (unsigned char) cp[1] & 31;
521 else if (strlen(cp) == 1)
522 value = (unsigned char) cp[0];
523 else if (strcmp(cp, "none") == 0)
524 value = -2;
525 else {
526 fatal("%.200s line %d: Bad escape character.",
527 filename, linenum);
528 /* NOTREACHED */
529 value = 0; /* Avoid compiler warning. */
530 }
531 if (*activep && *intptr == -1)
532 *intptr = value;
533 break;
534
535 default:
536 fatal("process_config_line: Unimplemented opcode %d", opcode);
537 }
538
539 /* Check that there is no garbage at end of line. */
540 if (strtok(NULL, WHITESPACE) != NULL)
541 fatal("%.200s line %d: garbage at end of line.",
542 filename, linenum);
543 return 0;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000544}
545
546
547/* Reads the config file and modifies the options accordingly. Options should
548 already be initialized before this call. This never returns if there
549 is an error. If the file does not exist, this returns immediately. */
550
Damien Miller95def091999-11-25 00:26:21 +1100551void
552read_config_file(const char *filename, const char *host, Options *options)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000553{
Damien Miller95def091999-11-25 00:26:21 +1100554 FILE *f;
555 char line[1024];
556 int active, linenum;
557 int bad_options = 0;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000558
Damien Miller95def091999-11-25 00:26:21 +1100559 /* Open the file. */
560 f = fopen(filename, "r");
561 if (!f)
562 return;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000563
Damien Miller95def091999-11-25 00:26:21 +1100564 debug("Reading configuration data %.200s", filename);
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000565
Damien Miller95def091999-11-25 00:26:21 +1100566 /* Mark that we are now processing the options. This flag is
567 turned on/off by Host specifications. */
568 active = 1;
569 linenum = 0;
570 while (fgets(line, sizeof(line), f)) {
571 /* Update line number counter. */
572 linenum++;
573 if (process_config_line(options, host, line, filename, linenum, &active) != 0)
574 bad_options++;
575 }
576 fclose(f);
577 if (bad_options > 0)
578 fatal("%s: terminating, %d bad configuration options\n",
579 filename, bad_options);
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000580}
581
582/* Initializes options to special values that indicate that they have not
583 yet been set. Read_config_file will only set options with this value.
584 Options are processed in the following order: command line, user config
585 file, system config file. Last, fill_default_options is called. */
586
Damien Miller95def091999-11-25 00:26:21 +1100587void
588initialize_options(Options * options)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000589{
Damien Miller95def091999-11-25 00:26:21 +1100590 memset(options, 'X', sizeof(*options));
591 options->forward_agent = -1;
592 options->forward_x11 = -1;
593 options->gateway_ports = -1;
594 options->use_privileged_port = -1;
595 options->rhosts_authentication = -1;
596 options->rsa_authentication = -1;
597 options->skey_authentication = -1;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000598#ifdef KRB4
Damien Miller95def091999-11-25 00:26:21 +1100599 options->kerberos_authentication = -1;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000600#endif
601#ifdef AFS
Damien Miller95def091999-11-25 00:26:21 +1100602 options->kerberos_tgt_passing = -1;
603 options->afs_token_passing = -1;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000604#endif
Damien Miller95def091999-11-25 00:26:21 +1100605 options->password_authentication = -1;
606 options->rhosts_rsa_authentication = -1;
607 options->fallback_to_rsh = -1;
608 options->use_rsh = -1;
609 options->batch_mode = -1;
610 options->check_host_ip = -1;
611 options->strict_host_key_checking = -1;
612 options->compression = -1;
613 options->keepalives = -1;
614 options->compression_level = -1;
615 options->port = -1;
616 options->connection_attempts = -1;
617 options->number_of_password_prompts = -1;
618 options->cipher = -1;
619 options->num_identity_files = 0;
620 options->hostname = NULL;
621 options->proxy_command = NULL;
622 options->user = NULL;
623 options->escape_char = -1;
624 options->system_hostfile = NULL;
625 options->user_hostfile = NULL;
626 options->num_local_forwards = 0;
627 options->num_remote_forwards = 0;
628 options->log_level = (LogLevel) - 1;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000629}
630
631/* Called after processing other sources of option data, this fills those
632 options for which no value has been specified with their default values. */
633
Damien Miller95def091999-11-25 00:26:21 +1100634void
635fill_default_options(Options * options)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000636{
Damien Miller95def091999-11-25 00:26:21 +1100637 if (options->forward_agent == -1)
638 options->forward_agent = 1;
639 if (options->forward_x11 == -1)
640 options->forward_x11 = 1;
641 if (options->gateway_ports == -1)
642 options->gateway_ports = 0;
643 if (options->use_privileged_port == -1)
644 options->use_privileged_port = 1;
645 if (options->rhosts_authentication == -1)
646 options->rhosts_authentication = 1;
647 if (options->rsa_authentication == -1)
648 options->rsa_authentication = 1;
649 if (options->skey_authentication == -1)
650 options->skey_authentication = 0;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000651#ifdef KRB4
Damien Miller95def091999-11-25 00:26:21 +1100652 if (options->kerberos_authentication == -1)
653 options->kerberos_authentication = 1;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000654#endif /* KRB4 */
655#ifdef AFS
Damien Miller95def091999-11-25 00:26:21 +1100656 if (options->kerberos_tgt_passing == -1)
657 options->kerberos_tgt_passing = 1;
658 if (options->afs_token_passing == -1)
659 options->afs_token_passing = 1;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000660#endif /* AFS */
Damien Miller95def091999-11-25 00:26:21 +1100661 if (options->password_authentication == -1)
662 options->password_authentication = 1;
663 if (options->rhosts_rsa_authentication == -1)
664 options->rhosts_rsa_authentication = 1;
665 if (options->fallback_to_rsh == -1)
666 options->fallback_to_rsh = 1;
667 if (options->use_rsh == -1)
668 options->use_rsh = 0;
669 if (options->batch_mode == -1)
670 options->batch_mode = 0;
671 if (options->check_host_ip == -1)
672 options->check_host_ip = 1;
673 if (options->strict_host_key_checking == -1)
674 options->strict_host_key_checking = 2; /* 2 is default */
675 if (options->compression == -1)
676 options->compression = 0;
677 if (options->keepalives == -1)
678 options->keepalives = 1;
679 if (options->compression_level == -1)
680 options->compression_level = 6;
681 if (options->port == -1)
682 options->port = 0; /* Filled in ssh_connect. */
683 if (options->connection_attempts == -1)
684 options->connection_attempts = 4;
685 if (options->number_of_password_prompts == -1)
686 options->number_of_password_prompts = 3;
687 /* Selected in ssh_login(). */
688 if (options->cipher == -1)
689 options->cipher = SSH_CIPHER_NOT_SET;
690 if (options->num_identity_files == 0) {
691 options->identity_files[0] =
692 xmalloc(2 + strlen(SSH_CLIENT_IDENTITY) + 1);
693 sprintf(options->identity_files[0], "~/%.100s", SSH_CLIENT_IDENTITY);
694 options->num_identity_files = 1;
695 }
696 if (options->escape_char == -1)
697 options->escape_char = '~';
698 if (options->system_hostfile == NULL)
699 options->system_hostfile = SSH_SYSTEM_HOSTFILE;
700 if (options->user_hostfile == NULL)
701 options->user_hostfile = SSH_USER_HOSTFILE;
702 if (options->log_level == (LogLevel) - 1)
703 options->log_level = SYSLOG_LEVEL_INFO;
704 /* options->proxy_command should not be set by default */
705 /* options->user will be set in the main program if appropriate */
706 /* options->hostname will be set in the main program if appropriate */
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000707}