158 lines
4.9 KiB
Text
158 lines
4.9 KiB
Text
--- servconf.c.orig Thu Jan 17 05:35:34 2002
|
|
+++ servconf.c Fri Jun 21 16:22:56 2002
|
|
@@ -88,8 +88,8 @@
|
|
void initialize_server_options(ServerOptions *options)
|
|
{
|
|
memset(options, 0, sizeof(*options));
|
|
- options->port = -1;
|
|
- options->listen_addr.s_addr = INADDR_ANY;
|
|
+ options->num_ports = 0;
|
|
+ options->listen_addrs = NULL;
|
|
options->host_key_file = NULL;
|
|
options->random_seed_file = NULL;
|
|
options->pid_file = NULL;
|
|
@@ -99,6 +99,9 @@
|
|
options->permit_root_login = -1;
|
|
options->ignore_rhosts = -1;
|
|
options->ignore_root_rhosts = -1;
|
|
+#ifdef ENABLE_LOG_AUTH
|
|
+ options->log_auth = -1;
|
|
+#endif /* ENABLE_LOG_AUTH */
|
|
options->quiet_mode = -1;
|
|
options->fascist_logging = -1;
|
|
options->print_motd = -1;
|
|
@@ -145,17 +148,33 @@
|
|
|
|
void fill_default_server_options(ServerOptions *options)
|
|
{
|
|
- if (options->port == -1)
|
|
+ struct addrinfo hints, *ai, *aitop;
|
|
+ char strport[PORTSTRLEN];
|
|
+ int i;
|
|
+
|
|
+ if (options->num_ports == 0)
|
|
+ options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
|
|
+ if (options->listen_addrs == NULL)
|
|
{
|
|
- struct servent *sp;
|
|
+ for (i = 0; i < options->num_ports; i++)
|
|
+ {
|
|
+ memset(&hints, 0, sizeof(hints));
|
|
+ hints.ai_flags = AI_PASSIVE;
|
|
+ hints.ai_family = IPv4or6;
|
|
+ hints.ai_socktype = SOCK_STREAM;
|
|
+ sprintf(strport, "%d", options->ports[i]);
|
|
+ if (getaddrinfo(NULL, strport, &hints, &aitop) != 0)
|
|
+ {
|
|
+ fprintf(stderr, "fatal: getaddrinfo: Cannot get anyaddr.\n");
|
|
+ exit(1);
|
|
+ }
|
|
+ for (ai = aitop; ai->ai_next; ai = ai->ai_next);
|
|
+ ai->ai_next = options->listen_addrs;
|
|
+ options->listen_addrs = aitop;
|
|
+ }
|
|
+ /* freeaddrinfo(options->listen_addrs) in sshd.c */
|
|
+ }
|
|
|
|
- sp = getservbyname(SSH_SERVICE_NAME, "tcp");
|
|
- if (sp)
|
|
- options->port = ntohs(sp->s_port);
|
|
- else
|
|
- options->port = SSH_DEFAULT_PORT;
|
|
- endservent();
|
|
- }
|
|
if (options->host_key_file == NULL)
|
|
options->host_key_file = HOST_KEY_FILE;
|
|
if (options->random_seed_file == NULL)
|
|
@@ -250,6 +269,9 @@
|
|
{
|
|
sPort, sHostKeyFile, sServerKeyBits, sLoginGraceTime, sKeyRegenerationTime,
|
|
sPermitRootLogin, sQuietMode, sFascistLogging, sLogFacility,
|
|
+#ifdef ENABLE_LOG_AUTH
|
|
+ sLogAuth,
|
|
+#endif /* ENABLE_LOG_AUTH */
|
|
sRhostsAuthentication, sRhostsRSAAuthentication, sRSAAuthentication,
|
|
sTISAuthentication, sPasswordAuthentication, sAllowHosts, sDenyHosts,
|
|
sListenAddress, sPrintMotd, sIgnoreRhosts, sX11Forwarding, sX11DisplayOffset,
|
|
@@ -282,6 +304,9 @@
|
|
{ "quietmode", sQuietMode },
|
|
{ "fascistlogging", sFascistLogging },
|
|
{ "syslogfacility", sLogFacility },
|
|
+#ifdef ENABLE_LOG_AUTH
|
|
+ { "logauth", sLogAuth },
|
|
+#endif /* ENABLE_LOG_AUTH */
|
|
{ "rhostsauthentication", sRhostsAuthentication },
|
|
{ "rhostsrsaauthentication", sRhostsRSAAuthentication },
|
|
{ "rsaauthentication", sRSAAuthentication },
|
|
@@ -375,6 +400,9 @@
|
|
char *cp, **charptr;
|
|
int linenum, *intptr, i, value;
|
|
ServerOpCodes opcode;
|
|
+ struct addrinfo hints, *ai, *aitop;
|
|
+ char strport[PORTSTRLEN];
|
|
+ int gaierr;
|
|
|
|
f = fopen(filename, "r");
|
|
if (!f)
|
|
@@ -397,7 +425,14 @@
|
|
switch (opcode)
|
|
{
|
|
case sPort:
|
|
- intptr = &options->port;
|
|
+ if (options->num_ports >= MAX_PORTS)
|
|
+ {
|
|
+ fprintf(stderr, "%s line %d: too many ports.\n",
|
|
+ filename, linenum);
|
|
+ exit(1);
|
|
+ }
|
|
+ options->ports[options->num_ports] = -1;
|
|
+ intptr = &options->ports[options->num_ports++];
|
|
parse_int:
|
|
cp = strtok(NULL, WHITESPACE);
|
|
if (!cp)
|
|
@@ -460,12 +495,26 @@
|
|
filename, linenum);
|
|
exit(1);
|
|
}
|
|
-#ifdef BROKEN_INET_ADDR
|
|
- options->listen_addr.s_addr = inet_network(cp);
|
|
-#else /* BROKEN_INET_ADDR */
|
|
- options->listen_addr.s_addr = inet_addr(cp);
|
|
-#endif /* BROKEN_INET_ADDR */
|
|
- break;
|
|
+ if (options->num_ports == 0)
|
|
+ options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
|
|
+ for (i = 0; i < options->num_ports; i++)
|
|
+ {
|
|
+ memset(&hints, 0, sizeof(hints));
|
|
+ hints.ai_family = IPv4or6;
|
|
+ hints.ai_socktype = SOCK_STREAM;
|
|
+ sprintf(strport, "%d", options->ports[i]);
|
|
+ if ((gaierr = getaddrinfo(cp, strport, &hints, &aitop)) != 0)
|
|
+ {
|
|
+ fprintf(stderr, "%s line %d: bad addr or host. (%s)\n",
|
|
+ filename, linenum, gai_strerror(gaierr));
|
|
+ exit(1);
|
|
+ }
|
|
+ for (ai = aitop; ai->ai_next; ai = ai->ai_next);
|
|
+ ai->ai_next = options->listen_addrs;
|
|
+ options->listen_addrs = aitop;
|
|
+ }
|
|
+ strtok(cp, WHITESPACE); /* getaddrinfo() may use strtok() */
|
|
+ break;
|
|
|
|
case sHostKeyFile:
|
|
charptr = &options->host_key_file;
|
|
@@ -539,6 +588,12 @@
|
|
if (*intptr == -1)
|
|
*intptr = value;
|
|
break;
|
|
+
|
|
+#ifdef ENABLE_LOG_AUTH
|
|
+ case sLogAuth:
|
|
+ intptr = &options->log_auth;
|
|
+ goto parse_flag;
|
|
+#endif /* ENABLE_LOG_AUTH */
|
|
|
|
case sIgnoreRhosts:
|
|
intptr = &options->ignore_rhosts;
|