From f0cf79146c96e479ae6b9d1ef8e813b9ec68259e Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Wed, 9 Apr 2008 15:07:37 +0000 Subject: [PATCH] config available ports, iana assigned ports list. git-svn-id: file:///svn/unbound/trunk@1025 be551aaa-1e26-0410-a405-d3ace91eadb9 --- daemon/unbound.c | 3 + doc/Changelog | 3 + doc/example.conf | 8 + doc/unbound.conf.5 | 13 + util/config_file.c | 81 ++ util/config_file.h | 21 + util/configlexer.c | 973 ++++++------- util/configlexer.lex | 2 + util/configparser.c | 585 ++++---- util/configparser.h | 8 +- util/configparser.y | 24 +- util/iana_ports.inc | 3209 ++++++++++++++++++++++++++++++++++++++++++ 12 files changed, 4173 insertions(+), 757 deletions(-) create mode 100644 util/iana_ports.inc diff --git a/daemon/unbound.c b/daemon/unbound.c index 285b5d75a..17b837c96 100644 --- a/daemon/unbound.c +++ b/daemon/unbound.c @@ -108,6 +108,9 @@ checkrlimits(struct config_file* cfg) size_t total = numthread * perthread + misc; size_t avail; struct rlimit rlim; + + verbose(VERB_ALGO, "%d ports available in config", + cfg_scan_ports(cfg->outgoing_avail_ports, 65536)); if(getrlimit(RLIMIT_NOFILE, &rlim) < 0) { log_warn("getrlimit: %s", strerror(errno)); return; diff --git a/doc/Changelog b/doc/Changelog index a626bf222..83b1d0d5b 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -4,6 +4,9 @@ libev-3.2 is a little faster than libevent-1.4.3-stable (about 5%). - unused commpoints not listed in epoll list. - statistics-cumulative option so that the values are not reset. + - config creates array of available ports, 61841 available, + it excludes <1024 and iana assigned numbers. + config statements to modify the available port numbers. 8 April 2008: Wouter - unbound tries to set the ulimit fds when started as server. diff --git a/doc/example.conf b/doc/example.conf index 1edf1f873..75ee878e4 100644 --- a/doc/example.conf +++ b/doc/example.conf @@ -58,6 +58,14 @@ server: # spoof attacks, as it gets harder to guess which port is used. # But also takes more system resources (for open sockets). # outgoing-range: 256 + + # permit unbound to use this port number or port range for + # making outgoing queries, using an outgoing interface. + # outgoing-port-permit: 32768 + + # deny unbound the use this of port number or port range for + # making outgoing queries, using an outgoing interface. + # outgoing-port-avoid: "3200-3208" # number of outgoing simultaneous tcp buffers to hold per thread. # outgoing-num-tcp: 10 diff --git a/doc/unbound.conf.5 b/doc/unbound.conf.5 index 2c525215c..8cd7594e8 100644 --- a/doc/unbound.conf.5 +++ b/doc/unbound.conf.5 @@ -132,6 +132,19 @@ query interface. Must be at least 1. Default is 256. Larger numbers give more protection against spoofing attempts, but need extra resources from the operating system. .TP +.B outgoing\-port\-permit: \fI +Permit unbound to open this port or range of ports for use to send queries. +Make sure these ports are not needed by other daemons. By default only +ports above 1024 that have not been assigned by IANA are used. +Give a port number or a range of the form "low-high", without spaces. +.TP +.B outgoing\-port\-avoid: \fI +Do not permit unbound to open this port or range of ports for use to send +queries. Use this to make sure unbound does not grab a port that another +daemon needs. The port is avoided on all outgoing interfaces, both IP4 and IP6. +By default only ports above 1024 that have not been assigned by IANA are used. +Give a port number or a range of the form "low-high", without spaces. +.TP .B outgoing\-num\-tcp: \fI Number of outgoing TCP buffers to allocate per thread. Default is 10. If set to 0, or if do_tcp is "no", no TCP queries to authoritative servers are done. diff --git a/util/config_file.c b/util/config_file.c index 41a28cedf..dcf385424 100644 --- a/util/config_file.c +++ b/util/config_file.c @@ -61,6 +61,9 @@ int ub_c_wrap(void); /** print error with file and line number */ void ub_c_error(const char *message); +/** init ports possible for use */ +static void init_outgoing_availports(int* array, int num); + struct config_file* config_create() { @@ -96,6 +99,9 @@ config_create() cfg->infra_cache_slabs = 4; cfg->infra_cache_numhosts = 10000; cfg->infra_cache_lame_size = 10240; /* easily 40 or more entries */ + if(!(cfg->outgoing_avail_ports = (int*)calloc(65536, sizeof(int)))) + goto error_exit; + init_outgoing_availports(cfg->outgoing_avail_ports, 65536); if(!(cfg->username = strdup("unbound"))) goto error_exit; if(!(cfg->chrootdir = strdup(CHROOT_DIR))) goto error_exit; if(!(cfg->directory = strdup(RUN_DIR))) goto error_exit; @@ -434,6 +440,7 @@ config_delete(struct config_file* cfg) free(cfg->identity); free(cfg->version); free(cfg->module_conf); + free(cfg->outgoing_avail_ports); config_delstrlist(cfg->trust_anchor_file_list); config_delstrlist(cfg->trusted_keys_file_list); config_delstrlist(cfg->trust_anchor_list); @@ -445,6 +452,80 @@ config_delete(struct config_file* cfg) free(cfg); } +static void +init_outgoing_availports(int* a, int num) +{ + /* generated with + grep "/udp" /etc/services | awk '{print $2;}' | sed -e 's?/udp??' | sort -n | grep -v 0 | sed -e 's/^\(.*\)$/\1,/' > util/iana_ports.inc + */ + const int iana_assigned[] = { +#include "util/iana_ports.inc" + 0 }; /* trailing 0 to put behind trailing comma */ + + int i; + /* do not use <1024, that could be trouble with the system, privs */ + for(i=1024; i= (int)sizeof(buf) ) { + log_err("cannot parse port number '%s'", str); + return 0; + } + if(mid > str) + memcpy(buf, str, (size_t)(mid-str)); + buf[mid-str] = 0; + low = atoi(buf); + if(low == 0 && strcmp(buf, "0") != 0) { + log_err("cannot parse port number '%s'", buf); + return 0; + } + for(i=low; i<=high; i++) { + if(i < num) + avail[i] = (allow?i:0); + } + return 1; + } + return 1; +} + +int +cfg_scan_ports(int* avail, int num) +{ + int i; + int count = 0; + for(i=0; i" +#line 1185 "" #define INITIAL 0 #define quotedstring 1 @@ -1328,7 +1339,7 @@ YY_DECL #line 99 "util/configlexer.lex" -#line 1331 "" +#line 1342 "" if ( !(yy_init) ) { @@ -1387,13 +1398,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 794 ) + if ( yy_current_state >= 808 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 1638 ); + while ( yy_base[yy_current_state] != 1666 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -1460,356 +1471,366 @@ YY_RULE_SETUP case 9: YY_RULE_SETUP #line 108 "util/configlexer.lex" -{ YDOUT; return VAR_OUTGOING_NUM_TCP;} +{ YDOUT; return VAR_OUTGOING_PORT_PERMIT;} YY_BREAK case 10: YY_RULE_SETUP #line 109 "util/configlexer.lex" -{ YDOUT; return VAR_INCOMING_NUM_TCP;} +{ YDOUT; return VAR_OUTGOING_PORT_AVOID;} YY_BREAK case 11: YY_RULE_SETUP #line 110 "util/configlexer.lex" -{ YDOUT; return VAR_DO_IP4;} +{ YDOUT; return VAR_OUTGOING_NUM_TCP;} YY_BREAK case 12: YY_RULE_SETUP #line 111 "util/configlexer.lex" -{ YDOUT; return VAR_DO_IP6;} +{ YDOUT; return VAR_INCOMING_NUM_TCP;} YY_BREAK case 13: YY_RULE_SETUP #line 112 "util/configlexer.lex" -{ YDOUT; return VAR_DO_UDP;} +{ YDOUT; return VAR_DO_IP4;} YY_BREAK case 14: YY_RULE_SETUP #line 113 "util/configlexer.lex" -{ YDOUT; return VAR_DO_TCP;} +{ YDOUT; return VAR_DO_IP6;} YY_BREAK case 15: YY_RULE_SETUP #line 114 "util/configlexer.lex" -{ YDOUT; return VAR_DO_DAEMONIZE;} +{ YDOUT; return VAR_DO_UDP;} YY_BREAK case 16: YY_RULE_SETUP #line 115 "util/configlexer.lex" -{ YDOUT; return VAR_INTERFACE;} +{ YDOUT; return VAR_DO_TCP;} YY_BREAK case 17: YY_RULE_SETUP #line 116 "util/configlexer.lex" -{ YDOUT; return VAR_OUTGOING_INTERFACE;} +{ YDOUT; return VAR_DO_DAEMONIZE;} YY_BREAK case 18: YY_RULE_SETUP #line 117 "util/configlexer.lex" -{ YDOUT; return VAR_INTERFACE_AUTOMATIC;} +{ YDOUT; return VAR_INTERFACE;} YY_BREAK case 19: YY_RULE_SETUP #line 118 "util/configlexer.lex" -{ YDOUT; return VAR_CHROOT;} +{ YDOUT; return VAR_OUTGOING_INTERFACE;} YY_BREAK case 20: YY_RULE_SETUP #line 119 "util/configlexer.lex" -{ YDOUT; return VAR_USERNAME;} +{ YDOUT; return VAR_INTERFACE_AUTOMATIC;} YY_BREAK case 21: YY_RULE_SETUP #line 120 "util/configlexer.lex" -{ YDOUT; return VAR_DIRECTORY;} +{ YDOUT; return VAR_CHROOT;} YY_BREAK case 22: YY_RULE_SETUP #line 121 "util/configlexer.lex" -{ YDOUT; return VAR_LOGFILE;} +{ YDOUT; return VAR_USERNAME;} YY_BREAK case 23: YY_RULE_SETUP #line 122 "util/configlexer.lex" -{ YDOUT; return VAR_PIDFILE;} +{ YDOUT; return VAR_DIRECTORY;} YY_BREAK case 24: YY_RULE_SETUP #line 123 "util/configlexer.lex" -{ YDOUT; return VAR_ROOT_HINTS;} +{ YDOUT; return VAR_LOGFILE;} YY_BREAK case 25: YY_RULE_SETUP #line 124 "util/configlexer.lex" -{ YDOUT; return VAR_MSG_BUFFER_SIZE;} +{ YDOUT; return VAR_PIDFILE;} YY_BREAK case 26: YY_RULE_SETUP #line 125 "util/configlexer.lex" -{ YDOUT; return VAR_MSG_CACHE_SIZE;} +{ YDOUT; return VAR_ROOT_HINTS;} YY_BREAK case 27: YY_RULE_SETUP #line 126 "util/configlexer.lex" -{ YDOUT; return VAR_MSG_CACHE_SLABS;} +{ YDOUT; return VAR_MSG_BUFFER_SIZE;} YY_BREAK case 28: YY_RULE_SETUP #line 127 "util/configlexer.lex" -{ YDOUT; return VAR_RRSET_CACHE_SIZE;} +{ YDOUT; return VAR_MSG_CACHE_SIZE;} YY_BREAK case 29: YY_RULE_SETUP #line 128 "util/configlexer.lex" -{ YDOUT; return VAR_RRSET_CACHE_SLABS;} +{ YDOUT; return VAR_MSG_CACHE_SLABS;} YY_BREAK case 30: YY_RULE_SETUP #line 129 "util/configlexer.lex" -{ YDOUT; return VAR_CACHE_MAX_TTL;} +{ YDOUT; return VAR_RRSET_CACHE_SIZE;} YY_BREAK case 31: YY_RULE_SETUP #line 130 "util/configlexer.lex" -{ YDOUT; return VAR_INFRA_HOST_TTL;} +{ YDOUT; return VAR_RRSET_CACHE_SLABS;} YY_BREAK case 32: YY_RULE_SETUP #line 131 "util/configlexer.lex" -{ YDOUT; return VAR_INFRA_LAME_TTL;} +{ YDOUT; return VAR_CACHE_MAX_TTL;} YY_BREAK case 33: YY_RULE_SETUP #line 132 "util/configlexer.lex" -{ YDOUT; return VAR_INFRA_CACHE_SLABS;} +{ YDOUT; return VAR_INFRA_HOST_TTL;} YY_BREAK case 34: YY_RULE_SETUP #line 133 "util/configlexer.lex" -{ YDOUT; return VAR_INFRA_CACHE_NUMHOSTS;} +{ YDOUT; return VAR_INFRA_LAME_TTL;} YY_BREAK case 35: YY_RULE_SETUP #line 134 "util/configlexer.lex" -{ YDOUT; return VAR_INFRA_CACHE_LAME_SIZE;} +{ YDOUT; return VAR_INFRA_CACHE_SLABS;} YY_BREAK case 36: YY_RULE_SETUP #line 135 "util/configlexer.lex" -{ YDOUT; return VAR_NUM_QUERIES_PER_THREAD;} +{ YDOUT; return VAR_INFRA_CACHE_NUMHOSTS;} YY_BREAK case 37: YY_RULE_SETUP #line 136 "util/configlexer.lex" -{ YDOUT; return VAR_TARGET_FETCH_POLICY;} +{ YDOUT; return VAR_INFRA_CACHE_LAME_SIZE;} YY_BREAK case 38: YY_RULE_SETUP #line 137 "util/configlexer.lex" -{ YDOUT; return VAR_HARDEN_SHORT_BUFSIZE;} +{ YDOUT; return VAR_NUM_QUERIES_PER_THREAD;} YY_BREAK case 39: YY_RULE_SETUP #line 138 "util/configlexer.lex" -{ YDOUT; return VAR_HARDEN_LARGE_QUERIES;} +{ YDOUT; return VAR_TARGET_FETCH_POLICY;} YY_BREAK case 40: YY_RULE_SETUP #line 139 "util/configlexer.lex" -{ YDOUT; return VAR_HARDEN_GLUE;} +{ YDOUT; return VAR_HARDEN_SHORT_BUFSIZE;} YY_BREAK case 41: YY_RULE_SETUP #line 140 "util/configlexer.lex" -{ YDOUT; return VAR_HARDEN_DNNSEC_STRIPPED;} +{ YDOUT; return VAR_HARDEN_LARGE_QUERIES;} YY_BREAK case 42: YY_RULE_SETUP #line 141 "util/configlexer.lex" -{ YDOUT; return VAR_USE_CAPS_FOR_ID;} +{ YDOUT; return VAR_HARDEN_GLUE;} YY_BREAK case 43: YY_RULE_SETUP #line 142 "util/configlexer.lex" -{ YDOUT; return VAR_STUB_ZONE;} +{ YDOUT; return VAR_HARDEN_DNNSEC_STRIPPED;} YY_BREAK case 44: YY_RULE_SETUP #line 143 "util/configlexer.lex" -{ YDOUT; return VAR_NAME;} +{ YDOUT; return VAR_USE_CAPS_FOR_ID;} YY_BREAK case 45: YY_RULE_SETUP #line 144 "util/configlexer.lex" -{ YDOUT; return VAR_STUB_ADDR;} +{ YDOUT; return VAR_STUB_ZONE;} YY_BREAK case 46: YY_RULE_SETUP #line 145 "util/configlexer.lex" -{ YDOUT; return VAR_STUB_HOST;} +{ YDOUT; return VAR_NAME;} YY_BREAK case 47: YY_RULE_SETUP #line 146 "util/configlexer.lex" -{ YDOUT; return VAR_FORWARD_ZONE;} +{ YDOUT; return VAR_STUB_ADDR;} YY_BREAK case 48: YY_RULE_SETUP #line 147 "util/configlexer.lex" -{ YDOUT; return VAR_FORWARD_ADDR;} +{ YDOUT; return VAR_STUB_HOST;} YY_BREAK case 49: YY_RULE_SETUP #line 148 "util/configlexer.lex" -{ YDOUT; return VAR_FORWARD_HOST;} +{ YDOUT; return VAR_FORWARD_ZONE;} YY_BREAK case 50: YY_RULE_SETUP #line 149 "util/configlexer.lex" -{ YDOUT; return VAR_DO_NOT_QUERY_ADDRESS;} +{ YDOUT; return VAR_FORWARD_ADDR;} YY_BREAK case 51: YY_RULE_SETUP #line 150 "util/configlexer.lex" -{ YDOUT; return VAR_DO_NOT_QUERY_LOCALHOST;} +{ YDOUT; return VAR_FORWARD_HOST;} YY_BREAK case 52: YY_RULE_SETUP #line 151 "util/configlexer.lex" -{ YDOUT; return VAR_ACCESS_CONTROL;} +{ YDOUT; return VAR_DO_NOT_QUERY_ADDRESS;} YY_BREAK case 53: YY_RULE_SETUP #line 152 "util/configlexer.lex" -{ YDOUT; return VAR_HIDE_IDENTITY;} +{ YDOUT; return VAR_DO_NOT_QUERY_LOCALHOST;} YY_BREAK case 54: YY_RULE_SETUP #line 153 "util/configlexer.lex" -{ YDOUT; return VAR_HIDE_VERSION;} +{ YDOUT; return VAR_ACCESS_CONTROL;} YY_BREAK case 55: YY_RULE_SETUP #line 154 "util/configlexer.lex" -{ YDOUT; return VAR_IDENTITY;} +{ YDOUT; return VAR_HIDE_IDENTITY;} YY_BREAK case 56: YY_RULE_SETUP #line 155 "util/configlexer.lex" -{ YDOUT; return VAR_VERSION;} +{ YDOUT; return VAR_HIDE_VERSION;} YY_BREAK case 57: YY_RULE_SETUP #line 156 "util/configlexer.lex" -{ YDOUT; return VAR_MODULE_CONF;} +{ YDOUT; return VAR_IDENTITY;} YY_BREAK case 58: YY_RULE_SETUP #line 157 "util/configlexer.lex" -{ YDOUT; return VAR_TRUST_ANCHOR_FILE;} +{ YDOUT; return VAR_VERSION;} YY_BREAK case 59: YY_RULE_SETUP #line 158 "util/configlexer.lex" -{ YDOUT; return VAR_TRUSTED_KEYS_FILE;} +{ YDOUT; return VAR_MODULE_CONF;} YY_BREAK case 60: YY_RULE_SETUP #line 159 "util/configlexer.lex" -{ YDOUT; return VAR_TRUST_ANCHOR;} +{ YDOUT; return VAR_TRUST_ANCHOR_FILE;} YY_BREAK case 61: YY_RULE_SETUP #line 160 "util/configlexer.lex" -{ YDOUT; return VAR_VAL_OVERRIDE_DATE;} +{ YDOUT; return VAR_TRUSTED_KEYS_FILE;} YY_BREAK case 62: YY_RULE_SETUP #line 161 "util/configlexer.lex" -{ YDOUT; return VAR_BOGUS_TTL;} +{ YDOUT; return VAR_TRUST_ANCHOR;} YY_BREAK case 63: YY_RULE_SETUP #line 162 "util/configlexer.lex" -{ YDOUT; return VAR_VAL_CLEAN_ADDITIONAL;} +{ YDOUT; return VAR_VAL_OVERRIDE_DATE;} YY_BREAK case 64: YY_RULE_SETUP #line 163 "util/configlexer.lex" -{ YDOUT; return VAR_VAL_PERMISSIVE_MODE;} +{ YDOUT; return VAR_BOGUS_TTL;} YY_BREAK case 65: YY_RULE_SETUP #line 164 "util/configlexer.lex" -{ YDOUT; return VAR_KEY_CACHE_SIZE;} +{ YDOUT; return VAR_VAL_CLEAN_ADDITIONAL;} YY_BREAK case 66: YY_RULE_SETUP #line 165 "util/configlexer.lex" -{ YDOUT; return VAR_KEY_CACHE_SLABS;} +{ YDOUT; return VAR_VAL_PERMISSIVE_MODE;} YY_BREAK case 67: YY_RULE_SETUP #line 166 "util/configlexer.lex" -{ YDOUT; return VAR_VAL_NSEC3_KEYSIZE_ITERATIONS;} +{ YDOUT; return VAR_KEY_CACHE_SIZE;} YY_BREAK case 68: YY_RULE_SETUP #line 167 "util/configlexer.lex" -{ YDOUT; return VAR_USE_SYSLOG;} +{ YDOUT; return VAR_KEY_CACHE_SLABS;} YY_BREAK case 69: YY_RULE_SETUP #line 168 "util/configlexer.lex" -{ YDOUT; return VAR_LOCAL_ZONE;} +{ YDOUT; return VAR_VAL_NSEC3_KEYSIZE_ITERATIONS;} YY_BREAK case 70: YY_RULE_SETUP #line 169 "util/configlexer.lex" -{ YDOUT; return VAR_LOCAL_DATA;} +{ YDOUT; return VAR_USE_SYSLOG;} YY_BREAK case 71: YY_RULE_SETUP #line 170 "util/configlexer.lex" -{ YDOUT; return VAR_STATISTICS_INTERVAL;} +{ YDOUT; return VAR_LOCAL_ZONE;} YY_BREAK case 72: YY_RULE_SETUP #line 171 "util/configlexer.lex" -{ YDOUT; return VAR_STATISTICS_CUMULATIVE;} +{ YDOUT; return VAR_LOCAL_DATA;} YY_BREAK case 73: -/* rule 73 can match eol */ YY_RULE_SETUP #line 172 "util/configlexer.lex" +{ YDOUT; return VAR_STATISTICS_INTERVAL;} + YY_BREAK +case 74: +YY_RULE_SETUP +#line 173 "util/configlexer.lex" +{ YDOUT; return VAR_STATISTICS_CUMULATIVE;} + YY_BREAK +case 75: +/* rule 75 can match eol */ +YY_RULE_SETUP +#line 174 "util/configlexer.lex" { LEXOUT(("NL\n")); cfg_parser->line++;} YY_BREAK /* Quoted strings. Strip leading and ending quotes */ -case 74: +case 76: YY_RULE_SETUP -#line 175 "util/configlexer.lex" +#line 177 "util/configlexer.lex" { BEGIN(quotedstring); LEXOUT(("QS ")); } YY_BREAK case YY_STATE_EOF(quotedstring): -#line 176 "util/configlexer.lex" +#line 178 "util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(INITIAL); } YY_BREAK -case 75: +case 77: YY_RULE_SETUP -#line 180 "util/configlexer.lex" +#line 182 "util/configlexer.lex" { LEXOUT(("STR(%s) ", yytext)); yymore(); } YY_BREAK -case 76: -/* rule 76 can match eol */ +case 78: +/* rule 78 can match eol */ YY_RULE_SETUP -#line 181 "util/configlexer.lex" +#line 183 "util/configlexer.lex" { cfg_parser->line++; yymore(); } YY_BREAK -case 77: +case 79: YY_RULE_SETUP -#line 182 "util/configlexer.lex" +#line 184 "util/configlexer.lex" { LEXOUT(("QE ")); BEGIN(INITIAL); @@ -1821,32 +1842,32 @@ YY_RULE_SETUP } YY_BREAK /* Single Quoted strings. Strip leading and ending quotes */ -case 78: +case 80: YY_RULE_SETUP -#line 193 "util/configlexer.lex" +#line 195 "util/configlexer.lex" { BEGIN(singlequotedstr); LEXOUT(("SQS ")); } YY_BREAK case YY_STATE_EOF(singlequotedstr): -#line 194 "util/configlexer.lex" +#line 196 "util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(INITIAL); } YY_BREAK -case 79: +case 81: YY_RULE_SETUP -#line 198 "util/configlexer.lex" +#line 200 "util/configlexer.lex" { LEXOUT(("STR(%s) ", yytext)); yymore(); } YY_BREAK -case 80: -/* rule 80 can match eol */ +case 82: +/* rule 82 can match eol */ YY_RULE_SETUP -#line 199 "util/configlexer.lex" +#line 201 "util/configlexer.lex" { cfg_parser->line++; yymore(); } YY_BREAK -case 81: +case 83: YY_RULE_SETUP -#line 200 "util/configlexer.lex" +#line 202 "util/configlexer.lex" { LEXOUT(("SQE ")); BEGIN(INITIAL); @@ -1858,37 +1879,37 @@ YY_RULE_SETUP } YY_BREAK /* include: directive */ -case 82: +case 84: YY_RULE_SETUP -#line 211 "util/configlexer.lex" +#line 213 "util/configlexer.lex" { LEXOUT(("v(%s) ", yytext)); BEGIN(include); } YY_BREAK case YY_STATE_EOF(include): -#line 212 "util/configlexer.lex" +#line 214 "util/configlexer.lex" { yyerror("EOF inside include directive"); BEGIN(INITIAL); } YY_BREAK -case 83: +case 85: YY_RULE_SETUP -#line 216 "util/configlexer.lex" +#line 218 "util/configlexer.lex" { LEXOUT(("ISP ")); /* ignore */ } YY_BREAK -case 84: -/* rule 84 can match eol */ +case 86: +/* rule 86 can match eol */ YY_RULE_SETUP -#line 217 "util/configlexer.lex" +#line 219 "util/configlexer.lex" { LEXOUT(("NL\n")); cfg_parser->line++;} YY_BREAK -case 85: +case 87: YY_RULE_SETUP -#line 218 "util/configlexer.lex" +#line 220 "util/configlexer.lex" { LEXOUT(("IQS ")); BEGIN(include_quoted); } YY_BREAK -case 86: +case 88: YY_RULE_SETUP -#line 219 "util/configlexer.lex" +#line 221 "util/configlexer.lex" { LEXOUT(("Iunquotedstr(%s) ", yytext)); config_start_include(yytext); @@ -1896,26 +1917,26 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(include_quoted): -#line 224 "util/configlexer.lex" +#line 226 "util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(INITIAL); } YY_BREAK -case 87: +case 89: YY_RULE_SETUP -#line 228 "util/configlexer.lex" +#line 230 "util/configlexer.lex" { LEXOUT(("ISTR(%s) ", yytext)); yymore(); } YY_BREAK -case 88: -/* rule 88 can match eol */ +case 90: +/* rule 90 can match eol */ YY_RULE_SETUP -#line 229 "util/configlexer.lex" +#line 231 "util/configlexer.lex" { cfg_parser->line++; yymore(); } YY_BREAK -case 89: +case 91: YY_RULE_SETUP -#line 230 "util/configlexer.lex" +#line 232 "util/configlexer.lex" { LEXOUT(("IQE ")); yytext[yyleng - 1] = '\0'; @@ -1924,7 +1945,7 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(INITIAL): -#line 236 "util/configlexer.lex" +#line 238 "util/configlexer.lex" { yy_set_bol(1); /* Set beginning of line, so "^" rules match. */ if (config_include_stack_ptr == 0) { @@ -1935,18 +1956,18 @@ case YY_STATE_EOF(INITIAL): } } YY_BREAK -case 90: +case 92: YY_RULE_SETUP -#line 246 "util/configlexer.lex" +#line 248 "util/configlexer.lex" { LEXOUT(("unquotedstr(%s) ", yytext)); yylval.str = strdup(yytext); return STRING; } YY_BREAK -case 91: +case 93: YY_RULE_SETUP -#line 249 "util/configlexer.lex" +#line 251 "util/configlexer.lex" ECHO; YY_BREAK -#line 1949 "" +#line 1970 "" case YY_END_OF_BUFFER: { @@ -2228,7 +2249,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 794 ) + if ( yy_current_state >= 808 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -2256,11 +2277,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 794 ) + if ( yy_current_state >= 808 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 793); + yy_is_jam = (yy_current_state == 807); return yy_is_jam ? 0 : yy_current_state; } @@ -2893,7 +2914,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 249 "util/configlexer.lex" +#line 251 "util/configlexer.lex" diff --git a/util/configlexer.lex b/util/configlexer.lex index 988e3ed23..b4d55d955 100644 --- a/util/configlexer.lex +++ b/util/configlexer.lex @@ -105,6 +105,8 @@ verbosity{COLON} { YDOUT; return VAR_VERBOSITY;} port{COLON} { YDOUT; return VAR_PORT;} outgoing-port{COLON} { YDOUT; return VAR_OUTGOING_PORT;} outgoing-range{COLON} { YDOUT; return VAR_OUTGOING_RANGE;} +outgoing-port-permit{COLON} { YDOUT; return VAR_OUTGOING_PORT_PERMIT;} +outgoing-port-avoid{COLON} { YDOUT; return VAR_OUTGOING_PORT_AVOID;} outgoing-num-tcp{COLON} { YDOUT; return VAR_OUTGOING_NUM_TCP;} incoming-num-tcp{COLON} { YDOUT; return VAR_INCOMING_NUM_TCP;} do-ip4{COLON} { YDOUT; return VAR_DO_IP4;} diff --git a/util/configparser.c b/util/configparser.c index 4116b1a02..f2681c7f3 100644 --- a/util/configparser.c +++ b/util/configparser.c @@ -143,7 +143,9 @@ VAR_STATISTICS_INTERVAL = 332, VAR_DO_DAEMONIZE = 333, VAR_USE_CAPS_FOR_ID = 334, - VAR_STATISTICS_CUMULATIVE = 335 + VAR_STATISTICS_CUMULATIVE = 335, + VAR_OUTGOING_PORT_PERMIT = 336, + VAR_OUTGOING_PORT_AVOID = 337 }; #endif /* Tokens. */ @@ -225,6 +227,8 @@ #define VAR_DO_DAEMONIZE 333 #define VAR_USE_CAPS_FOR_ID 334 #define VAR_STATISTICS_CUMULATIVE 335 +#define VAR_OUTGOING_PORT_PERMIT 336 +#define VAR_OUTGOING_PORT_AVOID 337 @@ -283,7 +287,7 @@ typedef union YYSTYPE char* str; } /* Line 187 of yacc.c. */ -#line 287 "util/configparser.c" +#line 291 "util/configparser.c" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -296,7 +300,7 @@ typedef union YYSTYPE /* Line 216 of yacc.c. */ -#line 300 "util/configparser.c" +#line 304 "util/configparser.c" #ifdef short # undef short @@ -511,20 +515,20 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 141 +#define YYLAST 145 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 81 +#define YYNTOKENS 83 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 80 +#define YYNNTS 82 /* YYNRULES -- Number of rules. */ -#define YYNRULES 151 +#define YYNRULES 155 /* YYNRULES -- Number of states. */ -#define YYNSTATES 222 +#define YYNSTATES 228 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 335 +#define YYMAXUTOK 337 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -565,7 +569,7 @@ static const yytype_uint8 yytranslate[] = 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80 + 75, 76, 77, 78, 79, 80, 81, 82 }; #if YYDEBUG @@ -580,40 +584,41 @@ static const yytype_uint16 yyprhs[] = 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, - 142, 144, 146, 148, 151, 152, 154, 156, 158, 160, - 163, 164, 166, 168, 170, 173, 176, 179, 182, 185, - 188, 191, 194, 197, 200, 203, 206, 209, 212, 215, - 218, 221, 224, 227, 230, 233, 236, 239, 242, 245, - 248, 251, 254, 257, 260, 263, 266, 269, 272, 275, - 278, 281, 284, 287, 290, 293, 296, 299, 302, 305, - 308, 311, 314, 317, 320, 324, 327, 330, 333, 336, - 339, 342, 345, 348, 351, 355, 358, 361, 364, 367, - 370, 373 + 142, 144, 146, 148, 150, 152, 155, 156, 158, 160, + 162, 164, 167, 168, 170, 172, 174, 177, 180, 183, + 186, 189, 192, 195, 198, 201, 204, 207, 210, 213, + 216, 219, 222, 225, 228, 231, 234, 237, 240, 243, + 246, 249, 252, 255, 258, 261, 264, 267, 270, 273, + 276, 279, 282, 285, 288, 291, 294, 297, 300, 303, + 306, 309, 312, 315, 318, 321, 324, 327, 330, 334, + 337, 340, 343, 346, 349, 352, 355, 358, 361, 365, + 368, 371, 374, 377, 380, 383 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { - 82, 0, -1, -1, 82, 83, -1, 84, 85, -1, - 87, 88, -1, 90, 91, -1, 11, -1, 85, 86, - -1, -1, 93, -1, 94, -1, 97, -1, 100, -1, - 101, -1, 105, -1, 106, -1, 107, -1, 108, -1, - 98, -1, 111, -1, 112, -1, 113, -1, 114, -1, - 115, -1, 125, -1, 126, -1, 127, -1, 128, -1, - 129, -1, 102, -1, 130, -1, 131, -1, 134, -1, - 132, -1, 133, -1, 135, -1, 136, -1, 137, -1, - 141, -1, 120, -1, 121, -1, 122, -1, 123, -1, - 138, -1, 144, -1, 117, -1, 119, -1, 145, -1, - 147, -1, 148, -1, 149, -1, 103, -1, 124, -1, - 151, -1, 152, -1, 118, -1, 150, -1, 110, -1, - 99, -1, 116, -1, 142, -1, 146, -1, 139, -1, - 143, -1, 153, -1, 154, -1, 104, -1, 95, -1, - 109, -1, 140, -1, 96, -1, 39, -1, 88, 89, - -1, -1, 155, -1, 156, -1, 157, -1, 45, -1, - 91, 92, -1, -1, 158, -1, 159, -1, 160, -1, - 13, 10, -1, 12, 10, -1, 77, 10, -1, 80, - 10, -1, 14, 10, -1, 17, 10, -1, 68, 10, - -1, 15, 10, -1, 16, 10, -1, 32, 10, -1, + 84, 0, -1, -1, 84, 85, -1, 86, 87, -1, + 89, 90, -1, 92, 93, -1, 11, -1, 87, 88, + -1, -1, 95, -1, 96, -1, 99, -1, 102, -1, + 103, -1, 109, -1, 110, -1, 111, -1, 112, -1, + 100, -1, 115, -1, 116, -1, 117, -1, 118, -1, + 119, -1, 129, -1, 130, -1, 131, -1, 132, -1, + 133, -1, 106, -1, 134, -1, 135, -1, 138, -1, + 136, -1, 137, -1, 139, -1, 140, -1, 141, -1, + 145, -1, 124, -1, 125, -1, 126, -1, 127, -1, + 142, -1, 148, -1, 121, -1, 123, -1, 149, -1, + 151, -1, 152, -1, 153, -1, 107, -1, 128, -1, + 155, -1, 156, -1, 122, -1, 154, -1, 114, -1, + 101, -1, 120, -1, 146, -1, 150, -1, 143, -1, + 147, -1, 157, -1, 158, -1, 108, -1, 97, -1, + 113, -1, 144, -1, 98, -1, 104, -1, 105, -1, + 39, -1, 90, 91, -1, -1, 159, -1, 160, -1, + 161, -1, 45, -1, 93, 94, -1, -1, 162, -1, + 163, -1, 164, -1, 13, 10, -1, 12, 10, -1, + 77, 10, -1, 80, 10, -1, 14, 10, -1, 17, + 10, -1, 68, 10, -1, 15, 10, -1, 16, 10, + -1, 81, 10, -1, 82, 10, -1, 32, 10, -1, 61, 10, -1, 76, 10, -1, 18, 10, -1, 19, 10, -1, 20, 10, -1, 21, 10, -1, 78, 10, -1, 67, 10, -1, 22, 10, -1, 23, 10, -1, @@ -637,22 +642,22 @@ static const yytype_int16 yyrhs[] = /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 95, 95, 95, 96, 96, 97, 101, 106, 107, - 108, 108, 108, 109, 109, 109, 110, 110, 110, 111, - 111, 111, 112, 112, 112, 113, 113, 114, 114, 115, - 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, - 120, 121, 121, 121, 122, 122, 122, 123, 123, 123, - 124, 124, 125, 125, 126, 126, 127, 127, 128, 128, - 128, 129, 129, 130, 130, 131, 131, 131, 132, 132, - 133, 133, 135, 147, 148, 149, 149, 149, 151, 163, - 164, 165, 165, 165, 167, 176, 185, 196, 205, 214, - 227, 242, 251, 260, 269, 278, 287, 296, 305, 314, - 323, 332, 346, 353, 360, 367, 375, 382, 389, 397, - 405, 412, 421, 430, 437, 444, 455, 463, 476, 485, - 493, 506, 515, 524, 533, 542, 555, 562, 572, 582, - 592, 602, 612, 619, 629, 642, 649, 667, 676, 685, - 695, 705, 712, 720, 733, 752, 759, 766, 773, 780, - 787, 794 + 0, 96, 96, 96, 97, 97, 98, 102, 107, 108, + 109, 109, 109, 110, 110, 110, 111, 111, 111, 112, + 112, 112, 113, 113, 113, 114, 114, 115, 115, 116, + 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, + 121, 122, 122, 122, 123, 123, 123, 124, 124, 124, + 125, 125, 126, 126, 127, 127, 128, 128, 129, 129, + 129, 130, 130, 131, 131, 132, 132, 132, 133, 133, + 134, 134, 135, 135, 137, 149, 150, 151, 151, 151, + 153, 165, 166, 167, 167, 167, 169, 178, 187, 198, + 207, 216, 229, 244, 253, 262, 271, 280, 289, 298, + 307, 316, 325, 334, 343, 352, 366, 373, 380, 387, + 395, 402, 409, 417, 425, 432, 441, 450, 457, 464, + 475, 483, 496, 505, 513, 526, 535, 544, 553, 562, + 575, 582, 592, 602, 612, 622, 632, 639, 649, 662, + 669, 687, 696, 705, 715, 725, 732, 740, 753, 772, + 779, 786, 793, 800, 807, 814 }; #endif @@ -685,13 +690,15 @@ static const char *const yytname[] = "VAR_CACHE_MAX_TTL", "VAR_HARDEN_DNNSEC_STRIPPED", "VAR_ACCESS_CONTROL", "VAR_LOCAL_ZONE", "VAR_LOCAL_DATA", "VAR_INTERFACE_AUTOMATIC", "VAR_STATISTICS_INTERVAL", "VAR_DO_DAEMONIZE", "VAR_USE_CAPS_FOR_ID", - "VAR_STATISTICS_CUMULATIVE", "$accept", "toplevelvars", "toplevelvar", + "VAR_STATISTICS_CUMULATIVE", "VAR_OUTGOING_PORT_PERMIT", + "VAR_OUTGOING_PORT_AVOID", "$accept", "toplevelvars", "toplevelvar", "serverstart", "contents_server", "content_server", "stubstart", "contents_stub", "content_stub", "forwardstart", "contents_forward", "content_forward", "server_num_threads", "server_verbosity", "server_statistics_interval", "server_statistics_cumulative", "server_port", "server_interface", "server_outgoing_interface", "server_outgoing_port", "server_outgoing_range", + "server_outgoing_port_permit", "server_outgoing_port_avoid", "server_outgoing_num_tcp", "server_incoming_num_tcp", "server_interface_automatic", "server_do_ip4", "server_do_ip6", "server_do_udp", "server_do_tcp", "server_do_daemonize", @@ -732,29 +739,29 @@ static const yytype_uint16 yytoknum[] = 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335 + 335, 336, 337 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 81, 82, 82, 83, 83, 83, 84, 85, 85, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 87, 88, 88, 89, 89, 89, 90, 91, - 91, 92, 92, 92, 93, 94, 95, 96, 97, 98, + 0, 83, 84, 84, 85, 85, 85, 86, 87, 87, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 89, 90, 90, 91, 91, 91, + 92, 93, 93, 94, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160 + 159, 160, 161, 162, 163, 164 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -767,15 +774,15 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 0, 1, 1, 1, 1, 2, - 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, + 1, 2, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, - 2, 2 + 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, + 2, 2, 2, 2, 2, 2 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -783,42 +790,43 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 2, 0, 1, 7, 72, 78, 3, 9, 74, 80, + 2, 0, 1, 7, 74, 80, 3, 9, 76, 82, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 10, 11, 68, 71, - 12, 19, 59, 13, 14, 30, 52, 67, 15, 16, - 17, 18, 69, 58, 20, 21, 22, 23, 24, 60, - 46, 56, 47, 40, 41, 42, 43, 53, 25, 26, - 27, 28, 29, 31, 32, 34, 35, 33, 36, 37, - 38, 44, 63, 70, 39, 61, 64, 45, 48, 62, - 49, 50, 51, 57, 54, 55, 65, 66, 0, 0, - 0, 73, 75, 76, 77, 0, 0, 0, 79, 81, - 82, 83, 85, 84, 88, 91, 92, 89, 96, 97, - 98, 99, 102, 103, 104, 105, 106, 116, 117, 118, - 119, 120, 93, 121, 122, 125, 123, 124, 126, 127, - 128, 132, 111, 112, 113, 114, 129, 135, 108, 110, - 136, 138, 139, 140, 94, 115, 142, 143, 109, 141, - 101, 90, 107, 133, 137, 130, 0, 0, 145, 95, - 86, 100, 131, 87, 146, 147, 148, 149, 150, 151, - 134, 144 + 0, 0, 0, 0, 0, 0, 0, 8, 10, 11, + 68, 71, 12, 19, 59, 13, 14, 72, 73, 30, + 52, 67, 15, 16, 17, 18, 69, 58, 20, 21, + 22, 23, 24, 60, 46, 56, 47, 40, 41, 42, + 43, 53, 25, 26, 27, 28, 29, 31, 32, 34, + 35, 33, 36, 37, 38, 44, 63, 70, 39, 61, + 64, 45, 48, 62, 49, 50, 51, 57, 54, 55, + 65, 66, 0, 0, 0, 75, 77, 78, 79, 0, + 0, 0, 81, 83, 84, 85, 87, 86, 90, 93, + 94, 91, 100, 101, 102, 103, 106, 107, 108, 109, + 110, 120, 121, 122, 123, 124, 97, 125, 126, 129, + 127, 128, 130, 131, 132, 136, 115, 116, 117, 118, + 133, 139, 112, 114, 140, 142, 143, 144, 98, 119, + 146, 147, 113, 145, 105, 92, 111, 137, 141, 134, + 0, 0, 149, 99, 88, 104, 135, 89, 95, 96, + 150, 151, 152, 153, 154, 155, 138, 148 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 1, 6, 7, 10, 75, 8, 11, 141, 9, - 12, 148, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 142, 143, 144, 149, 150, 151 + -1, 1, 6, 7, 10, 77, 8, 11, 145, 9, + 12, 152, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 146, 147, 148, 153, + 154, 155 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing @@ -826,29 +834,29 @@ static const yytype_int16 yydefgoto[] = #define YYPACT_NINF -13 static const yytype_int16 yypact[] = { - -13, 69, -13, -13, -13, -13, -13, -13, -13, -13, - -12, 33, 32, 16, 17, 18, 19, 23, 24, 25, - 62, 65, 66, 67, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 99, 100, 101, 102, 103, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, -13, -13, -13, -13, -13, + -13, 71, -13, -13, -13, -13, -13, -13, -13, -13, + -12, 35, 34, 16, 17, 18, 19, 23, 24, 25, + 64, 67, 68, 69, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 101, 102, 103, 104, 105, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, 124, 125, - 126, -13, -13, -13, -13, 127, 128, 129, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, + -13, -13, 128, 129, 130, -13, -13, -13, -13, 131, + 132, 133, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, 130, 131, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13 + 134, 135, -13, -13, -13, -13, -13, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13 }; /* YYPGOTO[NTERM-NUM]. */ @@ -861,7 +869,8 @@ static const yytype_int8 yypgoto[] = -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13 + -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, + -13, -13 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -873,19 +882,19 @@ static const yytype_uint8 yytable[] = { 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 152, 153, 154, 155, - 39, 40, 41, 156, 157, 158, 42, 43, 44, 45, + 33, 34, 35, 36, 37, 38, 156, 157, 158, 159, + 39, 40, 41, 160, 161, 162, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 2, - 145, 138, 159, 139, 140, 160, 161, 162, 146, 147, - 3, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 4, 190, - 191, 192, 193, 194, 5, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221 + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 2, 149, 142, 163, 143, 144, 164, 165, 166, + 150, 151, 3, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 4, 194, 195, 196, 197, 198, 5, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227 }; static const yytype_uint8 yycheck[] = @@ -896,44 +905,44 @@ static const yytype_uint8 yycheck[] = 42, 43, 44, 10, 10, 10, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 0, - 38, 38, 10, 40, 41, 10, 10, 10, 46, 47, - 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 0, 38, 38, 10, 40, 41, 10, 10, 10, + 46, 47, 11, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 39, 10, - 10, 10, 10, 10, 45, 10, 10, 10, 10, 10, + 39, 10, 10, 10, 10, 10, 45, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10 + 10, 10, 10, 10, 10, 10 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { - 0, 82, 0, 11, 39, 45, 83, 84, 87, 90, - 85, 88, 91, 12, 13, 14, 15, 16, 17, 18, + 0, 84, 0, 11, 39, 45, 85, 86, 89, 92, + 87, 90, 93, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 42, 43, 44, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 86, 93, 94, 95, 96, + 76, 77, 78, 79, 80, 81, 82, 88, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 38, 40, - 41, 89, 155, 156, 157, 38, 46, 47, 92, 158, - 159, 160, 10, 10, 10, 10, 10, 10, 10, 10, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 38, 40, 41, 91, 159, 160, 161, 38, + 46, 47, 94, 162, 163, 164, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10 + 10, 10, 10, 10, 10, 10, 10, 10 }; #define yyerrok (yyerrstatus = 0) @@ -1748,14 +1757,14 @@ yyreduce: switch (yyn) { case 7: -#line 102 "util/configparser.y" +#line 103 "util/configparser.y" { OUTYY(("\nP(server:)\n")); } break; - case 72: -#line 136 "util/configparser.y" + case 74: +#line 138 "util/configparser.y" { struct config_stub* s; OUTYY(("\nP(stub_zone:)\n")); @@ -1768,8 +1777,8 @@ yyreduce: } break; - case 78: -#line 152 "util/configparser.y" + case 80: +#line 154 "util/configparser.y" { struct config_stub* s; OUTYY(("\nP(forward_zone:)\n")); @@ -1782,8 +1791,8 @@ yyreduce: } break; - case 84: -#line 168 "util/configparser.y" + case 86: +#line 170 "util/configparser.y" { OUTYY(("P(server_num_threads:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -1793,8 +1802,8 @@ yyreduce: } break; - case 85: -#line 177 "util/configparser.y" + case 87: +#line 179 "util/configparser.y" { OUTYY(("P(server_verbosity:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -1804,8 +1813,8 @@ yyreduce: } break; - case 86: -#line 186 "util/configparser.y" + case 88: +#line 188 "util/configparser.y" { OUTYY(("P(server_statistics_interval:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "") == 0 || strcmp((yyvsp[(2) - (2)].str), "0") == 0) @@ -1817,8 +1826,8 @@ yyreduce: } break; - case 87: -#line 197 "util/configparser.y" + case 89: +#line 199 "util/configparser.y" { OUTYY(("P(server_statistics_cumulative:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -1828,8 +1837,8 @@ yyreduce: } break; - case 88: -#line 206 "util/configparser.y" + case 90: +#line 208 "util/configparser.y" { OUTYY(("P(server_port:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -1839,8 +1848,8 @@ yyreduce: } break; - case 89: -#line 215 "util/configparser.y" + case 91: +#line 217 "util/configparser.y" { OUTYY(("P(server_interface:%s)\n", (yyvsp[(2) - (2)].str))); if(cfg_parser->cfg->num_ifs == 0) @@ -1854,8 +1863,8 @@ yyreduce: } break; - case 90: -#line 228 "util/configparser.y" + case 92: +#line 230 "util/configparser.y" { OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[(2) - (2)].str))); if(cfg_parser->cfg->num_out_ifs == 0) @@ -1871,8 +1880,8 @@ yyreduce: } break; - case 91: -#line 243 "util/configparser.y" + case 93: +#line 245 "util/configparser.y" { OUTYY(("P(server_outgoing_port:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -1882,8 +1891,8 @@ yyreduce: } break; - case 92: -#line 252 "util/configparser.y" + case 94: +#line 254 "util/configparser.y" { OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -1893,8 +1902,30 @@ yyreduce: } break; - case 93: -#line 261 "util/configparser.y" + case 95: +#line 263 "util/configparser.y" + { + OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[(2) - (2)].str))); + if(!cfg_mark_ports((yyvsp[(2) - (2)].str), 1, + cfg_parser->cfg->outgoing_avail_ports, 65536)) + yyerror("port number or range (\"low-high\") expected"); + free((yyvsp[(2) - (2)].str)); + } + break; + + case 96: +#line 272 "util/configparser.y" + { + OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[(2) - (2)].str))); + if(!cfg_mark_ports((yyvsp[(2) - (2)].str), 0, + cfg_parser->cfg->outgoing_avail_ports, 65536)) + yyerror("port number or range (\"low-high\") expected"); + free((yyvsp[(2) - (2)].str)); + } + break; + + case 97: +#line 281 "util/configparser.y" { OUTYY(("P(server_outgoing_num_tcp:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -1904,8 +1935,8 @@ yyreduce: } break; - case 94: -#line 270 "util/configparser.y" + case 98: +#line 290 "util/configparser.y" { OUTYY(("P(server_incoming_num_tcp:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -1915,8 +1946,8 @@ yyreduce: } break; - case 95: -#line 279 "util/configparser.y" + case 99: +#line 299 "util/configparser.y" { OUTYY(("P(server_interface_automatic:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -1926,8 +1957,8 @@ yyreduce: } break; - case 96: -#line 288 "util/configparser.y" + case 100: +#line 308 "util/configparser.y" { OUTYY(("P(server_do_ip4:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -1937,8 +1968,8 @@ yyreduce: } break; - case 97: -#line 297 "util/configparser.y" + case 101: +#line 317 "util/configparser.y" { OUTYY(("P(server_do_ip6:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -1948,8 +1979,8 @@ yyreduce: } break; - case 98: -#line 306 "util/configparser.y" + case 102: +#line 326 "util/configparser.y" { OUTYY(("P(server_do_udp:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -1959,8 +1990,8 @@ yyreduce: } break; - case 99: -#line 315 "util/configparser.y" + case 103: +#line 335 "util/configparser.y" { OUTYY(("P(server_do_tcp:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -1970,8 +2001,8 @@ yyreduce: } break; - case 100: -#line 324 "util/configparser.y" + case 104: +#line 344 "util/configparser.y" { OUTYY(("P(server_do_daemonize:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -1981,8 +2012,8 @@ yyreduce: } break; - case 101: -#line 333 "util/configparser.y" + case 105: +#line 353 "util/configparser.y" { OUTYY(("P(server_use_syslog:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -1997,8 +2028,8 @@ yyreduce: } break; - case 102: -#line 347 "util/configparser.y" + case 106: +#line 367 "util/configparser.y" { OUTYY(("P(server_chroot:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->chrootdir); @@ -2006,8 +2037,8 @@ yyreduce: } break; - case 103: -#line 354 "util/configparser.y" + case 107: +#line 374 "util/configparser.y" { OUTYY(("P(server_username:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->username); @@ -2015,8 +2046,8 @@ yyreduce: } break; - case 104: -#line 361 "util/configparser.y" + case 108: +#line 381 "util/configparser.y" { OUTYY(("P(server_directory:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->directory); @@ -2024,8 +2055,8 @@ yyreduce: } break; - case 105: -#line 368 "util/configparser.y" + case 109: +#line 388 "util/configparser.y" { OUTYY(("P(server_logfile:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->logfile); @@ -2034,8 +2065,8 @@ yyreduce: } break; - case 106: -#line 376 "util/configparser.y" + case 110: +#line 396 "util/configparser.y" { OUTYY(("P(server_pidfile:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->pidfile); @@ -2043,8 +2074,8 @@ yyreduce: } break; - case 107: -#line 383 "util/configparser.y" + case 111: +#line 403 "util/configparser.y" { OUTYY(("P(server_root_hints:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, (yyvsp[(2) - (2)].str))) @@ -2052,8 +2083,8 @@ yyreduce: } break; - case 108: -#line 390 "util/configparser.y" + case 112: +#line 410 "util/configparser.y" { OUTYY(("P(server_trust_anchor_file:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> @@ -2062,8 +2093,8 @@ yyreduce: } break; - case 109: -#line 398 "util/configparser.y" + case 113: +#line 418 "util/configparser.y" { OUTYY(("P(server_trusted_keys_file:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> @@ -2072,8 +2103,8 @@ yyreduce: } break; - case 110: -#line 406 "util/configparser.y" + case 114: +#line 426 "util/configparser.y" { OUTYY(("P(server_trust_anchor:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, (yyvsp[(2) - (2)].str))) @@ -2081,8 +2112,8 @@ yyreduce: } break; - case 111: -#line 413 "util/configparser.y" + case 115: +#line 433 "util/configparser.y" { OUTYY(("P(server_hide_identity:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -2092,8 +2123,8 @@ yyreduce: } break; - case 112: -#line 422 "util/configparser.y" + case 116: +#line 442 "util/configparser.y" { OUTYY(("P(server_hide_version:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -2103,8 +2134,8 @@ yyreduce: } break; - case 113: -#line 431 "util/configparser.y" + case 117: +#line 451 "util/configparser.y" { OUTYY(("P(server_identity:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->identity); @@ -2112,8 +2143,8 @@ yyreduce: } break; - case 114: -#line 438 "util/configparser.y" + case 118: +#line 458 "util/configparser.y" { OUTYY(("P(server_version:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->version); @@ -2121,8 +2152,8 @@ yyreduce: } break; - case 115: -#line 445 "util/configparser.y" + case 119: +#line 465 "util/configparser.y" { OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -2134,8 +2165,8 @@ yyreduce: } break; - case 116: -#line 456 "util/configparser.y" + case 120: +#line 476 "util/configparser.y" { OUTYY(("P(server_msg_cache_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->msg_cache_size)) @@ -2144,8 +2175,8 @@ yyreduce: } break; - case 117: -#line 464 "util/configparser.y" + case 121: +#line 484 "util/configparser.y" { OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -2159,8 +2190,8 @@ yyreduce: } break; - case 118: -#line 477 "util/configparser.y" + case 122: +#line 497 "util/configparser.y" { OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -2170,8 +2201,8 @@ yyreduce: } break; - case 119: -#line 486 "util/configparser.y" + case 123: +#line 506 "util/configparser.y" { OUTYY(("P(server_rrset_cache_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->rrset_cache_size)) @@ -2180,8 +2211,8 @@ yyreduce: } break; - case 120: -#line 494 "util/configparser.y" + case 124: +#line 514 "util/configparser.y" { OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -2195,8 +2226,8 @@ yyreduce: } break; - case 121: -#line 507 "util/configparser.y" + case 125: +#line 527 "util/configparser.y" { OUTYY(("P(server_infra_host_ttl:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -2206,8 +2237,8 @@ yyreduce: } break; - case 122: -#line 516 "util/configparser.y" + case 126: +#line 536 "util/configparser.y" { OUTYY(("P(server_infra_lame_ttl:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -2217,8 +2248,8 @@ yyreduce: } break; - case 123: -#line 525 "util/configparser.y" + case 127: +#line 545 "util/configparser.y" { OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -2228,8 +2259,8 @@ yyreduce: } break; - case 124: -#line 534 "util/configparser.y" + case 128: +#line 554 "util/configparser.y" { OUTYY(("P(server_infra_cache_lame_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg-> @@ -2239,8 +2270,8 @@ yyreduce: } break; - case 125: -#line 543 "util/configparser.y" + case 129: +#line 563 "util/configparser.y" { OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -2254,8 +2285,8 @@ yyreduce: } break; - case 126: -#line 556 "util/configparser.y" + case 130: +#line 576 "util/configparser.y" { OUTYY(("P(server_target_fetch_policy:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->target_fetch_policy); @@ -2263,8 +2294,8 @@ yyreduce: } break; - case 127: -#line 563 "util/configparser.y" + case 131: +#line 583 "util/configparser.y" { OUTYY(("P(server_harden_short_bufsize:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -2275,8 +2306,8 @@ yyreduce: } break; - case 128: -#line 573 "util/configparser.y" + case 132: +#line 593 "util/configparser.y" { OUTYY(("P(server_harden_large_queries:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -2287,8 +2318,8 @@ yyreduce: } break; - case 129: -#line 583 "util/configparser.y" + case 133: +#line 603 "util/configparser.y" { OUTYY(("P(server_harden_glue:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -2299,8 +2330,8 @@ yyreduce: } break; - case 130: -#line 593 "util/configparser.y" + case 134: +#line 613 "util/configparser.y" { OUTYY(("P(server_harden_dnssec_stripped:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -2311,8 +2342,8 @@ yyreduce: } break; - case 131: -#line 603 "util/configparser.y" + case 135: +#line 623 "util/configparser.y" { OUTYY(("P(server_use_caps_for_id:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -2323,8 +2354,8 @@ yyreduce: } break; - case 132: -#line 613 "util/configparser.y" + case 136: +#line 633 "util/configparser.y" { OUTYY(("P(server_do_not_query_address:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, (yyvsp[(2) - (2)].str))) @@ -2332,8 +2363,8 @@ yyreduce: } break; - case 133: -#line 620 "util/configparser.y" + case 137: +#line 640 "util/configparser.y" { OUTYY(("P(server_do_not_query_localhost:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -2344,8 +2375,8 @@ yyreduce: } break; - case 134: -#line 630 "util/configparser.y" + case 138: +#line 650 "util/configparser.y" { OUTYY(("P(server_access_control:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))); if(strcmp((yyvsp[(3) - (3)].str), "deny")!=0 && strcmp((yyvsp[(3) - (3)].str), "refuse")!=0 && @@ -2359,8 +2390,8 @@ yyreduce: } break; - case 135: -#line 643 "util/configparser.y" + case 139: +#line 663 "util/configparser.y" { OUTYY(("P(server_module_conf:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->module_conf); @@ -2368,8 +2399,8 @@ yyreduce: } break; - case 136: -#line 650 "util/configparser.y" + case 140: +#line 670 "util/configparser.y" { OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[(2) - (2)].str))); if(strlen((yyvsp[(2) - (2)].str)) == 0 || strcmp((yyvsp[(2) - (2)].str), "0") == 0) { @@ -2388,8 +2419,8 @@ yyreduce: } break; - case 137: -#line 668 "util/configparser.y" + case 141: +#line 688 "util/configparser.y" { OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -2399,8 +2430,8 @@ yyreduce: } break; - case 138: -#line 677 "util/configparser.y" + case 142: +#line 697 "util/configparser.y" { OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0) @@ -2410,8 +2441,8 @@ yyreduce: } break; - case 139: -#line 686 "util/configparser.y" + case 143: +#line 706 "util/configparser.y" { OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -2422,8 +2453,8 @@ yyreduce: } break; - case 140: -#line 696 "util/configparser.y" + case 144: +#line 716 "util/configparser.y" { OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[(2) - (2)].str))); if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) @@ -2434,8 +2465,8 @@ yyreduce: } break; - case 141: -#line 706 "util/configparser.y" + case 145: +#line 726 "util/configparser.y" { OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->val_nsec3_key_iterations); @@ -2443,8 +2474,8 @@ yyreduce: } break; - case 142: -#line 713 "util/configparser.y" + case 146: +#line 733 "util/configparser.y" { OUTYY(("P(server_key_cache_size:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->key_cache_size)) @@ -2453,8 +2484,8 @@ yyreduce: } break; - case 143: -#line 721 "util/configparser.y" + case 147: +#line 741 "util/configparser.y" { OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -2468,8 +2499,8 @@ yyreduce: } break; - case 144: -#line 734 "util/configparser.y" + case 148: +#line 754 "util/configparser.y" { OUTYY(("P(server_local_zone:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))); if(strcmp((yyvsp[(3) - (3)].str), "static")!=0 && strcmp((yyvsp[(3) - (3)].str), "deny")!=0 && @@ -2489,8 +2520,8 @@ yyreduce: } break; - case 145: -#line 753 "util/configparser.y" + case 149: +#line 773 "util/configparser.y" { OUTYY(("P(server_local_data:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[(2) - (2)].str))) @@ -2498,8 +2529,8 @@ yyreduce: } break; - case 146: -#line 760 "util/configparser.y" + case 150: +#line 780 "util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->stubs->name); @@ -2507,8 +2538,8 @@ yyreduce: } break; - case 147: -#line 767 "util/configparser.y" + case 151: +#line 787 "util/configparser.y" { OUTYY(("P(stub-host:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[(2) - (2)].str))) @@ -2516,8 +2547,8 @@ yyreduce: } break; - case 148: -#line 774 "util/configparser.y" + case 152: +#line 794 "util/configparser.y" { OUTYY(("P(stub-addr:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[(2) - (2)].str))) @@ -2525,8 +2556,8 @@ yyreduce: } break; - case 149: -#line 781 "util/configparser.y" + case 153: +#line 801 "util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->forwards->name); @@ -2534,8 +2565,8 @@ yyreduce: } break; - case 150: -#line 788 "util/configparser.y" + case 154: +#line 808 "util/configparser.y" { OUTYY(("P(forward-host:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[(2) - (2)].str))) @@ -2543,8 +2574,8 @@ yyreduce: } break; - case 151: -#line 795 "util/configparser.y" + case 155: +#line 815 "util/configparser.y" { OUTYY(("P(forward-addr:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[(2) - (2)].str))) @@ -2554,7 +2585,7 @@ yyreduce: /* Line 1267 of yacc.c. */ -#line 2558 "util/configparser.c" +#line 2589 "util/configparser.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -2768,7 +2799,7 @@ yyreturn: } -#line 801 "util/configparser.y" +#line 821 "util/configparser.y" /* parse helper routines could be here */ diff --git a/util/configparser.h b/util/configparser.h index cf11842a6..9ddff4f6a 100644 --- a/util/configparser.h +++ b/util/configparser.h @@ -116,7 +116,9 @@ VAR_STATISTICS_INTERVAL = 332, VAR_DO_DAEMONIZE = 333, VAR_USE_CAPS_FOR_ID = 334, - VAR_STATISTICS_CUMULATIVE = 335 + VAR_STATISTICS_CUMULATIVE = 335, + VAR_OUTGOING_PORT_PERMIT = 336, + VAR_OUTGOING_PORT_AVOID = 337 }; #endif /* Tokens. */ @@ -198,6 +200,8 @@ #define VAR_DO_DAEMONIZE 333 #define VAR_USE_CAPS_FOR_ID 334 #define VAR_STATISTICS_CUMULATIVE 335 +#define VAR_OUTGOING_PORT_PERMIT 336 +#define VAR_OUTGOING_PORT_AVOID 337 @@ -209,7 +213,7 @@ typedef union YYSTYPE char* str; } /* Line 1489 of yacc.c. */ -#line 213 "util/configparser.h" +#line 217 "util/configparser.h" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 diff --git a/util/configparser.y b/util/configparser.y index 4d4eabe33..a6b2d8ddb 100644 --- a/util/configparser.y +++ b/util/configparser.y @@ -89,7 +89,8 @@ extern struct config_parser_state* cfg_parser; %token VAR_CACHE_MAX_TTL VAR_HARDEN_DNNSEC_STRIPPED VAR_ACCESS_CONTROL %token VAR_LOCAL_ZONE VAR_LOCAL_DATA VAR_INTERFACE_AUTOMATIC %token VAR_STATISTICS_INTERVAL VAR_DO_DAEMONIZE VAR_USE_CAPS_FOR_ID -%token VAR_STATISTICS_CUMULATIVE +%token VAR_STATISTICS_CUMULATIVE VAR_OUTGOING_PORT_PERMIT +%token VAR_OUTGOING_PORT_AVOID %% toplevelvars: /* empty */ | toplevelvars toplevelvar ; @@ -130,7 +131,8 @@ content_server: server_num_threads | server_verbosity | server_port | server_harden_dnssec_stripped | server_access_control | server_local_zone | server_local_data | server_interface_automatic | server_statistics_interval | server_do_daemonize | - server_use_caps_for_id | server_statistics_cumulative + server_use_caps_for_id | server_statistics_cumulative | + server_outgoing_port_permit | server_outgoing_port_avoid ; stubstart: VAR_STUB_ZONE { @@ -257,6 +259,24 @@ server_outgoing_range: VAR_OUTGOING_RANGE STRING free($2); } ; +server_outgoing_port_permit: VAR_OUTGOING_PORT_PERMIT STRING + { + OUTYY(("P(server_outgoing_port_permit:%s)\n", $2)); + if(!cfg_mark_ports($2, 1, + cfg_parser->cfg->outgoing_avail_ports, 65536)) + yyerror("port number or range (\"low-high\") expected"); + free($2); + } + ; +server_outgoing_port_avoid: VAR_OUTGOING_PORT_AVOID STRING + { + OUTYY(("P(server_outgoing_port_avoid:%s)\n", $2)); + if(!cfg_mark_ports($2, 0, + cfg_parser->cfg->outgoing_avail_ports, 65536)) + yyerror("port number or range (\"low-high\") expected"); + free($2); + } + ; server_outgoing_num_tcp: VAR_OUTGOING_NUM_TCP STRING { OUTYY(("P(server_outgoing_num_tcp:%s)\n", $2)); diff --git a/util/iana_ports.inc b/util/iana_ports.inc new file mode 100644 index 000000000..c322d11a8 --- /dev/null +++ b/util/iana_ports.inc @@ -0,0 +1,3209 @@ +1, +3, +5, +7, +9, +11, +13, +17, +18, +19, +21, +22, +23, +24, +25, +27, +29, +31, +33, +37, +38, +39, +41, +42, +43, +44, +45, +46, +47, +48, +49, +51, +52, +53, +54, +55, +56, +58, +61, +62, +63, +64, +65, +66, +67, +68, +69, +71, +72, +73, +74, +76, +78, +79, +81, +82, +83, +84, +86, +88, +89, +91, +92, +93, +94, +95, +96, +97, +99, +111, +112, +113, +115, +116, +117, +118, +119, +121, +122, +123, +124, +125, +126, +127, +128, +129, +131, +132, +133, +134, +135, +136, +137, +138, +139, +141, +142, +143, +144, +145, +146, +147, +148, +149, +151, +152, +153, +154, +155, +156, +157, +158, +159, +161, +162, +163, +164, +165, +166, +167, +168, +169, +171, +172, +173, +174, +175, +176, +177, +178, +179, +181, +182, +183, +184, +185, +186, +187, +188, +189, +191, +192, +193, +194, +195, +196, +197, +198, +199, +211, +212, +213, +214, +215, +216, +217, +218, +219, +221, +222, +223, +224, +242, +243, +244, +245, +246, +247, +248, +257, +258, +259, +261, +262, +263, +264, +265, +266, +267, +268, +281, +282, +283, +284, +286, +287, +311, +312, +313, +314, +315, +316, +317, +318, +319, +321, +322, +333, +344, +345, +346, +347, +348, +349, +351, +351, +352, +352, +353, +354, +355, +356, +357, +358, +359, +361, +362, +363, +364, +365, +366, +367, +368, +369, +371, +372, +373, +374, +375, +376, +377, +378, +379, +381, +382, +383, +384, +385, +386, +387, +388, +389, +391, +392, +393, +394, +395, +396, +397, +398, +399, +411, +412, +413, +414, +415, +416, +417, +418, +419, +421, +422, +423, +424, +425, +426, +427, +428, +429, +431, +432, +433, +434, +435, +436, +437, +438, +439, +441, +442, +443, +444, +445, +446, +447, +448, +449, +451, +452, +453, +454, +455, +456, +457, +458, +459, +461, +462, +463, +464, +466, +467, +468, +469, +471, +472, +473, +474, +475, +476, +477, +478, +479, +481, +482, +483, +484, +485, +486, +487, +488, +489, +491, +492, +493, +494, +495, +496, +497, +498, +499, +511, +512, +513, +514, +515, +516, +517, +518, +519, +521, +522, +523, +524, +525, +527, +528, +529, +533, +534, +535, +536, +537, +538, +539, +541, +542, +545, +546, +547, +548, +549, +551, +552, +553, +554, +555, +557, +558, +559, +561, +562, +563, +564, +565, +566, +567, +568, +569, +571, +572, +573, +574, +575, +576, +577, +578, +579, +581, +582, +583, +584, +585, +586, +587, +588, +589, +592, +593, +594, +595, +596, +597, +598, +599, +611, +612, +613, +614, +615, +617, +618, +619, +621, +622, +623, +624, +625, +626, +627, +628, +629, +631, +632, +633, +634, +635, +636, +637, +638, +639, +641, +642, +643, +644, +645, +646, +647, +648, +649, +651, +652, +653, +654, +655, +656, +657, +658, +661, +662, +663, +664, +665, +666, +666, +667, +668, +669, +671, +672, +673, +674, +675, +676, +677, +678, +679, +681, +682, +683, +684, +685, +686, +687, +688, +689, +691, +692, +693, +694, +695, +696, +697, +698, +699, +711, +712, +729, +731, +741, +742, +744, +747, +748, +751, +752, +753, +758, +759, +761, +762, +763, +764, +765, +767, +769, +771, +772, +773, +774, +775, +776, +777, +828, +829, +847, +848, +873, +886, +887, +888, +911, +912, +913, +953, +989, +991, +992, +993, +994, +995, +996, +997, +998, +999, +999, +1111, +1112, +1113, +1114, +1115, +1116, +1117, +1118, +1119, +1121, +1122, +1123, +1124, +1125, +1126, +1141, +1142, +1144, +1145, +1146, +1147, +1148, +1149, +1151, +1152, +1153, +1154, +1155, +1156, +1157, +1158, +1159, +1161, +1162, +1163, +1164, +1165, +1166, +1168, +1169, +1171, +1172, +1173, +1174, +1175, +1176, +1177, +1179, +1181, +1182, +1183, +1184, +1185, +1186, +1187, +1188, +1189, +1191, +1192, +1193, +1194, +1195, +1196, +1197, +1198, +1199, +1211, +1212, +1213, +1214, +1215, +1216, +1217, +1218, +1219, +1221, +1222, +1223, +1224, +1225, +1226, +1227, +1228, +1229, +1231, +1233, +1234, +1235, +1236, +1237, +1238, +1239, +1241, +1242, +1243, +1244, +1245, +1246, +1247, +1248, +1249, +1251, +1252, +1253, +1254, +1255, +1256, +1257, +1258, +1259, +1261, +1262, +1263, +1264, +1265, +1266, +1267, +1268, +1269, +1271, +1272, +1273, +1274, +1275, +1276, +1277, +1278, +1279, +1281, +1282, +1283, +1284, +1285, +1286, +1287, +1288, +1289, +1291, +1292, +1293, +1294, +1295, +1296, +1297, +1298, +1299, +1311, +1312, +1314, +1315, +1316, +1317, +1318, +1319, +1322, +1323, +1324, +1325, +1326, +1327, +1328, +1329, +1331, +1332, +1333, +1334, +1335, +1336, +1337, +1338, +1339, +1341, +1342, +1343, +1344, +1345, +1346, +1347, +1348, +1349, +1351, +1352, +1353, +1354, +1355, +1356, +1357, +1358, +1359, +1361, +1362, +1363, +1364, +1365, +1366, +1367, +1368, +1369, +1371, +1372, +1373, +1374, +1375, +1376, +1377, +1378, +1379, +1381, +1382, +1383, +1384, +1385, +1386, +1387, +1388, +1389, +1391, +1392, +1393, +1394, +1395, +1396, +1397, +1398, +1399, +1411, +1412, +1413, +1414, +1415, +1416, +1417, +1418, +1419, +1421, +1422, +1423, +1424, +1425, +1426, +1427, +1428, +1429, +1431, +1432, +1433, +1434, +1435, +1436, +1437, +1438, +1439, +1441, +1442, +1443, +1444, +1445, +1446, +1447, +1448, +1449, +1451, +1452, +1453, +1454, +1455, +1456, +1457, +1458, +1459, +1461, +1462, +1463, +1464, +1465, +1466, +1467, +1468, +1469, +1473, +1474, +1475, +1476, +1477, +1478, +1479, +1481, +1482, +1483, +1484, +1485, +1486, +1487, +1488, +1489, +1491, +1492, +1493, +1494, +1495, +1496, +1497, +1498, +1499, +1511, +1512, +1513, +1514, +1515, +1516, +1517, +1518, +1519, +1521, +1522, +1523, +1524, +1525, +1526, +1527, +1528, +1531, +1532, +1533, +1534, +1535, +1536, +1537, +1538, +1539, +1541, +1542, +1543, +1544, +1545, +1546, +1547, +1548, +1549, +1551, +1552, +1553, +1554, +1555, +1556, +1557, +1558, +1559, +1561, +1562, +1563, +1564, +1565, +1566, +1567, +1568, +1569, +1571, +1572, +1573, +1574, +1575, +1576, +1577, +1578, +1579, +1581, +1582, +1583, +1584, +1585, +1586, +1587, +1588, +1589, +1591, +1592, +1593, +1594, +1595, +1596, +1597, +1598, +1599, +1611, +1612, +1613, +1614, +1615, +1616, +1617, +1618, +1619, +1621, +1622, +1623, +1624, +1625, +1626, +1627, +1628, +1629, +1631, +1632, +1633, +1634, +1635, +1636, +1637, +1638, +1639, +1641, +1642, +1643, +1645, +1646, +1647, +1648, +1649, +1651, +1652, +1653, +1654, +1655, +1656, +1657, +1658, +1659, +1661, +1662, +1663, +1664, +1665, +1666, +1667, +1668, +1669, +1671, +1672, +1673, +1674, +1675, +1676, +1677, +1678, +1679, +1681, +1682, +1683, +1684, +1685, +1686, +1687, +1688, +1689, +1691, +1692, +1693, +1694, +1695, +1696, +1697, +1698, +1699, +1711, +1712, +1713, +1714, +1715, +1716, +1717, +1718, +1719, +1721, +1722, +1723, +1724, +1725, +1726, +1727, +1728, +1729, +1731, +1732, +1733, +1734, +1735, +1736, +1737, +1738, +1739, +1741, +1742, +1743, +1744, +1745, +1746, +1747, +1748, +1749, +1751, +1752, +1754, +1755, +1756, +1757, +1758, +1759, +1761, +1762, +1763, +1764, +1765, +1766, +1767, +1768, +1769, +1771, +1772, +1773, +1774, +1776, +1777, +1778, +1779, +1781, +1782, +1784, +1785, +1786, +1787, +1788, +1789, +1791, +1792, +1793, +1794, +1795, +1796, +1798, +1799, +1811, +1812, +1813, +1814, +1815, +1816, +1817, +1818, +1819, +1821, +1822, +1823, +1824, +1825, +1826, +1827, +1828, +1829, +1831, +1832, +1833, +1834, +1835, +1836, +1837, +1838, +1839, +1841, +1842, +1843, +1844, +1845, +1846, +1847, +1848, +1849, +1851, +1852, +1853, +1854, +1855, +1856, +1857, +1858, +1859, +1861, +1862, +1863, +1864, +1865, +1866, +1867, +1868, +1869, +1871, +1872, +1873, +1874, +1875, +1876, +1877, +1878, +1879, +1881, +1882, +1883, +1884, +1885, +1886, +1887, +1888, +1889, +1891, +1892, +1893, +1894, +1896, +1897, +1898, +1899, +1911, +1912, +1913, +1914, +1915, +1916, +1917, +1918, +1919, +1921, +1922, +1923, +1924, +1925, +1926, +1927, +1928, +1929, +1931, +1932, +1933, +1934, +1935, +1936, +1937, +1938, +1939, +1941, +1942, +1943, +1944, +1945, +1946, +1947, +1948, +1949, +1951, +1952, +1953, +1954, +1955, +1956, +1957, +1958, +1959, +1961, +1962, +1963, +1964, +1965, +1966, +1967, +1968, +1969, +1971, +1972, +1973, +1974, +1975, +1976, +1977, +1978, +1979, +1981, +1982, +1983, +1984, +1985, +1986, +1987, +1988, +1989, +1989, +1991, +1992, +1992, +1993, +1994, +1995, +1996, +1997, +1998, +1999, +2111, +2112, +2113, +2114, +2115, +2116, +2117, +2118, +2119, +2121, +2122, +2123, +2124, +2125, +2126, +2127, +2128, +2129, +2131, +2132, +2133, +2134, +2135, +2136, +2137, +2138, +2139, +2141, +2142, +2143, +2144, +2145, +2146, +2147, +2148, +2149, +2151, +2152, +2159, +2161, +2162, +2163, +2164, +2165, +2166, +2167, +2168, +2169, +2171, +2172, +2173, +2174, +2175, +2176, +2177, +2178, +2181, +2182, +2183, +2184, +2185, +2191, +2192, +2197, +2198, +2199, +2213, +2214, +2215, +2219, +2221, +2222, +2223, +2228, +2232, +2233, +2234, +2235, +2236, +2237, +2238, +2239, +2241, +2242, +2243, +2244, +2245, +2246, +2248, +2249, +2251, +2252, +2253, +2254, +2255, +2256, +2261, +2262, +2266, +2267, +2268, +2269, +2271, +2272, +2273, +2274, +2275, +2276, +2277, +2279, +2281, +2282, +2283, +2284, +2285, +2286, +2287, +2288, +2289, +2294, +2295, +2296, +2297, +2298, +2299, +2311, +2313, +2314, +2315, +2316, +2317, +2318, +2319, +2321, +2322, +2323, +2324, +2325, +2326, +2327, +2328, +2331, +2332, +2333, +2334, +2335, +2336, +2337, +2338, +2339, +2341, +2342, +2343, +2344, +2345, +2346, +2347, +2348, +2349, +2351, +2352, +2353, +2354, +2355, +2356, +2357, +2358, +2359, +2361, +2362, +2363, +2364, +2365, +2366, +2367, +2368, +2369, +2371, +2381, +2382, +2383, +2384, +2385, +2386, +2387, +2388, +2389, +2391, +2392, +2393, +2394, +2395, +2396, +2397, +2398, +2399, +2411, +2412, +2413, +2414, +2415, +2416, +2417, +2418, +2419, +2421, +2422, +2423, +2424, +2425, +2427, +2428, +2429, +2431, +2432, +2433, +2434, +2435, +2436, +2437, +2439, +2441, +2442, +2443, +2444, +2445, +2446, +2447, +2448, +2449, +2451, +2452, +2453, +2454, +2455, +2456, +2457, +2458, +2459, +2461, +2462, +2463, +2464, +2465, +2466, +2467, +2468, +2469, +2471, +2472, +2473, +2474, +2475, +2476, +2477, +2478, +2479, +2481, +2482, +2483, +2484, +2485, +2486, +2487, +2488, +2489, +2491, +2492, +2493, +2494, +2495, +2496, +2497, +2498, +2511, +2512, +2513, +2514, +2515, +2516, +2517, +2518, +2519, +2521, +2522, +2523, +2524, +2525, +2526, +2527, +2528, +2529, +2531, +2532, +2533, +2534, +2535, +2536, +2537, +2538, +2539, +2541, +2542, +2543, +2544, +2545, +2546, +2547, +2548, +2549, +2551, +2552, +2553, +2554, +2555, +2556, +2557, +2558, +2559, +2561, +2562, +2563, +2565, +2566, +2567, +2568, +2569, +2571, +2572, +2573, +2574, +2575, +2576, +2577, +2578, +2579, +2581, +2582, +2583, +2584, +2585, +2586, +2587, +2588, +2589, +2591, +2592, +2593, +2594, +2595, +2596, +2597, +2598, +2599, +2611, +2612, +2613, +2614, +2615, +2616, +2617, +2618, +2619, +2621, +2622, +2623, +2624, +2625, +2626, +2627, +2628, +2629, +2631, +2632, +2633, +2634, +2635, +2636, +2637, +2638, +2639, +2641, +2642, +2643, +2644, +2645, +2646, +2647, +2648, +2649, +2651, +2652, +2653, +2654, +2655, +2656, +2657, +2658, +2659, +2661, +2662, +2663, +2664, +2665, +2666, +2667, +2668, +2669, +2671, +2672, +2673, +2674, +2675, +2676, +2677, +2678, +2679, +2681, +2683, +2684, +2685, +2686, +2687, +2688, +2689, +2691, +2692, +2694, +2695, +2696, +2697, +2698, +2699, +2711, +2712, +2713, +2714, +2715, +2716, +2717, +2718, +2719, +2721, +2722, +2723, +2724, +2725, +2726, +2727, +2728, +2729, +2731, +2732, +2733, +2734, +2735, +2736, +2737, +2738, +2739, +2741, +2742, +2743, +2744, +2745, +2746, +2747, +2748, +2749, +2751, +2752, +2753, +2754, +2755, +2756, +2757, +2758, +2759, +2761, +2762, +2763, +2764, +2765, +2766, +2767, +2768, +2769, +2771, +2772, +2773, +2774, +2775, +2776, +2777, +2778, +2779, +2781, +2782, +2783, +2784, +2785, +2786, +2787, +2788, +2789, +2791, +2792, +2793, +2794, +2795, +2796, +2797, +2798, +2799, +2811, +2812, +2813, +2814, +2815, +2816, +2817, +2818, +2819, +2821, +2822, +2823, +2824, +2826, +2827, +2828, +2829, +2831, +2832, +2833, +2834, +2835, +2836, +2837, +2838, +2841, +2842, +2843, +2844, +2845, +2846, +2847, +2848, +2851, +2852, +2853, +2854, +2856, +2857, +2858, +2859, +2861, +2862, +2863, +2864, +2865, +2866, +2867, +2868, +2869, +2871, +2872, +2874, +2875, +2876, +2877, +2878, +2879, +2881, +2882, +2883, +2884, +2885, +2886, +2887, +2888, +2889, +2891, +2892, +2893, +2894, +2895, +2896, +2897, +2898, +2899, +2911, +2912, +2913, +2914, +2915, +2916, +2917, +2918, +2919, +2921, +2922, +2923, +2924, +2926, +2927, +2928, +2929, +2931, +2932, +2933, +2934, +2935, +2936, +2937, +2938, +2939, +2941, +2942, +2943, +2944, +2945, +2946, +2947, +2948, +2949, +2951, +2952, +2953, +2954, +2955, +2956, +2957, +2958, +2959, +2961, +2962, +2963, +2964, +2965, +2966, +2967, +2968, +2969, +2971, +2972, +2973, +2974, +2975, +2976, +2977, +2978, +2979, +2981, +2982, +2983, +2984, +2985, +2986, +2987, +2988, +2989, +2991, +2992, +2993, +2994, +2995, +2996, +2997, +2998, +2999, +3111, +3112, +3113, +3114, +3115, +3116, +3117, +3118, +3119, +3122, +3123, +3124, +3125, +3126, +3127, +3129, +3131, +3132, +3133, +3134, +3135, +3136, +3137, +3138, +3139, +3141, +3142, +3143, +3144, +3145, +3146, +3147, +3148, +3149, +3151, +3152, +3153, +3154, +3155, +3156, +3157, +3158, +3159, +3161, +3162, +3163, +3164, +3165, +3166, +3167, +3168, +3169, +3171, +3172, +3173, +3174, +3175, +3176, +3177, +3178, +3179, +3181, +3182, +3183, +3184, +3185, +3186, +3187, +3188, +3189, +3191, +3192, +3193, +3194, +3195, +3196, +3197, +3198, +3199, +3211, +3212, +3213, +3214, +3215, +3216, +3217, +3218, +3219, +3221, +3222, +3223, +3224, +3225, +3226, +3227, +3228, +3229, +3231, +3232, +3233, +3234, +3235, +3236, +3237, +3238, +3239, +3241, +3242, +3243, +3244, +3245, +3246, +3247, +3248, +3249, +3251, +3252, +3253, +3254, +3255, +3256, +3257, +3258, +3259, +3261, +3262, +3263, +3264, +3265, +3266, +3267, +3268, +3269, +3271, +3272, +3273, +3274, +3275, +3276, +3277, +3278, +3279, +3281, +3282, +3283, +3284, +3285, +3286, +3287, +3288, +3289, +3291, +3292, +3293, +3294, +3295, +3296, +3297, +3298, +3299, +3311, +3312, +3313, +3314, +3315, +3316, +3317, +3318, +3319, +3321, +3326, +3327, +3328, +3329, +3331, +3332, +3333, +3334, +3335, +3336, +3337, +3338, +3339, +3341, +3342, +3343, +3344, +3345, +3346, +3347, +3348, +3349, +3351, +3352, +3353, +3354, +3355, +3356, +3357, +3358, +3359, +3361, +3362, +3363, +3372, +3373, +3374, +3375, +3376, +3377, +3378, +3379, +3381, +3382, +3383, +3384, +3385, +3386, +3387, +3388, +3389, +3391, +3392, +3393, +3394, +3395, +3396, +3397, +3398, +3399, +3411, +3412, +3413, +3414, +3415, +3416, +3417, +3418, +3419, +3421, +3422, +3423, +3424, +3425, +3426, +3427, +3428, +3429, +3431, +3432, +3433, +3434, +3435, +3436, +3437, +3438, +3439, +3441, +3442, +3443, +3444, +3445, +3446, +3447, +3448, +3449, +3451, +3452, +3453, +3455, +3456, +3457, +3458, +3459, +3461, +3462, +3463, +3464, +3465, +3466, +3467, +3468, +3469, +3471, +3472, +3473, +3474, +3475, +3476, +3477, +3478, +3479, +3481, +3482, +3483, +3484, +3485, +3486, +3487, +3488, +3489, +3491, +3492, +3493, +3494, +3495, +3496, +3497, +3498, +3499, +3511, +3512, +3513, +3514, +3515, +3516, +3517, +3518, +3519, +3521, +3522, +3523, +3524, +3525, +3526, +3527, +3528, +3529, +3531, +3532, +3533, +3534, +3535, +3536, +3537, +3538, +3539, +3541, +3542, +3543, +3544, +3545, +3547, +3548, +3549, +3551, +3552, +3553, +3554, +3555, +3556, +3557, +3558, +3559, +3561, +3562, +3563, +3564, +3566, +3567, +3568, +3569, +3571, +3572, +3573, +3574, +3575, +3576, +3577, +3578, +3579, +3581, +3582, +3583, +3584, +3585, +3586, +3587, +3588, +3589, +3591, +3592, +3593, +3594, +3595, +3596, +3597, +3598, +3599, +3611, +3612, +3613, +3614, +3615, +3616, +3617, +3618, +3619, +3621, +3622, +3623, +3624, +3625, +3626, +3627, +3628, +3629, +3631, +3633, +3634, +3635, +3636, +3637, +3638, +3639, +3641, +3642, +3643, +3644, +3645, +3646, +3647, +3648, +3649, +3651, +3652, +3653, +3654, +3655, +3656, +3657, +3658, +3659, +3661, +3662, +3663, +3664, +3665, +3666, +3667, +3668, +3669, +3671, +3672, +3673, +3674, +3675, +3676, +3677, +3678, +3679, +3681, +3682, +3683, +3684, +3685, +3686, +3687, +3688, +3689, +3691, +3692, +3693, +3694, +3695, +3696, +3697, +3698, +3699, +3711, +3712, +3713, +3714, +3715, +3716, +3717, +3718, +3719, +3721, +3722, +3723, +3724, +3725, +3726, +3727, +3728, +3729, +3731, +3732, +3733, +3734, +3735, +3736, +3738, +3739, +3741, +3742, +3743, +3744, +3745, +3746, +3747, +3748, +3749, +3751, +3752, +3753, +3754, +3755, +3756, +3757, +3758, +3759, +3761, +3762, +3763, +3764, +3765, +3767, +3768, +3769, +3771, +3772, +3773, +3774, +3775, +3776, +3777, +3778, +3779, +3781, +3782, +3783, +3784, +3785, +3786, +3787, +3788, +3789, +3791, +3792, +3793, +3794, +3795, +3796, +3797, +3798, +3799, +3811, +3812, +3813, +3814, +3815, +3816, +3817, +3818, +3819, +3821, +3822, +3823, +3824, +3836, +3837, +3838, +3839, +3841, +3842, +3843, +3844, +3845, +3846, +3847, +3848, +3849, +3851, +3852, +3853, +3854, +3855, +3856, +3857, +3858, +3859, +3861, +3862, +3863, +3864, +3865, +3866, +3867, +3869, +3871, +3872, +3873, +3874, +3875, +3876, +3877, +3878, +3879, +3881, +3882, +3883, +3884, +3885, +3886, +3887, +3888, +3889, +3891, +3892, +3893, +3894, +3895, +3896, +3897, +3898, +3899, +3911, +3912, +3913, +3914, +3915, +3916, +3917, +3918, +3919, +3921, +3922, +3923, +3924, +3925, +3926, +3927, +3928, +3929, +3931, +3932, +3933, +3934, +3935, +3936, +3937, +3938, +3939, +3941, +3942, +3943, +3944, +3945, +3946, +3947, +3948, +3949, +3951, +3952, +3953, +3954, +3955, +3956, +3957, +3958, +3959, +3961, +3962, +3963, +3964, +3965, +3966, +3967, +3968, +3969, +3971, +3972, +3973, +3974, +3975, +3984, +3985, +3986, +3987, +3988, +3989, +3991, +3992, +3993, +3995, +3996, +4111, +4114, +4132, +4133, +4134, +4138, +4141, +4142, +4143, +4145, +4154, +4161, +4162, +4199, +4321, +4343, +4344, +4345, +4346, +4347, +4348, +4349, +4351, +4352, +4353, +4354, +4355, +4356, +4357, +4358, +4369, +4426, +4442, +4443, +4444, +4445, +4446, +4447, +4448, +4449, +4451, +4452, +4453, +4454, +4455, +4456, +4457, +4484, +4535, +4536, +4537, +4545, +4546, +4547, +4555, +4567, +4568, +4569, +4598, +4658, +4659, +4661, +4662, +4672, +4673, +4674, +4675, +4676, +4677, +4678, +4679, +4681, +4682, +4683, +4684, +4685, +4686, +4687, +4688, +4689, +4691, +4692, +4737, +4738, +4739, +4751, +4752, +4827, +4837, +4838, +4839, +4848, +4849, +4868, +4869, +4885, +4894, +4899, +4949, +4951, +4987, +4988, +4989, +5112, +5133, +5137, +5145, +5151, +5152, +5154, +5155, +5165, +5167, +5168, +5191, +5192, +5193, +5222, +5225, +5226, +5232, +5234, +5236, +5251, +5252, +5264, +5265, +5269, +5272, +5282, +5312, +5313, +5314, +5315, +5343, +5351, +5352, +5353, +5354, +5355, +5356, +5357, +5358, +5397, +5398, +5399, +5411, +5412, +5413, +5414, +5415, +5416, +5417, +5418, +5419, +5421, +5422, +5423, +5424, +5425, +5426, +5427, +5428, +5429, +5431, +5432, +5433, +5434, +5435, +5453, +5454, +5455, +5456, +5461, +5462, +5463, +5465, +5553, +5554, +5555, +5566, +5567, +5584, +5585, +5599, +5631, +5632, +5672, +5673, +5674, +5675, +5676, +5677, +5678, +5679, +5688, +5713, +5714, +5715, +5716, +5717, +5721, +5729, +5741, +5742, +5743, +5744, +5745, +5746, +5747, +5748, +5755, +5757, +5766, +5767, +5768, +5771, +5777, +5813, +5814, +5815, +5859, +5963, +5968, +5969, +5987, +5988, +5989, +5991, +5992, +5999, +6111, +6112, +6122, +6123, +6133, +6141, +6142, +6143, +6144, +6145, +6146, +6147, +6149, +6161, +6162, +6163, +6253, +6321, +6322, +6343, +6346, +6347, +6382, +6389, +6471, +6543, +6547, +6548, +6549, +6558, +6566, +6579, +6581, +6582, +6583, +6621, +6623, +6627, +6628, +6667, +6672, +6673, +6714, +6715, +6767, +6768, +6769, +6771, +6786, +6787, +6788, +6789, +6791, +6831, +6841, +6842, +6888, +6946, +6961, +6962, +6963, +6964, +6965, +6966, +6969, +6998, +6999, +7121, +7161, +7162, +7163, +7174, +7227, +7272, +7273, +7274, +7281, +7391, +7392, +7395, +7397, +7421, +7426, +7427, +7428, +7429, +7431, +7437, +7491, +7511, +7543, +7544, +7545, +7546, +7547, +7566, +7588, +7624, +7626, +7627, +7633, +7674, +7675, +7676, +7677, +7697, +7725, +7726, +7727, +7738, +7743, +7777, +7778, +7779, +7781, +7786, +7794, +7797, +7798, +7845, +7846, +7887, +7913, +7932, +7933, +7967, +7979, +7999, +8115, +8116, +8118, +8121, +8122, +8128, +8129, +8131, +8132, +8148, +8161, +8199, +8351, +8376, +8377, +8378, +8379, +8383, +8416, +8417, +8443, +8444, +8473, +8474, +8554, +8555, +8567, +8611, +8612, +8613, +8614, +8686, +8699, +8733, +8763, +8764, +8765, +8786, +8787, +8873, +8888, +8889, +8891, +8892, +8893, +8894, +8911, +8912, +8913, +8954, +8989, +8999, +9131, +9161, +9162, +9163, +9164, +9191, +9211, +9212, +9213, +9217, +9222, +9281, +9282, +9283, +9284, +9285, +9287, +9292, +9318, +9321, +9343, +9344, +9346, +9359, +9374, +9396, +9397, +9418, +9535, +9555, +9593, +9594, +9595, +9596, +9597, +9598, +9599, +9612, +9747, +9753, +9875, +9876, +9888, +9898, +9899, +9911, +9951, +9952, +9953, +9991, +9992, +9993, +9994, +9995, +9996, +9997, +9998, +9999, +11111, +11112, +11161, +11162, +11163, +11164, +11165, +11319, +11321, +11367, +11371, +11751, +11967, +12121, +12168, +12172, +12321, +12322, +12345, +12753, +13223, +13224, +13721, +13722, +13724, +13782, +13783, +13785, +13786, +13818, +13819, +13821, +13822, +14141, +14145, +14149, +14936, +14937, +15345, +15363, +16161, +16361, +16367, +16368, +16384, +16991, +16992, +16993, +16994, +16995, +17185, +17219, +17235, +18181, +18182, +18183, +18184, +18185, +18186, +18187, +18241, +18463, +18769, +18881, +18888, +19191, +19194, +19283, +19315, +19398, +19411, +19412, +19539, +19541, +21845, +21846, +21847, +21848, +21849, +22273, +22555, +22951, +24242, +24249, +24321, +24386, +24554, +24677, +24678, +24922, +25793, +26261, +26262, +26263, +26264, +27345, +27374, +27782, +27999, +31416, +31457, +31765, +32249, +32483, +32635, +32768, +32769, +32771, +32772, +32773, +32774, +32775, +32896, +33331, +33434, +33656, +34249, +34378, +34379, +34962, +34963, +34964, +36865, +37475, +39681, +41111, +41794, +41795, +43188, +43189, +43441, +44321, +44322, +44553, +44818, +45678, +45966, +46999, +47557, +47624, +48556, +48619, -- 2.47.2