summaryrefslogtreecommitdiffstats
path: root/readconf.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>1999-11-25 00:26:21 +1100
committerDamien Miller <djm@mindrot.org>1999-11-25 00:26:21 +1100
commit95def09838fc61b37b6ea7cd5c234a465b4b129b (patch)
tree042744f76f40a326b873cb1c3690a6d7d966bc3e /readconf.c
parent4d2f15f895f4c795afc008aeff3fd2ceffbc44f4 (diff)
- Merged very large OpenBSD source code reformat
- OpenBSD CVS updates - [channels.c cipher.c compat.c log-client.c scp.c serverloop.c] [ssh.h sshd.8 sshd.c] syslog changes: * Unified Logmessage for all auth-types, for success and for failed * Standard connections get only ONE line in the LOG when level==LOG: Auth-attempts are logged only, if authentication is: a) successfull or b) with passwd or c) we had more than AUTH_FAIL_LOG failues * many log() became verbose() * old behaviour with level=VERBOSE - [readconf.c readconf.h ssh.1 ssh.h sshconnect.c sshd.c] tranfer s/key challenge/response data in SSH_SMSG_AUTH_TIS_CHALLENGE messages. allows use of s/key in windows (ttssh, securecrt) and ssh-1.2.27 clients without 'ssh -v', ok: niels@ - [sshd.8] -V, for fallback to openssh in SSH2 compatibility mode - [sshd.c] fix sigchld race; cjc5@po.cwru.edu
Diffstat (limited to 'readconf.c')
-rw-r--r--readconf.c1097
1 files changed, 548 insertions, 549 deletions
diff --git a/readconf.c b/readconf.c
index d8694b82..063bd467 100644
--- a/readconf.c
+++ b/readconf.c
@@ -1,20 +1,20 @@
/*
-
-readconf.c
-
-Author: Tatu Ylonen <ylo@cs.hut.fi>
-
-Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
- All rights reserved
-
-Created: Sat Apr 22 00:03:10 1995 ylo
-
-Functions for reading the configuration files.
-
-*/
+ *
+ * readconf.c
+ *
+ * Author: Tatu Ylonen <ylo@cs.hut.fi>
+ *
+ * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
+ * All rights reserved
+ *
+ * Created: Sat Apr 22 00:03:10 1995 ylo
+ *
+ * Functions for reading the configuration files.
+ *
+ */
#include "includes.h"
-RCSID("$Id: readconf.c,v 1.4 1999/11/21 02:23:53 damien Exp $");
+RCSID("$Id: readconf.c,v 1.5 1999/11/24 13:26:22 damien Exp $");
#include "ssh.h"
#include "cipher.h"
@@ -86,73 +86,72 @@ RCSID("$Id: readconf.c,v 1.4 1999/11/21 02:23:53 damien Exp $");
/* Keyword tokens. */
-typedef enum
-{
- oBadOption,
- oForwardAgent, oForwardX11, oGatewayPorts, oRhostsAuthentication,
- oPasswordAuthentication, oRSAAuthentication, oFallBackToRsh, oUseRsh,
+typedef enum {
+ oBadOption,
+ oForwardAgent, oForwardX11, oGatewayPorts, oRhostsAuthentication,
+ oPasswordAuthentication, oRSAAuthentication, oFallBackToRsh, oUseRsh,
+ oSkeyAuthentication,
#ifdef KRB4
- oKerberosAuthentication,
+ oKerberosAuthentication,
#endif /* KRB4 */
#ifdef AFS
- oKerberosTgtPassing, oAFSTokenPassing,
+ oKerberosTgtPassing, oAFSTokenPassing,
#endif
- oIdentityFile, oHostName, oPort, oCipher, oRemoteForward, oLocalForward,
- oUser, oHost, oEscapeChar, oRhostsRSAAuthentication, oProxyCommand,
- oGlobalKnownHostsFile, oUserKnownHostsFile, oConnectionAttempts,
- oBatchMode, oCheckHostIP, oStrictHostKeyChecking, oCompression,
- oCompressionLevel, oKeepAlives, oNumberOfPasswordPrompts, oTISAuthentication,
- oUsePrivilegedPort, oLogLevel
+ oIdentityFile, oHostName, oPort, oCipher, oRemoteForward, oLocalForward,
+ oUser, oHost, oEscapeChar, oRhostsRSAAuthentication, oProxyCommand,
+ oGlobalKnownHostsFile, oUserKnownHostsFile, oConnectionAttempts,
+ oBatchMode, oCheckHostIP, oStrictHostKeyChecking, oCompression,
+ oCompressionLevel, oKeepAlives, oNumberOfPasswordPrompts, oTISAuthentication,
+ oUsePrivilegedPort, oLogLevel
} OpCodes;
/* Textual representations of the tokens. */
-static struct
-{
- const char *name;
- OpCodes opcode;
-} keywords[] =
-{
- { "forwardagent", oForwardAgent },
- { "forwardx11", oForwardX11 },
- { "gatewayports", oGatewayPorts },
- { "useprivilegedport", oUsePrivilegedPort },
- { "rhostsauthentication", oRhostsAuthentication },
- { "passwordauthentication", oPasswordAuthentication },
- { "rsaauthentication", oRSAAuthentication },
+static struct {
+ const char *name;
+ OpCodes opcode;
+} keywords[] = {
+ { "forwardagent", oForwardAgent },
+ { "forwardx11", oForwardX11 },
+ { "gatewayports", oGatewayPorts },
+ { "useprivilegedport", oUsePrivilegedPort },
+ { "rhostsauthentication", oRhostsAuthentication },
+ { "passwordauthentication", oPasswordAuthentication },
+ { "rsaauthentication", oRSAAuthentication },
+ { "skeyauthentication", oSkeyAuthentication },
#ifdef KRB4
- { "kerberosauthentication", oKerberosAuthentication },
+ { "kerberosauthentication", oKerberosAuthentication },
#endif /* KRB4 */
#ifdef AFS
- { "kerberostgtpassing", oKerberosTgtPassing },
- { "afstokenpassing", oAFSTokenPassing },
+ { "kerberostgtpassing", oKerberosTgtPassing },
+ { "afstokenpassing", oAFSTokenPassing },
#endif
- { "fallbacktorsh", oFallBackToRsh },
- { "usersh", oUseRsh },
- { "identityfile", oIdentityFile },
- { "hostname", oHostName },
- { "proxycommand", oProxyCommand },
- { "port", oPort },
- { "cipher", oCipher },
- { "remoteforward", oRemoteForward },
- { "localforward", oLocalForward },
- { "user", oUser },
- { "host", oHost },
- { "escapechar", oEscapeChar },
- { "rhostsrsaauthentication", oRhostsRSAAuthentication },
- { "globalknownhostsfile", oGlobalKnownHostsFile },
- { "userknownhostsfile", oUserKnownHostsFile },
- { "connectionattempts", oConnectionAttempts },
- { "batchmode", oBatchMode },
- { "checkhostip", oCheckHostIP },
- { "stricthostkeychecking", oStrictHostKeyChecking },
- { "compression", oCompression },
- { "compressionlevel", oCompressionLevel },
- { "keepalive", oKeepAlives },
- { "numberofpasswordprompts", oNumberOfPasswordPrompts },
- { "tisauthentication", oTISAuthentication },
- { "loglevel", oLogLevel },
- { NULL, 0 }
+ { "fallbacktorsh", oFallBackToRsh },
+ { "usersh", oUseRsh },
+ { "identityfile", oIdentityFile },
+ { "hostname", oHostName },
+ { "proxycommand", oProxyCommand },
+ { "port", oPort },
+ { "cipher", oCipher },
+ { "remoteforward", oRemoteForward },
+ { "localforward", oLocalForward },
+ { "user", oUser },
+ { "host", oHost },
+ { "escapechar", oEscapeChar },
+ { "rhostsrsaauthentication", oRhostsRSAAuthentication },
+ { "globalknownhostsfile", oGlobalKnownHostsFile },
+ { "userknownhostsfile", oUserKnownHostsFile },
+ { "connectionattempts", oConnectionAttempts },
+ { "batchmode", oBatchMode },
+ { "checkhostip", oCheckHostIP },
+ { "stricthostkeychecking", oStrictHostKeyChecking },
+ { "compression", oCompression },
+ { "compressionlevel", oCompressionLevel },
+ { "keepalive", oKeepAlives },
+ { "numberofpasswordprompts", oNumberOfPasswordPrompts },
+ { "tisauthentication", oTISAuthentication },
+ { "loglevel", oLogLevel },
+ { NULL, 0 }
};
/* Characters considered whitespace in strtok calls. */
@@ -162,53 +161,56 @@ static struct
/* Adds a local TCP/IP port forward to options. Never returns if there
is an error. */
-void add_local_forward(Options *options, int port, const char *host,
- int host_port)
+void
+add_local_forward(Options *options, int port, const char *host,
+ int host_port)
{
- Forward *fwd;
- extern uid_t original_real_uid;
- if ((port & 0xffff) != port)
- fatal("Requested forwarding of nonexistent port %d.", port);
- if (port < IPPORT_RESERVED && original_real_uid != 0)
- fatal("Privileged ports can only be forwarded by root.\n");
- if (options->num_local_forwards >= SSH_MAX_FORWARDS_PER_DIRECTION)
- fatal("Too many local forwards (max %d).", SSH_MAX_FORWARDS_PER_DIRECTION);
- fwd = &options->local_forwards[options->num_local_forwards++];
- fwd->port = port;
- fwd->host = xstrdup(host);
- fwd->host_port = host_port;
+ Forward *fwd;
+ extern uid_t original_real_uid;
+ if ((port & 0xffff) != port)
+ fatal("Requested forwarding of nonexistent port %d.", port);
+ if (port < IPPORT_RESERVED && original_real_uid != 0)
+ fatal("Privileged ports can only be forwarded by root.\n");
+ if (options->num_local_forwards >= SSH_MAX_FORWARDS_PER_DIRECTION)
+ fatal("Too many local forwards (max %d).", SSH_MAX_FORWARDS_PER_DIRECTION);
+ fwd = &options->local_forwards[options->num_local_forwards++];
+ fwd->port = port;
+ fwd->host = xstrdup(host);
+ fwd->host_port = host_port;
}
/* Adds a remote TCP/IP port forward to options. Never returns if there
is an error. */
-void add_remote_forward(Options *options, int port, const char *host,
- int host_port)
+void
+add_remote_forward(Options *options, int port, const char *host,
+ int host_port)
{
- Forward *fwd;
- if (options->num_remote_forwards >= SSH_MAX_FORWARDS_PER_DIRECTION)
- fatal("Too many remote forwards (max %d).",
- SSH_MAX_FORWARDS_PER_DIRECTION);
- fwd = &options->remote_forwards[options->num_remote_forwards++];
- fwd->port = port;
- fwd->host = xstrdup(host);
- fwd->host_port = host_port;
+ Forward *fwd;
+ if (options->num_remote_forwards >= SSH_MAX_FORWARDS_PER_DIRECTION)
+ fatal("Too many remote forwards (max %d).",
+ SSH_MAX_FORWARDS_PER_DIRECTION);
+ fwd = &options->remote_forwards[options->num_remote_forwards++];
+ fwd->port = port;
+ fwd->host = xstrdup(host);
+ fwd->host_port = host_port;
}
/* Returns the number of the token pointed to by cp of length len.
Never returns if the token is not known. */
-static OpCodes parse_token(const char *cp, const char *filename, int linenum)
+static OpCodes
+parse_token(const char *cp, const char *filename, int linenum)
{
- unsigned int i;
+ unsigned int i;
- for (i = 0; keywords[i].name; i++)
- if (strcmp(cp, keywords[i].name) == 0)
- return keywords[i].opcode;
+ for (i = 0; keywords[i].name; i++)
+ if (strcmp(cp, keywords[i].name) == 0)
+ return keywords[i].opcode;
- fprintf(stderr, "%s: line %d: Bad configuration option: %s\n",
- filename, linenum, cp);
- return oBadOption;
+ fprintf(stderr, "%s: line %d: Bad configuration option: %s\n",
+ filename, linenum, cp);
+ return oBadOption;
}
/* Processes a single option line as used in the configuration files.
@@ -216,336 +218,329 @@ static OpCodes parse_token(const char *cp, const char *filename, int linenum)
int
process_config_line(Options *options, const char *host,
- char *line, const char *filename, int linenum,
- int *activep)
+ char *line, const char *filename, int linenum,
+ int *activep)
{
- char buf[256], *cp, *string, **charptr;
- int opcode, *intptr, value, fwd_port, fwd_host_port;
-
- /* Skip leading whitespace. */
- cp = line + strspn(line, WHITESPACE);
- if (!*cp || *cp == '\n' || *cp == '#')
- return 0;
-
- /* Get the keyword. (Each line is supposed to begin with a keyword). */
- cp = strtok(cp, WHITESPACE);
- {
- char *t = cp;
- for (; *t != 0; t++)
- if ('A' <= *t && *t <= 'Z')
- *t = *t - 'A' + 'a'; /* tolower */
-
- }
- opcode = parse_token(cp, filename, linenum);
-
- switch (opcode)
- {
- case oBadOption:
- return -1; /* don't panic, but count bad options */
- /*NOTREACHED*/
- case oForwardAgent:
- intptr = &options->forward_agent;
- parse_flag:
- cp = strtok(NULL, WHITESPACE);
- if (!cp)
- fatal("%.200s line %d: Missing yes/no argument.", filename, linenum);
- value = 0; /* To avoid compiler warning... */
- if (strcmp(cp, "yes") == 0 || strcmp(cp, "true") == 0)
- value = 1;
- else if (strcmp(cp, "no") == 0 || strcmp(cp, "false") == 0)
- value = 0;
- else
- fatal("%.200s line %d: Bad yes/no argument.", filename, linenum);
- if (*activep && *intptr == -1)
- *intptr = value;
- break;
-
- case oForwardX11:
- intptr = &options->forward_x11;
- goto parse_flag;
-
- case oGatewayPorts:
- intptr = &options->gateway_ports;
- goto parse_flag;
-
- case oUsePrivilegedPort:
- intptr = &options->use_privileged_port;
- goto parse_flag;
-
- case oRhostsAuthentication:
- intptr = &options->rhosts_authentication;
- goto parse_flag;
-
- case oPasswordAuthentication:
- intptr = &options->password_authentication;
- goto parse_flag;
-
- case oRSAAuthentication:
- intptr = &options->rsa_authentication;
- goto parse_flag;
-
- case oRhostsRSAAuthentication:
- intptr = &options->rhosts_rsa_authentication;
- goto parse_flag;
+ char buf[256], *cp, *string, **charptr;
+ int opcode, *intptr, value, fwd_port, fwd_host_port;
+
+ /* Skip leading whitespace. */
+ cp = line + strspn(line, WHITESPACE);
+ if (!*cp || *cp == '\n' || *cp == '#')
+ return 0;
+
+ /* Get the keyword. (Each line is supposed to begin with a
+ keyword). */
+ cp = strtok(cp, WHITESPACE);
+ {
+ char *t = cp;
+ for (; *t != 0; t++)
+ if ('A' <= *t && *t <= 'Z')
+ *t = *t - 'A' + 'a'; /* tolower */
+
+ }
+ opcode = parse_token(cp, filename, linenum);
+
+ switch (opcode) {
+ case oBadOption:
+ return -1; /* don't panic, but count bad options */
+ /* NOTREACHED */
+ case oForwardAgent:
+ intptr = &options->forward_agent;
+parse_flag:
+ cp = strtok(NULL, WHITESPACE);
+ if (!cp)
+ fatal("%.200s line %d: Missing yes/no argument.", filename, linenum);
+ value = 0; /* To avoid compiler warning... */
+ if (strcmp(cp, "yes") == 0 || strcmp(cp, "true") == 0)
+ value = 1;
+ else if (strcmp(cp, "no") == 0 || strcmp(cp, "false") == 0)
+ value = 0;
+ else
+ fatal("%.200s line %d: Bad yes/no argument.", filename, linenum);
+ if (*activep && *intptr == -1)
+ *intptr = value;
+ break;
+
+ case oForwardX11:
+ intptr = &options->forward_x11;
+ goto parse_flag;
+
+ case oGatewayPorts:
+ intptr = &options->gateway_ports;
+ goto parse_flag;
+
+ case oUsePrivilegedPort:
+ intptr = &options->use_privileged_port;
+ goto parse_flag;
+
+ case oRhostsAuthentication:
+ intptr = &options->rhosts_authentication;
+ goto parse_flag;
+
+ case oPasswordAuthentication:
+ intptr = &options->password_authentication;
+ goto parse_flag;
+
+ case oRSAAuthentication:
+ intptr = &options->rsa_authentication;
+ goto parse_flag;
+
+ case oRhostsRSAAuthentication:
+ intptr = &options->rhosts_rsa_authentication;
+ goto parse_flag;
+
+ case oTISAuthentication:
+ /* fallthrough, there is no difference on the client side */
+ case oSkeyAuthentication:
+ intptr = &options->skey_authentication;
+ goto parse_flag;
#ifdef KRB4
- case oKerberosAuthentication:
- intptr = &options->kerberos_authentication;
- goto parse_flag;
+ case oKerberosAuthentication:
+ intptr = &options->kerberos_authentication;
+ goto parse_flag;
#endif /* KRB4 */
#ifdef AFS
- case oKerberosTgtPassing:
- intptr = &options->kerberos_tgt_passing;
- goto parse_flag;
+ case oKerberosTgtPassing:
+ intptr = &options->kerberos_tgt_passing;
+ goto parse_flag;
- case oAFSTokenPassing:
- intptr = &options->afs_token_passing;
- goto parse_flag;
+ case oAFSTokenPassing:
+ intptr = &options->afs_token_passing;
+ goto parse_flag;
#endif
-
- case oFallBackToRsh:
- intptr = &options->fallback_to_rsh;
- goto parse_flag;
-
- case oUseRsh:
- intptr = &options->use_rsh;
- goto parse_flag;
-
- case oBatchMode:
- intptr = &options->batch_mode;
- goto parse_flag;
-
- case oCheckHostIP:
- intptr = &options->check_host_ip;
- goto parse_flag;
-
- case oStrictHostKeyChecking:
- intptr = &options->strict_host_key_checking;
- cp = strtok(NULL, WHITESPACE);
- if (!cp)
- fatal("%.200s line %d: Missing yes/no argument.",
- filename, linenum);
- value = 0; /* To avoid compiler warning... */
- if (strcmp(cp, "yes") == 0 || strcmp(cp, "true") == 0)
- value = 1;
- else if (strcmp(cp, "no") == 0 || strcmp(cp, "false") == 0)
- value = 0;
- else if (strcmp(cp, "ask") == 0)
- value = 2;
- else
- fatal("%.200s line %d: Bad yes/no/ask argument.", filename, linenum);
- if (*activep && *intptr == -1)
- *intptr = value;
- break;
-
- case oCompression:
- intptr = &options->compression;
- goto parse_flag;
-
- case oKeepAlives:
- intptr = &options->keepalives;
- goto parse_flag;
-
- case oNumberOfPasswordPrompts:
- intptr = &options->number_of_password_prompts;
- goto parse_int;
-
- case oTISAuthentication:
- cp = strtok(NULL, WHITESPACE);
- if (cp != 0 && (strcmp(cp, "yes") == 0 || strcmp(cp, "true") == 0))
- fprintf(stderr,
- "%.99s line %d: Warning, TIS is not supported.\n",
- filename,
- linenum);
- break;
-
- case oCompressionLevel:
- intptr = &options->compression_level;
- goto parse_int;
-
- case oIdentityFile:
- cp = strtok(NULL, WHITESPACE);
- if (!cp)
- fatal("%.200s line %d: Missing argument.", filename, linenum);
- if (*activep)
- {
- if (options->num_identity_files >= SSH_MAX_IDENTITY_FILES)
- fatal("%.200s line %d: Too many identity files specified (max %d).",
- filename, linenum, SSH_MAX_IDENTITY_FILES);
- options->identity_files[options->num_identity_files++] = xstrdup(cp);
- }
- break;
-
- case oUser:
- charptr = &options->user;
- parse_string:
- cp = strtok(NULL, WHITESPACE);
- if (!cp)
- fatal("%.200s line %d: Missing argument.", filename, linenum);
- if (*activep && *charptr == NULL)
- *charptr = xstrdup(cp);
- break;
-
- case oGlobalKnownHostsFile:
- charptr = &options->system_hostfile;
- goto parse_string;
-
- case oUserKnownHostsFile:
- charptr = &options->user_hostfile;
- goto parse_string;
-
- case oHostName:
- charptr = &options->hostname;
- goto parse_string;
-
- case oProxyCommand:
- charptr = &options->proxy_command;
- string = xstrdup("");
- while ((cp = strtok(NULL, WHITESPACE)) != NULL)
- {
- string = xrealloc(string, strlen(string) + strlen(cp) + 2);
- strcat(string, " ");
- strcat(string, cp);
- }
- if (*activep && *charptr == NULL)
- *charptr = string;
- else
- xfree(string);
- return 0;
-
- case oPort:
- intptr = &options->port;
- parse_int:
- cp = strtok(NULL, WHITESPACE);
- if (!cp)
- fatal("%.200s line %d: Missing argument.", filename, linenum);
- if (cp[0] < '0' || cp[0] > '9')
- fatal("%.200s line %d: Bad number.", filename, linenum);
+
+ case oFallBackToRsh:
+ intptr = &options->fallback_to_rsh;
+ goto parse_flag;
+
+ case oUseRsh:
+ intptr = &options->use_rsh;
+ goto parse_flag;
+
+ case oBatchMode:
+ intptr = &options->batch_mode;
+ goto parse_flag;
+
+ case oCheckHostIP:
+ intptr = &options->check_host_ip;
+ goto parse_flag;
+
+ case oStrictHostKeyChecking:
+ intptr = &options->strict_host_key_checking;
+ cp = strtok(NULL, WHITESPACE);
+ if (!cp)
+ fatal("%.200s line %d: Missing yes/no argument.",
+ filename, linenum);
+ value = 0; /* To avoid compiler warning... */
+ if (strcmp(cp, "yes") == 0 || strcmp(cp, "true") == 0)
+ value = 1;
+ else if (strcmp(cp, "no") == 0 || strcmp(cp, "false") == 0)
+ value = 0;
+ else if (strcmp(cp, "ask") == 0)
+ value = 2;
+ else
+ fatal("%.200s line %d: Bad yes/no/ask argument.", filename, linenum);
+ if (*activep && *intptr == -1)
+ *intptr = value;
+ break;
+
+ case oCompression:
+ intptr = &options->compression;
+ goto parse_flag;
+
+ case oKeepAlives:
+ intptr = &options->keepalives;
+ goto parse_flag;
+
+ case oNumberOfPasswordPrompts:
+ intptr = &options->number_of_password_prompts;
+ goto parse_int;
+
+ case oCompressionLevel:
+ intptr = &options->compression_level;
+ goto parse_int;
+
+ case oIdentityFile:
+ cp = strtok(NULL, WHITESPACE);
+ if (!cp)
+ fatal("%.200s line %d: Missing argument.", filename, linenum);
+ if (*activep) {
+ if (options->num_identity_files >= SSH_MAX_IDENTITY_FILES)
+ fatal("%.200s line %d: Too many identity files specified (max %d).",
+ filename, linenum, SSH_MAX_IDENTITY_FILES);
+ options->identity_files[options->num_identity_files++] = xstrdup(cp);
+ }
+ break;
+
+ case oUser:
+ charptr = &options->user;
+parse_string:
+ cp = strtok(NULL, WHITESPACE);
+ if (!cp)
+ fatal("%.200s line %d: Missing argument.", filename, linenum);
+ if (*activep && *charptr == NULL)
+ *charptr = xstrdup(cp);
+ break;
+
+ case oGlobalKnownHostsFile:
+ charptr = &options->system_hostfile;
+ goto parse_string;
+
+ case oUserKnownHostsFile:
+ charptr = &options->user_hostfile;
+ goto parse_string;
+
+ case oHostName:
+ charptr = &options->hostname;
+ goto parse_string;
+
+ case oProxyCommand:
+ charptr = &options->proxy_command;
+ string = xstrdup("");
+ while ((cp = strtok(NULL, WHITESPACE)) != NULL) {
+ string = xrealloc(string, strlen(string) + strlen(cp) + 2);
+ strcat(string, " ");
+ strcat(string, cp);
+ }
+ if (*activep && *charptr == NULL)
+ *charptr = string;
+ else
+ xfree(string);
+ return 0;
+
+ case oPort:
+ intptr = &options->port;
+parse_int:
+ cp = strtok(NULL, WHITESPACE);
+ if (!cp)
+ fatal("%.200s line %d: Missing argument.", filename, linenum);
+ if (cp[0] < '0' || cp[0] > '9')
+ fatal("%.200s line %d: Bad number.", filename, linenum);
#if 0
- value = atoi(cp);
+ value = atoi(cp);
#else
- {
- char *ptr;
- value = strtol(cp, &ptr, 0); /* Octal, decimal, or hex format? */
- if (cp == ptr)
- fatal("%.200s line %d: Bad number.", filename, linenum);
- }
+ {
+ char *ptr;
+ value = strtol(cp, &ptr, 0); /* Octal, decimal, or
+ hex format? */
+ if (cp == ptr)
+ fatal("%.200s line %d: Bad number.", filename, linenum);
+ }
#endif
- if (*activep && *intptr == -1)
- *intptr = value;
- break;
-
- case oConnectionAttempts:
- intptr = &options->connection_attempts;
- goto parse_int;
-
- case oCipher:
- intptr = &options->cipher;
- cp = strtok(NULL, WHITESPACE);
- value = cipher_number(cp);
- if (value == -1)
- fatal("%.200s line %d: Bad cipher '%s'.",
- filename, linenum, cp ? cp : "<NONE>");
- if (*activep && *intptr == -1)
- *intptr = value;
- break;
-
- case oLogLevel:
- intptr = (int *)&options->log_level;
- cp = strtok(NULL, WHITESPACE);
- value = log_level_number(cp);
- if (value == (LogLevel)-1)
- fatal("%.200s line %d: unsupported log level '%s'\n",
- filename, linenum, cp ? cp : "<NONE>");
- if (*activep && (LogLevel)*intptr == -1)
- *intptr = (LogLevel)value;
- break;
-
- case oRemoteForward:
- cp = strtok(NULL, WHITESPACE);
- if (!cp)
- fatal("%.200s line %d: Missing argument.", filename, linenum);
- if (cp[0] < '0' || cp[0] > '9')
- fatal("%.200s line %d: Badly formatted port number.",
- filename, linenum);
- fwd_port = atoi(cp);
- cp = strtok(NULL, WHITESPACE);
- if (!cp)
- fatal("%.200s line %d: Missing second argument.",
- filename, linenum);
- if (sscanf(cp, "%255[^:]:%d", buf, &fwd_host_port) != 2)
- fatal("%.200s line %d: Badly formatted host:port.",
- filename, linenum);
- if (*activep)
- add_remote_forward(options, fwd_port, buf, fwd_host_port);
- break;
-
- case oLocalForward:
- cp = strtok(NULL, WHITESPACE);
- if (!cp)
- fatal("%.200s line %d: Missing argument.", filename, linenum);
- if (cp[0] < '0' || cp[0] > '9')
- fatal("%.200s line %d: Badly formatted port number.",
- filename, linenum);
- fwd_port = atoi(cp);
- cp = strtok(NULL, WHITESPACE);
- if (!cp)
- fatal("%.200s line %d: Missing second argument.",
- filename, linenum);
- if (sscanf(cp, "%255[^:]:%d", buf, &fwd_host_port) != 2)
- fatal("%.200s line %d: Badly formatted host:port.",
- filename, linenum);
- if (*activep)
- add_local_forward(options, fwd_port, buf, fwd_host_port);
- break;
-
- case oHost:
- *activep = 0;
- while ((cp = strtok(NULL, WHITESPACE)) != NULL)
- if (match_pattern(host, cp))
- {
- debug("Applying options for %.100s", cp);
- *activep = 1;
- break;
- }
- /* Avoid garbage check below, as strtok already returned NULL. */
- return 0;
-
- case oEscapeChar:
- intptr = &options->escape_char;
- cp = strtok(NULL, WHITESPACE);
- if (!cp)
- fatal("%.200s line %d: Missing argument.", filename, linenum);
- if (cp[0] == '^' && cp[2] == 0 &&
- (unsigned char)cp[1] >= 64 && (unsigned char)cp[1] < 128)
- value = (unsigned char)cp[1] & 31;
- else
- if (strlen(cp) == 1)
- value = (unsigned char)cp[0];
- else
- if (strcmp(cp, "none") == 0)
- value = -2;
- else
- {
- fatal("%.200s line %d: Bad escape character.",
- filename, linenum);
- /*NOTREACHED*/
- value = 0; /* Avoid compiler warning. */
- }
- if (*activep && *intptr == -1)
- *intptr = value;
- break;
-
- default:
- fatal("process_config_line: Unimplemented opcode %d", opcode);
- }
-
- /* Check that there is no garbage at end of line. */
- if (strtok(NULL, WHITESPACE) != NULL)
- fatal("%.200s line %d: garbage at end of line.",
- filename, linenum);
- return 0;
+ if (*activep && *intptr == -1)
+ *intptr = value;
+ break;
+
+ case oConnectionAttempts:
+ intptr = &options->connection_attempts;
+ goto parse_int;
+
+ case oCipher:
+ intptr = &options->cipher;
+ cp = strtok(NULL, WHITESPACE);
+ value = cipher_number(cp);
+ if (value == -1)
+ fatal("%.200s line %d: Bad cipher '%s'.",
+ filename, linenum, cp ? cp : "<NONE>");
+ if (*activep && *intptr == -1)
+ *intptr = value;
+ break;
+
+ case oLogLevel:
+ intptr = (int *) &options->log_level;
+ cp = strtok(NULL, WHITESPACE);
+ value = log_level_number(cp);
+ if (value == (LogLevel) - 1)
+ fatal("%.200s line %d: unsupported log level '%s'\n",
+ filename, linenum, cp ? cp : "<NONE>");
+ if (*activep && (LogLevel) * intptr == -1)
+ *intptr = (LogLevel) value;
+ break;
+
+ case oRemoteForward:
+ cp = strtok(NULL, WHITESPACE);
+ if (!cp)
+ fatal("%.200s line %d: Missing argument.", filename, linenum);
+ if (cp[0] < '0' || cp[0] > '9')
+ fatal("%.200s line %d: Badly formatted port number.",
+ filename, linenum);
+ fwd_port = atoi(cp);
+ cp = strtok(NULL, WHITESPACE);
+ if (!cp)
+ fatal("%.200s line %d: Missing second argument.",
+ filename, linenum);
+ if (sscanf(cp, "%255[^:]:%d", buf, &fwd_host_port) != 2)
+ fatal("%.200s line %d: Badly formatted host:port.",
+ filename, linenum);
+ if (*activep)
+ add_remote_forward(options, fwd_port, buf, fwd_host_port);
+ break;
+
+ case oLocalForward:
+ cp = strtok(NULL, WHITESPACE);
+ if (!cp)
+ fatal("%.200s line %d: Missing argument.", filename, linenum);
+ if (cp[0] < '0' || cp[0] > '9')
+ fatal("%.200s line %d: Badly formatted port number.",
+ filename, linenum);
+ fwd_port = atoi(cp);
+ cp = strtok(NULL, WHITESPACE);
+ if (!cp)
+ fatal("%.200s line %d: Missing second argument.",
+ filename, linenum);
+ if (sscanf(cp, "%255[^:]:%d", buf, &fwd_host_port) != 2)
+ fatal("%.200s line %d: Badly formatted host:port.",
+ filename, linenum);
+ if (*activep)
+ add_local_forward(options, fwd_port, buf, fwd_host_port);
+ break;
+
+ case oHost:
+ *activep = 0;
+ while ((cp = strtok(NULL, WHITESPACE)) != NULL)
+ if (match_pattern(host, cp)) {
+ debug("Applying options for %.100s", cp);
+ *activep = 1;
+ break;
+ }
+ /* Avoid garbage check below, as strtok already returned
+ NULL. */
+ return 0;
+
+ case oEscapeChar:
+ intptr = &options->escape_char;
+ cp = strtok(NULL, WHITESPACE);
+ if (!cp)
+ fatal("%.200s line %d: Missing argument.", filename, linenum);
+ if (cp[0] == '^' && cp[2] == 0 &&
+ (unsigned char) cp[1] >= 64 && (unsigned char) cp[1] < 128)
+ value = (unsigned char) cp[1] & 31;
+ else if (strlen(cp) == 1)
+ value = (unsigned char) cp[0];
+ else if (strcmp(cp, "none") == 0)
+ value = -2;
+ else {
+ fatal("%.200s line %d: Bad escape character.",
+ filename, linenum);
+ /* NOTREACHED */
+ value = 0; /* Avoid compiler warning. */
+ }
+ if (*activep && *intptr == -1)
+ *intptr = value;
+ break;
+
+ default:
+ fatal("process_config_line: Unimplemented opcode %d", opcode);
+ }
+
+ /* Check that there is no garbage at end of line. */
+ if (strtok(NULL, WHITESPACE) != NULL)
+ fatal("%.200s line %d: garbage at end of line.",
+ filename, linenum);
+ return 0;
}
@@ -553,35 +548,35 @@ process_config_line(Options *options, const char *host,
already be initialized before this call. This never returns if there
is an error. If the file does not exist, this returns immediately. */
-void read_config_file(const char *filename, const char *host, Options *options)
+void
+read_config_file(const char *filename, const char *host, Options *options)
{
- FILE *f;
- char line[1024];
- int active, linenum;
- int bad_options = 0;
-
- /* Open the file. */
- f = fopen(filename, "r");
- if (!f)
- return;
-
- debug("Reading configuration data %.200s", filename);
-
- /* Mark that we are now processing the options. This flag is turned on/off
- by Host specifications. */
- active = 1;
- linenum = 0;
- while (fgets(line, sizeof(line), f))
- {
- /* Update line number counter. */
- linenum++;
- if (process_config_line(options, host, line, filename, linenum, &active) != 0)
- bad_options++;
- }
- fclose(f);
- if (bad_options > 0)
- fatal("%s: terminating, %d bad configuration options\n",
- filename, bad_options);
+ FILE *f;
+ char line[1024];
+ int active, linenum;
+ int bad_options = 0;
+
+ /* Open the file. */
+ f = fopen(filename, "r");
+ if (!f)
+ return;
+
+ debug("Reading configuration data %.200s", filename);
+
+ /* Mark that we are now processing the options. This flag is
+ turned on/off by Host specifications. */
+ active = 1;
+ linenum = 0;
+ while (fgets(line, sizeof(line), f)) {
+ /* Update line number counter. */
+ linenum++;
+ if (process_config_line(options, host, line, filename, linenum, &active) != 0)
+ bad_options++;
+ }
+ fclose(f);
+ if (bad_options > 0)
+ fatal("%s: terminating, %d bad configuration options\n",
+ filename, bad_options);
}
/* Initializes options to special values that indicate that they have not
@@ -589,120 +584,124 @@ void read_config_file(const char *filename, const char *host, Options *options)
Options are processed in the following order: command line, user config
file, system config file. Last, fill_default_options is called. */
-void initialize_options(Options *options)
+void
+initialize_options(Options * options)
{
- memset(options, 'X', sizeof(*options));
- options->forward_agent = -1;
- options->forward_x11 = -1;
- options->gateway_ports = -1;
- options->use_privileged_port = -1;
- options->rhosts_authentication = -1;
- options->rsa_authentication = -1;
+ memset(options, 'X', sizeof(*options));
+ options->forward_agent = -1;
+ options->forward_x11 = -1;
+ options->gateway_ports = -1;
+ options->use_privileged_port = -1;
+ options->rhosts_authentication = -1;
+ options->rsa_authentication = -1;
+ options->skey_authentication = -1;
#ifdef KRB4
- options->kerberos_authentication = -1;
+ options->kerberos_authentication = -1;
#endif
#ifdef AFS
- options->kerberos_tgt_passing = -1;
- options->afs_token_passing = -1;
+ options->kerberos_tgt_passing = -1;
+ options->afs_token_passing = -1;
#endif
- options->password_authentication = -1;
- options->rhosts_rsa_authentication = -1;
- options->fallback_to_rsh = -1;
- options->use_rsh = -1;
- options->batch_mode = -1;
- options->check_host_ip = -1;
- options->strict_host_key_checking = -1;
- options->compression = -1;
- options->keepalives = -1;
- options->compression_level = -1;
- options->port = -1;
- options->connection_attempts = -1;
- options->number_of_password_prompts = -1;
- options->cipher = -1;
- options->num_identity_files = 0;
- options->hostname = NULL;
- options->proxy_command = NULL;
- options->user = NULL;
- options->escape_char = -1;
- options->system_hostfile = NULL;
- options->user_hostfile = NULL;
- options->num_local_forwards = 0;
- options->num_remote_forwards = 0;
- options->log_level = (LogLevel)-1;
+ options->password_authentication = -1;
+ options->rhosts_rsa_authentication = -1;
+ options->fallback_to_rsh = -1;
+ options->use_rsh = -1;
+ options->batch_mode = -1;
+ options->check_host_ip = -1;
+ options->strict_host_key_checking = -1;
+ options->compression = -1;
+ options->keepalives = -1;
+ options->compression_level = -1;
+ options->port = -1;
+ options->connection_attempts = -1;
+ options->number_of_password_prompts = -1;