From: Wouter Wijngaards Date: Tue, 15 Jan 2008 09:45:30 +0000 (+0000) Subject: interface-automatic (IP6mapped, good for anycast service and so on). X-Git-Tag: release-0.9~93 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=179273a13a205c62110dc6234331698f0e7ba5b9;p=thirdparty%2Funbound.git interface-automatic (IP6mapped, good for anycast service and so on). git-svn-id: file:///svn/unbound/trunk@847 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/daemon/acl_list.c b/daemon/acl_list.c index 09104763f..b3b879cae 100644 --- a/daemon/acl_list.c +++ b/daemon/acl_list.c @@ -200,6 +200,8 @@ acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg) return 0; if(!acl_list_str_cfg(acl, "::1", "allow", 0)) return 0; + if(!acl_list_str_cfg(acl, "::ffff:127.0.0.1", "allow", 0)) + return 0; acl_list_init_parents(acl); return 1; } diff --git a/daemon/worker.c b/daemon/worker.c index e65290e9d..a146bd025 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -684,6 +684,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error, LDNS_QR_SET(ldns_buffer_begin(c->buffer)); LDNS_RCODE_SET(ldns_buffer_begin(c->buffer), LDNS_RCODE_REFUSED); + log_addr(VERB_ALGO, "refused query from", + &repinfo->addr, repinfo->addrlen); log_buf(VERB_ALGO, "refuse", c->buffer); return 1; } diff --git a/doc/Changelog b/doc/Changelog index 2e80d4611..bd39ccd59 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,9 +1,13 @@ +15 January 2008: Wouter + - interface-automatic feature. experimental. Nice for anycast. + 14 January 2008: Wouter - in no debug sets NDEBUG to remove asserts. - configure --enable-debug is needed for dependency generation for assertions and for compiler warnings. - ldns.tgz updated with ldns-trunk (where buffer.h is updated). - fix lint, unit test in optimize mode. + - default access control allows ::ffff:127.0.0.1 v6mapped localhost. 11 January 2008: Wouter - man page, warning removed. diff --git a/doc/TODO b/doc/TODO index 8670e0df3..edc3020fd 100644 --- a/doc/TODO +++ b/doc/TODO @@ -62,3 +62,6 @@ o library add convenience functions for A, AAAA, PTR, getaddrinfo, libresolve. o library add function to get signature data (or whole reply message). o library add function to validate input from app that is signed. o add dynamic-update requests (making a dynupd request) to libunbound api. +o in an ipv6 connected only environment unbound cannot use outgoing IP6 + to send to ip4to6 mapped hosts, need ip4to6map of NS and disable + V6ONLY socket option. diff --git a/doc/example.conf b/doc/example.conf index e29ba3224..3ef42d8e1 100644 --- a/doc/example.conf +++ b/doc/example.conf @@ -26,6 +26,13 @@ server: # interface: 192.0.2.153 # interface: 192.0.2.154 # interface: 2001:DB8::5 + + # enable this feature to detect all available interfaces automatically + # May not be supported on all platforms. experimental. + # If interfaces are added or removed during runtime this works. + # Do not forget to enable access-control for your ip4, ip6 and + # ip6mappedip4 addresses. + # interface-automatic: no # port to answer queries from # port: 53 @@ -121,6 +128,7 @@ server: # access-control: 127.0.0.0/8 allow # access-control: ::0/0 refuse # access-control: ::1 allow + # access-control: ::ffff:127.0.0.1 allow # if given, a chroot(2) is done to the given directory. # i.e. you can chroot to the working directory, for example, diff --git a/doc/unbound.conf.5 b/doc/unbound.conf.5 index d4a5bd149..d0a618d11 100644 --- a/doc/unbound.conf.5 +++ b/doc/unbound.conf.5 @@ -96,6 +96,14 @@ Can be given multiple times to work on several interfaces. If none are given the default is to listen to localhost. The interfaces are not changed on a reload (kill \-HUP) but only on restart. .TP +.B interface-automatic: \fI +Detect all interfaces and use them. This feature is experimental, and needs +support in your OS for IPv6 (and its socket options). You have to set access +control for IPv4, IPv6 addresses and also for mapped IPv4 to IPv6 addresses +(i.e. ::ffff:192.168.0.0/112 and so on). IPv4 TCP connections use the IPv4 +access control, IPv4 UDP queries use the mapped access control. +Default value is no. +.TP .B outgoing\-interface: \fI Interface to use to connect to the network. This interface is used to send queries to authoritative servers and receive their replies. Can be given diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c index 52ec206af..5d514c898 100644 --- a/services/listen_dnsport.c +++ b/services/listen_dnsport.c @@ -86,7 +86,7 @@ verbose_print_addr(struct addrinfo *addr) } int -create_udp_sock(struct addrinfo *addr) +create_udp_sock(struct addrinfo *addr, int v6only) { int s; # if defined(IPV6_V6ONLY) @@ -99,11 +99,13 @@ create_udp_sock(struct addrinfo *addr) } if(addr->ai_family == AF_INET6) { # if defined(IPV6_V6ONLY) - if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, - &on, (socklen_t)sizeof(on)) < 0) { - log_err("setsockopt(..., IPV6_V6ONLY, ...) failed: %s", - strerror(errno)); - return -1; + if(v6only) { + if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, + &on, (socklen_t)sizeof(on)) < 0) { + log_err("setsockopt(..., IPV6_V6ONLY" + ", ...) failed: %s", strerror(errno)); + return -1; + } } # endif # if defined(IPV6_USE_MIN_MTU) @@ -135,10 +137,11 @@ create_udp_sock(struct addrinfo *addr) /** * Create and bind TCP listening socket * @param addr: address info ready to make socket. + * @param v6only: enable ip6 only flag on ip6 sockets. * @return: the socket. -1 on error. */ static int -create_tcp_accept_sock(struct addrinfo *addr) +create_tcp_accept_sock(struct addrinfo *addr, int v6only) { int s, flag; #if defined(SO_REUSEADDR) || defined(IPV6_V6ONLY) @@ -158,7 +161,7 @@ create_tcp_accept_sock(struct addrinfo *addr) } #endif /* SO_REUSEADDR */ #if defined(IPV6_V6ONLY) - if(addr->ai_family == AF_INET6) { + if(addr->ai_family == AF_INET6 && v6only) { if(setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &on, (socklen_t)sizeof(on)) < 0) { log_err("setsockopt(..., IPV6_V6ONLY, ...) failed: %s", @@ -192,7 +195,7 @@ create_tcp_accept_sock(struct addrinfo *addr) */ static int make_sock(int stype, const char* ifname, const char* port, - struct addrinfo *hints) + struct addrinfo *hints, int v6only) { struct addrinfo *res = NULL; int r, s; @@ -204,8 +207,8 @@ make_sock(int stype, const char* ifname, const char* port, return -1; } if(stype == SOCK_DGRAM) - s = create_udp_sock(res); - else s = create_tcp_accept_sock(res); + s = create_udp_sock(res, v6only); + else s = create_tcp_accept_sock(res, v6only); freeaddrinfo(res); return s; } @@ -214,11 +217,11 @@ make_sock(int stype, const char* ifname, const char* port, * Add port to open ports list. * @param list: list head. changed. * @param s: fd. - * @param is_udp: if fd is UDP. + * @param ftype: if fd is UDP. * @return false on failure. list in unchanged then. */ static int -port_insert(struct listen_port** list, int s, int is_udp) +port_insert(struct listen_port** list, int s, enum listen_type ftype) { struct listen_port* item = (struct listen_port*)malloc( sizeof(struct listen_port)); @@ -226,14 +229,32 @@ port_insert(struct listen_port** list, int s, int is_udp) return 0; item->next = *list; item->fd = s; - item->is_udp = is_udp; + item->ftype = ftype; *list = item; return 1; } +#ifdef IPV6_RECVPKTINFO +/** set IPV6_RECVPKTINFO on fd */ +static int +set_ip6_recvpktinfo(int s) +{ + int on = 1; + if(setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO, + &on, (socklen_t)sizeof(on)) < 0) { + log_err("setsockopt(..., IPV6_RECVPKTINFO, ...) failed: %s", + strerror(errno)); + return 0; + } + return 1; +} +#endif /* defined IPV6_RECVPKTINFO */ + /** * Helper for ports_open. Creates one interface (or NULL for default). * @param ifname: The interface ip address. + * @param do_auto: use automatic interface detection. + * If enabled, then ifname must be the wildcard name. * @param do_udp: if udp should be used. * @param do_tcp: if udp should be used. * @param hints: for getaddrinfo. family and flags have to be set by caller. @@ -242,25 +263,45 @@ port_insert(struct listen_port** list, int s, int is_udp) * @return: returns false on error. */ static int -ports_create_if(const char* ifname, int do_udp, int do_tcp, +ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, struct addrinfo *hints, const char* port, struct listen_port** list) { int s; if(!do_udp && !do_tcp) return 0; - if(do_udp) { - if((s = make_sock(SOCK_DGRAM, ifname, port, hints)) == -1) + if(do_auto) { + /* skip ip4 sockets, ip4 udp gets mapped to v6 */ + if(hints->ai_family == AF_INET6) { + if((s = make_sock(SOCK_DGRAM, ifname, port, hints, 0)) + == -1) + return 0; +#ifdef IPV6_RECVPKTINFO + if(!set_ip6_recvpktinfo(s)) + return 0; +#else + log_err("no IPV6_RECVPKTINFO option, please " + "disable interface-automatic in config"); + return 0; +#endif + if(!port_insert(list, s, listen_type_udpancil)) { + close(s); + return 0; + } + } + } else if(do_udp) { + /* regular udp socket */ + if((s = make_sock(SOCK_DGRAM, ifname, port, hints, 1)) == -1) return 0; - if(!port_insert(list, s, 1)) { + if(!port_insert(list, s, listen_type_udp)) { close(s); return 0; } } if(do_tcp) { - if((s = make_sock(SOCK_STREAM, ifname, port, hints)) == -1) { + if((s = make_sock(SOCK_STREAM, ifname, port, hints, 1)) == -1) { return 0; } - if(!port_insert(list, s, 0)) { + if(!port_insert(list, s, listen_type_tcp)) { close(s); return 0; } @@ -306,11 +347,15 @@ listen_create(struct comm_base* base, struct listen_port* ports, /* create comm points as needed */ while(ports) { struct comm_point* cp = NULL; - if(ports->is_udp) + if(ports->ftype == listen_type_udp) cp = comm_point_create_udp(base, ports->fd, front->udp_buff, cb, cb_arg); - else cp = comm_point_create_tcp(base, ports->fd, + else if(ports->ftype == listen_type_tcp) + cp = comm_point_create_tcp(base, ports->fd, tcp_accept_count, bufsize, cb, cb_arg); + else if(ports->ftype == listen_type_udpancil) + cp = comm_point_create_udp_ancil(base, ports->fd, + front->udp_buff, cb, cb_arg); if(!cp) { log_err("can't create commpoint"); listen_delete(front); @@ -383,12 +428,13 @@ listening_ports_open(struct config_file* cfg) struct listen_port* list = NULL; struct addrinfo hints; int i, do_ip4, do_ip6; - int do_tcp; + int do_tcp, do_auto; char portbuf[32]; snprintf(portbuf, sizeof(portbuf), "%d", cfg->port); do_ip4 = cfg->do_ip4; do_ip6 = cfg->do_ip6; do_tcp = cfg->do_tcp; + do_auto = cfg->if_automatic && cfg->do_udp; if(cfg->incoming_num_tcp == 0) do_tcp = 0; @@ -405,11 +451,16 @@ listening_ports_open(struct config_file* cfg) if(!do_ip4 && !do_ip6) { return NULL; } + if(do_auto && (!do_ip4 || !do_ip6)) { + log_warn("interface_automatic option does not work when IP4 or IP6 is not enabled. Disabling option."); + do_auto = 0; + } /* create ip4 and ip6 ports so that return addresses are nice. */ - if(cfg->num_ifs == 0) { + if(do_auto || cfg->num_ifs == 0) { if(do_ip6) { hints.ai_family = AF_INET6; - if(!ports_create_if("::1", cfg->do_udp, do_tcp, + if(!ports_create_if(do_auto?"::0":"::1", + do_auto, cfg->do_udp, do_tcp, &hints, portbuf, &list)) { listening_ports_free(list); return NULL; @@ -417,7 +468,8 @@ listening_ports_open(struct config_file* cfg) } if(do_ip4) { hints.ai_family = AF_INET; - if(!ports_create_if("127.0.0.1", cfg->do_udp, do_tcp, + if(!ports_create_if(do_auto?"0.0.0.0":"127.0.0.1", + do_auto, cfg->do_udp, do_tcp, &hints, portbuf, &list)) { listening_ports_free(list); return NULL; @@ -428,7 +480,7 @@ listening_ports_open(struct config_file* cfg) if(!do_ip6) continue; hints.ai_family = AF_INET6; - if(!ports_create_if(cfg->ifs[i], cfg->do_udp, + if(!ports_create_if(cfg->ifs[i], 0, cfg->do_udp, do_tcp, &hints, portbuf, &list)) { listening_ports_free(list); return NULL; @@ -437,7 +489,7 @@ listening_ports_open(struct config_file* cfg) if(!do_ip4) continue; hints.ai_family = AF_INET; - if(!ports_create_if(cfg->ifs[i], cfg->do_udp, + if(!ports_create_if(cfg->ifs[i], 0, cfg->do_udp, do_tcp, &hints, portbuf, &list)) { listening_ports_free(list); return NULL; diff --git a/services/listen_dnsport.h b/services/listen_dnsport.h index fb11a6ade..17d18e2cc 100644 --- a/services/listen_dnsport.h +++ b/services/listen_dnsport.h @@ -74,6 +74,18 @@ struct listen_list { struct comm_point* com; }; +/** + * type of ports + */ +enum listen_type { + /** udp type */ + listen_type_udp, + /** tcp type */ + listen_type_tcp, + /** udp ipv6 (v4mapped) for use with ancillary data */ + listen_type_udpancil +}; + /** * Single linked list to store shared ports that have been * opened for use by all threads. @@ -84,7 +96,7 @@ struct listen_port { /** file descriptor, open and ready for use */ int fd; /** type of file descriptor, udp or tcp */ - int is_udp; + enum listen_type ftype; }; /** @@ -154,8 +166,9 @@ size_t listen_get_mem(struct listen_dnsport* listen); /** * Create and bind nonblocking UDP socket * @param addr: address info ready to make socket. + * @param v6only: if enabled, IP6 sockets get IP6ONLY option set. * @return: the socket. -1 on error. */ -int create_udp_sock(struct addrinfo* addr); +int create_udp_sock(struct addrinfo* addr, int v6only); #endif /* LISTEN_DNSPORT_H */ diff --git a/services/outside_network.c b/services/outside_network.c index 9bee14885..2e7fad850 100644 --- a/services/outside_network.c +++ b/services/outside_network.c @@ -302,7 +302,7 @@ open_udp_port_range(const char* ifname, struct addrinfo* hints, int porthint) r==EAI_SYSTEM?(char*)strerror(errno):""); return -1; } - s = create_udp_sock(res); + s = create_udp_sock(res, 1); freeaddrinfo(res); return s; } diff --git a/testcode/fake_event.c b/testcode/fake_event.c index 6f0a01eeb..f46b6131d 100644 --- a/testcode/fake_event.c +++ b/testcode/fake_event.c @@ -1005,6 +1005,12 @@ void comm_point_udp_callback(int ATTR_UNUSED(fd), short ATTR_UNUSED(event), log_assert(0); } +void comm_point_udp_ancil_callback(int ATTR_UNUSED(fd), + short ATTR_UNUSED(event), void* ATTR_UNUSED(arg)) +{ + log_assert(0); +} + void comm_point_tcp_accept_callback(int ATTR_UNUSED(fd), short ATTR_UNUSED(event), void* ATTR_UNUSED(arg)) { diff --git a/util/config_file.c b/util/config_file.c index 57ad14962..7634170b8 100644 --- a/util/config_file.c +++ b/util/config_file.c @@ -105,6 +105,7 @@ config_create() cfg->donotquery_localhost = 1; cfg->root_hints = NULL; cfg->do_daemonize = 1; + cfg->if_automatic = 0; cfg->num_ifs = 0; cfg->ifs = NULL; cfg->num_out_ifs = 0; diff --git a/util/config_file.h b/util/config_file.h index 8cc975e4c..0fda53fff 100644 --- a/util/config_file.h +++ b/util/config_file.h @@ -102,6 +102,10 @@ struct config_file { /** the target fetch policy for the iterator */ char* target_fetch_policy; + /** automatic interface for incoming messages. Uses ipv6 remapping, + * and recvmsg/sendmsg ancillary data to detect interfaces, boolean */ + int if_automatic; + /** number of interfaces to open. If 0 default all interfaces. */ int num_ifs; /** interface description strings (IP addresses) */ diff --git a/util/configlexer.c b/util/configlexer.c index 4e88f6fb1..778e7c74d 100644 --- a/util/configlexer.c +++ b/util/configlexer.c @@ -365,8 +365,8 @@ static void yy_fatal_error (yyconst char msg[] ); *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 86 -#define YY_END_OF_BUFFER 87 +#define YY_NUM_RULES 87 +#define YY_END_OF_BUFFER 88 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -374,89 +374,90 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[732] = +static yyconst flex_int16_t yy_accept[743] = { 0, - 1, 1, 70, 70, 74, 74, 78, 78, 82, 82, - 87, 85, 1, 68, 69, 2, 73, 86, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 70, 71, 86, 72, 86, - 74, 75, 76, 86, 81, 78, 79, 80, 86, 82, - 83, 84, 86, 85, 0, 1, 2, 2, 2, 2, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 70, 0, - 74, 0, 81, 0, 78, 82, 0, 85, 85, 85, - - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 41, 85, 85, - 85, 85, 6, 85, 85, 85, 85, 85, 85, 85, - - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 17, 85, 11, 12, - 85, 14, 13, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 3, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 77, 85, 85, 85, 85, - 85, 85, 85, 85, 20, 85, 85, 85, 85, 85, - 85, 21, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 53, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 52, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 18, 85, 85, 85, - 85, 85, 85, 85, 85, 19, 85, 85, 85, 85, - - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 15, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 42, 43, 40, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 5, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 67, 66, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 22, 85, 85, 85, - 85, 65, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 38, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - - 4, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 45, 46, 44, - 85, 85, 85, 85, 51, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 57, 85, 85, 85, 85, - 85, 85, 85, 28, 85, 85, 85, 85, 85, 50, - 85, 85, 85, 85, 85, 85, 85, 85, 54, 85, - 85, 85, 85, 85, 85, 7, 85, 85, 85, 85, - 85, 85, 59, 85, 85, 85, 85, 49, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 29, 30, 62, - - 85, 85, 24, 85, 85, 85, 85, 8, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 63, 23, 25, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 10, 85, 85, 85, - 85, 85, 9, 26, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 31, - 85, 85, 27, 85, 55, 56, 85, 85, 58, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 16, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - - 85, 35, 85, 85, 61, 47, 85, 85, 37, 36, - 85, 32, 85, 60, 85, 85, 85, 33, 85, 85, - 48, 39, 34, 85, 85, 85, 85, 85, 85, 64, - 0 + 1, 1, 71, 71, 75, 75, 79, 79, 83, 83, + 88, 86, 1, 69, 70, 2, 74, 87, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 71, 72, 87, 73, 87, + 75, 76, 77, 87, 82, 79, 80, 81, 87, 83, + 84, 85, 87, 86, 0, 1, 2, 2, 2, 2, + 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, 71, 0, + 75, 0, 82, 0, 79, 83, 0, 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, 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, 42, 86, 86, + 86, 86, 6, 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, 86, 18, 86, 11, 12, + 86, 14, 13, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 3, 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, 78, 86, 86, 86, 86, + 86, 86, 86, 86, 21, 86, 86, 86, 86, 86, + 86, 22, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 54, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 53, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 19, 86, 86, 86, + 86, 86, 86, 86, 86, 20, 86, 86, 86, 86, + + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 15, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 43, 44, 41, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 5, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 68, 67, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 23, 86, + 86, 86, 86, 66, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 39, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + + 86, 86, 86, 4, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 46, 47, 45, 86, 86, 86, 86, 52, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 58, + 86, 86, 86, 86, 86, 86, 86, 29, 86, 86, + 86, 86, 86, 51, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 55, 86, 86, 86, 86, 86, 86, + 7, 86, 86, 86, 86, 86, 86, 60, 86, 86, + 86, 86, 50, 86, 86, 86, 86, 86, 86, 86, + + 86, 86, 30, 31, 86, 63, 86, 86, 25, 86, + 86, 86, 86, 8, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 64, 24, 26, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 10, 86, 86, 86, 86, 86, 86, + 9, 27, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 32, 86, 86, + 86, 28, 86, 56, 57, 86, 86, 59, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 16, 86, + + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 17, 86, 36, 86, 86, 62, 48, 86, 86, 38, + 37, 86, 33, 86, 61, 86, 86, 86, 34, 86, + 86, 49, 40, 35, 86, 86, 86, 86, 86, 86, + 65, 0 } ; static yyconst flex_int32_t yy_ec[256] = @@ -499,18 +500,18 @@ static yyconst flex_int32_t yy_meta[39] = 1, 1, 1, 1, 1, 1, 1, 1 } ; -static yyconst flex_int16_t yy_base[743] = +static yyconst flex_int16_t yy_base[754] = { 0, 0, 0, 36, 39, 43, 50, 62, 74, 55, 67, - 1513, 1499, 49, 1514, 1514, 81, 1514, 88, 32, 83, + 1535, 1521, 49, 1536, 1536, 81, 1536, 88, 32, 83, 76, 78, 60, 89, 94, 86, 87, 95, 88, 97, - 103, 104, 112, 98, 121, 1498, 1514, 1514, 1514, 57, - 1497, 1514, 1514, 116, 1496, 1506, 1514, 1514, 136, 1494, - 1514, 1514, 127, 1493, 142, 146, 0, 149, 0, 0, + 103, 104, 112, 98, 121, 1520, 1536, 1536, 1536, 57, + 1519, 1536, 1536, 116, 1518, 1528, 1536, 1536, 136, 1516, + 1536, 1536, 127, 1515, 142, 146, 0, 149, 0, 0, 142, 144, 137, 146, 153, 150, 151, 152, 155, 158, 157, 159, 165, 171, 170, 172, 173, 175, 174, 176, - 114, 180, 183, 185, 186, 188, 187, 194, 1492, 204, - 1491, 210, 1490, 216, 1500, 1488, 208, 209, 212, 213, + 114, 180, 183, 185, 186, 188, 187, 194, 1514, 204, + 1513, 210, 1512, 216, 1522, 1510, 208, 209, 212, 213, 216, 215, 217, 218, 225, 219, 226, 229, 231, 238, 241, 243, 244, 250, 247, 253, 251, 254, 255, 256, @@ -520,158 +521,160 @@ static yyconst flex_int16_t yy_base[743] = 316, 323, 327, 329, 338, 330, 334, 345, 341, 331, 342, 343, 361, 344, 348, 347, 359, 351, 352, 369, 353, 362, 368, 373, 378, 379, 380, 381, 384, 387, - 386, 394, 401, 397, 398, 399, 404, 1487, 402, 406, - 407, 409, 1486, 410, 417, 411, 423, 413, 430, 415, + 386, 394, 401, 397, 398, 399, 404, 1509, 402, 406, + 407, 409, 1508, 410, 417, 411, 423, 413, 430, 415, 426, 429, 433, 434, 421, 436, 437, 440, 450, 446, 457, 447, 460, 463, 469, 466, 468, 449, 475, 472, 473, 471, 474, 438, 477, 481, 483, 487, 484, 497, 493, 495, 496, 494, 500, 502, 505, 503, 509, 515, 504, 510, 521, 522, 525, 517, 520, 526, 531, 534, - 537, 527, 538, 528, 540, 545, 1485, 548, 1484, 1483, - 550, 1482, 1481, 554, 551, 552, 553, 556, 560, 561, + 537, 527, 538, 528, 540, 545, 1507, 548, 1506, 1505, + 550, 1504, 1503, 554, 551, 552, 553, 556, 560, 561, 563, 567, 571, 573, 574, 577, 575, 584, 585, 586, - 579, 590, 591, 593, 595, 597, 598, 1480, 601, 602, + 579, 590, 591, 593, 595, 597, 598, 1502, 601, 602, 603, 606, 604, 613, 611, 609, 615, 618, 621, 623, 625, 626, 628, 629, 630, 631, 632, 633, 636, 639, - 646, 648, 638, 642, 662, 1479, 659, 663, 657, 664, - 665, 667, 668, 669, 1478, 671, 673, 674, 677, 680, - 688, 1477, 684, 689, 690, 691, 693, 694, 697, 695, - 701, 709, 696, 704, 706, 711, 712, 713, 1476, 716, + 646, 648, 638, 642, 662, 1501, 659, 663, 657, 664, + 665, 667, 668, 669, 1500, 671, 673, 674, 677, 680, + 688, 1499, 684, 689, 690, 691, 693, 694, 697, 695, + 701, 709, 696, 704, 706, 711, 712, 713, 1498, 716, 723, 720, 722, 726, 724, 725, 731, 732, 733, 734, - 735, 736, 1475, 740, 743, 741, 742, 756, 762, 758, - 761, 763, 764, 770, 767, 769, 771, 774, 775, 778, - 790, 794, 768, 791, 795, 796, 1474, 802, 806, 809, - 798, 805, 811, 808, 812, 1473, 813, 814, 815, 816, - - 817, 819, 821, 820, 825, 822, 826, 838, 844, 845, - 1472, 832, 842, 848, 779, 854, 851, 852, 853, 855, - 856, 858, 859, 862, 873, 1471, 1470, 1469, 863, 865, - 857, 875, 864, 884, 867, 882, 880, 1468, 887, 888, - 889, 891, 890, 892, 894, 896, 900, 893, 901, 902, - 906, 916, 903, 910, 914, 1467, 1466, 917, 919, 921, - 933, 935, 924, 927, 931, 936, 1465, 945, 938, 941, - 942, 1464, 944, 947, 950, 952, 953, 954, 956, 964, - 966, 970, 972, 973, 1463, 979, 980, 961, 978, 986, - 982, 983, 984, 987, 988, 990, 992, 991, 998, 994, - - 1462, 1005, 1011, 996, 1007, 1004, 1013, 1024, 1025, 1017, - 1026, 1018, 1032, 1029, 1033, 1035, 1036, 1461, 1460, 1459, - 1043, 1039, 744, 1041, 1458, 1045, 1048, 1031, 1046, 1052, - 1054, 1053, 1059, 1067, 1056, 1068, 1060, 1069, 1070, 1071, - 1076, 1072, 1080, 1078, 1079, 1457, 1082, 1084, 1086, 1092, - 1094, 1096, 1100, 1456, 1102, 1097, 1103, 1104, 1105, 1455, - 1109, 1107, 1108, 1113, 1116, 1118, 1123, 1126, 1454, 1127, - 1129, 1130, 1133, 1131, 1135, 1453, 1140, 1134, 1141, 1143, - 1136, 1146, 1452, 1147, 1149, 1151, 1161, 1451, 1160, 1162, - 1153, 1163, 1167, 1154, 1170, 1171, 1174, 1447, 1443, 1442, - - 1178, 1181, 1441, 1183, 1189, 1185, 1187, 1437, 1188, 1190, - 1194, 1195, 1196, 1191, 1197, 1198, 1199, 1201, 1203, 1208, - 1209, 1210, 1213, 1219, 1215, 1216, 1436, 1432, 1431, 1220, - 1221, 1231, 1233, 1223, 1227, 1235, 1237, 1238, 1243, 1244, - 1245, 1246, 1247, 1253, 1254, 1255, 1430, 1250, 1256, 1261, - 1257, 1266, 1424, 1396, 1270, 1272, 1277, 1279, 1267, 1286, - 1283, 1284, 1273, 1285, 1287, 1289, 1290, 1292, 1295, 1395, - 1296, 1298, 1394, 1299, 1393, 1392, 1303, 1300, 1390, 1305, - 1306, 1307, 1311, 1312, 1317, 1308, 1316, 1320, 1389, 1319, - 1327, 1328, 1332, 1336, 1337, 1339, 1341, 1343, 1345, 1349, - - 1351, 1388, 1354, 1356, 1387, 1385, 1346, 1358, 1384, 1329, - 1360, 1021, 1363, 782, 1357, 1369, 1371, 644, 1373, 1375, - 530, 355, 223, 1364, 1377, 1366, 1378, 1379, 1382, 189, - 1514, 1410, 1416, 1422, 1428, 136, 1434, 1440, 1446, 83, - 1451, 1457 + 735, 736, 1497, 740, 743, 741, 742, 762, 763, 755, + 759, 765, 766, 772, 768, 770, 771, 769, 777, 776, + 782, 790, 779, 791, 792, 793, 1496, 801, 807, 808, + 795, 794, 806, 809, 810, 1495, 813, 811, 814, 818, + + 816, 817, 819, 820, 824, 821, 823, 836, 844, 845, + 846, 1494, 838, 849, 851, 852, 859, 842, 853, 855, + 857, 861, 862, 863, 866, 867, 1493, 1492, 1491, 874, + 868, 869, 879, 875, 883, 880, 885, 886, 1490, 888, + 887, 891, 892, 895, 896, 897, 899, 903, 900, 907, + 910, 912, 916, 913, 917, 918, 920, 1489, 1488, 921, + 922, 928, 946, 934, 925, 935, 942, 943, 1487, 950, + 949, 948, 951, 1486, 952, 954, 955, 961, 953, 963, + 964, 972, 974, 979, 981, 982, 1485, 988, 989, 968, + 987, 995, 991, 993, 994, 996, 976, 997, 999, 1005, + + 1000, 1007, 1003, 1484, 1011, 1022, 1010, 1019, 1020, 1028, + 1032, 1035, 1033, 1036, 1021, 1039, 1037, 1041, 1043, 1046, + 1483, 1482, 1481, 1053, 1049, 744, 1051, 1480, 1054, 1055, + 1059, 1060, 1061, 1063, 1062, 1064, 825, 1067, 1068, 1070, + 1078, 1077, 1081, 1083, 1085, 1086, 1088, 1089, 1090, 1479, + 1094, 1106, 1092, 1095, 1103, 1109, 1111, 1478, 1108, 1115, + 1116, 1117, 1118, 1477, 1119, 1120, 1121, 1123, 1126, 1128, + 1130, 1136, 1131, 1476, 1139, 1141, 1143, 1145, 1146, 1147, + 1475, 1154, 1148, 1155, 1151, 1157, 1158, 1471, 1159, 1160, + 1163, 1175, 1467, 1168, 1171, 1176, 1177, 1179, 1181, 1183, + + 1184, 1187, 1466, 1465, 1190, 1461, 1194, 1198, 1460, 1200, + 1206, 1202, 1204, 1456, 1205, 1207, 1211, 1212, 1213, 1208, + 1214, 1215, 1216, 1218, 1220, 1225, 1226, 1227, 1230, 1236, + 1232, 1233, 1237, 1455, 1454, 1448, 1238, 1241, 1248, 1250, + 1240, 1252, 1254, 1255, 1253, 1263, 1264, 1262, 1265, 1266, + 1271, 1272, 1273, 1420, 1274, 1275, 1279, 1285, 1283, 1284, + 1419, 1415, 1287, 1295, 1297, 1300, 1288, 1307, 1304, 1305, + 1290, 1306, 1310, 1311, 1312, 1313, 1315, 1414, 1317, 1318, + 1324, 1413, 1319, 1412, 1411, 1326, 1321, 1410, 1328, 1329, + 1331, 1336, 1332, 1339, 1338, 1340, 1342, 1348, 1405, 1355, + + 1346, 1349, 1360, 1362, 1352, 1364, 1366, 1372, 1373, 1375, + 1367, 1376, 1356, 1380, 1381, 1186, 1180, 1382, 1383, 1087, + 1024, 1385, 970, 1388, 927, 1389, 1391, 1394, 644, 1396, + 1397, 530, 355, 223, 1399, 1400, 1402, 1404, 1403, 1408, + 189, 1536, 1434, 1440, 1446, 1452, 136, 1458, 1464, 1470, + 83, 1475, 1481 } ; -static yyconst flex_int16_t yy_def[743] = +static yyconst flex_int16_t yy_def[754] = { 0, - 731, 1, 732, 732, 733, 733, 734, 734, 735, 735, - 731, 736, 731, 731, 731, 737, 731, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 738, 731, 731, 731, 738, - 739, 731, 731, 739, 740, 731, 731, 731, 740, 741, - 731, 731, 741, 736, 736, 731, 742, 737, 742, 737, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 738, 738, - 739, 739, 740, 740, 731, 741, 741, 736, 736, 736, - - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, - 0, 731, 731, 731, 731, 731, 731, 731, 731, 731, - 731, 731 + 742, 1, 743, 743, 744, 744, 745, 745, 746, 746, + 742, 747, 742, 742, 742, 748, 742, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 749, 742, 742, 742, 749, + 750, 742, 742, 750, 751, 742, 742, 742, 751, 752, + 742, 742, 752, 747, 747, 742, 753, 748, 753, 748, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 749, 749, + 750, 750, 751, 751, 742, 752, 752, 747, 747, 747, + + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, + 747, 0, 742, 742, 742, 742, 742, 742, 742, 742, + 742, 742, 742 } ; -static yyconst flex_int16_t yy_nxt[1553] = +static yyconst flex_int16_t yy_nxt[1575] = { 0, 12, 13, 14, 14, 15, 16, 17, 12, 12, 12, 12, 12, 18, 19, 12, 20, 21, 12, 22, 12, @@ -755,98 +758,100 @@ static yyconst flex_int16_t yy_nxt[1553] = 387, 55, 381, 55, 55, 55, 388, 386, 55, 389, 395, 396, 55, 392, 55, 55, 55, 55, 55, 397, 391, 394, 398, 55, 55, 55, 55, 55, 55, 393, - 399, 400, 55, 55, 55, 55, 55, 406, 559, 410, - 404, 401, 403, 408, 402, 407, 405, 411, 55, 412, - 55, 413, 409, 55, 55, 55, 55, 417, 414, 55, - 55, 55, 55, 55, 418, 419, 55, 55, 415, 426, - 55, 55, 420, 416, 55, 425, 421, 458, 422, 429, - - 423, 427, 55, 55, 424, 428, 55, 55, 55, 433, - 55, 430, 431, 434, 55, 432, 435, 55, 55, 436, - 55, 55, 438, 55, 55, 55, 55, 55, 55, 55, - 442, 55, 55, 55, 55, 437, 446, 55, 55, 439, - 447, 444, 441, 440, 55, 443, 449, 445, 450, 448, - 55, 453, 454, 456, 55, 452, 55, 55, 451, 457, - 55, 459, 455, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 466, 467, 55, 55, 55, 55, 469, 55, - 463, 460, 461, 462, 465, 55, 472, 55, 464, 475, - 468, 470, 55, 471, 55, 473, 55, 474, 476, 55, - - 55, 55, 55, 55, 55, 55, 55, 485, 55, 483, - 477, 484, 55, 55, 55, 55, 478, 486, 55, 479, - 481, 482, 55, 491, 487, 480, 55, 489, 55, 55, - 490, 55, 488, 55, 492, 494, 55, 495, 496, 55, - 500, 493, 498, 55, 499, 55, 501, 55, 55, 497, - 55, 503, 506, 55, 55, 502, 55, 55, 507, 55, - 504, 505, 55, 511, 55, 55, 55, 512, 55, 513, - 508, 517, 509, 55, 514, 510, 55, 518, 55, 516, - 515, 519, 55, 520, 55, 55, 522, 523, 521, 525, - 55, 55, 55, 526, 55, 55, 55, 524, 55, 55, - - 55, 533, 55, 55, 55, 527, 55, 528, 55, 534, - 55, 537, 529, 535, 530, 531, 55, 55, 540, 55, - 544, 538, 539, 55, 532, 55, 542, 541, 536, 55, - 55, 545, 547, 55, 543, 546, 55, 55, 55, 551, - 548, 55, 549, 55, 55, 55, 554, 55, 55, 555, - 557, 55, 560, 55, 550, 55, 553, 55, 55, 556, - 55, 562, 552, 563, 55, 55, 55, 558, 55, 564, - 567, 55, 55, 568, 572, 565, 561, 566, 569, 55, - 55, 55, 55, 55, 55, 571, 573, 576, 55, 577, - 55, 55, 55, 570, 55, 583, 55, 581, 55, 574, - - 582, 578, 575, 579, 55, 580, 55, 584, 55, 55, - 586, 588, 55, 587, 55, 55, 55, 55, 589, 55, - 55, 55, 585, 590, 594, 55, 597, 598, 55, 599, - 55, 595, 596, 591, 600, 55, 592, 593, 55, 55, - 603, 55, 55, 55, 602, 55, 55, 55, 55, 606, - 607, 608, 55, 55, 610, 55, 601, 612, 55, 55, - 604, 55, 605, 55, 616, 55, 55, 613, 617, 611, - 615, 609, 55, 55, 55, 55, 618, 619, 614, 55, - 621, 623, 55, 55, 620, 622, 55, 624, 626, 627, - 55, 625, 628, 55, 629, 55, 630, 55, 631, 55, - - 55, 55, 55, 55, 634, 633, 55, 55, 55, 55, - 55, 55, 638, 55, 632, 55, 643, 635, 636, 637, - 55, 55, 55, 641, 647, 55, 648, 55, 55, 640, - 642, 55, 55, 55, 639, 55, 652, 644, 645, 55, - 646, 649, 653, 55, 654, 55, 650, 55, 656, 55, - 55, 651, 657, 655, 658, 55, 55, 55, 55, 55, - 660, 661, 55, 663, 659, 55, 55, 55, 55, 55, - 664, 662, 670, 55, 665, 666, 667, 671, 55, 55, - 668, 673, 55, 672, 55, 55, 669, 674, 675, 55, - 676, 55, 677, 678, 679, 55, 55, 55, 55, 55, - - 680, 55, 55, 681, 55, 682, 684, 55, 55, 689, - 55, 55, 55, 686, 683, 55, 691, 55, 55, 55, - 55, 692, 693, 55, 55, 688, 687, 685, 55, 55, - 702, 55, 55, 695, 698, 690, 694, 701, 696, 55, - 55, 55, 697, 705, 55, 699, 700, 706, 55, 55, - 703, 55, 709, 55, 710, 55, 708, 55, 55, 704, - 712, 55, 711, 55, 713, 714, 55, 707, 55, 55, - 55, 718, 55, 715, 717, 55, 55, 716, 55, 719, - 721, 55, 722, 55, 723, 55, 720, 55, 724, 55, - 55, 55, 727, 730, 55, 725, 55, 55, 726, 55, - - 55, 55, 55, 728, 55, 55, 55, 55, 55, 729, - 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, - 41, 41, 45, 45, 45, 45, 45, 45, 50, 50, - 50, 50, 50, 50, 58, 58, 55, 58, 58, 58, - 89, 89, 55, 55, 55, 89, 91, 91, 55, 55, - 91, 96, 96, 55, 55, 55, 96, 59, 59, 55, - 59, 59, 59, 55, 55, 55, 55, 55, 55, 55, + 399, 400, 55, 55, 55, 55, 55, 406, 563, 410, + 404, 401, 403, 408, 402, 407, 405, 55, 414, 411, + 413, 55, 409, 412, 55, 55, 415, 55, 55, 418, + 55, 55, 55, 55, 55, 419, 420, 427, 55, 55, + 416, 55, 421, 428, 55, 417, 422, 426, 423, 425, + + 424, 429, 55, 55, 55, 55, 55, 55, 434, 432, + 430, 431, 433, 55, 435, 436, 437, 439, 55, 55, + 55, 55, 55, 55, 438, 55, 55, 443, 55, 55, + 55, 55, 55, 55, 447, 55, 55, 55, 448, 573, + 440, 441, 442, 445, 444, 450, 446, 451, 55, 449, + 55, 454, 455, 453, 55, 452, 55, 55, 55, 456, + 458, 55, 459, 55, 55, 55, 461, 55, 457, 55, + 460, 55, 462, 55, 55, 55, 468, 469, 55, 55, + 55, 55, 465, 463, 470, 464, 55, 55, 467, 471, + 474, 55, 55, 466, 472, 55, 476, 55, 55, 55, + + 55, 478, 477, 55, 55, 473, 475, 55, 55, 55, + 487, 55, 55, 485, 486, 55, 479, 480, 481, 55, + 488, 483, 55, 493, 55, 55, 484, 482, 55, 55, + 55, 489, 55, 55, 55, 491, 492, 55, 490, 55, + 55, 497, 499, 498, 494, 504, 55, 55, 495, 501, + 496, 502, 500, 503, 55, 55, 505, 509, 55, 506, + 55, 55, 55, 55, 55, 55, 55, 55, 508, 510, + 514, 507, 515, 55, 517, 55, 55, 511, 516, 520, + 55, 512, 55, 513, 55, 521, 55, 519, 55, 518, + 522, 55, 523, 55, 55, 525, 526, 524, 528, 55, + + 55, 55, 529, 55, 527, 55, 55, 55, 55, 55, + 537, 55, 55, 536, 530, 55, 531, 55, 538, 55, + 541, 532, 55, 55, 533, 534, 539, 535, 543, 544, + 542, 55, 55, 55, 55, 548, 55, 540, 546, 549, + 55, 545, 551, 550, 55, 55, 555, 55, 55, 55, + 547, 55, 553, 55, 558, 55, 552, 554, 55, 559, + 561, 55, 564, 55, 557, 55, 55, 55, 566, 560, + 556, 55, 55, 55, 55, 55, 55, 562, 574, 55, + 55, 572, 55, 568, 569, 565, 570, 576, 571, 55, + 55, 567, 577, 55, 578, 55, 581, 55, 55, 55, + + 55, 55, 55, 582, 55, 575, 55, 55, 586, 583, + 579, 584, 587, 589, 580, 55, 585, 588, 55, 591, + 55, 55, 593, 55, 594, 590, 592, 55, 55, 55, + 55, 55, 55, 55, 599, 55, 602, 603, 55, 604, + 55, 595, 55, 55, 600, 601, 596, 606, 55, 597, + 598, 55, 609, 55, 605, 55, 608, 55, 55, 55, + 55, 607, 613, 55, 612, 614, 55, 55, 616, 55, + 55, 55, 55, 610, 611, 55, 622, 617, 618, 619, + 55, 621, 623, 55, 624, 615, 625, 55, 55, 55, + 620, 55, 55, 55, 627, 55, 55, 628, 55, 55, + + 630, 632, 55, 633, 631, 634, 55, 626, 629, 635, + 55, 636, 55, 637, 55, 638, 55, 55, 55, 55, + 55, 641, 640, 55, 55, 55, 55, 55, 55, 645, + 55, 639, 55, 650, 642, 643, 644, 55, 55, 55, + 648, 654, 55, 655, 55, 55, 647, 649, 55, 55, + 55, 646, 55, 55, 651, 652, 660, 653, 656, 661, + 55, 662, 55, 657, 55, 55, 55, 55, 658, 659, + 663, 665, 666, 664, 55, 55, 55, 55, 55, 667, + 668, 669, 671, 55, 55, 55, 55, 55, 670, 672, + 678, 55, 673, 674, 675, 55, 55, 55, 682, 55, + + 55, 681, 55, 680, 676, 677, 679, 55, 684, 55, + 683, 685, 55, 686, 687, 688, 55, 55, 55, 55, + 690, 689, 55, 55, 55, 55, 691, 55, 693, 55, + 55, 55, 697, 55, 695, 699, 55, 692, 55, 701, + 55, 55, 702, 55, 55, 703, 696, 698, 55, 694, + 55, 55, 55, 711, 55, 700, 708, 705, 55, 704, + 55, 55, 707, 706, 55, 712, 713, 55, 55, 714, + 710, 716, 55, 717, 55, 709, 55, 720, 55, 55, + 715, 719, 718, 721, 55, 55, 723, 55, 55, 724, + 722, 725, 55, 55, 55, 55, 729, 55, 726, 728, + + 55, 55, 732, 55, 730, 733, 55, 734, 55, 55, + 735, 55, 55, 727, 55, 55, 55, 55, 731, 741, + 55, 737, 55, 55, 55, 55, 55, 55, 738, 739, + 736, 55, 55, 740, 36, 36, 36, 36, 36, 36, + 41, 41, 41, 41, 41, 41, 45, 45, 45, 45, + 45, 45, 50, 50, 50, 50, 50, 50, 58, 58, + 55, 58, 58, 58, 89, 89, 55, 55, 55, 89, + 91, 91, 55, 55, 91, 96, 96, 55, 55, 55, + 96, 59, 59, 55, 59, 59, 59, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - - 97, 95, 94, 92, 90, 55, 97, 95, 94, 92, - 90, 55, 731, 11, 731, 731, 731, 731, 731, 731, - 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, - 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, - 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, - 731, 731 + 55, 55, 97, 95, 94, 92, 90, 55, 97, 95, + 94, 92, 90, 55, 742, 11, 742, 742, 742, 742, + 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, + 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, + 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, + 742, 742, 742, 742 } ; -static yyconst flex_int16_t yy_chk[1553] = +static yyconst flex_int16_t yy_chk[1575] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -856,13 +861,13 @@ static yyconst flex_int16_t yy_chk[1553] = 13, 4, 6, 6, 13, 5, 6, 9, 9, 9, 40, 40, 6, 7, 7, 7, 7, 9, 7, 10, 10, 10, 23, 23, 7, 8, 8, 8, 8, 10, - 8, 23, 16, 740, 16, 16, 8, 16, 21, 18, + 8, 23, 16, 751, 16, 16, 8, 16, 21, 18, 22, 18, 18, 16, 18, 20, 20, 21, 26, 27, 29, 24, 21, 20, 22, 24, 25, 28, 28, 30, 34, 25, 26, 27, 24, 31, 32, 27, 30, 44, 29, 32, 44, 30, 33, 33, 81, 28, 34, 31, - 53, 53, 31, 35, 35, 32, 736, 49, 35, 49, + 53, 53, 31, 35, 35, 32, 747, 49, 35, 49, 49, 33, 49, 55, 81, 55, 55, 56, 55, 63, 58, 56, 58, 58, 61, 58, 62, 61, 64, 62, 65, 58, 66, 67, 68, 65, 63, 69, 68, 71, @@ -870,10 +875,10 @@ static yyconst flex_int16_t yy_chk[1553] = 67, 73, 75, 74, 76, 77, 79, 78, 80, 70, 74, 78, 82, 71, 75, 83, 76, 84, 85, 87, - 86, 730, 80, 79, 77, 86, 88, 90, 90, 82, + 86, 741, 80, 79, 77, 86, 88, 90, 90, 82, 87, 97, 97, 92, 84, 83, 92, 94, 85, 94, 94, 98, 94, 88, 99, 100, 98, 102, 101, 103, - 104, 106, 99, 101, 104, 723, 102, 105, 107, 100, + 104, 106, 99, 101, 104, 734, 102, 105, 107, 100, 102, 108, 105, 109, 106, 110, 102, 102, 109, 107, 110, 103, 107, 111, 111, 112, 113, 114, 108, 115, 116, 112, 114, 117, 115, 116, 118, 119, 120, 121, @@ -887,7 +892,7 @@ static yyconst flex_int16_t yy_chk[1553] = 149, 147, 144, 141, 146, 152, 148, 150, 150, 153, 154, 154, 156, 160, 151, 155, 157, 151, 153, 152, 155, 157, 158, 159, 161, 162, 164, 158, 159, 166, - 165, 156, 160, 168, 169, 171, 167, 722, 162, 165, + 165, 156, 160, 168, 169, 171, 167, 733, 162, 165, 164, 167, 161, 163, 172, 163, 163, 166, 170, 170, 173, 170, 168, 169, 171, 174, 163, 163, 163, 172, 175, 176, 177, 178, 180, 173, 179, 178, 181, 180, @@ -907,7 +912,7 @@ static yyconst flex_int16_t yy_chk[1553] = 232, 231, 235, 233, 236, 238, 241, 237, 238, 236, 239, 239, 242, 234, 228, 235, 237, 240, 243, 246, 241, 240, 247, 243, 244, 244, 242, 245, 248, 252, - 254, 245, 721, 249, 247, 248, 250, 246, 249, 251, + 254, 245, 732, 249, 247, 248, 250, 246, 249, 251, 253, 250, 255, 254, 251, 255, 252, 256, 256, 253, 258, 264, 261, 265, 266, 267, 264, 265, 268, 266, 265, 269, 269, 270, 265, 271, 271, 258, 261, 272, @@ -919,7 +924,7 @@ static yyconst flex_int16_t yy_chk[1553] = 294, 296, 286, 295, 292, 294, 296, 297, 291, 293, 298, 298, 290, 299, 295, 300, 299, 301, 302, 303, 303, 304, 305, 306, 307, 308, 308, 297, 309, 301, - 313, 310, 300, 308, 314, 304, 718, 302, 311, 311, + 313, 310, 300, 308, 314, 304, 729, 302, 311, 311, 312, 309, 310, 313, 307, 305, 317, 306, 312, 319, 308, 317, 314, 315, 315, 318, 320, 321, 318, 322, 323, 324, 321, 326, 322, 327, 328, 319, 320, 329, @@ -930,95 +935,97 @@ static yyconst flex_int16_t yy_chk[1553] = 342, 342, 336, 346, 347, 348, 343, 341, 350, 344, 351, 352, 352, 347, 353, 351, 355, 356, 354, 353, 346, 350, 354, 357, 358, 359, 360, 361, 362, 348, - 355, 356, 364, 366, 367, 365, 523, 362, 523, 367, - 360, 357, 359, 365, 358, 364, 361, 368, 368, 369, - 370, 370, 366, 371, 369, 372, 373, 374, 371, 375, - 383, 376, 374, 377, 375, 376, 378, 379, 372, 380, - 380, 415, 377, 373, 714, 379, 377, 415, 377, 383, - - 377, 381, 381, 384, 378, 382, 382, 385, 386, 388, - 391, 384, 385, 389, 388, 386, 390, 392, 389, 391, - 394, 390, 393, 393, 395, 397, 398, 399, 400, 401, - 398, 402, 404, 403, 406, 392, 402, 405, 407, 394, - 403, 400, 397, 395, 412, 399, 405, 401, 406, 404, - 408, 409, 410, 413, 413, 408, 409, 410, 407, 414, - 414, 416, 412, 417, 418, 419, 416, 420, 421, 431, - 422, 423, 423, 424, 424, 429, 433, 430, 429, 435, - 420, 417, 418, 419, 422, 425, 432, 432, 421, 435, - 425, 430, 437, 431, 436, 433, 434, 434, 436, 439, - - 440, 441, 443, 442, 444, 448, 445, 446, 446, 444, - 437, 445, 447, 449, 450, 453, 439, 447, 451, 440, - 442, 443, 454, 452, 448, 441, 455, 450, 452, 458, - 451, 459, 449, 460, 453, 455, 463, 455, 458, 464, - 461, 454, 460, 465, 460, 461, 462, 462, 466, 459, - 469, 464, 468, 470, 471, 463, 473, 468, 469, 474, - 465, 466, 475, 474, 476, 477, 478, 475, 479, 476, - 470, 480, 471, 488, 477, 473, 480, 481, 481, 479, - 478, 482, 482, 483, 483, 484, 486, 487, 484, 489, - 489, 486, 487, 490, 491, 492, 493, 488, 490, 494, - - 495, 495, 496, 498, 497, 491, 500, 491, 504, 496, - 499, 499, 491, 497, 492, 493, 506, 502, 503, 505, - 507, 500, 502, 503, 494, 507, 505, 504, 498, 510, - 512, 508, 509, 712, 506, 508, 508, 509, 511, 513, - 510, 514, 511, 528, 513, 515, 516, 516, 517, 517, - 521, 522, 524, 524, 512, 521, 515, 526, 529, 517, - 527, 527, 514, 528, 530, 532, 531, 522, 535, 529, - 532, 533, 537, 533, 537, 530, 526, 531, 534, 534, - 536, 538, 539, 540, 542, 536, 538, 541, 541, 542, - 544, 545, 543, 535, 547, 548, 548, 545, 549, 539, - - 547, 543, 540, 543, 550, 544, 551, 549, 552, 556, - 551, 553, 553, 552, 555, 557, 558, 559, 555, 562, - 563, 561, 550, 556, 561, 564, 564, 565, 565, 566, - 566, 562, 563, 557, 567, 567, 558, 559, 568, 570, - 571, 571, 572, 574, 570, 573, 578, 575, 581, 574, - 575, 577, 577, 579, 579, 580, 568, 581, 582, 584, - 572, 585, 573, 586, 586, 591, 594, 582, 587, 580, - 585, 578, 589, 587, 590, 592, 589, 590, 584, 593, - 592, 594, 595, 596, 591, 593, 597, 595, 597, 601, - 601, 596, 602, 602, 604, 604, 605, 606, 606, 607, - - 609, 605, 610, 614, 610, 609, 611, 612, 613, 615, - 616, 617, 614, 618, 607, 619, 619, 611, 612, 613, - 620, 621, 622, 617, 623, 623, 624, 625, 626, 616, - 618, 624, 630, 631, 615, 634, 631, 620, 621, 635, - 622, 625, 632, 632, 633, 633, 626, 636, 635, 637, - 638, 630, 636, 634, 637, 639, 640, 641, 642, 643, - 639, 640, 648, 642, 638, 644, 645, 646, 649, 651, - 643, 641, 650, 650, 644, 645, 646, 651, 652, 659, - 648, 655, 655, 652, 656, 663, 649, 656, 657, 657, - 658, 658, 659, 660, 661, 661, 662, 664, 660, 665, - - 662, 666, 667, 663, 668, 664, 666, 669, 671, 672, - 672, 674, 678, 668, 665, 677, 677, 680, 681, 682, - 686, 678, 680, 683, 684, 671, 669, 667, 687, 685, - 690, 690, 688, 682, 685, 674, 681, 688, 683, 691, - 692, 710, 684, 693, 693, 686, 687, 694, 694, 695, - 691, 696, 697, 697, 698, 698, 696, 699, 707, 692, - 700, 700, 699, 701, 701, 703, 703, 695, 704, 715, - 708, 711, 711, 704, 708, 713, 724, 707, 726, 713, - 716, 716, 717, 717, 719, 719, 715, 720, 720, 725, - 727, 728, 726, 729, 729, 724, 709, 706, 725, 705, - - 702, 689, 679, 727, 676, 675, 673, 670, 654, 728, - 732, 732, 732, 732, 732, 732, 733, 733, 733, 733, - 733, 733, 734, 734, 734, 734, 734, 734, 735, 735, - 735, 735, 735, 735, 737, 737, 653, 737, 737, 737, - 738, 738, 647, 629, 628, 738, 739, 739, 627, 608, - 739, 741, 741, 603, 600, 599, 741, 742, 742, 598, - 742, 742, 742, 588, 583, 576, 569, 560, 554, 546, - 525, 520, 519, 518, 501, 485, 472, 467, 457, 456, - 438, 428, 427, 426, 411, 396, 387, 363, 349, 332, - 325, 316, 288, 263, 262, 260, 259, 257, 193, 188, - - 96, 95, 93, 91, 89, 54, 50, 46, 45, 41, - 36, 12, 11, 731, 731, 731, 731, 731, 731, 731, - 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, - 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, - 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, - 731, 731 + 355, 356, 364, 366, 367, 365, 526, 362, 526, 367, + 360, 357, 359, 365, 358, 364, 361, 370, 370, 368, + 369, 371, 366, 368, 368, 369, 371, 372, 373, 374, + 375, 378, 376, 377, 374, 375, 376, 380, 380, 379, + 372, 383, 377, 381, 381, 373, 377, 379, 377, 378, + + 377, 382, 382, 384, 385, 386, 392, 391, 388, 385, + 383, 384, 386, 388, 389, 390, 391, 393, 393, 389, + 390, 394, 395, 398, 392, 397, 399, 398, 401, 402, + 400, 403, 404, 406, 402, 407, 405, 537, 403, 537, + 394, 395, 397, 400, 399, 405, 401, 406, 408, 404, + 413, 409, 410, 408, 418, 407, 409, 410, 411, 411, + 414, 414, 415, 415, 416, 419, 417, 420, 413, 421, + 416, 417, 418, 422, 423, 424, 424, 425, 425, 426, + 431, 432, 421, 419, 426, 420, 430, 434, 423, 430, + 433, 433, 436, 422, 431, 435, 435, 437, 438, 441, + + 440, 437, 436, 442, 443, 432, 434, 444, 445, 446, + 447, 447, 449, 445, 446, 448, 438, 440, 441, 450, + 448, 443, 451, 453, 452, 454, 444, 442, 453, 455, + 456, 449, 457, 460, 461, 451, 452, 465, 450, 725, + 462, 457, 460, 457, 454, 464, 464, 466, 455, 462, + 456, 462, 461, 463, 467, 468, 465, 470, 463, 466, + 472, 471, 470, 473, 475, 479, 476, 477, 468, 471, + 476, 467, 477, 478, 479, 480, 481, 472, 478, 482, + 490, 473, 723, 475, 482, 483, 483, 481, 497, 480, + 484, 484, 485, 485, 486, 488, 489, 486, 491, 491, + + 488, 489, 492, 493, 490, 494, 495, 492, 496, 498, + 498, 499, 501, 497, 493, 503, 493, 500, 499, 502, + 502, 493, 507, 505, 494, 495, 500, 496, 505, 506, + 503, 508, 509, 515, 506, 510, 721, 501, 508, 511, + 510, 507, 512, 511, 511, 513, 516, 512, 514, 517, + 509, 516, 514, 518, 519, 519, 513, 515, 520, 520, + 524, 525, 527, 527, 518, 524, 529, 530, 530, 520, + 517, 531, 532, 533, 535, 534, 536, 525, 538, 538, + 539, 536, 540, 532, 533, 529, 534, 540, 535, 542, + 541, 531, 541, 543, 542, 544, 545, 545, 546, 720, + + 547, 548, 549, 546, 553, 539, 551, 554, 549, 547, + 543, 547, 551, 553, 544, 555, 548, 552, 552, 555, + 559, 556, 557, 557, 559, 554, 556, 560, 561, 562, + 563, 565, 566, 567, 565, 568, 568, 569, 569, 570, + 570, 560, 571, 573, 566, 567, 561, 572, 572, 562, + 563, 575, 576, 576, 571, 577, 575, 578, 579, 580, + 583, 573, 580, 585, 579, 582, 582, 584, 584, 586, + 587, 589, 590, 577, 578, 591, 591, 585, 586, 587, + 594, 590, 592, 595, 594, 583, 595, 592, 596, 597, + 589, 598, 717, 599, 597, 600, 601, 598, 716, 602, + + 600, 602, 605, 605, 601, 607, 607, 596, 599, 608, + 608, 610, 610, 611, 612, 612, 613, 615, 611, 616, + 620, 616, 615, 617, 618, 619, 621, 622, 623, 620, + 624, 613, 625, 625, 617, 618, 619, 626, 627, 628, + 623, 629, 629, 630, 631, 632, 622, 624, 630, 633, + 637, 621, 641, 638, 626, 627, 638, 628, 631, 639, + 639, 640, 640, 632, 642, 645, 643, 644, 633, 637, + 641, 643, 644, 642, 648, 646, 647, 649, 650, 645, + 646, 647, 649, 651, 652, 653, 655, 656, 648, 650, + 657, 657, 651, 652, 653, 659, 660, 658, 663, 663, + + 667, 660, 671, 659, 655, 656, 658, 664, 665, 665, + 664, 666, 666, 667, 668, 669, 669, 670, 672, 668, + 671, 670, 673, 674, 675, 676, 672, 677, 674, 679, + 680, 683, 679, 687, 676, 681, 681, 673, 686, 686, + 689, 690, 687, 691, 693, 689, 677, 680, 692, 675, + 695, 694, 696, 697, 697, 683, 694, 691, 701, 690, + 698, 702, 693, 692, 705, 698, 700, 700, 713, 701, + 696, 703, 703, 704, 704, 695, 706, 707, 707, 711, + 702, 706, 705, 708, 708, 709, 710, 710, 712, 712, + 709, 714, 714, 715, 718, 719, 722, 722, 715, 719, + + 724, 726, 727, 727, 724, 728, 728, 730, 730, 731, + 731, 735, 736, 718, 737, 739, 738, 699, 726, 740, + 740, 736, 688, 685, 684, 682, 678, 662, 737, 738, + 735, 661, 654, 739, 743, 743, 743, 743, 743, 743, + 744, 744, 744, 744, 744, 744, 745, 745, 745, 745, + 745, 745, 746, 746, 746, 746, 746, 746, 748, 748, + 636, 748, 748, 748, 749, 749, 635, 634, 614, 749, + 750, 750, 609, 606, 750, 752, 752, 604, 603, 593, + 752, 753, 753, 588, 753, 753, 753, 581, 574, 564, + 558, 550, 528, 523, 522, 521, 504, 487, 474, 469, + + 459, 458, 439, 429, 428, 427, 412, 396, 387, 363, + 349, 332, 325, 316, 288, 263, 262, 260, 259, 257, + 193, 188, 96, 95, 93, 91, 89, 54, 50, 46, + 45, 41, 36, 12, 11, 742, 742, 742, 742, 742, + 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, + 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, + 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, + 742, 742, 742, 742 } ; static yy_state_type yy_last_accepting_state; @@ -1124,7 +1131,7 @@ static void config_end_include(void) #endif -#line 1127 "" +#line 1134 "" #define INITIAL 0 #define quotedstring 1 @@ -1281,7 +1288,7 @@ YY_DECL #line 99 "util/configlexer.lex" -#line 1284 "" +#line 1291 "" if ( !(yy_init) ) { @@ -1340,13 +1347,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 >= 732 ) + if ( yy_current_state >= 743 ) 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] != 1514 ); + while ( yy_base[yy_current_state] != 1536 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -1453,291 +1460,296 @@ YY_RULE_SETUP case 17: YY_RULE_SETUP #line 116 "util/configlexer.lex" -{ YDOUT; return VAR_CHROOT;} +{ YDOUT; return VAR_INTERFACE_AUTOMATIC;} YY_BREAK case 18: YY_RULE_SETUP #line 117 "util/configlexer.lex" -{ YDOUT; return VAR_USERNAME;} +{ YDOUT; return VAR_CHROOT;} YY_BREAK case 19: YY_RULE_SETUP #line 118 "util/configlexer.lex" -{ YDOUT; return VAR_DIRECTORY;} +{ YDOUT; return VAR_USERNAME;} YY_BREAK case 20: YY_RULE_SETUP #line 119 "util/configlexer.lex" -{ YDOUT; return VAR_LOGFILE;} +{ YDOUT; return VAR_DIRECTORY;} YY_BREAK case 21: YY_RULE_SETUP #line 120 "util/configlexer.lex" -{ YDOUT; return VAR_PIDFILE;} +{ YDOUT; return VAR_LOGFILE;} YY_BREAK case 22: YY_RULE_SETUP #line 121 "util/configlexer.lex" -{ YDOUT; return VAR_ROOT_HINTS;} +{ YDOUT; return VAR_PIDFILE;} YY_BREAK case 23: YY_RULE_SETUP #line 122 "util/configlexer.lex" -{ YDOUT; return VAR_MSG_BUFFER_SIZE;} +{ YDOUT; return VAR_ROOT_HINTS;} YY_BREAK case 24: YY_RULE_SETUP #line 123 "util/configlexer.lex" -{ YDOUT; return VAR_MSG_CACHE_SIZE;} +{ YDOUT; return VAR_MSG_BUFFER_SIZE;} YY_BREAK case 25: YY_RULE_SETUP #line 124 "util/configlexer.lex" -{ YDOUT; return VAR_MSG_CACHE_SLABS;} +{ YDOUT; return VAR_MSG_CACHE_SIZE;} YY_BREAK case 26: YY_RULE_SETUP #line 125 "util/configlexer.lex" -{ YDOUT; return VAR_RRSET_CACHE_SIZE;} +{ YDOUT; return VAR_MSG_CACHE_SLABS;} YY_BREAK case 27: YY_RULE_SETUP #line 126 "util/configlexer.lex" -{ YDOUT; return VAR_RRSET_CACHE_SLABS;} +{ YDOUT; return VAR_RRSET_CACHE_SIZE;} YY_BREAK case 28: YY_RULE_SETUP #line 127 "util/configlexer.lex" -{ YDOUT; return VAR_CACHE_MAX_TTL;} +{ YDOUT; return VAR_RRSET_CACHE_SLABS;} YY_BREAK case 29: YY_RULE_SETUP #line 128 "util/configlexer.lex" -{ YDOUT; return VAR_INFRA_HOST_TTL;} +{ YDOUT; return VAR_CACHE_MAX_TTL;} YY_BREAK case 30: YY_RULE_SETUP #line 129 "util/configlexer.lex" -{ YDOUT; return VAR_INFRA_LAME_TTL;} +{ YDOUT; return VAR_INFRA_HOST_TTL;} YY_BREAK case 31: YY_RULE_SETUP #line 130 "util/configlexer.lex" -{ YDOUT; return VAR_INFRA_CACHE_SLABS;} +{ YDOUT; return VAR_INFRA_LAME_TTL;} YY_BREAK case 32: YY_RULE_SETUP #line 131 "util/configlexer.lex" -{ YDOUT; return VAR_INFRA_CACHE_NUMHOSTS;} +{ YDOUT; return VAR_INFRA_CACHE_SLABS;} YY_BREAK case 33: YY_RULE_SETUP #line 132 "util/configlexer.lex" -{ YDOUT; return VAR_INFRA_CACHE_LAME_SIZE;} +{ YDOUT; return VAR_INFRA_CACHE_NUMHOSTS;} YY_BREAK case 34: YY_RULE_SETUP #line 133 "util/configlexer.lex" -{ YDOUT; return VAR_NUM_QUERIES_PER_THREAD;} +{ YDOUT; return VAR_INFRA_CACHE_LAME_SIZE;} YY_BREAK case 35: YY_RULE_SETUP #line 134 "util/configlexer.lex" -{ YDOUT; return VAR_TARGET_FETCH_POLICY;} +{ YDOUT; return VAR_NUM_QUERIES_PER_THREAD;} YY_BREAK case 36: YY_RULE_SETUP #line 135 "util/configlexer.lex" -{ YDOUT; return VAR_HARDEN_SHORT_BUFSIZE;} +{ YDOUT; return VAR_TARGET_FETCH_POLICY;} YY_BREAK case 37: YY_RULE_SETUP #line 136 "util/configlexer.lex" -{ YDOUT; return VAR_HARDEN_LARGE_QUERIES;} +{ YDOUT; return VAR_HARDEN_SHORT_BUFSIZE;} YY_BREAK case 38: YY_RULE_SETUP #line 137 "util/configlexer.lex" -{ YDOUT; return VAR_HARDEN_GLUE;} +{ YDOUT; return VAR_HARDEN_LARGE_QUERIES;} YY_BREAK case 39: YY_RULE_SETUP #line 138 "util/configlexer.lex" -{ YDOUT; return VAR_HARDEN_DNNSEC_STRIPPED;} +{ YDOUT; return VAR_HARDEN_GLUE;} YY_BREAK case 40: YY_RULE_SETUP #line 139 "util/configlexer.lex" -{ YDOUT; return VAR_STUB_ZONE;} +{ YDOUT; return VAR_HARDEN_DNNSEC_STRIPPED;} YY_BREAK case 41: YY_RULE_SETUP #line 140 "util/configlexer.lex" -{ YDOUT; return VAR_NAME;} +{ YDOUT; return VAR_STUB_ZONE;} YY_BREAK case 42: YY_RULE_SETUP #line 141 "util/configlexer.lex" -{ YDOUT; return VAR_STUB_ADDR;} +{ YDOUT; return VAR_NAME;} YY_BREAK case 43: YY_RULE_SETUP #line 142 "util/configlexer.lex" -{ YDOUT; return VAR_STUB_HOST;} +{ YDOUT; return VAR_STUB_ADDR;} YY_BREAK case 44: YY_RULE_SETUP #line 143 "util/configlexer.lex" -{ YDOUT; return VAR_FORWARD_ZONE;} +{ YDOUT; return VAR_STUB_HOST;} YY_BREAK case 45: YY_RULE_SETUP #line 144 "util/configlexer.lex" -{ YDOUT; return VAR_FORWARD_ADDR;} +{ YDOUT; return VAR_FORWARD_ZONE;} YY_BREAK case 46: YY_RULE_SETUP #line 145 "util/configlexer.lex" -{ YDOUT; return VAR_FORWARD_HOST;} +{ YDOUT; return VAR_FORWARD_ADDR;} YY_BREAK case 47: YY_RULE_SETUP #line 146 "util/configlexer.lex" -{ YDOUT; return VAR_DO_NOT_QUERY_ADDRESS;} +{ YDOUT; return VAR_FORWARD_HOST;} YY_BREAK case 48: YY_RULE_SETUP #line 147 "util/configlexer.lex" -{ YDOUT; return VAR_DO_NOT_QUERY_LOCALHOST;} +{ YDOUT; return VAR_DO_NOT_QUERY_ADDRESS;} YY_BREAK case 49: YY_RULE_SETUP #line 148 "util/configlexer.lex" -{ YDOUT; return VAR_ACCESS_CONTROL;} +{ YDOUT; return VAR_DO_NOT_QUERY_LOCALHOST;} YY_BREAK case 50: YY_RULE_SETUP #line 149 "util/configlexer.lex" -{ YDOUT; return VAR_HIDE_IDENTITY;} +{ YDOUT; return VAR_ACCESS_CONTROL;} YY_BREAK case 51: YY_RULE_SETUP #line 150 "util/configlexer.lex" -{ YDOUT; return VAR_HIDE_VERSION;} +{ YDOUT; return VAR_HIDE_IDENTITY;} YY_BREAK case 52: YY_RULE_SETUP #line 151 "util/configlexer.lex" -{ YDOUT; return VAR_IDENTITY;} +{ YDOUT; return VAR_HIDE_VERSION;} YY_BREAK case 53: YY_RULE_SETUP #line 152 "util/configlexer.lex" -{ YDOUT; return VAR_VERSION;} +{ YDOUT; return VAR_IDENTITY;} YY_BREAK case 54: YY_RULE_SETUP #line 153 "util/configlexer.lex" -{ YDOUT; return VAR_MODULE_CONF;} +{ YDOUT; return VAR_VERSION;} YY_BREAK case 55: YY_RULE_SETUP #line 154 "util/configlexer.lex" -{ YDOUT; return VAR_TRUST_ANCHOR_FILE;} +{ YDOUT; return VAR_MODULE_CONF;} YY_BREAK case 56: YY_RULE_SETUP #line 155 "util/configlexer.lex" -{ YDOUT; return VAR_TRUSTED_KEYS_FILE;} +{ YDOUT; return VAR_TRUST_ANCHOR_FILE;} YY_BREAK case 57: YY_RULE_SETUP #line 156 "util/configlexer.lex" -{ YDOUT; return VAR_TRUST_ANCHOR;} +{ YDOUT; return VAR_TRUSTED_KEYS_FILE;} YY_BREAK case 58: YY_RULE_SETUP #line 157 "util/configlexer.lex" -{ YDOUT; return VAR_VAL_OVERRIDE_DATE;} +{ YDOUT; return VAR_TRUST_ANCHOR;} YY_BREAK case 59: YY_RULE_SETUP #line 158 "util/configlexer.lex" -{ YDOUT; return VAR_BOGUS_TTL;} +{ YDOUT; return VAR_VAL_OVERRIDE_DATE;} YY_BREAK case 60: YY_RULE_SETUP #line 159 "util/configlexer.lex" -{ YDOUT; return VAR_VAL_CLEAN_ADDITIONAL;} +{ YDOUT; return VAR_BOGUS_TTL;} YY_BREAK case 61: YY_RULE_SETUP #line 160 "util/configlexer.lex" -{ YDOUT; return VAR_VAL_PERMISSIVE_MODE;} +{ YDOUT; return VAR_VAL_CLEAN_ADDITIONAL;} YY_BREAK case 62: YY_RULE_SETUP #line 161 "util/configlexer.lex" -{ YDOUT; return VAR_KEY_CACHE_SIZE;} +{ YDOUT; return VAR_VAL_PERMISSIVE_MODE;} YY_BREAK case 63: YY_RULE_SETUP #line 162 "util/configlexer.lex" -{ YDOUT; return VAR_KEY_CACHE_SLABS;} +{ YDOUT; return VAR_KEY_CACHE_SIZE;} YY_BREAK case 64: YY_RULE_SETUP #line 163 "util/configlexer.lex" -{ YDOUT; return VAR_VAL_NSEC3_KEYSIZE_ITERATIONS;} +{ YDOUT; return VAR_KEY_CACHE_SLABS;} YY_BREAK case 65: YY_RULE_SETUP #line 164 "util/configlexer.lex" -{ YDOUT; return VAR_USE_SYSLOG;} +{ YDOUT; return VAR_VAL_NSEC3_KEYSIZE_ITERATIONS;} YY_BREAK case 66: YY_RULE_SETUP #line 165 "util/configlexer.lex" -{ YDOUT; return VAR_LOCAL_ZONE;} +{ YDOUT; return VAR_USE_SYSLOG;} YY_BREAK case 67: YY_RULE_SETUP #line 166 "util/configlexer.lex" -{ YDOUT; return VAR_LOCAL_DATA;} +{ YDOUT; return VAR_LOCAL_ZONE;} YY_BREAK case 68: -/* rule 68 can match eol */ YY_RULE_SETUP #line 167 "util/configlexer.lex" +{ YDOUT; return VAR_LOCAL_DATA;} + YY_BREAK +case 69: +/* rule 69 can match eol */ +YY_RULE_SETUP +#line 168 "util/configlexer.lex" { LEXOUT(("NL\n")); cfg_parser->line++;} YY_BREAK /* Quoted strings. Strip leading and ending quotes */ -case 69: +case 70: YY_RULE_SETUP -#line 170 "util/configlexer.lex" +#line 171 "util/configlexer.lex" { BEGIN(quotedstring); LEXOUT(("QS ")); } YY_BREAK case YY_STATE_EOF(quotedstring): -#line 171 "util/configlexer.lex" +#line 172 "util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(INITIAL); } YY_BREAK -case 70: -YY_RULE_SETUP -#line 175 "util/configlexer.lex" -{ LEXOUT(("STR(%s) ", yytext)); yymore(); } - YY_BREAK case 71: -/* rule 71 can match eol */ YY_RULE_SETUP #line 176 "util/configlexer.lex" -{ cfg_parser->line++; yymore(); } +{ LEXOUT(("STR(%s) ", yytext)); yymore(); } YY_BREAK case 72: +/* rule 72 can match eol */ YY_RULE_SETUP #line 177 "util/configlexer.lex" +{ cfg_parser->line++; yymore(); } + YY_BREAK +case 73: +YY_RULE_SETUP +#line 178 "util/configlexer.lex" { LEXOUT(("QE ")); BEGIN(INITIAL); @@ -1749,32 +1761,32 @@ YY_RULE_SETUP } YY_BREAK /* Single Quoted strings. Strip leading and ending quotes */ -case 73: +case 74: YY_RULE_SETUP -#line 188 "util/configlexer.lex" +#line 189 "util/configlexer.lex" { BEGIN(singlequotedstr); LEXOUT(("SQS ")); } YY_BREAK case YY_STATE_EOF(singlequotedstr): -#line 189 "util/configlexer.lex" +#line 190 "util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(INITIAL); } YY_BREAK -case 74: -YY_RULE_SETUP -#line 193 "util/configlexer.lex" -{ LEXOUT(("STR(%s) ", yytext)); yymore(); } - YY_BREAK case 75: -/* rule 75 can match eol */ YY_RULE_SETUP #line 194 "util/configlexer.lex" -{ cfg_parser->line++; yymore(); } +{ LEXOUT(("STR(%s) ", yytext)); yymore(); } YY_BREAK case 76: +/* rule 76 can match eol */ YY_RULE_SETUP #line 195 "util/configlexer.lex" +{ cfg_parser->line++; yymore(); } + YY_BREAK +case 77: +YY_RULE_SETUP +#line 196 "util/configlexer.lex" { LEXOUT(("SQE ")); BEGIN(INITIAL); @@ -1786,37 +1798,37 @@ YY_RULE_SETUP } YY_BREAK /* include: directive */ -case 77: +case 78: YY_RULE_SETUP -#line 206 "util/configlexer.lex" +#line 207 "util/configlexer.lex" { LEXOUT(("v(%s) ", yytext)); BEGIN(include); } YY_BREAK case YY_STATE_EOF(include): -#line 207 "util/configlexer.lex" +#line 208 "util/configlexer.lex" { yyerror("EOF inside include directive"); BEGIN(INITIAL); } YY_BREAK -case 78: -YY_RULE_SETUP -#line 211 "util/configlexer.lex" -{ LEXOUT(("ISP ")); /* ignore */ } - YY_BREAK case 79: -/* rule 79 can match eol */ YY_RULE_SETUP #line 212 "util/configlexer.lex" -{ LEXOUT(("NL\n")); cfg_parser->line++;} +{ LEXOUT(("ISP ")); /* ignore */ } YY_BREAK case 80: +/* rule 80 can match eol */ YY_RULE_SETUP #line 213 "util/configlexer.lex" -{ LEXOUT(("IQS ")); BEGIN(include_quoted); } +{ LEXOUT(("NL\n")); cfg_parser->line++;} YY_BREAK case 81: YY_RULE_SETUP #line 214 "util/configlexer.lex" +{ LEXOUT(("IQS ")); BEGIN(include_quoted); } + YY_BREAK +case 82: +YY_RULE_SETUP +#line 215 "util/configlexer.lex" { LEXOUT(("Iunquotedstr(%s) ", yytext)); config_start_include(yytext); @@ -1824,26 +1836,26 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(include_quoted): -#line 219 "util/configlexer.lex" +#line 220 "util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(INITIAL); } YY_BREAK -case 82: -YY_RULE_SETUP -#line 223 "util/configlexer.lex" -{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); } - YY_BREAK case 83: -/* rule 83 can match eol */ YY_RULE_SETUP #line 224 "util/configlexer.lex" -{ cfg_parser->line++; yymore(); } +{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); } YY_BREAK case 84: +/* rule 84 can match eol */ YY_RULE_SETUP #line 225 "util/configlexer.lex" +{ cfg_parser->line++; yymore(); } + YY_BREAK +case 85: +YY_RULE_SETUP +#line 226 "util/configlexer.lex" { LEXOUT(("IQE ")); yytext[yyleng - 1] = '\0'; @@ -1852,7 +1864,7 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(INITIAL): -#line 231 "util/configlexer.lex" +#line 232 "util/configlexer.lex" { yy_set_bol(1); /* Set beginning of line, so "^" rules match. */ if (config_include_stack_ptr == 0) { @@ -1863,18 +1875,18 @@ case YY_STATE_EOF(INITIAL): } } YY_BREAK -case 85: +case 86: YY_RULE_SETUP -#line 241 "util/configlexer.lex" +#line 242 "util/configlexer.lex" { LEXOUT(("unquotedstr(%s) ", yytext)); yylval.str = strdup(yytext); return STRING; } YY_BREAK -case 86: +case 87: YY_RULE_SETUP -#line 244 "util/configlexer.lex" +#line 245 "util/configlexer.lex" ECHO; YY_BREAK -#line 1877 "" +#line 1889 "" case YY_END_OF_BUFFER: { @@ -2156,7 +2168,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 >= 732 ) + if ( yy_current_state >= 743 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -2184,11 +2196,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 >= 732 ) + if ( yy_current_state >= 743 ) 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 == 731); + yy_is_jam = (yy_current_state == 742); return yy_is_jam ? 0 : yy_current_state; } @@ -2821,7 +2833,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 244 "util/configlexer.lex" +#line 245 "util/configlexer.lex" diff --git a/util/configlexer.lex b/util/configlexer.lex index 4b8ae0909..3c3241d98 100644 --- a/util/configlexer.lex +++ b/util/configlexer.lex @@ -113,6 +113,7 @@ do-udp{COLON} { YDOUT; return VAR_DO_UDP;} do-tcp{COLON} { YDOUT; return VAR_DO_TCP;} interface{COLON} { YDOUT; return VAR_INTERFACE;} outgoing-interface{COLON} { YDOUT; return VAR_OUTGOING_INTERFACE;} +interface-automatic{COLON} { YDOUT; return VAR_INTERFACE_AUTOMATIC;} chroot{COLON} { YDOUT; return VAR_CHROOT;} username{COLON} { YDOUT; return VAR_USERNAME;} directory{COLON} { YDOUT; return VAR_DIRECTORY;} diff --git a/util/configparser.c b/util/configparser.c index 49dafc293..9befd4dc2 100644 --- a/util/configparser.c +++ b/util/configparser.c @@ -138,7 +138,8 @@ VAR_HARDEN_DNNSEC_STRIPPED = 327, VAR_ACCESS_CONTROL = 328, VAR_LOCAL_ZONE = 329, - VAR_LOCAL_DATA = 330 + VAR_LOCAL_DATA = 330, + VAR_INTERFACE_AUTOMATIC = 331 }; #endif /* Tokens. */ @@ -215,6 +216,7 @@ #define VAR_ACCESS_CONTROL 328 #define VAR_LOCAL_ZONE 329 #define VAR_LOCAL_DATA 330 +#define VAR_INTERFACE_AUTOMATIC 331 @@ -273,7 +275,7 @@ typedef union YYSTYPE char* str; } /* Line 187 of yacc.c. */ -#line 277 "util/configparser.c" +#line 279 "util/configparser.c" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -286,7 +288,7 @@ typedef union YYSTYPE /* Line 216 of yacc.c. */ -#line 290 "util/configparser.c" +#line 292 "util/configparser.c" #ifdef short # undef short @@ -501,20 +503,20 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 131 +#define YYLAST 133 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 76 +#define YYNTOKENS 77 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 75 +#define YYNNTS 76 /* YYNRULES -- Number of rules. */ -#define YYNRULES 141 +#define YYNRULES 143 /* YYNRULES -- Number of states. */ -#define YYNSTATES 207 +#define YYNSTATES 210 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 330 +#define YYMAXUTOK 331 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -555,7 +557,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 + 75, 76 }; #if YYDEBUG @@ -569,56 +571,56 @@ static const yytype_uint16 yyprhs[] = 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 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, 141, - 142, 144, 146, 148, 150, 153, 154, 156, 158, 160, - 163, 166, 169, 172, 175, 178, 181, 184, 187, 190, - 193, 196, 199, 202, 205, 208, 211, 214, 217, 220, - 223, 226, 229, 232, 235, 238, 241, 244, 247, 250, - 253, 256, 259, 262, 265, 268, 271, 274, 277, 280, - 283, 286, 289, 292, 295, 299, 302, 305, 308, 311, - 314, 317, 320, 323, 326, 330, 333, 336, 339, 342, - 345, 348 + 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, + 143, 144, 146, 148, 150, 152, 155, 156, 158, 160, + 162, 165, 168, 171, 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, 304, 307, 310, + 313, 316, 319, 322, 325, 328, 331, 335, 338, 341, + 344, 347, 350, 353 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { - 77, 0, -1, -1, 77, 78, -1, 79, 80, -1, - 82, 83, -1, 85, 86, -1, 11, -1, 80, 81, - -1, -1, 88, -1, 89, -1, 90, -1, 93, -1, - 94, -1, 97, -1, 98, -1, 99, -1, 100, -1, - 91, -1, 102, -1, 103, -1, 104, -1, 105, -1, - 106, -1, 116, -1, 117, -1, 118, -1, 119, -1, - 120, -1, 95, -1, 121, -1, 122, -1, 125, -1, - 123, -1, 124, -1, 126, -1, 127, -1, 128, -1, - 131, -1, 111, -1, 112, -1, 113, -1, 114, -1, - 129, -1, 134, -1, 108, -1, 110, -1, 135, -1, - 137, -1, 138, -1, 139, -1, 96, -1, 115, -1, - 141, -1, 142, -1, 109, -1, 140, -1, 101, -1, - 92, -1, 107, -1, 132, -1, 136, -1, 130, -1, - 133, -1, 143, -1, 144, -1, 39, -1, 83, 84, - -1, -1, 145, -1, 146, -1, 147, -1, 45, -1, - 86, 87, -1, -1, 148, -1, 149, -1, 150, -1, - 13, 10, -1, 12, 10, -1, 14, 10, -1, 17, - 10, -1, 68, 10, -1, 15, 10, -1, 16, 10, - -1, 32, 10, -1, 61, 10, -1, 18, 10, -1, - 19, 10, -1, 20, 10, -1, 21, 10, -1, 67, - 10, -1, 22, 10, -1, 23, 10, -1, 24, 10, - -1, 25, 10, -1, 26, 10, -1, 69, 10, -1, - 55, 10, -1, 65, 10, -1, 56, 10, -1, 49, - 10, -1, 50, 10, -1, 51, 10, -1, 52, 10, - -1, 62, 10, -1, 27, 10, -1, 28, 10, -1, - 29, 10, -1, 30, 10, -1, 31, 10, -1, 33, - 10, -1, 34, 10, -1, 36, 10, -1, 37, 10, - -1, 35, 10, -1, 42, 10, -1, 43, 10, -1, - 44, 10, -1, 53, 10, -1, 72, 10, -1, 48, - 10, -1, 70, 10, -1, 73, 10, 10, -1, 54, - 10, -1, 57, 10, -1, 71, 10, -1, 58, 10, - -1, 59, 10, -1, 60, 10, -1, 66, 10, -1, - 63, 10, -1, 64, 10, -1, 74, 10, 10, -1, - 75, 10, -1, 38, 10, -1, 40, 10, -1, 41, - 10, -1, 38, 10, -1, 46, 10, -1, 47, 10, - -1 + 78, 0, -1, -1, 78, 79, -1, 80, 81, -1, + 83, 84, -1, 86, 87, -1, 11, -1, 81, 82, + -1, -1, 89, -1, 90, -1, 91, -1, 94, -1, + 95, -1, 99, -1, 100, -1, 101, -1, 102, -1, + 92, -1, 104, -1, 105, -1, 106, -1, 107, -1, + 108, -1, 118, -1, 119, -1, 120, -1, 121, -1, + 122, -1, 96, -1, 123, -1, 124, -1, 127, -1, + 125, -1, 126, -1, 128, -1, 129, -1, 130, -1, + 133, -1, 113, -1, 114, -1, 115, -1, 116, -1, + 131, -1, 136, -1, 110, -1, 112, -1, 137, -1, + 139, -1, 140, -1, 141, -1, 97, -1, 117, -1, + 143, -1, 144, -1, 111, -1, 142, -1, 103, -1, + 93, -1, 109, -1, 134, -1, 138, -1, 132, -1, + 135, -1, 145, -1, 146, -1, 98, -1, 39, -1, + 84, 85, -1, -1, 147, -1, 148, -1, 149, -1, + 45, -1, 87, 88, -1, -1, 150, -1, 151, -1, + 152, -1, 13, 10, -1, 12, 10, -1, 14, 10, + -1, 17, 10, -1, 68, 10, -1, 15, 10, -1, + 16, 10, -1, 32, 10, -1, 61, 10, -1, 76, + 10, -1, 18, 10, -1, 19, 10, -1, 20, 10, + -1, 21, 10, -1, 67, 10, -1, 22, 10, -1, + 23, 10, -1, 24, 10, -1, 25, 10, -1, 26, + 10, -1, 69, 10, -1, 55, 10, -1, 65, 10, + -1, 56, 10, -1, 49, 10, -1, 50, 10, -1, + 51, 10, -1, 52, 10, -1, 62, 10, -1, 27, + 10, -1, 28, 10, -1, 29, 10, -1, 30, 10, + -1, 31, 10, -1, 33, 10, -1, 34, 10, -1, + 36, 10, -1, 37, 10, -1, 35, 10, -1, 42, + 10, -1, 43, 10, -1, 44, 10, -1, 53, 10, + -1, 72, 10, -1, 48, 10, -1, 70, 10, -1, + 73, 10, 10, -1, 54, 10, -1, 57, 10, -1, + 71, 10, -1, 58, 10, -1, 59, 10, -1, 60, + 10, -1, 66, 10, -1, 63, 10, -1, 64, 10, + -1, 74, 10, 10, -1, 75, 10, -1, 38, 10, + -1, 40, 10, -1, 41, 10, -1, 38, 10, -1, + 46, 10, -1, 47, 10, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ @@ -630,15 +632,15 @@ static const yytype_uint16 yyrline[] = 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 119, 120, 120, 120, 121, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, - 126, 127, 127, 128, 128, 129, 129, 131, 143, 144, - 145, 145, 145, 147, 159, 160, 161, 161, 161, 163, - 172, 181, 190, 203, 218, 227, 236, 245, 254, 263, - 272, 281, 290, 304, 311, 318, 325, 333, 340, 347, - 355, 363, 370, 379, 388, 395, 402, 413, 421, 434, - 443, 451, 464, 473, 482, 491, 500, 513, 520, 530, - 540, 550, 560, 567, 577, 590, 597, 615, 624, 633, - 643, 653, 660, 668, 681, 700, 707, 714, 721, 728, - 735, 742 + 126, 127, 127, 128, 128, 129, 129, 129, 131, 143, + 144, 145, 145, 145, 147, 159, 160, 161, 161, 161, + 163, 172, 181, 190, 203, 218, 227, 236, 245, 254, + 263, 272, 281, 290, 299, 313, 320, 327, 334, 342, + 349, 356, 364, 372, 379, 388, 397, 404, 411, 422, + 430, 443, 452, 460, 473, 482, 491, 500, 509, 522, + 529, 539, 549, 559, 569, 576, 586, 599, 606, 624, + 633, 642, 652, 662, 669, 677, 690, 709, 716, 723, + 730, 737, 744, 751 }; #endif @@ -669,16 +671,16 @@ static const char *const yytname[] = "VAR_VAL_NSEC3_KEYSIZE_ITERATIONS", "VAR_USE_SYSLOG", "VAR_OUTGOING_INTERFACE", "VAR_ROOT_HINTS", "VAR_DO_NOT_QUERY_LOCALHOST", "VAR_CACHE_MAX_TTL", "VAR_HARDEN_DNNSEC_STRIPPED", "VAR_ACCESS_CONTROL", - "VAR_LOCAL_ZONE", "VAR_LOCAL_DATA", "$accept", "toplevelvars", - "toplevelvar", "serverstart", "contents_server", "content_server", - "stubstart", "contents_stub", "content_stub", "forwardstart", - "contents_forward", "content_forward", "server_num_threads", - "server_verbosity", "server_port", "server_interface", - "server_outgoing_interface", "server_outgoing_port", + "VAR_LOCAL_ZONE", "VAR_LOCAL_DATA", "VAR_INTERFACE_AUTOMATIC", "$accept", + "toplevelvars", "toplevelvar", "serverstart", "contents_server", + "content_server", "stubstart", "contents_stub", "content_stub", + "forwardstart", "contents_forward", "content_forward", + "server_num_threads", "server_verbosity", "server_port", + "server_interface", "server_outgoing_interface", "server_outgoing_port", "server_outgoing_range", "server_outgoing_num_tcp", - "server_incoming_num_tcp", "server_do_ip4", "server_do_ip6", - "server_do_udp", "server_do_tcp", "server_use_syslog", "server_chroot", - "server_username", "server_directory", "server_logfile", + "server_incoming_num_tcp", "server_interface_automatic", "server_do_ip4", + "server_do_ip6", "server_do_udp", "server_do_tcp", "server_use_syslog", + "server_chroot", "server_username", "server_directory", "server_logfile", "server_pidfile", "server_root_hints", "server_trust_anchor_file", "server_trusted_keys_file", "server_trust_anchor", "server_hide_identity", "server_hide_version", "server_identity", @@ -713,28 +715,28 @@ static const yytype_uint16 yytoknum[] = 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 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 + 325, 326, 327, 328, 329, 330, 331 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 76, 77, 77, 78, 78, 78, 79, 80, 80, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 82, 83, 83, - 84, 84, 84, 85, 86, 86, 87, 87, 87, 88, + 0, 77, 78, 78, 79, 79, 79, 80, 81, 81, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 83, 84, + 84, 85, 85, 85, 86, 87, 87, 88, 88, 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, 142, 143, 144, 145, 146, 147, 148, - 149, 150 + 149, 150, 151, 152 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -746,15 +748,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, 1, 1, 1, 1, 1, 2, 0, - 1, 1, 1, 1, 2, 0, 1, 1, 1, 2, + 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, 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, 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 @@ -762,40 +764,40 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 2, 0, 1, 7, 67, 73, 3, 9, 69, 75, + 2, 0, 1, 7, 68, 74, 3, 9, 70, 76, 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, - 8, 10, 11, 12, 19, 59, 13, 14, 30, 52, - 15, 16, 17, 18, 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, 39, 61, 64, 45, 48, 62, - 49, 50, 51, 57, 54, 55, 65, 66, 0, 0, - 0, 68, 70, 71, 72, 0, 0, 0, 74, 76, - 77, 78, 80, 79, 81, 84, 85, 82, 88, 89, - 90, 91, 93, 94, 95, 96, 97, 107, 108, 109, - 110, 111, 86, 112, 113, 116, 114, 115, 117, 118, - 119, 122, 102, 103, 104, 105, 120, 125, 99, 101, - 126, 128, 129, 130, 87, 106, 132, 133, 100, 131, - 92, 83, 98, 123, 127, 121, 0, 0, 135, 136, - 137, 138, 139, 140, 141, 124, 134 + 0, 8, 10, 11, 12, 19, 59, 13, 14, 30, + 52, 67, 15, 16, 17, 18, 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, 39, 61, 64, 45, + 48, 62, 49, 50, 51, 57, 54, 55, 65, 66, + 0, 0, 0, 69, 71, 72, 73, 0, 0, 0, + 75, 77, 78, 79, 81, 80, 82, 85, 86, 83, + 90, 91, 92, 93, 95, 96, 97, 98, 99, 109, + 110, 111, 112, 113, 87, 114, 115, 118, 116, 117, + 119, 120, 121, 124, 104, 105, 106, 107, 122, 127, + 101, 103, 128, 130, 131, 132, 88, 108, 134, 135, + 102, 133, 94, 84, 100, 125, 129, 123, 0, 0, + 137, 89, 138, 139, 140, 141, 142, 143, 126, 136 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 1, 6, 7, 10, 70, 8, 11, 131, 9, - 12, 138, 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, 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, 132, - 133, 134, 139, 140, 141 + -1, 1, 6, 7, 10, 71, 8, 11, 133, 9, + 12, 140, 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, 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, + 134, 135, 136, 141, 142, 143 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing @@ -803,27 +805,27 @@ static const yytype_int16 yydefgoto[] = #define YYPACT_NINF -13 static const yytype_int8 yypact[] = { - -13, 64, -13, -13, -13, -13, -13, -13, -13, -13, - -12, 28, 27, 16, 17, 18, 19, 23, 24, 25, - 57, 60, 61, 62, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 94, 95, 96, 97, 98, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + -13, 65, -13, -13, -13, -13, -13, -13, -13, -13, + -12, 29, 28, 16, 17, 18, 19, 23, 24, 25, + 58, 61, 62, 63, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 95, 96, 97, 98, 99, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, -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, -13, -13, -13, -13, -13, -13, 114, 115, - 116, -13, -13, -13, -13, 117, 118, 119, -13, -13, + 116, 117, 118, -13, -13, -13, -13, 119, 120, 121, -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, 120, 121, -13, -13, - -13, -13, -13, -13, -13, -13, -13 + -13, -13, -13, -13, -13, -13, -13, -13, 122, 123, + -13, -13, -13, -13, -13, -13, -13, -13, -13, -13 }; /* YYPGOTO[NTERM-NUM]. */ @@ -836,7 +838,7 @@ 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 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -848,18 +850,18 @@ 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, 142, 143, 144, 145, - 39, 40, 41, 146, 147, 148, 42, 43, 44, 45, + 33, 34, 35, 36, 37, 38, 144, 145, 146, 147, + 39, 40, 41, 148, 149, 150, 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, 2, 135, 128, 149, 129, 130, - 150, 151, 152, 136, 137, 3, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 4, 180, 181, 182, 183, 184, 5, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206 + 66, 67, 68, 69, 70, 2, 137, 130, 151, 131, + 132, 152, 153, 154, 138, 139, 3, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 4, 182, 183, 184, 185, 186, + 5, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209 }; static const yytype_uint8 yycheck[] = @@ -870,41 +872,41 @@ 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, 0, 38, 38, 10, 40, 41, - 10, 10, 10, 46, 47, 11, 10, 10, 10, 10, + 72, 73, 74, 75, 76, 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, 39, 10, 10, 10, 10, 10, 45, + 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 + 10, 10, 10, 10 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { - 0, 77, 0, 11, 39, 45, 78, 79, 82, 85, - 80, 83, 86, 12, 13, 14, 15, 16, 17, 18, + 0, 78, 0, 11, 39, 45, 79, 80, 83, 86, + 81, 84, 87, 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, - 81, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 76, 82, 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, 142, 143, 144, 38, 40, - 41, 84, 145, 146, 147, 38, 46, 47, 87, 148, - 149, 150, 10, 10, 10, 10, 10, 10, 10, 10, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 38, 40, 41, 85, 147, 148, 149, 38, 46, 47, + 88, 150, 151, 152, 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) @@ -1725,7 +1727,7 @@ yyreduce: } break; - case 67: + case 68: #line 132 "util/configparser.y" { struct config_stub* s; @@ -1739,7 +1741,7 @@ yyreduce: } break; - case 73: + case 74: #line 148 "util/configparser.y" { struct config_stub* s; @@ -1753,7 +1755,7 @@ yyreduce: } break; - case 79: + case 80: #line 164 "util/configparser.y" { OUTYY(("P(server_num_threads:%s)\n", (yyvsp[(2) - (2)].str))); @@ -1764,7 +1766,7 @@ yyreduce: } break; - case 80: + case 81: #line 173 "util/configparser.y" { OUTYY(("P(server_verbosity:%s)\n", (yyvsp[(2) - (2)].str))); @@ -1775,7 +1777,7 @@ yyreduce: } break; - case 81: + case 82: #line 182 "util/configparser.y" { OUTYY(("P(server_port:%s)\n", (yyvsp[(2) - (2)].str))); @@ -1786,7 +1788,7 @@ yyreduce: } break; - case 82: + case 83: #line 191 "util/configparser.y" { OUTYY(("P(server_interface:%s)\n", (yyvsp[(2) - (2)].str))); @@ -1801,7 +1803,7 @@ yyreduce: } break; - case 83: + case 84: #line 204 "util/configparser.y" { OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[(2) - (2)].str))); @@ -1818,7 +1820,7 @@ yyreduce: } break; - case 84: + case 85: #line 219 "util/configparser.y" { OUTYY(("P(server_outgoing_port:%s)\n", (yyvsp[(2) - (2)].str))); @@ -1829,7 +1831,7 @@ yyreduce: } break; - case 85: + case 86: #line 228 "util/configparser.y" { OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[(2) - (2)].str))); @@ -1840,7 +1842,7 @@ yyreduce: } break; - case 86: + case 87: #line 237 "util/configparser.y" { OUTYY(("P(server_outgoing_num_tcp:%s)\n", (yyvsp[(2) - (2)].str))); @@ -1851,7 +1853,7 @@ yyreduce: } break; - case 87: + case 88: #line 246 "util/configparser.y" { OUTYY(("P(server_incoming_num_tcp:%s)\n", (yyvsp[(2) - (2)].str))); @@ -1862,8 +1864,19 @@ yyreduce: } break; - case 88: + case 89: #line 255 "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) + yyerror("expected yes or no."); + else cfg_parser->cfg->if_automatic = (strcmp((yyvsp[(2) - (2)].str), "yes")==0); + free((yyvsp[(2) - (2)].str)); + } + break; + + case 90: +#line 264 "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) @@ -1873,8 +1886,8 @@ yyreduce: } break; - case 89: -#line 264 "util/configparser.y" + case 91: +#line 273 "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) @@ -1884,8 +1897,8 @@ yyreduce: } break; - case 90: -#line 273 "util/configparser.y" + case 92: +#line 282 "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) @@ -1895,8 +1908,8 @@ yyreduce: } break; - case 91: -#line 282 "util/configparser.y" + case 93: +#line 291 "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) @@ -1906,8 +1919,8 @@ yyreduce: } break; - case 92: -#line 291 "util/configparser.y" + case 94: +#line 300 "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) @@ -1922,8 +1935,8 @@ yyreduce: } break; - case 93: -#line 305 "util/configparser.y" + case 95: +#line 314 "util/configparser.y" { OUTYY(("P(server_chroot:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->chrootdir); @@ -1931,8 +1944,8 @@ yyreduce: } break; - case 94: -#line 312 "util/configparser.y" + case 96: +#line 321 "util/configparser.y" { OUTYY(("P(server_username:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->username); @@ -1940,8 +1953,8 @@ yyreduce: } break; - case 95: -#line 319 "util/configparser.y" + case 97: +#line 328 "util/configparser.y" { OUTYY(("P(server_directory:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->directory); @@ -1949,8 +1962,8 @@ yyreduce: } break; - case 96: -#line 326 "util/configparser.y" + case 98: +#line 335 "util/configparser.y" { OUTYY(("P(server_logfile:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->logfile); @@ -1959,8 +1972,8 @@ yyreduce: } break; - case 97: -#line 334 "util/configparser.y" + case 99: +#line 343 "util/configparser.y" { OUTYY(("P(server_pidfile:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->pidfile); @@ -1968,8 +1981,8 @@ yyreduce: } break; - case 98: -#line 341 "util/configparser.y" + case 100: +#line 350 "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))) @@ -1977,8 +1990,8 @@ yyreduce: } break; - case 99: -#line 348 "util/configparser.y" + case 101: +#line 357 "util/configparser.y" { OUTYY(("P(server_trust_anchor_file:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> @@ -1987,8 +2000,8 @@ yyreduce: } break; - case 100: -#line 356 "util/configparser.y" + case 102: +#line 365 "util/configparser.y" { OUTYY(("P(server_trusted_keys_file:%s)\n", (yyvsp[(2) - (2)].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> @@ -1997,8 +2010,8 @@ yyreduce: } break; - case 101: -#line 364 "util/configparser.y" + case 103: +#line 373 "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))) @@ -2006,8 +2019,8 @@ yyreduce: } break; - case 102: -#line 371 "util/configparser.y" + case 104: +#line 380 "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) @@ -2017,8 +2030,8 @@ yyreduce: } break; - case 103: -#line 380 "util/configparser.y" + case 105: +#line 389 "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) @@ -2028,8 +2041,8 @@ yyreduce: } break; - case 104: -#line 389 "util/configparser.y" + case 106: +#line 398 "util/configparser.y" { OUTYY(("P(server_identity:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->identity); @@ -2037,8 +2050,8 @@ yyreduce: } break; - case 105: -#line 396 "util/configparser.y" + case 107: +#line 405 "util/configparser.y" { OUTYY(("P(server_version:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->version); @@ -2046,8 +2059,8 @@ yyreduce: } break; - case 106: -#line 403 "util/configparser.y" + case 108: +#line 412 "util/configparser.y" { OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -2059,8 +2072,8 @@ yyreduce: } break; - case 107: -#line 414 "util/configparser.y" + case 109: +#line 423 "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)) @@ -2069,8 +2082,8 @@ yyreduce: } break; - case 108: -#line 422 "util/configparser.y" + case 110: +#line 431 "util/configparser.y" { OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -2084,8 +2097,8 @@ yyreduce: } break; - case 109: -#line 435 "util/configparser.y" + case 111: +#line 444 "util/configparser.y" { OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -2095,8 +2108,8 @@ yyreduce: } break; - case 110: -#line 444 "util/configparser.y" + case 112: +#line 453 "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)) @@ -2105,8 +2118,8 @@ yyreduce: } break; - case 111: -#line 452 "util/configparser.y" + case 113: +#line 461 "util/configparser.y" { OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -2120,8 +2133,8 @@ yyreduce: } break; - case 112: -#line 465 "util/configparser.y" + case 114: +#line 474 "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) @@ -2131,8 +2144,8 @@ yyreduce: } break; - case 113: -#line 474 "util/configparser.y" + case 115: +#line 483 "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) @@ -2142,8 +2155,8 @@ yyreduce: } break; - case 114: -#line 483 "util/configparser.y" + case 116: +#line 492 "util/configparser.y" { OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -2153,8 +2166,8 @@ yyreduce: } break; - case 115: -#line 492 "util/configparser.y" + case 117: +#line 501 "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-> @@ -2164,8 +2177,8 @@ yyreduce: } break; - case 116: -#line 501 "util/configparser.y" + case 118: +#line 510 "util/configparser.y" { OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -2179,8 +2192,8 @@ yyreduce: } break; - case 117: -#line 514 "util/configparser.y" + case 119: +#line 523 "util/configparser.y" { OUTYY(("P(server_target_fetch_policy:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->target_fetch_policy); @@ -2188,8 +2201,8 @@ yyreduce: } break; - case 118: -#line 521 "util/configparser.y" + case 120: +#line 530 "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) @@ -2200,8 +2213,8 @@ yyreduce: } break; - case 119: -#line 531 "util/configparser.y" + case 121: +#line 540 "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) @@ -2212,8 +2225,8 @@ yyreduce: } break; - case 120: -#line 541 "util/configparser.y" + case 122: +#line 550 "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) @@ -2224,8 +2237,8 @@ yyreduce: } break; - case 121: -#line 551 "util/configparser.y" + case 123: +#line 560 "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) @@ -2236,8 +2249,8 @@ yyreduce: } break; - case 122: -#line 561 "util/configparser.y" + case 124: +#line 570 "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))) @@ -2245,8 +2258,8 @@ yyreduce: } break; - case 123: -#line 568 "util/configparser.y" + case 125: +#line 577 "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) @@ -2257,8 +2270,8 @@ yyreduce: } break; - case 124: -#line 578 "util/configparser.y" + case 126: +#line 587 "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 && @@ -2272,8 +2285,8 @@ yyreduce: } break; - case 125: -#line 591 "util/configparser.y" + case 127: +#line 600 "util/configparser.y" { OUTYY(("P(server_module_conf:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->module_conf); @@ -2281,8 +2294,8 @@ yyreduce: } break; - case 126: -#line 598 "util/configparser.y" + case 128: +#line 607 "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) { @@ -2301,8 +2314,8 @@ yyreduce: } break; - case 127: -#line 616 "util/configparser.y" + case 129: +#line 625 "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) @@ -2312,8 +2325,8 @@ yyreduce: } break; - case 128: -#line 625 "util/configparser.y" + case 130: +#line 634 "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) @@ -2323,8 +2336,8 @@ yyreduce: } break; - case 129: -#line 634 "util/configparser.y" + case 131: +#line 643 "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) @@ -2335,8 +2348,8 @@ yyreduce: } break; - case 130: -#line 644 "util/configparser.y" + case 132: +#line 653 "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) @@ -2347,8 +2360,8 @@ yyreduce: } break; - case 131: -#line 654 "util/configparser.y" + case 133: +#line 663 "util/configparser.y" { OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->val_nsec3_key_iterations); @@ -2356,8 +2369,8 @@ yyreduce: } break; - case 132: -#line 661 "util/configparser.y" + case 134: +#line 670 "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)) @@ -2366,8 +2379,8 @@ yyreduce: } break; - case 133: -#line 669 "util/configparser.y" + case 135: +#line 678 "util/configparser.y" { OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str))); if(atoi((yyvsp[(2) - (2)].str)) == 0) @@ -2381,8 +2394,8 @@ yyreduce: } break; - case 134: -#line 682 "util/configparser.y" + case 136: +#line 691 "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 && @@ -2402,8 +2415,8 @@ yyreduce: } break; - case 135: -#line 701 "util/configparser.y" + case 137: +#line 710 "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))) @@ -2411,8 +2424,8 @@ yyreduce: } break; - case 136: -#line 708 "util/configparser.y" + case 138: +#line 717 "util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->stubs->name); @@ -2420,8 +2433,8 @@ yyreduce: } break; - case 137: -#line 715 "util/configparser.y" + case 139: +#line 724 "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))) @@ -2429,8 +2442,8 @@ yyreduce: } break; - case 138: -#line 722 "util/configparser.y" + case 140: +#line 731 "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))) @@ -2438,8 +2451,8 @@ yyreduce: } break; - case 139: -#line 729 "util/configparser.y" + case 141: +#line 738 "util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str))); free(cfg_parser->cfg->forwards->name); @@ -2447,8 +2460,8 @@ yyreduce: } break; - case 140: -#line 736 "util/configparser.y" + case 142: +#line 745 "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))) @@ -2456,8 +2469,8 @@ yyreduce: } break; - case 141: -#line 743 "util/configparser.y" + case 143: +#line 752 "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))) @@ -2467,7 +2480,7 @@ yyreduce: /* Line 1267 of yacc.c. */ -#line 2471 "util/configparser.c" +#line 2484 "util/configparser.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -2681,7 +2694,7 @@ yyreturn: } -#line 749 "util/configparser.y" +#line 758 "util/configparser.y" /* parse helper routines could be here */ diff --git a/util/configparser.h b/util/configparser.h index 8c4004291..c4a4cb94b 100644 --- a/util/configparser.h +++ b/util/configparser.h @@ -111,7 +111,8 @@ VAR_HARDEN_DNNSEC_STRIPPED = 327, VAR_ACCESS_CONTROL = 328, VAR_LOCAL_ZONE = 329, - VAR_LOCAL_DATA = 330 + VAR_LOCAL_DATA = 330, + VAR_INTERFACE_AUTOMATIC = 331 }; #endif /* Tokens. */ @@ -188,6 +189,7 @@ #define VAR_ACCESS_CONTROL 328 #define VAR_LOCAL_ZONE 329 #define VAR_LOCAL_DATA 330 +#define VAR_INTERFACE_AUTOMATIC 331 @@ -199,7 +201,7 @@ typedef union YYSTYPE char* str; } /* Line 1489 of yacc.c. */ -#line 203 "util/configparser.h" +#line 205 "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 1e391a5c9..fb1dba0c1 100644 --- a/util/configparser.y +++ b/util/configparser.y @@ -87,7 +87,7 @@ extern struct config_parser_state* cfg_parser; %token VAR_VAL_NSEC3_KEYSIZE_ITERATIONS VAR_USE_SYSLOG %token VAR_OUTGOING_INTERFACE VAR_ROOT_HINTS VAR_DO_NOT_QUERY_LOCALHOST %token VAR_CACHE_MAX_TTL VAR_HARDEN_DNNSEC_STRIPPED VAR_ACCESS_CONTROL -%token VAR_LOCAL_ZONE VAR_LOCAL_DATA +%token VAR_LOCAL_ZONE VAR_LOCAL_DATA VAR_INTERFACE_AUTOMATIC %% toplevelvars: /* empty */ | toplevelvars toplevelvar ; @@ -126,7 +126,7 @@ content_server: server_num_threads | server_verbosity | server_port | server_use_syslog | server_outgoing_interface | server_root_hints | server_do_not_query_localhost | server_cache_max_ttl | server_harden_dnssec_stripped | server_access_control | - server_local_zone | server_local_data + server_local_zone | server_local_data | server_interface_automatic ; stubstart: VAR_STUB_ZONE { @@ -251,6 +251,15 @@ server_incoming_num_tcp: VAR_INCOMING_NUM_TCP STRING free($2); } ; +server_interface_automatic: VAR_INTERFACE_AUTOMATIC STRING + { + OUTYY(("P(server_interface_automatic:%s)\n", $2)); + if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->if_automatic = (strcmp($2, "yes")==0); + free($2); + } + ; server_do_ip4: VAR_DO_IP4 STRING { OUTYY(("P(server_do_ip4:%s)\n", $2)); diff --git a/util/fptr_wlist.c b/util/fptr_wlist.c index 21a292f1e..83da3be0a 100644 --- a/util/fptr_wlist.c +++ b/util/fptr_wlist.c @@ -99,6 +99,7 @@ int fptr_whitelist_event(void (*fptr)(int, short, void *)) { if(fptr == &comm_point_udp_callback) return 1; + else if(fptr == &comm_point_udp_ancil_callback) return 1; else if(fptr == &comm_point_tcp_accept_callback) return 1; else if(fptr == &comm_point_tcp_handle_callback) return 1; else if(fptr == &comm_timer_callback) return 1; diff --git a/util/netevent.c b/util/netevent.c index 3d61a27c0..77b5ed7ef 100644 --- a/util/netevent.c +++ b/util/netevent.c @@ -178,6 +178,122 @@ comm_point_send_udp_msg(struct comm_point *c, ldns_buffer* packet, return 1; } +/** send a UDP reply over specified interface*/ +int +comm_point_send_udp_msg_if(struct comm_point *c, ldns_buffer* packet, + struct sockaddr* addr, socklen_t addrlen, int ifnum) +{ +#if defined(AF_INET6) && defined(IPV6_PKTINFO) + ssize_t sent; + struct msghdr msg; + struct iovec iov[1]; + char control[256]; + struct cmsghdr *cmsg; + + log_assert(c->fd != -1); + log_assert(ldns_buffer_remaining(packet) > 0); + log_assert(addr && addrlen > 0); + + msg.msg_name = addr; + msg.msg_namelen = addrlen; + iov[0].iov_base = ldns_buffer_begin(packet); + iov[0].iov_len = ldns_buffer_remaining(packet); + msg.msg_iov = iov; + msg.msg_iovlen = 1; + msg.msg_control = control; + msg.msg_controllen = sizeof(control); + msg.msg_flags = 0; + + cmsg = CMSG_FIRSTHDR(&msg); + cmsg->cmsg_level = IPPROTO_IPV6; + cmsg->cmsg_type = IPV6_PKTINFO; + cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo)); + memset(&((struct in6_pktinfo*)CMSG_DATA(cmsg))->ipi6_addr, 0, + sizeof(struct in6_addr)); + ((struct in6_pktinfo*)CMSG_DATA(cmsg))->ipi6_ifindex = + (TYPE_MSGIOVLEN)ifnum; + msg.msg_controllen = cmsg->cmsg_len; + + log_info("using interface to sendmsg %d", ifnum); + sent = sendmsg(c->fd, &msg, 0); + if(sent == -1) { + verbose(VERB_OPS, "sendto failed: %s", strerror(errno)); + return 0; + } else if((size_t)sent != ldns_buffer_remaining(packet)) { + log_err("sent %d in place of %d bytes", + (int)sent, (int)ldns_buffer_remaining(packet)); + return 0; + } + return 1; +#else + log_err("sendmsg: IPV6_PKTINFO not supported"); + return 0; +#endif +} + +void +comm_point_udp_ancil_callback(int fd, short event, void* arg) +{ +#if defined(AF_INET6) && defined(IPV6_PKTINFO) + struct comm_reply rep; + struct msghdr msg; + struct iovec iov[1]; + ssize_t recv; + char ancil[256]; + struct cmsghdr* cmsg; + + rep.c = (struct comm_point*)arg; + log_assert(rep.c->type == comm_udp); + + if(!(event&EV_READ)) + return; + log_assert(rep.c && rep.c->buffer && rep.c->fd == fd); + ldns_buffer_clear(rep.c->buffer); + rep.addrlen = (socklen_t)sizeof(rep.addr); + log_assert(fd != -1); + log_assert(ldns_buffer_remaining(rep.c->buffer) > 0); + msg.msg_name = &rep.addr; + msg.msg_namelen = (socklen_t)sizeof(rep.addr); + iov[0].iov_base = ldns_buffer_begin(rep.c->buffer); + iov[0].iov_len = ldns_buffer_remaining(rep.c->buffer); + msg.msg_iov = iov; + msg.msg_iovlen = 1; + msg.msg_control = ancil; + msg.msg_controllen = sizeof(ancil); + msg.msg_flags = 0; + recv = recvmsg(fd, &msg, 0); + if(recv == -1) { + if(errno != EAGAIN && errno != EINTR) { + log_err("recvfrom failed: %s", strerror(errno)); + } + return; + } + rep.addrlen = msg.msg_namelen; + ldns_buffer_skip(rep.c->buffer, recv); + ldns_buffer_flip(rep.c->buffer); + rep.ifnum = 0; + for(cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; + cmsg = CMSG_NXTHDR(&msg, cmsg)) { + if( cmsg->cmsg_level == IPPROTO_IPV6 && + cmsg->cmsg_type == IPV6_PKTINFO) { + rep.ifnum = (int)((struct in6_pktinfo*)CMSG_DATA( + cmsg))->ipi6_ifindex; + /* ignored ipi6_addr with the dest ipv6 address */ + } + } + log_info("recvmsg if %d", rep.ifnum); + log_assert(fptr_whitelist_comm_point(rep.c->callback)); + if((*rep.c->callback)(rep.c, rep.c->cb_arg, NETEVENT_NOERROR, &rep)) { + /* send back immediate reply */ + (void)comm_point_send_udp_msg_if(rep.c, rep.c->buffer, + (struct sockaddr*)&rep.addr, rep.addrlen, rep.ifnum); + } +#else + fatal_exit("recvmsg: No support for IPV6_PKTINFO. " + "Please disable interface-automatic"); +#endif +} + void comm_point_udp_callback(int fd, short event, void* arg) { @@ -205,6 +321,7 @@ comm_point_udp_callback(int fd, short event, void* arg) } ldns_buffer_skip(rep.c->buffer, recv); ldns_buffer_flip(rep.c->buffer); + rep.ifnum = 0; log_assert(fptr_whitelist_comm_point(rep.c->callback)); if((*rep.c->callback)(rep.c, rep.c->cb_arg, NETEVENT_NOERROR, &rep)) { /* send back immediate reply */ @@ -562,6 +679,50 @@ comm_point_create_udp(struct comm_base *base, int fd, ldns_buffer* buffer, return c; } +struct comm_point* +comm_point_create_udp_ancil(struct comm_base *base, int fd, + ldns_buffer* buffer, + comm_point_callback_t* callback, void* callback_arg) +{ + struct comm_point* c = (struct comm_point*)calloc(1, + sizeof(struct comm_point)); + short evbits; + if(!c) + return NULL; + c->ev = (struct internal_event*)calloc(1, + sizeof(struct internal_event)); + if(!c->ev) { + free(c); + return NULL; + } + c->fd = fd; + c->buffer = buffer; + c->timeout = NULL; + c->tcp_is_reading = 0; + c->tcp_byte_count = 0; + c->tcp_parent = NULL; + c->max_tcp_count = 0; + c->tcp_handlers = NULL; + c->tcp_free = NULL; + c->type = comm_udp; + c->tcp_do_close = 0; + c->do_not_close = 0; + c->tcp_do_toggle_rw = 0; + c->tcp_check_nb_connect = 0; + c->callback = callback; + c->cb_arg = callback_arg; + evbits = EV_READ | EV_PERSIST; + /* libevent stuff */ + event_set(&c->ev->ev, c->fd, evbits, comm_point_udp_ancil_callback, c); + if(event_base_set(base->eb->base, &c->ev->ev) != 0 || + event_add(&c->ev->ev, c->timeout) != 0 ) { + log_err("could not add udp event"); + comm_point_delete(c); + return NULL; + } + return c; +} + static struct comm_point* comm_point_create_tcp_handler(struct comm_base *base, struct comm_point* parent, size_t bufsize, @@ -834,7 +995,12 @@ comm_point_send_reply(struct comm_reply *repinfo) { log_assert(repinfo && repinfo->c); if(repinfo->c->type == comm_udp) { - comm_point_send_udp_msg(repinfo->c, repinfo->c->buffer, + if(repinfo->ifnum) + comm_point_send_udp_msg_if(repinfo->c, + repinfo->c->buffer, (struct sockaddr*)&repinfo->addr, + repinfo->addrlen, repinfo->ifnum); + else + comm_point_send_udp_msg(repinfo->c, repinfo->c->buffer, (struct sockaddr*)&repinfo->addr, repinfo->addrlen); } else { comm_point_start_listening(repinfo->c, -1, TCP_QUERY_TIMEOUT); diff --git a/util/netevent.h b/util/netevent.h index cae79e5a7..3a4d706b6 100644 --- a/util/netevent.h +++ b/util/netevent.h @@ -98,6 +98,8 @@ struct comm_reply { struct sockaddr_storage addr; /** length of address */ socklen_t addrlen; + /** the interface received (for UDPautomaticinterface) or 0 */ + int ifnum; }; /** @@ -272,6 +274,22 @@ struct comm_point* comm_point_create_udp(struct comm_base* base, int fd, ldns_buffer* buffer, comm_point_callback_t* callback, void* callback_arg); +/** + * Create an UDP with ancillary data comm point. Calls malloc. + * Uses recvmsg instead of recv to get udp message. + * setups the structure with the parameters you provide. + * @param base: in which base to alloc the commpoint. + * @param fd : file descriptor of open UDP socket. + * @param buffer: shared buffer by UDP sockets from this thread. + * @param callback: callback function pointer. + * @param callback_arg: will be passed to your callback function. + * @return: returns the allocated communication point. NULL on error. + * Sets timeout to NULL. Turns off TCP options. + */ +struct comm_point* comm_point_create_udp_ancil(struct comm_base* base, + int fd, ldns_buffer* buffer, + comm_point_callback_t* callback, void* callback_arg); + /** * Create a TCP listener comm point. Calls malloc. * Setups the structure with the parameters you provide. @@ -476,6 +494,16 @@ void comm_signal_delete(struct comm_signal* comsig); */ void comm_point_udp_callback(int fd, short event, void* arg); +/** + * This routine is published for checks and tests, and is only used internally. + * handle libevent callback for udp ancillary data comm point. + * @param fd: file descriptor. + * @param event: event bits from libevent: + * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. + * @param arg: the comm_point structure. + */ +void comm_point_udp_ancil_callback(int fd, short event, void* arg); + /** * This routine is published for checks and tests, and is only used internally. * handle libevent callback for tcp accept comm point