1158287Smaxim%{ 2158287Smaxim/* 3158287Smaxim * configlexer.lex - lexical analyzer for unbound config file 4330449Seadler * 5330449Seadler * Copyright (c) 2001-2006, NLnet Labs. All rights reserved 6158287Smaxim * 7158287Smaxim * See LICENSE for the license. 8158287Smaxim * 9158287Smaxim */ 10158287Smaxim#include "config.h" 11158287Smaxim 12158287Smaxim/* because flex keeps having sign-unsigned compare problems that are unfixed*/ 13158287Smaxim#if defined(__clang__)||(defined(__GNUC__)&&((__GNUC__ >4)||(defined(__GNUC_MINOR__)&&(__GNUC__ ==4)&&(__GNUC_MINOR__ >=2)))) 14158287Smaxim#pragma GCC diagnostic ignored "-Wsign-compare" 15158287Smaxim#endif 16158287Smaxim 17158287Smaxim#include <ctype.h> 18158287Smaxim#include <strings.h> 19158287Smaxim#ifdef HAVE_GLOB_H 20158287Smaxim# include <glob.h> 21158287Smaxim#endif 22158287Smaxim 23158287Smaxim#include "util/config_file.h" 24158287Smaxim#include "configparser.h" 25158287Smaximvoid ub_c_error(const char *message); 26158287Smaxim 27158287Smaxim#if 0 28158287Smaxim#define LEXOUT(s) printf s /* used ONLY when debugging */ 29158287Smaxim#else 30158287Smaxim#define LEXOUT(s) 31158287Smaxim#endif 32158287Smaxim 33158287Smaxim/** avoid warning in about fwrite return value */ 34158287Smaxim#define ECHO ub_c_error_msg("syntax error at text: %s", ub_c_text) 35158287Smaxim 36158287Smaxim/** A parser variable, this is a statement in the config file which is 37158287Smaxim * of the form variable: value1 value2 ... nargs is the number of values. */ 38158287Smaxim#define YDVAR(nargs, var) \ 39158287Smaxim num_args=(nargs); \ 40158287Smaxim LEXOUT(("v(%s%d) ", ub_c_text, num_args)); \ 41158287Smaxim if(num_args > 0) { BEGIN(val); } \ 42158287Smaxim return (var); 43158287Smaxim 44158287Smaximstruct inc_state { 45158287Smaxim char* filename; 46158287Smaxim int line; 47158287Smaxim YY_BUFFER_STATE buffer; 48158287Smaxim struct inc_state* next; 49158287Smaxim int inc_toplevel; 50158287Smaxim}; 51158287Smaximstatic struct inc_state* config_include_stack = NULL; 52158287Smaximstatic int inc_depth = 0; 53202718Sedstatic int inc_prev = 0; 54202718Sedstatic int num_args = 0; 55158287Smaximstatic int inc_toplevel = 0; 56158287Smaxim 57158287Smaximvoid init_cfg_parse(void) 58158287Smaxim{ 59202198Sed config_include_stack = NULL; 60158287Smaxim inc_depth = 0; 61158287Smaxim inc_prev = 0; 62158287Smaxim num_args = 0; 63158287Smaxim inc_toplevel = 0; 64158287Smaxim} 65158287Smaxim 66250942Sghelmerstatic void config_start_include(const char* filename, int toplevel) 67158287Smaxim{ 68158287Smaxim FILE *input; 69158287Smaxim struct inc_state* s; 70158287Smaxim char* nm; 71158287Smaxim if(inc_depth+1 > 100000) { 72158287Smaxim ub_c_error_msg("too many include files"); 73202198Sed return; 74158287Smaxim } 75158287Smaxim if(*filename == '\0') { 76158287Smaxim ub_c_error_msg("empty include file name"); 77158287Smaxim return; 78158287Smaxim } 79166504Srse s = (struct inc_state*)malloc(sizeof(*s)); 80158287Smaxim if(!s) { 81158287Smaxim ub_c_error_msg("include %s: malloc failure", filename); 82158287Smaxim return; 83158287Smaxim } 84158287Smaxim if(cfg_parser->chroot && strncmp(filename, cfg_parser->chroot, 85158287Smaxim strlen(cfg_parser->chroot)) == 0) { 86158287Smaxim filename += strlen(cfg_parser->chroot); 87158287Smaxim } 88158287Smaxim nm = strdup(filename); 89301413Smarkj if(!nm) { 90158287Smaxim ub_c_error_msg("include %s: strdup failure", filename); 91158287Smaxim free(s); 92158287Smaxim return; 93158287Smaxim } 94158287Smaxim input = fopen(filename, "r"); 95158287Smaxim if(!input) { 96202198Sed ub_c_error_msg("cannot open include file '%s': %s", 97158287Smaxim filename, strerror(errno)); 98158287Smaxim free(s); 99158287Smaxim free(nm); 100158287Smaxim return; 101158287Smaxim } 102158287Smaxim LEXOUT(("switch_to_include_file(%s)\n", filename)); 103158287Smaxim inc_depth++; 104158287Smaxim s->filename = cfg_parser->filename; 105158287Smaxim s->line = cfg_parser->line; 106158287Smaxim s->buffer = YY_CURRENT_BUFFER; 107158287Smaxim s->inc_toplevel = inc_toplevel; 108158287Smaxim s->next = config_include_stack; 109158287Smaxim config_include_stack = s; 110158287Smaxim cfg_parser->filename = nm; 111158287Smaxim cfg_parser->line = 1; 112158287Smaxim inc_toplevel = toplevel; 113158287Smaxim yy_switch_to_buffer(yy_create_buffer(input, YY_BUF_SIZE)); 114158287Smaxim} 115158287Smaxim 116158287Smaximstatic void config_start_include_glob(const char* filename, int toplevel) 117158287Smaxim{ 118158287Smaxim 119158287Smaxim /* check for wildcards */ 120158287Smaxim#ifdef HAVE_GLOB 121158287Smaxim glob_t g; 122158287Smaxim int i, r, flags; 123158287Smaxim if(!(!strchr(filename, '*') && !strchr(filename, '?') && !strchr(filename, '[') && 124158287Smaxim !strchr(filename, '{') && !strchr(filename, '~'))) { 125158287Smaxim flags = 0 126158287Smaxim#ifdef GLOB_ERR 127158287Smaxim | GLOB_ERR 128158287Smaxim#endif 129158287Smaxim /* do not set GLOB_NOSORT so the results are sorted 130158287Smaxim and in a predictable order. */ 131158287Smaxim#ifdef GLOB_BRACE 132158287Smaxim | GLOB_BRACE 133158287Smaxim#endif 134158287Smaxim#ifdef GLOB_TILDE 135158287Smaxim | GLOB_TILDE 136158287Smaxim#endif 137158287Smaxim ; 138158287Smaxim memset(&g, 0, sizeof(g)); 139158287Smaxim if(cfg_parser->chroot && strncmp(filename, cfg_parser->chroot, 140158287Smaxim strlen(cfg_parser->chroot)) == 0) { 141158287Smaxim filename += strlen(cfg_parser->chroot); 142158287Smaxim } 143158287Smaxim r = glob(filename, flags, NULL, &g); 144158287Smaxim if(r) { 145158287Smaxim /* some error */ 146158287Smaxim globfree(&g); 147158287Smaxim if(r == GLOB_NOMATCH) 148158287Smaxim return; /* no matches for pattern */ 149158287Smaxim config_start_include(filename, toplevel); /* let original deal with it */ 150158287Smaxim return; 151158287Smaxim } 152158287Smaxim /* process files found, if any */ 153158287Smaxim for(i=(int)g.gl_pathc-1; i>=0; i--) { 154158287Smaxim config_start_include(g.gl_pathv[i], toplevel); 155158287Smaxim } 156158287Smaxim globfree(&g); 157158287Smaxim return; 158158287Smaxim } 159158287Smaxim#endif /* HAVE_GLOB */ 160158287Smaxim 161158287Smaxim config_start_include(filename, toplevel); 162158287Smaxim} 163158287Smaxim 164158287Smaximstatic void config_end_include(void) 165158287Smaxim{ 166158287Smaxim struct inc_state* s = config_include_stack; 167158287Smaxim --inc_depth; 168158287Smaxim if(!s) return; 169158287Smaxim free(cfg_parser->filename); 170158287Smaxim cfg_parser->filename = s->filename; 171158287Smaxim cfg_parser->line = s->line; 172158287Smaxim yy_delete_buffer(YY_CURRENT_BUFFER); 173158287Smaxim yy_switch_to_buffer(s->buffer); 174158287Smaxim config_include_stack = s->next; 175158287Smaxim inc_toplevel = s->inc_toplevel; 176158287Smaxim free(s); 177158287Smaxim} 178158287Smaxim 179158287Smaxim#ifndef yy_set_bol /* compat definition, for flex 2.4.6 */ 180158287Smaxim#define yy_set_bol(at_bol) \ 181166504Srse { \ 182158287Smaxim if ( ! yy_current_buffer ) \ 183158287Smaxim yy_current_buffer = yy_create_buffer( ub_c_in, YY_BUF_SIZE ); \ 184158287Smaxim yy_current_buffer->yy_ch_buf[0] = ((at_bol)?'\n':' '); \ 185158287Smaxim } 186158287Smaxim#endif 187158287Smaxim 188158287Smaxim%} 189158287Smaxim%option noinput 190158287Smaxim%option nounput 191158287Smaxim%{ 192158287Smaxim#ifndef YY_NO_UNPUT 193158287Smaxim#define YY_NO_UNPUT 1 194158287Smaxim#endif 195158287Smaxim#ifndef YY_NO_INPUT 196158287Smaxim#define YY_NO_INPUT 1 197158287Smaxim#endif 198158287Smaxim%} 199158287Smaxim 200158287SmaximSPACE [ \t] 201158287SmaximLETTER [a-zA-Z] 202158287SmaximUNQUOTEDLETTER [^\'\"\n\r \t\\]|\\. 203158287SmaximUNQUOTEDLETTER_NOCOLON [^\:\'\"\n\r \t\\]|\\. 204158287SmaximNEWLINE [\r\n] 205158287SmaximCOMMENT \# 206158287SmaximCOLON \: 207158287SmaximDQANY [^\"\n\r\\]|\\. 208158287SmaximSQANY [^\'\n\r\\]|\\. 209158287Smaxim 210158287Smaxim%x quotedstring singlequotedstr include include_quoted val include_toplevel include_toplevel_quoted 211158287Smaxim 212158287Smaxim%% 213158287Smaxim<INITIAL,val>{SPACE}* { 214158287Smaxim LEXOUT(("SP ")); /* ignore */ } 215158287Smaxim<INITIAL,val>{SPACE}*{COMMENT}.* { 216158287Smaxim /* note that flex makes the longest match and '.' is any but not nl */ 217158287Smaxim LEXOUT(("comment(%s) ", ub_c_text)); /* ignore */ } 218158287Smaximserver{COLON} { YDVAR(0, VAR_SERVER) } 219158287Smaximqname-minimisation{COLON} { YDVAR(1, VAR_QNAME_MINIMISATION) } 220158287Smaximqname-minimisation-strict{COLON} { YDVAR(1, VAR_QNAME_MINIMISATION_STRICT) } 221158287Smaximnum-threads{COLON} { YDVAR(1, VAR_NUM_THREADS) } 222158287Smaximverbosity{COLON} { YDVAR(1, VAR_VERBOSITY) } 223158287Smaximport{COLON} { YDVAR(1, VAR_PORT) } 224158287Smaximoutgoing-range{COLON} { YDVAR(1, VAR_OUTGOING_RANGE) } 225158287Smaximoutgoing-port-permit{COLON} { YDVAR(1, VAR_OUTGOING_PORT_PERMIT) } 226158287Smaximoutgoing-port-avoid{COLON} { YDVAR(1, VAR_OUTGOING_PORT_AVOID) } 227158287Smaximoutgoing-num-tcp{COLON} { YDVAR(1, VAR_OUTGOING_NUM_TCP) } 228158287Smaximincoming-num-tcp{COLON} { YDVAR(1, VAR_INCOMING_NUM_TCP) } 229158287Smaximdo-ip4{COLON} { YDVAR(1, VAR_DO_IP4) } 230158287Smaximdo-ip6{COLON} { YDVAR(1, VAR_DO_IP6) } 231158287Smaximprefer-ip4{COLON} { YDVAR(1, VAR_PREFER_IP4) } 232158287Smaximprefer-ip6{COLON} { YDVAR(1, VAR_PREFER_IP6) } 233158287Smaximdo-udp{COLON} { YDVAR(1, VAR_DO_UDP) } 234158287Smaximdo-tcp{COLON} { YDVAR(1, VAR_DO_TCP) } 235158287Smaximtcp-upstream{COLON} { YDVAR(1, VAR_TCP_UPSTREAM) } 236158287Smaximtcp-mss{COLON} { YDVAR(1, VAR_TCP_MSS) } 237158287Smaximoutgoing-tcp-mss{COLON} { YDVAR(1, VAR_OUTGOING_TCP_MSS) } 238158287Smaximtcp-idle-timeout{COLON} { YDVAR(1, VAR_TCP_IDLE_TIMEOUT) } 239158287Smaximedns-tcp-keepalive{COLON} { YDVAR(1, VAR_EDNS_TCP_KEEPALIVE) } 240158287Smaximedns-tcp-keepalive-timeout{COLON} { YDVAR(1, VAR_EDNS_TCP_KEEPALIVE_TIMEOUT) } 241158287Smaximssl-upstream{COLON} { YDVAR(1, VAR_SSL_UPSTREAM) } 242158287Smaximtls-upstream{COLON} { YDVAR(1, VAR_SSL_UPSTREAM) } 243158287Smaximssl-service-key{COLON} { YDVAR(1, VAR_SSL_SERVICE_KEY) } 244158287Smaximtls-service-key{COLON} { YDVAR(1, VAR_SSL_SERVICE_KEY) } 245158287Smaximssl-service-pem{COLON} { YDVAR(1, VAR_SSL_SERVICE_PEM) } 246158287Smaximtls-service-pem{COLON} { YDVAR(1, VAR_SSL_SERVICE_PEM) } 247158287Smaximssl-port{COLON} { YDVAR(1, VAR_SSL_PORT) } 248158287Smaximtls-port{COLON} { YDVAR(1, VAR_SSL_PORT) } 249158287Smaximssl-cert-bundle{COLON} { YDVAR(1, VAR_TLS_CERT_BUNDLE) } 250158287Smaximtls-cert-bundle{COLON} { YDVAR(1, VAR_TLS_CERT_BUNDLE) } 251158287Smaximtls-win-cert{COLON} { YDVAR(1, VAR_TLS_WIN_CERT) } 252158287Smaximadditional-ssl-port{COLON} { YDVAR(1, VAR_TLS_ADDITIONAL_PORT) } 253158287Smaximadditional-tls-port{COLON} { YDVAR(1, VAR_TLS_ADDITIONAL_PORT) } 254158287Smaximtls-additional-ports{COLON} { YDVAR(1, VAR_TLS_ADDITIONAL_PORT) } 255158287Smaximtls-additional-port{COLON} { YDVAR(1, VAR_TLS_ADDITIONAL_PORT) } 256158287Smaximtls-session-ticket-keys{COLON} { YDVAR(1, VAR_TLS_SESSION_TICKET_KEYS) } 257158287Smaximtls-ciphers{COLON} { YDVAR(1, VAR_TLS_CIPHERS) } 258158287Smaximtls-ciphersuites{COLON} { YDVAR(1, VAR_TLS_CIPHERSUITES) } 259158287Smaximtls-use-sni{COLON} { YDVAR(1, VAR_TLS_USE_SNI) } 260158287Smaximhttps-port{COLON} { YDVAR(1, VAR_HTTPS_PORT) } 261158287Smaximhttp-endpoint{COLON} { YDVAR(1, VAR_HTTP_ENDPOINT) } 262158287Smaximhttp-max-streams{COLON} { YDVAR(1, VAR_HTTP_MAX_STREAMS) } 263158287Smaximhttp-query-buffer-size{COLON} { YDVAR(1, VAR_HTTP_QUERY_BUFFER_SIZE) } 264158287Smaximhttp-response-buffer-size{COLON} { YDVAR(1, VAR_HTTP_RESPONSE_BUFFER_SIZE) } 265158287Smaximhttp-nodelay{COLON} { YDVAR(1, VAR_HTTP_NODELAY) } 266158287Smaximhttp-notls-downstream{COLON} { YDVAR(1, VAR_HTTP_NOTLS_DOWNSTREAM) } 267158287Smaximuse-systemd{COLON} { YDVAR(1, VAR_USE_SYSTEMD) } 268158287Smaximdo-daemonize{COLON} { YDVAR(1, VAR_DO_DAEMONIZE) } 269158287Smaximinterface{COLON} { YDVAR(1, VAR_INTERFACE) } 270158287Smaximip-address{COLON} { YDVAR(1, VAR_INTERFACE) } 271158287Smaximoutgoing-interface{COLON} { YDVAR(1, VAR_OUTGOING_INTERFACE) } 272158287Smaximinterface-automatic{COLON} { YDVAR(1, VAR_INTERFACE_AUTOMATIC) } 273158287Smaximso-rcvbuf{COLON} { YDVAR(1, VAR_SO_RCVBUF) } 274158287Smaximso-sndbuf{COLON} { YDVAR(1, VAR_SO_SNDBUF) } 275158287Smaximso-reuseport{COLON} { YDVAR(1, VAR_SO_REUSEPORT) } 276158287Smaximip-transparent{COLON} { YDVAR(1, VAR_IP_TRANSPARENT) } 277158287Smaximip-freebind{COLON} { YDVAR(1, VAR_IP_FREEBIND) } 278158287Smaximip-dscp{COLON} { YDVAR(1, VAR_IP_DSCP) } 279158287Smaximchroot{COLON} { YDVAR(1, VAR_CHROOT) } 280158287Smaximusername{COLON} { YDVAR(1, VAR_USERNAME) } 281158287Smaximdirectory{COLON} { YDVAR(1, VAR_DIRECTORY) } 282158287Smaximlogfile{COLON} { YDVAR(1, VAR_LOGFILE) } 283158287Smaximpidfile{COLON} { YDVAR(1, VAR_PIDFILE) } 284240954Skevloroot-hints{COLON} { YDVAR(1, VAR_ROOT_HINTS) } 285158287Smaximstream-wait-size{COLON} { YDVAR(1, VAR_STREAM_WAIT_SIZE) } 286158287Smaximedns-buffer-size{COLON} { YDVAR(1, VAR_EDNS_BUFFER_SIZE) } 287158287Smaximmsg-buffer-size{COLON} { YDVAR(1, VAR_MSG_BUFFER_SIZE) } 288158287Smaximmsg-cache-size{COLON} { YDVAR(1, VAR_MSG_CACHE_SIZE) } 289158287Smaximmsg-cache-slabs{COLON} { YDVAR(1, VAR_MSG_CACHE_SLABS) } 290158287Smaximrrset-cache-size{COLON} { YDVAR(1, VAR_RRSET_CACHE_SIZE) } 291158287Smaximrrset-cache-slabs{COLON} { YDVAR(1, VAR_RRSET_CACHE_SLABS) } 292240954Skevlocache-max-ttl{COLON} { YDVAR(1, VAR_CACHE_MAX_TTL) } 293158287Smaximcache-max-negative-ttl{COLON} { YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) } 294158287Smaximcache-min-ttl{COLON} { YDVAR(1, VAR_CACHE_MIN_TTL) } 295240954Skevloinfra-host-ttl{COLON} { YDVAR(1, VAR_INFRA_HOST_TTL) } 296240954Skevloinfra-lame-ttl{COLON} { YDVAR(1, VAR_INFRA_LAME_TTL) } 297158287Smaximinfra-cache-slabs{COLON} { YDVAR(1, VAR_INFRA_CACHE_SLABS) } 298158287Smaximinfra-cache-numhosts{COLON} { YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) } 299240954Skevloinfra-cache-lame-size{COLON} { YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) } 300240954Skevloinfra-cache-min-rtt{COLON} { YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) } 301240954Skevloinfra-keep-probing{COLON} { YDVAR(1, VAR_INFRA_KEEP_PROBING) } 302240954Skevlonum-queries-per-thread{COLON} { YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) } 303240954Skevlojostle-timeout{COLON} { YDVAR(1, VAR_JOSTLE_TIMEOUT) } 304240954Skevlodelay-close{COLON} { YDVAR(1, VAR_DELAY_CLOSE) } 305240954Skevloudp-connect{COLON} { YDVAR(1, VAR_UDP_CONNECT) } 306240954Skevlotarget-fetch-policy{COLON} { YDVAR(1, VAR_TARGET_FETCH_POLICY) } 307240954Skevloharden-short-bufsize{COLON} { YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) } 308240954Skevloharden-large-queries{COLON} { YDVAR(1, VAR_HARDEN_LARGE_QUERIES) } 309240954Skevloharden-glue{COLON} { YDVAR(1, VAR_HARDEN_GLUE) } 310240954Skevloharden-dnssec-stripped{COLON} { YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) } 311240954Skevloharden-below-nxdomain{COLON} { YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) } 312240954Skevloharden-referral-path{COLON} { YDVAR(1, VAR_HARDEN_REFERRAL_PATH) } 313240954Skevloharden-algo-downgrade{COLON} { YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) } 314240954Skevlouse-caps-for-id{COLON} { YDVAR(1, VAR_USE_CAPS_FOR_ID) } 315240954Skevlocaps-whitelist{COLON} { YDVAR(1, VAR_CAPS_WHITELIST) } 316240954Skevlocaps-exempt{COLON} { YDVAR(1, VAR_CAPS_WHITELIST) } 317158287Smaximunwanted-reply-threshold{COLON} { YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) } 318158287Smaximprivate-address{COLON} { YDVAR(1, VAR_PRIVATE_ADDRESS) } 319158287Smaximprivate-domain{COLON} { YDVAR(1, VAR_PRIVATE_DOMAIN) } 320158287Smaximprefetch-key{COLON} { YDVAR(1, VAR_PREFETCH_KEY) } 321158287Smaximprefetch{COLON} { YDVAR(1, VAR_PREFETCH) } 322158287Smaximdeny-any{COLON} { YDVAR(1, VAR_DENY_ANY) } 323158287Smaximstub-zone{COLON} { YDVAR(0, VAR_STUB_ZONE) } 324158287Smaximname{COLON} { YDVAR(1, VAR_NAME) } 325158287Smaximstub-addr{COLON} { YDVAR(1, VAR_STUB_ADDR) } 326158287Smaximstub-host{COLON} { YDVAR(1, VAR_STUB_HOST) } 327158287Smaximstub-prime{COLON} { YDVAR(1, VAR_STUB_PRIME) } 328158287Smaximstub-first{COLON} { YDVAR(1, VAR_STUB_FIRST) } 329158287Smaximstub-no-cache{COLON} { YDVAR(1, VAR_STUB_NO_CACHE) } 330158287Smaximstub-ssl-upstream{COLON} { YDVAR(1, VAR_STUB_SSL_UPSTREAM) } 331158287Smaximstub-tls-upstream{COLON} { YDVAR(1, VAR_STUB_SSL_UPSTREAM) } 332158287Smaximforward-zone{COLON} { YDVAR(0, VAR_FORWARD_ZONE) } 333158287Smaximforward-addr{COLON} { YDVAR(1, VAR_FORWARD_ADDR) } 334158287Smaximforward-host{COLON} { YDVAR(1, VAR_FORWARD_HOST) } 335158287Smaximforward-first{COLON} { YDVAR(1, VAR_FORWARD_FIRST) } 336158287Smaximforward-no-cache{COLON} { YDVAR(1, VAR_FORWARD_NO_CACHE) } 337158287Smaximforward-ssl-upstream{COLON} { YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) } 338158287Smaximforward-tls-upstream{COLON} { YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) } 339158287Smaximauth-zone{COLON} { YDVAR(0, VAR_AUTH_ZONE) } 340158287Smaximrpz{COLON} { YDVAR(0, VAR_RPZ) } 341158287Smaximtags{COLON} { YDVAR(1, VAR_TAGS) } 342158287Smaximrpz-action-override{COLON} { YDVAR(1, VAR_RPZ_ACTION_OVERRIDE) } 343158287Smaximrpz-cname-override{COLON} { YDVAR(1, VAR_RPZ_CNAME_OVERRIDE) } 344158287Smaximrpz-log{COLON} { YDVAR(1, VAR_RPZ_LOG) } 345158287Smaximrpz-log-name{COLON} { YDVAR(1, VAR_RPZ_LOG_NAME) } 346158287Smaximzonefile{COLON} { YDVAR(1, VAR_ZONEFILE) } 347158287Smaximmaster{COLON} { YDVAR(1, VAR_MASTER) } 348158287Smaximprimary{COLON} { YDVAR(1, VAR_MASTER) } 349158287Smaximurl{COLON} { YDVAR(1, VAR_URL) } 350158287Smaximallow-notify{COLON} { YDVAR(1, VAR_ALLOW_NOTIFY) } 351158287Smaximfor-downstream{COLON} { YDVAR(1, VAR_FOR_DOWNSTREAM) } 352158287Smaximfor-upstream{COLON} { YDVAR(1, VAR_FOR_UPSTREAM) } 353158287Smaximfallback-enabled{COLON} { YDVAR(1, VAR_FALLBACK_ENABLED) } 354158287Smaximview{COLON} { YDVAR(0, VAR_VIEW) } 355158287Smaximview-first{COLON} { YDVAR(1, VAR_VIEW_FIRST) } 356158287Smaximdo-not-query-address{COLON} { YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) } 357158287Smaximdo-not-query-localhost{COLON} { YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) } 358158287Smaximaccess-control{COLON} { YDVAR(2, VAR_ACCESS_CONTROL) } 359158287Smaximsend-client-subnet{COLON} { YDVAR(1, VAR_SEND_CLIENT_SUBNET) } 360158287Smaximclient-subnet-zone{COLON} { YDVAR(1, VAR_CLIENT_SUBNET_ZONE) } 361158287Smaximclient-subnet-always-forward{COLON} { YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) } 362158287Smaximclient-subnet-opcode{COLON} { YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) } 363158287Smaximmax-client-subnet-ipv4{COLON} { YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) } 364158287Smaximmax-client-subnet-ipv6{COLON} { YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) } 365158287Smaximmin-client-subnet-ipv4{COLON} { YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV4) } 366158287Smaximmin-client-subnet-ipv6{COLON} { YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV6) } 367158287Smaximmax-ecs-tree-size-ipv4{COLON} { YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV4) } 368158287Smaximmax-ecs-tree-size-ipv6{COLON} { YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV6) } 369158287Smaximhide-identity{COLON} { YDVAR(1, VAR_HIDE_IDENTITY) } 370158287Smaximhide-version{COLON} { YDVAR(1, VAR_HIDE_VERSION) } 371158287Smaximhide-trustanchor{COLON} { YDVAR(1, VAR_HIDE_TRUSTANCHOR) } 372158287Smaximidentity{COLON} { YDVAR(1, VAR_IDENTITY) } 373158287Smaximversion{COLON} { YDVAR(1, VAR_VERSION) } 374158287Smaximmodule-config{COLON} { YDVAR(1, VAR_MODULE_CONF) } 375158287Smaximdlv-anchor{COLON} { YDVAR(1, VAR_DLV_ANCHOR) } 376158287Smaximdlv-anchor-file{COLON} { YDVAR(1, VAR_DLV_ANCHOR_FILE) } 377158287Smaximtrust-anchor-file{COLON} { YDVAR(1, VAR_TRUST_ANCHOR_FILE) } 378158287Smaximauto-trust-anchor-file{COLON} { YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) } 379158287Smaximtrusted-keys-file{COLON} { YDVAR(1, VAR_TRUSTED_KEYS_FILE) } 380158287Smaximtrust-anchor{COLON} { YDVAR(1, VAR_TRUST_ANCHOR) } 381158287Smaximtrust-anchor-signaling{COLON} { YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) } 382158287Smaximroot-key-sentinel{COLON} { YDVAR(1, VAR_ROOT_KEY_SENTINEL) } 383158287Smaximval-override-date{COLON} { YDVAR(1, VAR_VAL_OVERRIDE_DATE) } 384158287Smaximval-sig-skew-min{COLON} { YDVAR(1, VAR_VAL_SIG_SKEW_MIN) } 385158287Smaximval-sig-skew-max{COLON} { YDVAR(1, VAR_VAL_SIG_SKEW_MAX) } 386158287Smaximval-bogus-ttl{COLON} { YDVAR(1, VAR_BOGUS_TTL) } 387158287Smaximval-clean-additional{COLON} { YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) } 388158287Smaximval-permissive-mode{COLON} { YDVAR(1, VAR_VAL_PERMISSIVE_MODE) } 389158287Smaximaggressive-nsec{COLON} { YDVAR(1, VAR_AGGRESSIVE_NSEC) } 390158287Smaximignore-cd-flag{COLON} { YDVAR(1, VAR_IGNORE_CD_FLAG) } 391158287Smaximserve-expired{COLON} { YDVAR(1, VAR_SERVE_EXPIRED) } 392158287Smaximserve-expired-ttl{COLON} { YDVAR(1, VAR_SERVE_EXPIRED_TTL) } 393158287Smaximserve-expired-ttl-reset{COLON} { YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) } 394158287Smaximserve-expired-reply-ttl{COLON} { YDVAR(1, VAR_SERVE_EXPIRED_REPLY_TTL) } 395158287Smaximserve-expired-client-timeout{COLON} { YDVAR(1, VAR_SERVE_EXPIRED_CLIENT_TIMEOUT) } 396158287Smaximserve-original-ttl{COLON} { YDVAR(1, VAR_SERVE_ORIGINAL_TTL) } 397158287Smaximfake-dsa{COLON} { YDVAR(1, VAR_FAKE_DSA) } 398158287Smaximfake-sha1{COLON} { YDVAR(1, VAR_FAKE_SHA1) } 399158287Smaximval-log-level{COLON} { YDVAR(1, VAR_VAL_LOG_LEVEL) } 400158287Smaximkey-cache-size{COLON} { YDVAR(1, VAR_KEY_CACHE_SIZE) } 401158287Smaximkey-cache-slabs{COLON} { YDVAR(1, VAR_KEY_CACHE_SLABS) } 402158287Smaximneg-cache-size{COLON} { YDVAR(1, VAR_NEG_CACHE_SIZE) } 403158287Smaximval-nsec3-keysize-iterations{COLON} { 404158287Smaxim YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) } 405158287Smaximadd-holddown{COLON} { YDVAR(1, VAR_ADD_HOLDDOWN) } 406158287Smaximdel-holddown{COLON} { YDVAR(1, VAR_DEL_HOLDDOWN) } 407158287Smaximkeep-missing{COLON} { YDVAR(1, VAR_KEEP_MISSING) } 408158287Smaximpermit-small-holddown{COLON} { YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) } 409158287Smaximuse-syslog{COLON} { YDVAR(1, VAR_USE_SYSLOG) } 410158287Smaximlog-identity{COLON} { YDVAR(1, VAR_LOG_IDENTITY) } 411158287Smaximlog-time-ascii{COLON} { YDVAR(1, VAR_LOG_TIME_ASCII) } 412158287Smaximlog-queries{COLON} { YDVAR(1, VAR_LOG_QUERIES) } 413158287Smaximlog-replies{COLON} { YDVAR(1, VAR_LOG_REPLIES) } 414158287Smaximlog-tag-queryreply{COLON} { YDVAR(1, VAR_LOG_TAG_QUERYREPLY) } 415158287Smaximlog-local-actions{COLON} { YDVAR(1, VAR_LOG_LOCAL_ACTIONS) } 416158287Smaximlog-servfail{COLON} { YDVAR(1, VAR_LOG_SERVFAIL) } 417158287Smaximlocal-zone{COLON} { YDVAR(2, VAR_LOCAL_ZONE) } 418158287Smaximlocal-data{COLON} { YDVAR(1, VAR_LOCAL_DATA) } 419158287Smaximlocal-data-ptr{COLON} { YDVAR(1, VAR_LOCAL_DATA_PTR) } 420158287Smaximunblock-lan-zones{COLON} { YDVAR(1, VAR_UNBLOCK_LAN_ZONES) } 421158287Smaximinsecure-lan-zones{COLON} { YDVAR(1, VAR_INSECURE_LAN_ZONES) } 422158287Smaximstatistics-interval{COLON} { YDVAR(1, VAR_STATISTICS_INTERVAL) } 423158287Smaximstatistics-cumulative{COLON} { YDVAR(1, VAR_STATISTICS_CUMULATIVE) } 424158287Smaximextended-statistics{COLON} { YDVAR(1, VAR_EXTENDED_STATISTICS) } 425158287Smaximshm-enable{COLON} { YDVAR(1, VAR_SHM_ENABLE) } 426158287Smaximshm-key{COLON} { YDVAR(1, VAR_SHM_KEY) } 427158287Smaximremote-control{COLON} { YDVAR(0, VAR_REMOTE_CONTROL) } 428158287Smaximcontrol-enable{COLON} { YDVAR(1, VAR_CONTROL_ENABLE) } 429158287Smaximcontrol-interface{COLON} { YDVAR(1, VAR_CONTROL_INTERFACE) } 430158287Smaximcontrol-port{COLON} { YDVAR(1, VAR_CONTROL_PORT) } 431158287Smaximcontrol-use-cert{COLON} { YDVAR(1, VAR_CONTROL_USE_CERT) } 432158287Smaximserver-key-file{COLON} { YDVAR(1, VAR_SERVER_KEY_FILE) } 433158287Smaximserver-cert-file{COLON} { YDVAR(1, VAR_SERVER_CERT_FILE) } 434158287Smaximcontrol-key-file{COLON} { YDVAR(1, VAR_CONTROL_KEY_FILE) } 435158287Smaximcontrol-cert-file{COLON} { YDVAR(1, VAR_CONTROL_CERT_FILE) } 436158287Smaximpython-script{COLON} { YDVAR(1, VAR_PYTHON_SCRIPT) } 437158287Smaximpython{COLON} { YDVAR(0, VAR_PYTHON) } 438158287Smaximdynlib-file{COLON} { YDVAR(1, VAR_DYNLIB_FILE) } 439158287Smaximdynlib{COLON} { YDVAR(0, VAR_DYNLIB) } 440158287Smaximdomain-insecure{COLON} { YDVAR(1, VAR_DOMAIN_INSECURE) } 441158287Smaximminimal-responses{COLON} { YDVAR(1, VAR_MINIMAL_RESPONSES) } 442158287Smaximrrset-roundrobin{COLON} { YDVAR(1, VAR_RRSET_ROUNDROBIN) } 443158287Smaximunknown-server-time-limit{COLON} { YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) } 444158287Smaximmax-udp-size{COLON} { YDVAR(1, VAR_MAX_UDP_SIZE) } 445158287Smaximdns64-prefix{COLON} { YDVAR(1, VAR_DNS64_PREFIX) } 446158287Smaximdns64-synthall{COLON} { YDVAR(1, VAR_DNS64_SYNTHALL) } 447158287Smaximdns64-ignore-aaaa{COLON} { YDVAR(1, VAR_DNS64_IGNORE_AAAA) } 448158287Smaximdefine-tag{COLON} { YDVAR(1, VAR_DEFINE_TAG) } 449158287Smaximlocal-zone-tag{COLON} { YDVAR(2, VAR_LOCAL_ZONE_TAG) } 450158287Smaximaccess-control-tag{COLON} { YDVAR(2, VAR_ACCESS_CONTROL_TAG) } 451158287Smaximaccess-control-tag-action{COLON} { YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) } 452158287Smaximaccess-control-tag-data{COLON} { YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) } 453158287Smaximaccess-control-view{COLON} { YDVAR(2, VAR_ACCESS_CONTROL_VIEW) } 454158287Smaximlocal-zone-override{COLON} { YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) } 455158287Smaximdnstap{COLON} { YDVAR(0, VAR_DNSTAP) } 456158287Smaximdnstap-enable{COLON} { YDVAR(1, VAR_DNSTAP_ENABLE) } 457158287Smaximdnstap-bidirectional{COLON} { YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) } 458158287Smaximdnstap-socket-path{COLON} { YDVAR(1, VAR_DNSTAP_SOCKET_PATH) } 459158287Smaximdnstap-ip{COLON} { YDVAR(1, VAR_DNSTAP_IP) } 460158287Smaximdnstap-tls{COLON} { YDVAR(1, VAR_DNSTAP_TLS) } 461158287Smaximdnstap-tls-server-name{COLON} { YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) } 462158287Smaximdnstap-tls-cert-bundle{COLON} { YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) } 463158287Smaximdnstap-tls-client-key-file{COLON} { 464158287Smaxim YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) } 465158287Smaximdnstap-tls-client-cert-file{COLON} { 466158287Smaxim YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) } 467158287Smaximdnstap-send-identity{COLON} { YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) } 468158287Smaximdnstap-send-version{COLON} { YDVAR(1, VAR_DNSTAP_SEND_VERSION) } 469158287Smaximdnstap-identity{COLON} { YDVAR(1, VAR_DNSTAP_IDENTITY) } 470158287Smaximdnstap-version{COLON} { YDVAR(1, VAR_DNSTAP_VERSION) } 471158287Smaximdnstap-log-resolver-query-messages{COLON} { 472158287Smaxim YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) } 473158287Smaximdnstap-log-resolver-response-messages{COLON} { 474158287Smaxim YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) } 475158287Smaximdnstap-log-client-query-messages{COLON} { 476158287Smaxim YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) } 477158287Smaximdnstap-log-client-response-messages{COLON} { 478158287Smaxim YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) } 479158287Smaximdnstap-log-forwarder-query-messages{COLON} { 480158287Smaxim YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) } 481158287Smaximdnstap-log-forwarder-response-messages{COLON} { 482158287Smaxim YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) } 483158287Smaximdisable-dnssec-lame-check{COLON} { YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) } 484158287Smaximip-ratelimit{COLON} { YDVAR(1, VAR_IP_RATELIMIT) } 485158287Smaximratelimit{COLON} { YDVAR(1, VAR_RATELIMIT) } 486158287Smaximip-ratelimit-slabs{COLON} { YDVAR(1, VAR_IP_RATELIMIT_SLABS) } 487158287Smaximratelimit-slabs{COLON} { YDVAR(1, VAR_RATELIMIT_SLABS) } 488158287Smaximip-ratelimit-size{COLON} { YDVAR(1, VAR_IP_RATELIMIT_SIZE) } 489158287Smaximratelimit-size{COLON} { YDVAR(1, VAR_RATELIMIT_SIZE) } 490158287Smaximratelimit-for-domain{COLON} { YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) } 491158287Smaximratelimit-below-domain{COLON} { YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) } 492158287Smaximip-ratelimit-factor{COLON} { YDVAR(1, VAR_IP_RATELIMIT_FACTOR) } 493158287Smaximratelimit-factor{COLON} { YDVAR(1, VAR_RATELIMIT_FACTOR) } 494158287Smaximlow-rtt{COLON} { YDVAR(1, VAR_LOW_RTT) } 495158287Smaximfast-server-num{COLON} { YDVAR(1, VAR_FAST_SERVER_NUM) } 496158287Smaximlow-rtt-pct{COLON} { YDVAR(1, VAR_FAST_SERVER_PERMIL) } 497158287Smaximlow-rtt-permil{COLON} { YDVAR(1, VAR_FAST_SERVER_PERMIL) } 498158287Smaximfast-server-permil{COLON} { YDVAR(1, VAR_FAST_SERVER_PERMIL) } 499158287Smaximresponse-ip-tag{COLON} { YDVAR(2, VAR_RESPONSE_IP_TAG) } 500158287Smaximresponse-ip{COLON} { YDVAR(2, VAR_RESPONSE_IP) } 501158287Smaximresponse-ip-data{COLON} { YDVAR(2, VAR_RESPONSE_IP_DATA) } 502158287Smaximdnscrypt{COLON} { YDVAR(0, VAR_DNSCRYPT) } 503158287Smaximdnscrypt-enable{COLON} { YDVAR(1, VAR_DNSCRYPT_ENABLE) } 504158287Smaximdnscrypt-port{COLON} { YDVAR(1, VAR_DNSCRYPT_PORT) } 505158287Smaximdnscrypt-provider{COLON} { YDVAR(1, VAR_DNSCRYPT_PROVIDER) } 506158287Smaximdnscrypt-secret-key{COLON} { YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) } 507158287Smaximdnscrypt-provider-cert{COLON} { YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) } 508158287Smaximdnscrypt-provider-cert-rotated{COLON} { YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) } 509158287Smaximdnscrypt-shared-secret-cache-size{COLON} { 510158287Smaxim YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) } 511158287Smaximdnscrypt-shared-secret-cache-slabs{COLON} { 512158287Smaxim YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) } 513158287Smaximdnscrypt-nonce-cache-size{COLON} { YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) } 514158287Smaximdnscrypt-nonce-cache-slabs{COLON} { YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) } 515158287Smaximpad-responses{COLON} { YDVAR(1, VAR_PAD_RESPONSES) } 516158287Smaximpad-responses-block-size{COLON} { YDVAR(1, VAR_PAD_RESPONSES_BLOCK_SIZE) } 517158287Smaximpad-queries{COLON} { YDVAR(1, VAR_PAD_QUERIES) } 518158287Smaximpad-queries-block-size{COLON} { YDVAR(1, VAR_PAD_QUERIES_BLOCK_SIZE) } 519158287Smaximipsecmod-enabled{COLON} { YDVAR(1, VAR_IPSECMOD_ENABLED) } 520158287Smaximipsecmod-ignore-bogus{COLON} { YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) } 521158287Smaximipsecmod-hook{COLON} { YDVAR(1, VAR_IPSECMOD_HOOK) } 522158287Smaximipsecmod-max-ttl{COLON} { YDVAR(1, VAR_IPSECMOD_MAX_TTL) } 523158289Sumeipsecmod-whitelist{COLON} { YDVAR(1, VAR_IPSECMOD_WHITELIST) } 524158289Sumeipsecmod-allow{COLON} { YDVAR(1, VAR_IPSECMOD_WHITELIST) } 525158289Sumeipsecmod-strict{COLON} { YDVAR(1, VAR_IPSECMOD_STRICT) } 526158287Smaximcachedb{COLON} { YDVAR(0, VAR_CACHEDB) } 527158287Smaximbackend{COLON} { YDVAR(1, VAR_CACHEDB_BACKEND) } 528158287Smaximsecret-seed{COLON} { YDVAR(1, VAR_CACHEDB_SECRETSEED) } 529158287Smaximredis-server-host{COLON} { YDVAR(1, VAR_CACHEDB_REDISHOST) } 530158287Smaximredis-server-port{COLON} { YDVAR(1, VAR_CACHEDB_REDISPORT) } 531158287Smaximredis-timeout{COLON} { YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) } 532158287Smaximredis-expire-records{COLON} { YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) } 533158287Smaximipset{COLON} { YDVAR(0, VAR_IPSET) } 534158287Smaximname-v4{COLON} { YDVAR(1, VAR_IPSET_NAME_V4) } 535158287Smaximname-v6{COLON} { YDVAR(1, VAR_IPSET_NAME_V6) } 536158287Smaximudp-upstream-without-downstream{COLON} { YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) } 537158287Smaximtcp-connection-limit{COLON} { YDVAR(2, VAR_TCP_CONNECTION_LIMIT) } 538158287Smaximedns-client-string{COLON} { YDVAR(2, VAR_EDNS_CLIENT_STRING) } 539158287Smaximedns-client-string-opcode{COLON} { YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) } 540158287Smaximnsid{COLON} { YDVAR(1, VAR_NSID ) } 541158287Smaxim<INITIAL,val>{NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++; } 542158287Smaxim 543158287Smaxim /* Quoted strings. Strip leading and ending quotes */ 544158287Smaxim<val>\" { BEGIN(quotedstring); LEXOUT(("QS ")); } 545158287Smaxim<quotedstring><<EOF>> { 546158287Smaxim ub_c_error("EOF inside quoted string"); 547158287Smaxim if(--num_args == 0) { BEGIN(INITIAL); } 548158287Smaxim else { BEGIN(val); } 549158287Smaxim} 550158287Smaxim<quotedstring>{DQANY}* { LEXOUT(("STR(%s) ", ub_c_text)); yymore(); } 551158287Smaxim<quotedstring>{NEWLINE} { ub_c_error("newline inside quoted string, no end \""); 552158287Smaxim cfg_parser->line++; BEGIN(INITIAL); } 553158287Smaxim<quotedstring>\" { 554158287Smaxim LEXOUT(("QE ")); 555158287Smaxim if(--num_args == 0) { BEGIN(INITIAL); } 556158287Smaxim else { BEGIN(val); } 557158287Smaxim ub_c_text[ub_c_leng - 1] = '\0'; 558158287Smaxim ub_c_lval.str = strdup(ub_c_text); 559158287Smaxim if(!ub_c_lval.str) 560158287Smaxim ub_c_error("out of memory"); 561158287Smaxim return STRING_ARG; 562158287Smaxim} 563158287Smaxim 564158287Smaxim /* Single Quoted strings. Strip leading and ending quotes */ 565158287Smaxim<val>\' { BEGIN(singlequotedstr); LEXOUT(("SQS ")); } 566158287Smaxim<singlequotedstr><<EOF>> { 567158287Smaxim ub_c_error("EOF inside quoted string"); 568158287Smaxim if(--num_args == 0) { BEGIN(INITIAL); } 569158287Smaxim else { BEGIN(val); } 570158287Smaxim} 571158287Smaxim<singlequotedstr>{SQANY}* { LEXOUT(("STR(%s) ", ub_c_text)); yymore(); } 572158287Smaxim<singlequotedstr>{NEWLINE} { ub_c_error("newline inside quoted string, no end '"); 573158287Smaxim cfg_parser->line++; BEGIN(INITIAL); } 574158287Smaxim<singlequotedstr>\' { 575158287Smaxim LEXOUT(("SQE ")); 576202198Sed if(--num_args == 0) { BEGIN(INITIAL); } 577202198Sed else { BEGIN(val); } 578250942Sghelmer ub_c_text[ub_c_leng - 1] = '\0'; 579250942Sghelmer ub_c_lval.str = strdup(ub_c_text); 580250942Sghelmer if(!ub_c_lval.str) 581250942Sghelmer ub_c_error("out of memory"); 582250942Sghelmer return STRING_ARG; 583250942Sghelmer} 584250942Sghelmer 585250942Sghelmer /* include: directive */ 586250942Sghelmer<INITIAL,val>include{COLON} { 587250942Sghelmer LEXOUT(("v(%s) ", ub_c_text)); inc_prev = YYSTATE; BEGIN(include); } 588250942Sghelmer<include><<EOF>> { 589250942Sghelmer ub_c_error("EOF inside include directive"); 590250942Sghelmer BEGIN(inc_prev); 591250942Sghelmer} 592250942Sghelmer<include>{SPACE}* { LEXOUT(("ISP ")); /* ignore */ } 593250942Sghelmer<include>{NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++;} 594250942Sghelmer<include>\" { LEXOUT(("IQS ")); BEGIN(include_quoted); } 595250942Sghelmer<include>{UNQUOTEDLETTER}* { 596250942Sghelmer LEXOUT(("Iunquotedstr(%s) ", ub_c_text)); 597250942Sghelmer config_start_include_glob(ub_c_text, 0); 598250942Sghelmer BEGIN(inc_prev); 599250942Sghelmer} 600250942Sghelmer<include_quoted><<EOF>> { 601250942Sghelmer ub_c_error("EOF inside quoted string"); 602250942Sghelmer BEGIN(inc_prev); 603250942Sghelmer} 604250942Sghelmer<include_quoted>{DQANY}* { LEXOUT(("ISTR(%s) ", ub_c_text)); yymore(); } 605250942Sghelmer<include_quoted>{NEWLINE} { ub_c_error("newline before \" in include name"); 606250942Sghelmer cfg_parser->line++; BEGIN(inc_prev); } 607250942Sghelmer<include_quoted>\" { 608250942Sghelmer LEXOUT(("IQE ")); 609250942Sghelmer ub_c_text[ub_c_leng - 1] = '\0'; 610250942Sghelmer config_start_include_glob(ub_c_text,0); 611250942Sghelmer BEGIN(inc_prev); 612250942Sghelmer} 613250942Sghelmer<INITIAL,val><<EOF>> { 614250942Sghelmer LEXOUT(("LEXEOF ")); 615250942Sghelmer yy_set_bol(1); /* Set beginning of line, so "^" rules match. */ 616250942Sghelmer if (!config_include_stack) { 617250942Sghelmer yyterminate(); 618250942Sghelmer } else { 619202198Sed fclose(yyin); 620202198Sed int prev_toplevel = inc_toplevel; 621202198Sed fclose(ub_c_in); 622202198Sed config_end_include(); 623202198Sed if(prev_toplevel) return (VAR_FORCE_TOPLEVEL); 624202198Sed } 625202198Sed} 626202198Sed 627202198Sed /* include-toplevel: directive */ 628202198Sed<INITIAL,val>include-toplevel{COLON} { 629202198Sed LEXOUT(("v(%s) ", ub_c_text)); inc_prev = YYSTATE; BEGIN(include_toplevel); 630202198Sed} 631202198Sed<include_toplevel><<EOF>> { 632202198Sed ub_c_error("EOF inside include_toplevel directive"); 633202198Sed BEGIN(inc_prev); 634202198Sed} 635202718Sed<include_toplevel>{SPACE}* { LEXOUT(("ITSP ")); /* ignore */ } 636202718Sed<include_toplevel>{NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++; } 637202718Sed<include_toplevel>\" { LEXOUT(("ITQS ")); BEGIN(include_toplevel_quoted); } 638202198Sed<include_toplevel>{UNQUOTEDLETTER}* { 639202198Sed LEXOUT(("ITunquotedstr(%s) ", ub_c_text)); 640202198Sed config_start_include_glob(ub_c_text, 1); 641202198Sed BEGIN(inc_prev); 642202198Sed return (VAR_FORCE_TOPLEVEL); 643202198Sed} 644202198Sed<include_toplevel_quoted><<EOF>> { 645202198Sed ub_c_error("EOF inside quoted string"); 646202198Sed BEGIN(inc_prev); 647202198Sed} 648202198Sed<include_toplevel_quoted>{DQANY}* { LEXOUT(("ITSTR(%s) ", ub_c_text)); yymore(); } 649202198Sed<include_toplevel_quoted>{NEWLINE} { 650202198Sed ub_c_error("newline before \" in include name"); 651202198Sed cfg_parser->line++; BEGIN(inc_prev); 652202198Sed} 653202198Sed<include_toplevel_quoted>\" { 654202198Sed LEXOUT(("ITQE ")); 655202559Sed ub_c_text[yyleng - 1] = '\0'; 656202559Sed config_start_include_glob(ub_c_text, 1); 657202198Sed BEGIN(inc_prev); 658226841Sed return (VAR_FORCE_TOPLEVEL); 659226841Sed} 660226841Sed 661226841Sed<val>{UNQUOTEDLETTER}* { LEXOUT(("unquotedstr(%s) ", ub_c_text)); 662226841Sed if(--num_args == 0) { BEGIN(INITIAL); } 663226841Sed ub_c_lval.str = strdup(ub_c_text); return STRING_ARG; } 664226841Sed 665226841Sed{UNQUOTEDLETTER_NOCOLON}* { 666226841Sed ub_c_error_msg("unknown keyword '%s'", ub_c_text); 667226841Sed } 668226841Sed 669202198Sed<*>. { 670202198Sed ub_c_error_msg("stray '%s'", ub_c_text); 671202198Sed } 672202559Sed 673202198Sed%% 674202198Sed