diff options
Diffstat (limited to 'servconf.c')
-rw-r--r-- | servconf.c | 126 |
1 files changed, 56 insertions, 70 deletions
diff --git a/servconf.c b/servconf.c index 74710c41f..909ad7d8f 100644 --- a/servconf.c +++ b/servconf.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: servconf.c,v 1.219 2011/05/23 03:30:07 djm Exp $ */ | 1 | /* $OpenBSD: servconf.c,v 1.220 2011/06/17 21:47:35 djm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland | 3 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland |
4 | * All rights reserved | 4 | * All rights reserved |
@@ -671,6 +671,37 @@ match_cfg_line(char **condition, int line, const char *user, const char *host, | |||
671 | 671 | ||
672 | #define WHITESPACE " \t\r\n" | 672 | #define WHITESPACE " \t\r\n" |
673 | 673 | ||
674 | /* Multistate option parsing */ | ||
675 | struct multistate { | ||
676 | char *key; | ||
677 | int value; | ||
678 | }; | ||
679 | static const struct multistate multistate_addressfamily[] = { | ||
680 | { "inet", AF_INET }, | ||
681 | { "inet6", AF_INET6 }, | ||
682 | { "any", AF_UNSPEC }, | ||
683 | { NULL, -1 } | ||
684 | }; | ||
685 | static const struct multistate multistate_permitrootlogin[] = { | ||
686 | { "without-password", PERMIT_NO_PASSWD }, | ||
687 | { "forced-commands-only", PERMIT_FORCED_ONLY }, | ||
688 | { "yes", PERMIT_YES }, | ||
689 | { "no", PERMIT_NO }, | ||
690 | { NULL, -1 } | ||
691 | }; | ||
692 | static const struct multistate multistate_compression[] = { | ||
693 | { "delayed", COMP_DELAYED }, | ||
694 | { "yes", COMP_ZLIB }, | ||
695 | { "no", COMP_NONE }, | ||
696 | { NULL, -1 } | ||
697 | }; | ||
698 | static const struct multistate multistate_gatewayports[] = { | ||
699 | { "clientspecified", 2 }, | ||
700 | { "yes", 1 }, | ||
701 | { "no", 0 }, | ||
702 | { NULL, -1 } | ||
703 | }; | ||
704 | |||
674 | int | 705 | int |
675 | process_server_config_line(ServerOptions *options, char *line, | 706 | process_server_config_line(ServerOptions *options, char *line, |
676 | const char *filename, int linenum, int *activep, const char *user, | 707 | const char *filename, int linenum, int *activep, const char *user, |
@@ -684,6 +715,7 @@ process_server_config_line(ServerOptions *options, char *line, | |||
684 | int port; | 715 | int port; |
685 | u_int i, flags = 0; | 716 | u_int i, flags = 0; |
686 | size_t len; | 717 | size_t len; |
718 | const struct multistate *multistate_ptr; | ||
687 | 719 | ||
688 | cp = line; | 720 | cp = line; |
689 | if ((arg = strdelim(&cp)) == NULL) | 721 | if ((arg = strdelim(&cp)) == NULL) |
@@ -799,24 +831,27 @@ process_server_config_line(ServerOptions *options, char *line, | |||
799 | break; | 831 | break; |
800 | 832 | ||
801 | case sAddressFamily: | 833 | case sAddressFamily: |
834 | intptr = &options->address_family; | ||
835 | multistate_ptr = multistate_addressfamily; | ||
836 | if (options->listen_addrs != NULL) | ||
837 | fatal("%s line %d: address family must be specified " | ||
838 | "before ListenAddress.", filename, linenum); | ||
839 | parse_multistate: | ||
802 | arg = strdelim(&cp); | 840 | arg = strdelim(&cp); |
803 | if (!arg || *arg == '\0') | 841 | if (!arg || *arg == '\0') |
804 | fatal("%s line %d: missing address family.", | 842 | fatal("%s line %d: missing argument.", |
805 | filename, linenum); | 843 | filename, linenum); |
806 | intptr = &options->address_family; | 844 | value = -1; |
807 | if (options->listen_addrs != NULL) | 845 | for (i = 0; multistate_ptr[i].key != NULL; i++) { |
808 | fatal("%s line %d: address family must be specified before " | 846 | if (strcasecmp(arg, multistate_ptr[i].key) == 0) { |
809 | "ListenAddress.", filename, linenum); | 847 | value = multistate_ptr[i].value; |
810 | if (strcasecmp(arg, "inet") == 0) | 848 | break; |
811 | value = AF_INET; | 849 | } |
812 | else if (strcasecmp(arg, "inet6") == 0) | 850 | } |
813 | value = AF_INET6; | 851 | if (value == -1) |
814 | else if (strcasecmp(arg, "any") == 0) | 852 | fatal("%s line %d: unsupported option \"%s\".", |
815 | value = AF_UNSPEC; | ||
816 | else | ||
817 | fatal("%s line %d: unsupported address family \"%s\".", | ||
818 | filename, linenum, arg); | 853 | filename, linenum, arg); |
819 | if (*intptr == -1) | 854 | if (*activep && *intptr == -1) |
820 | *intptr = value; | 855 | *intptr = value; |
821 | break; | 856 | break; |
822 | 857 | ||
@@ -855,27 +890,8 @@ process_server_config_line(ServerOptions *options, char *line, | |||
855 | 890 | ||
856 | case sPermitRootLogin: | 891 | case sPermitRootLogin: |
857 | intptr = &options->permit_root_login; | 892 | intptr = &options->permit_root_login; |
858 | arg = strdelim(&cp); | 893 | multistate_ptr = multistate_permitrootlogin; |
859 | if (!arg || *arg == '\0') | 894 | goto parse_multistate; |
860 | fatal("%s line %d: missing yes/" | ||
861 | "without-password/forced-commands-only/no " | ||
862 | "argument.", filename, linenum); | ||
863 | value = 0; /* silence compiler */ | ||
864 | if (strcmp(arg, "without-password") == 0) | ||
865 | value = PERMIT_NO_PASSWD; | ||
866 | else if (strcmp(arg, "forced-commands-only") == 0) | ||
867 | value = PERMIT_FORCED_ONLY; | ||
868 | else if (strcmp(arg, "yes") == 0) | ||
869 | value = PERMIT_YES; | ||
870 | else if (strcmp(arg, "no") == 0) | ||
871 | value = PERMIT_NO; | ||
872 | else | ||
873 | fatal("%s line %d: Bad yes/" | ||
874 | "without-password/forced-commands-only/no " | ||
875 | "argument: %s", filename, linenum, arg); | ||
876 | if (*activep && *intptr == -1) | ||
877 | *intptr = value; | ||
878 | break; | ||
879 | 895 | ||
880 | case sIgnoreRhosts: | 896 | case sIgnoreRhosts: |
881 | intptr = &options->ignore_rhosts; | 897 | intptr = &options->ignore_rhosts; |
@@ -1006,43 +1022,13 @@ process_server_config_line(ServerOptions *options, char *line, | |||
1006 | 1022 | ||
1007 | case sCompression: | 1023 | case sCompression: |
1008 | intptr = &options->compression; | 1024 | intptr = &options->compression; |
1009 | arg = strdelim(&cp); | 1025 | multistate_ptr = multistate_compression; |
1010 | if (!arg || *arg == '\0') | 1026 | goto parse_multistate; |
1011 | fatal("%s line %d: missing yes/no/delayed " | ||
1012 | "argument.", filename, linenum); | ||
1013 | value = 0; /* silence compiler */ | ||
1014 | if (strcmp(arg, "delayed") == 0) | ||
1015 | value = COMP_DELAYED; | ||
1016 | else if (strcmp(arg, "yes") == 0) | ||
1017 | value = COMP_ZLIB; | ||
1018 | else if (strcmp(arg, "no") == 0) | ||
1019 | value = COMP_NONE; | ||
1020 | else | ||
1021 | fatal("%s line %d: Bad yes/no/delayed " | ||
1022 | "argument: %s", filename, linenum, arg); | ||
1023 | if (*intptr == -1) | ||
1024 | *intptr = value; | ||
1025 | break; | ||
1026 | 1027 | ||
1027 | case sGatewayPorts: | 1028 | case sGatewayPorts: |
1028 | intptr = &options->gateway_ports; | 1029 | intptr = &options->gateway_ports; |
1029 | arg = strdelim(&cp); | 1030 | multistate_ptr = multistate_gatewayports; |
1030 | if (!arg || *arg == '\0') | 1031 | goto parse_multistate; |
1031 | fatal("%s line %d: missing yes/no/clientspecified " | ||
1032 | "argument.", filename, linenum); | ||
1033 | value = 0; /* silence compiler */ | ||
1034 | if (strcmp(arg, "clientspecified") == 0) | ||
1035 | value = 2; | ||
1036 | else if (strcmp(arg, "yes") == 0) | ||
1037 | value = 1; | ||
1038 | else if (strcmp(arg, "no") == 0) | ||
1039 | value = 0; | ||
1040 | else | ||
1041 | fatal("%s line %d: Bad yes/no/clientspecified " | ||
1042 | "argument: %s", filename, linenum, arg); | ||
1043 | if (*activep && *intptr == -1) | ||
1044 | *intptr = value; | ||
1045 | break; | ||
1046 | 1032 | ||
1047 | case sUseDNS: | 1033 | case sUseDNS: |
1048 | intptr = &options->use_dns; | 1034 | intptr = &options->use_dns; |