version 1.137, 2004/08/13 11:09:24 |
version 1.137.2.2, 2005/06/05 02:22:39 |
|
|
static void add_listen_addr(ServerOptions *, char *, u_short); |
static void add_listen_addr(ServerOptions *, char *, u_short); |
static void add_one_listen_addr(ServerOptions *, char *, u_short); |
static void add_one_listen_addr(ServerOptions *, char *, u_short); |
|
|
/* AF_UNSPEC or AF_INET or AF_INET6 */ |
|
extern int IPv4or6; |
|
/* Use of privilege separation or not */ |
/* Use of privilege separation or not */ |
extern int use_privsep; |
extern int use_privsep; |
|
|
|
|
options->num_ports = 0; |
options->num_ports = 0; |
options->ports_from_cmdline = 0; |
options->ports_from_cmdline = 0; |
options->listen_addrs = NULL; |
options->listen_addrs = NULL; |
|
options->address_family = -1; |
options->num_host_key_files = 0; |
options->num_host_key_files = 0; |
options->pid_file = NULL; |
options->pid_file = NULL; |
options->server_key_bits = -1; |
options->server_key_bits = -1; |
|
|
sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTicketCleanup, |
sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTicketCleanup, |
sKerberosGetAFSToken, |
sKerberosGetAFSToken, |
sKerberosTgtPassing, sChallengeResponseAuthentication, |
sKerberosTgtPassing, sChallengeResponseAuthentication, |
sPasswordAuthentication, sKbdInteractiveAuthentication, sListenAddress, |
sPasswordAuthentication, sKbdInteractiveAuthentication, |
|
sListenAddress, sAddressFamily, |
sPrintMotd, sPrintLastLog, sIgnoreRhosts, |
sPrintMotd, sPrintLastLog, sIgnoreRhosts, |
sX11Forwarding, sX11DisplayOffset, sX11UseLocalhost, |
sX11Forwarding, sX11DisplayOffset, sX11UseLocalhost, |
sStrictModes, sEmptyPasswd, sTCPKeepAlive, |
sStrictModes, sEmptyPasswd, sTCPKeepAlive, |
|
|
{ "skeyauthentication", sChallengeResponseAuthentication }, /* alias */ |
{ "skeyauthentication", sChallengeResponseAuthentication }, /* alias */ |
{ "checkmail", sDeprecated }, |
{ "checkmail", sDeprecated }, |
{ "listenaddress", sListenAddress }, |
{ "listenaddress", sListenAddress }, |
|
{ "addressfamily", sAddressFamily }, |
{ "printmotd", sPrintMotd }, |
{ "printmotd", sPrintMotd }, |
{ "printlastlog", sPrintLastLog }, |
{ "printlastlog", sPrintLastLog }, |
{ "ignorerhosts", sIgnoreRhosts }, |
{ "ignorerhosts", sIgnoreRhosts }, |
|
|
|
|
if (options->num_ports == 0) |
if (options->num_ports == 0) |
options->ports[options->num_ports++] = SSH_DEFAULT_PORT; |
options->ports[options->num_ports++] = SSH_DEFAULT_PORT; |
|
if (options->address_family == -1) |
|
options->address_family = AF_UNSPEC; |
if (port == 0) |
if (port == 0) |
for (i = 0; i < options->num_ports; i++) |
for (i = 0; i < options->num_ports; i++) |
add_one_listen_addr(options, addr, options->ports[i]); |
add_one_listen_addr(options, addr, options->ports[i]); |
|
|
int gaierr; |
int gaierr; |
|
|
memset(&hints, 0, sizeof(hints)); |
memset(&hints, 0, sizeof(hints)); |
hints.ai_family = IPv4or6; |
hints.ai_family = options->address_family; |
hints.ai_socktype = SOCK_STREAM; |
hints.ai_socktype = SOCK_STREAM; |
hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0; |
hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0; |
snprintf(strport, sizeof strport, "%u", port); |
snprintf(strport, sizeof strport, "%u", port); |
|
|
char *cp, **charptr, *arg, *p; |
char *cp, **charptr, *arg, *p; |
int *intptr, value, i, n; |
int *intptr, value, i, n; |
ServerOpCodes opcode; |
ServerOpCodes opcode; |
|
u_short port; |
|
|
cp = line; |
cp = line; |
arg = strdelim(&cp); |
arg = strdelim(&cp); |
|
|
|
|
case sListenAddress: |
case sListenAddress: |
arg = strdelim(&cp); |
arg = strdelim(&cp); |
if (!arg || *arg == '\0' || strncmp(arg, "[]", 2) == 0) |
if (arg == NULL || *arg == '\0') |
fatal("%s line %d: missing inet addr.", |
fatal("%s line %d: missing address", |
filename, linenum); |
filename, linenum); |
if (*arg == '[') { |
p = hpdelim(&arg); |
if ((p = strchr(arg, ']')) == NULL) |
if (p == NULL) |
fatal("%s line %d: bad ipv6 inet addr usage.", |
fatal("%s line %d: bad address:port usage", |
filename, linenum); |
filename, linenum); |
arg++; |
p = cleanhostname(p); |
memmove(p, p+1, strlen(p+1)+1); |
if (arg == NULL) |
} else if (((p = strchr(arg, ':')) == NULL) || |
port = 0; |
(strchr(p+1, ':') != NULL)) { |
else if ((port = a2port(arg)) == 0) |
add_listen_addr(options, arg, 0); |
fatal("%s line %d: bad port number", filename, linenum); |
break; |
|
} |
|
if (*p == ':') { |
|
u_short port; |
|
|
|
p++; |
add_listen_addr(options, p, port); |
if (*p == '\0') |
|
fatal("%s line %d: bad inet addr:port usage.", |
break; |
filename, linenum); |
|
else { |
case sAddressFamily: |
*(p-1) = '\0'; |
arg = strdelim(&cp); |
if ((port = a2port(p)) == 0) |
intptr = &options->address_family; |
fatal("%s line %d: bad port number.", |
if (options->listen_addrs != NULL) |
filename, linenum); |
fatal("%s line %d: address family must be specified before " |
add_listen_addr(options, arg, port); |
"ListenAddress.", filename, linenum); |
} |
if (strcasecmp(arg, "inet") == 0) |
} else if (*p == '\0') |
value = AF_INET; |
add_listen_addr(options, arg, 0); |
else if (strcasecmp(arg, "inet6") == 0) |
|
value = AF_INET6; |
|
else if (strcasecmp(arg, "any") == 0) |
|
value = AF_UNSPEC; |
else |
else |
fatal("%s line %d: bad inet addr usage.", |
fatal("%s line %d: unsupported address family \"%s\".", |
filename, linenum); |
filename, linenum, arg); |
|
if (*intptr == -1) |
|
*intptr = value; |
break; |
break; |
|
|
case sHostKeyFile: |
case sHostKeyFile: |
|
|
|
|
case sGatewayPorts: |
case sGatewayPorts: |
intptr = &options->gateway_ports; |
intptr = &options->gateway_ports; |
goto parse_flag; |
arg = strdelim(&cp); |
|
if (!arg || *arg == '\0') |
|
fatal("%s line %d: missing yes/no/clientspecified " |
|
"argument.", filename, linenum); |
|
value = 0; /* silence compiler */ |
|
if (strcmp(arg, "clientspecified") == 0) |
|
value = 2; |
|
else if (strcmp(arg, "yes") == 0) |
|
value = 1; |
|
else if (strcmp(arg, "no") == 0) |
|
value = 0; |
|
else |
|
fatal("%s line %d: Bad yes/no/clientspecified " |
|
"argument: %s", filename, linenum, arg); |
|
if (*intptr == -1) |
|
*intptr = value; |
|
break; |
|
|
case sUseDNS: |
case sUseDNS: |
intptr = &options->use_dns; |
intptr = &options->use_dns; |
|
|
|
|
obuf = cbuf = xstrdup(buffer_ptr(conf)); |
obuf = cbuf = xstrdup(buffer_ptr(conf)); |
linenum = 1; |
linenum = 1; |
while((cp = strsep(&cbuf, "\n")) != NULL) { |
while ((cp = strsep(&cbuf, "\n")) != NULL) { |
if (process_server_config_line(options, cp, filename, |
if (process_server_config_line(options, cp, filename, |
linenum++) != 0) |
linenum++) != 0) |
bad_options++; |
bad_options++; |