/* * $Id$ * * scanner for cfg files * * Copyright (C) 2001-2003 FhG Fokus * * This file is part of ser, a free SIP server. * * ser is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version * * For a license to use the ser software under conditions * other than those described here, or to purchase support for this * software, please contact iptel.org by e-mail at the following addresses: * info@iptel.org * * ser is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * History: * ------- * 2003-01-29 src_port added (jiri) * 2003-01-23 mhomed added (jiri) * 2003-03-19 replaced all the mallocs/frees w/ pkg_malloc/pkg_free (andrei) * 2003-04-01 added dst_port, proto (tcp, udp, tls), af(inet, inet6) (andrei) * 2003-04-05 s/reply_route/failure_route, onreply_route introduced (jiri) * 2003-04-12 added force_rport, chdir and wdir (andrei) * 2003-04-22 strip_tail added (jiri) * 2003-07-03 tls* (disable, certificate, private_key, ca_list, verify, * require_certificate added (andrei) * 2003-07-06 more tls config. vars added: tls_method, tls_port_no (andrei) * 2003-10-02 added {,set_}advertised_{address,port} (andrei) * 2003-10-07 added hex and octal numbers support (andrei) * 2003-10-10 replaced len_gt w/ msg:len (andrei) * 2003-10-13 added fifo_dir (andrei) * 2003-10-28 added tcp_accept_aliases (andrei) * 2003-11-29 added {tcp_send, tcp_connect, tls_*}_timeout (andrei) * 2004-03-30 added DISABLE_CORE and OPEN_FD_LIMIT (andrei) * 2004-04-28 added sock_mode (replaces fifo_mode), sock_user & * sock_group (andrei) * 2004-05-03 applied multicast support patch from janakj * added MCAST_TTL (andrei) * 2004-10-08 more escapes: \", \xHH, \nnn and minor optimizations (andrei) * 2004-10-19 added FROM_URI and TO_URI (andrei) * 2004-11-30 added force_send_socket * 2005-07-08 added tcp_connection_lifetime, tcp_poll_method, * tcp_max_connections (andrei) * 2005-07-11 added dns_retr_{time,no}, dns_servers_no, dns_use_search_list, * dns_try_ipv6 (andrei) * 2005-12-11 added onsend_route, snd_{ip,port,proto,af}, * to_{ip,port} (andrei) * 2005-12-12 separated drop, exit, break, return, added RETCODE (andrei) * 2005-12-19 select framework (mma) * 2006-09-11 added dns cache (use, flags, ttls, mem ,gc) & dst blacklist * options (andrei) * 2006-10-13 added STUN_ALLOW_STUN, STUN_ALLOW_FP, STUN_REFRESH_INTERVAL * (vlada) * 2007-06-07 added SHM_FORCE_ALLOC, MLOCK_PAGES, REAL_TIME, RT_PRIO, * RT_POLICY, RT_TIMER1_PRIO, RT_TIMER1_POLICY, RT_TIMER2_PRIO, * RT_TIMER2_POLICY (andrei) * 2007-06-16 added DNS_SRV_LB, DNS_TRY_NAPTR (andrei) * 2007-06-18 added DNS_{UDP,TCP,TLS}_PREF (andrei) * 2007-09-10 introduced phone2tel option which allows NOT to consider * user=phone URIs as TEL URIs (jiri) * 2007-10-10 added DNS_SEARCH_FMATCH (mma) * 2007-11-28 added TCP_OPT_{FD_CACHE, DEFER_ACCEPT, DELAYED_ACK, SYNCNT, * LINGER2, KEEPALIVE, KEEPIDLE, KEEPINTVL, KEEPCNT} (andrei) * 2008-01-24 added CFG_DESCRIPTION used by cfg_var (Miklos) * 2008-11-28 added support for kamailio pvars and avp/pvar guessing (andrei) * 2008-12-11 added support for "string1" "string2" (andrei) * 2009-03-10 added SET_USERPHONE action (Miklos) * 2009-04-24 add strlen, strempty and defined operators (andrei) * 2009-03-07 RETCODE, it's now a core pvar (andrei) * 2010-01-10 added SHM_MEM_SZ (andrei) * 2010-02-17 added DST_BLST_{UDP,TCP,TLS,SCTP}_IMASK (andrei) */ %option noinput %{ #include "dprint.h" #include "globals.h" #include "mem/mem.h" #include #include #include "ip_addr.h" #include "usr_avp.h" #include "select.h" #include "cfg.tab.h" #include "sr_compat.h" #include "ppcfg.h" /* states */ #define INITIAL_S 0 #define COMMENT_S 1 #define COMMENT_LN_S 2 #define STRING_S 3 #define ATTR_S 4 /* avp/attr */ #define SELECT_S 5 #define AVP_PVAR_S 6 /* avp or pvar */ #define PVAR_P_S 7 /* pvar: $(...) or $foo(...)*/ #define PVARID_S 8 /* $foo.bar...*/ #define STR_BETWEEN_S 9 #define LINECOMMENT_S 10 #define DEFINE_S 11 #define DEFINE_EOL_S 12 #define IFDEF_S 13 #define IFDEF_EOL_S 14 #define IFDEF_SKIP_S 15 #define DEFINE_DATA_S 16 #define STR_BUF_ALLOC_UNIT 128 struct str_buf{ char* s; char* crt; int left; }; static int comment_nest=0; static int p_nest=0; static int state=0, old_state=0, old_initial=0; static struct str_buf s_buf; int line=1; int column=1; int startcolumn=1; int startline=1; char *finame = 0; static int ign_lines=0; static int ign_columns=0; char* yy_number_str=0; /* str correspondent for the current NUMBER token */ int r = 0; str *sdef = 0; static char* addchar(struct str_buf *, char); static char* addstr(struct str_buf *, char*, int); static void count(); static void count_more(); static void count_ignore(); #define MAX_INCLUDE_DEPTH 10 static struct sr_yy_state { YY_BUFFER_STATE state; int line; int column; int startcolumn; int startline; char *finame; } include_stack[MAX_INCLUDE_DEPTH]; static int include_stack_ptr = 0; static int sr_push_yy_state(char *fin, int mode); static int sr_pop_yy_state(); static struct sr_yy_fname { char *fname; struct sr_yy_fname *next; } *sr_yy_fname_list = 0; static str *pp_define_get(int len, const char * text); static int pp_ifdef_type(int pos); static void pp_ifdef_var(int len, const char * text); static void pp_ifdef(); static void pp_else(); static void pp_endif(); %} /* start conditions */ %x STRING1 STRING2 STR_BETWEEN COMMENT COMMENT_LN ATTR SELECT AVP_PVAR PVAR_P %x PVARID INCLF IMPTF %x LINECOMMENT DEFINE_ID DEFINE_EOL DEFINE_DATA IFDEF_ID IFDEF_EOL IFDEF_SKIP /* config script types : #!SER or #!KAMAILIO or #!MAX_COMPAT */ SER_CFG SER KAMAILIO_CFG KAMAILIO|OPENSER MAXCOMPAT_CFG MAXCOMPAT|ALL /* action keywords */ FORWARD forward FORWARD_TCP forward_tcp FORWARD_UDP forward_udp FORWARD_TLS forward_tls FORWARD_SCTP forward_sctp DROP "drop" EXIT "exit" RETURN "return" BREAK "break" LOG log ERROR error ROUTE route ROUTE_REQUEST request_route ROUTE_FAILURE failure_route ROUTE_REPLY reply_route ROUTE_ONREPLY onreply_route ROUTE_BRANCH branch_route ROUTE_SEND onsend_route ROUTE_EVENT event_route EXEC exec FORCE_RPORT "force_rport"|"add_rport" ADD_LOCAL_RPORT "add_local_rport" FORCE_TCP_ALIAS "force_tcp_alias"|"add_tcp_alias" UDP_MTU "udp_mtu" UDP_MTU_TRY_PROTO "udp_mtu_try_proto" UDP4_RAW "udp4_raw" UDP4_RAW_MTU "udp4_raw_mtu" UDP4_RAW_TTL "udp4_raw_ttl" SETFLAG setflag RESETFLAG resetflag ISFLAGSET isflagset FLAGS_DECL "flags"|"bool" SETAVPFLAG setavpflag RESETAVPFLAG resetavpflag ISAVPFLAGSET isavpflagset AVPFLAGS_DECL avpflags SET_HOST "rewritehost"|"sethost"|"seth" SET_HOSTPORT "rewritehostport"|"sethostport"|"sethp" SET_HOSTPORTTRANS "rewritehostporttrans"|"sethostporttrans"|"sethpt" SET_USER "rewriteuser"|"setuser"|"setu" SET_USERPASS "rewriteuserpass"|"setuserpass"|"setup" SET_PORT "rewriteport"|"setport"|"setp" SET_URI "rewriteuri"|"seturi" REVERT_URI "revert_uri" PREFIX "prefix" STRIP "strip" STRIP_TAIL "strip_tail" SET_USERPHONE "userphone" REMOVE_BRANCH "remove_branch" CLEAR_BRANCHES "clear_branches" IF "if" ELSE "else" SET_ADV_ADDRESS "set_advertised_address" SET_ADV_PORT "set_advertised_port" FORCE_SEND_SOCKET "force_send_socket" SET_FWD_NO_CONNECT "set_forward_no_connect" SET_RPL_NO_CONNECT "set_reply_no_connect" SET_FWD_CLOSE "set_forward_close" SET_RPL_CLOSE "set_reply_close" SWITCH "switch" CASE "case" DEFAULT "default" WHILE "while" CFG_SELECT "cfg_select" CFG_RESET "cfg_reset" /*ACTION LVALUES*/ URIHOST "uri:host" URIPORT "uri:port" MAX_LEN "max_len" /* condition keywords */ METHOD method /* hack -- the second element in first line is referable as either uri or status; it only would makes sense to call it "uri" from route{} and status from onreply_route{} */ URI "uri"|"status" FROM_URI "from_uri" TO_URI "to_uri" SRCIP src_ip SRCPORT src_port DSTIP dst_ip DSTPORT dst_port SNDIP snd_ip SNDPORT snd_port SNDPROTO snd_proto|to_proto SNDAF snd_af|to_af TOIP to_ip TOPORT to_port PROTO proto AF af MYSELF myself MSGLEN "msg:len" RETCODE \$\?|\$retcode|\$rc /* operators */ EQUAL = EQUAL_T == GT > LT < GTE >= LTE <= DIFF != MATCH =~ ADDEQ "+=" NOT !|"not" LOG_AND "and"|"&&" BIN_AND "&" LOG_OR "or"|"||" BIN_OR "|" BIN_NOT "~" BIN_XOR "^" BIN_LSHIFT "<<" BIN_RSHIFT ">>" PLUS "+" MINUS "-" MODULO "mod" STRLEN "strlen" STREMPTY "strempty" DEFINED "defined" STREQ eq INTEQ ieq STRDIFF ne INTDIFF ine INTCAST \(int\) STRCAST \(str\) /* Attribute specification */ ATTR_MARK "%" VAR_MARK "$" SELECT_MARK "@" ATTR_FROM "f" ATTR_TO "t" ATTR_FROMURI "fr" ATTR_TOURI "tr" ATTR_FROMUSER "fu" ATTR_TOUSER "tu" ATTR_FROMDOMAIN "fd" ATTR_TODOMAIN "td" ATTR_GLOBAL "g" /* avp prefix */ AVP_PREF (([ft][rud]?)|g)\. /* config vars. */ DEBUG debug FORK fork FORK_DELAY fork_delay LOGSTDERROR log_stderror LOGFACILITY log_facility LOGNAME log_name LOGCOLOR log_color LISTEN listen ADVERTISE advertise|ADVERTISE ALIAS alias SR_AUTO_ALIASES auto_aliases DNS dns REV_DNS rev_dns DNS_TRY_IPV6 dns_try_ipv6 DNS_TRY_NAPTR dns_try_naptr DNS_SRV_LB dns_srv_lb|dns_srv_loadbalancing DNS_UDP_PREF dns_udp_pref|dns_udp_preference DNS_TCP_PREF dns_tcp_pref|dns_tcp_preference DNS_TLS_PREF dns_tls_pref|dns_tls_preference DNS_SCTP_PREF dns_sctp_pref|dns_sctp_preference DNS_RETR_TIME dns_retr_time DNS_RETR_NO dns_retr_no DNS_SERVERS_NO dns_servers_no DNS_USE_SEARCH dns_use_search_list DNS_SEARCH_FMATCH dns_search_full_match /* dns cache */ DNS_CACHE_INIT dns_cache_init DNS_USE_CACHE use_dns_cache DNS_USE_FAILOVER use_dns_failover DNS_CACHE_FLAGS dns_cache_flags DNS_CACHE_NEG_TTL dns_cache_negative_ttl DNS_CACHE_MIN_TTL dns_cache_min_ttl DNS_CACHE_MAX_TTL dns_cache_max_ttl DNS_CACHE_MEM dns_cache_mem DNS_CACHE_GC_INT dns_cache_gc_interval DNS_CACHE_DEL_NONEXP dns_cache_del_nonexp|dns_cache_delete_nonexpired /* ipv6 auto bind */ AUTO_BIND_IPV6 auto_bind_ipv6 /* blacklist */ DST_BLST_INIT dst_blacklist_init USE_DST_BLST use_dst_blacklist DST_BLST_MEM dst_blacklist_mem DST_BLST_TTL dst_blacklist_expire|dst_blacklist_ttl DST_BLST_GC_INT dst_blacklist_gc_interval DST_BLST_UDP_IMASK dst_blacklist_udp_imask DST_BLST_TCP_IMASK dst_blacklist_tcp_imask DST_BLST_TLS_IMASK dst_blacklist_tls_imask DST_BLST_SCTP_IMASK dst_blacklist_sctp_imask PORT port STAT statistics MAXBUFFER maxbuffer SQL_BUFFER_SIZE sql_buffer_size CHILDREN children SOCKET_WORKERS socket_workers CHECK_VIA check_via PHONE2TEL phone2tel SYN_BRANCH syn_branch MEMLOG "memlog"|"mem_log" MEMDBG "memdbg"|"mem_dbg" MEMSUM "mem_summary" MEMSAFETY "mem_safety" MEMJOIN "mem_join" CORELOG "corelog"|"core_log" SIP_WARNING sip_warning SERVER_SIGNATURE server_signature SERVER_HEADER server_header USER_AGENT_HEADER user_agent_header REPLY_TO_VIA reply_to_via USER "user"|"uid" GROUP "group"|"gid" CHROOT "chroot" WDIR "workdir"|"wdir" MHOMED mhomed DISABLE_TCP "disable_tcp" TCP_CHILDREN "tcp_children" TCP_ACCEPT_ALIASES "tcp_accept_aliases" TCP_SEND_TIMEOUT "tcp_send_timeout" TCP_CONNECT_TIMEOUT "tcp_connect_timeout" TCP_CON_LIFETIME "tcp_connection_lifetime" TCP_POLL_METHOD "tcp_poll_method" TCP_MAX_CONNECTIONS "tcp_max_connections" TLS_MAX_CONNECTIONS "tls_max_connections" TCP_NO_CONNECT "tcp_no_connect" TCP_SOURCE_IPV4 "tcp_source_ipv4" TCP_SOURCE_IPV6 "tcp_source_ipv6" TCP_OPT_FD_CACHE "tcp_fd_cache" TCP_OPT_BUF_WRITE "tcp_buf_write"|"tcp_async" TCP_OPT_CONN_WQ_MAX "tcp_conn_wq_max" TCP_OPT_WQ_MAX "tcp_wq_max" TCP_OPT_RD_BUF "tcp_rd_buf_size" TCP_OPT_WQ_BLK "tcp_wq_blk_size" TCP_OPT_DEFER_ACCEPT "tcp_defer_accept" TCP_OPT_DELAYED_ACK "tcp_delayed_ack" TCP_OPT_SYNCNT "tcp_syncnt" TCP_OPT_LINGER2 "tcp_linger2" TCP_OPT_KEEPALIVE "tcp_keepalive" TCP_OPT_KEEPIDLE "tcp_keepidle" TCP_OPT_KEEPINTVL "tcp_keepintvl" TCP_OPT_KEEPCNT "tcp_keepcnt" TCP_OPT_CRLF_PING "tcp_crlf_ping" TCP_OPT_ACCEPT_NO_CL "tcp_accept_no_cl" TCP_CLONE_RCVBUF "tcp_clone_rcvbuf" DISABLE_TLS "disable_tls"|"tls_disable" ENABLE_TLS "enable_tls"|"tls_enable" TLSLOG "tlslog"|"tls_log" TLS_PORT_NO "tls_port_no" TLS_METHOD "tls_method" TLS_VERIFY "tls_verify" TLS_REQUIRE_CERTIFICATE "tls_require_certificate" TLS_CERTIFICATE "tls_certificate" TLS_PRIVATE_KEY "tls_private_key" TLS_CA_LIST "tls_ca_list" TLS_HANDSHAKE_TIMEOUT "tls_handshake_timeout" TLS_SEND_TIMEOUT "tls_send_timeout" DISABLE_SCTP "disable_sctp" ENABLE_SCTP "enable_sctp" SCTP_CHILDREN "sctp_children" SCTP_SOCKET_RCVBUF "sctp_socket_rcvbuf"|"sctp_socket_receive_buffer" SCTP_SOCKET_SNDBUF "sctp_socket_sndbuf"|"sctp_socket_send_buffer" SCTP_AUTOCLOSE "sctp_autoclose" SCTP_SEND_TTL "sctp_send_ttl" SCTP_SEND_RETRIES "sctp_send_retries" SCTP_ASSOC_TRACKING "sctp_assoc_tracking" SCTP_ASSOC_REUSE "sctp_assoc_reuse" SCTP_MAX_ASSOCS "sctp_max_assocs" SCTP_SRTO_INITIAL "sctp_srto_initial" SCTP_SRTO_MAX "sctp_srto_max" SCTP_SRTO_MIN "sctp_srto_min" SCTP_ASOCMAXRXT "sctp_asocmaxrxt" SCTP_INIT_MAX_ATTEMPTS "sctp_init_max_attempts" SCTP_INIT_MAX_TIMEO "sctp_init_max_timeo" SCTP_HBINTERVAL "sctp_hbinterval" SCTP_PATHMAXRXT "sctp_pathmaxrxt" SCTP_SACK_DELAY "sctp_sack_delay" SCTP_SACK_FREQ "sctp_sack_freq" SCTP_MAX_BURST "sctp_max_burst" ADVERTISED_ADDRESS "advertised_address" ADVERTISED_PORT "advertised_port" DISABLE_CORE "disable_core_dump" OPEN_FD_LIMIT "open_files_limit" SHM_MEM_SZ "shm"|"shm_mem"|"shm_mem_size" SHM_FORCE_ALLOC "shm_force_alloc" MLOCK_PAGES "mlock_pages" REAL_TIME "real_time" RT_PRIO "rt_prio" RT_POLICY "rt_policy" RT_TIMER1_PRIO "rt_timer1_prio"|"rt_fast_timer_prio"|"rt_ftimer_prio" RT_TIMER1_POLICY "rt_timer1_policy"|"rt_ftimer_policy" RT_TIMER2_PRIO "rt_timer2_prio"|"rt_stimer_prio" RT_TIMER2_POLICY "rt_timer2_policy"|"rt_stimer_policy" MCAST_LOOPBACK "mcast_loopback" MCAST_TTL "mcast_ttl" TOS "tos" PMTU_DISCOVERY "pmtu_discovery" KILL_TIMEOUT "exit_timeout"|"ser_kill_timeout" MAX_WLOOPS "max_while_loops" PVBUFSIZE "pv_buffer_size" PVBUFSLOTS "pv_buffer_slots" HTTP_REPLY_HACK "http_reply_hack" VERSION_TABLE_CFG "version_table" /* stun config variables */ STUN_REFRESH_INTERVAL "stun_refresh_interval" STUN_ALLOW_STUN "stun_allow_stun" STUN_ALLOW_FP "stun_allow_fp" SERVER_ID "server_id" LATENCY_LOG latency_log LATENCY_LIMIT_DB latency_limit_db LATENCY_LIMIT_ACTION latency_limit_action MSG_TIME msg_time CFG_DESCRIPTION "description"|"descr"|"desc" LOADMODULE loadmodule LOADPATH "loadpath"|"mpath" MODPARAM modparam /* values */ YES "yes"|"true"|"on"|"enable" NO "no"|"false"|"off"|"disable" UDP "udp"|"UDP" TCP "tcp"|"TCP" TLS "tls"|"TLS" SCTP "sctp"|"SCTP" WS "ws"|"WS" WSS "wss"|"WSS" INET "inet"|"INET" INET6 "inet6"|"INET6" SSLv23 "sslv23"|"SSLv23"|"SSLV23" SSLv2 "sslv2"|"SSLv2"|"SSLV2" SSLv3 "sslv3"|"SSLv3"|"SSLV3" TLSv1 "tlsv1"|"TLSv1"|"TLSV1" LETTER [a-zA-Z] DIGIT [0-9] LETTER_ {LETTER}|[_] ALPHANUM {LETTER_}|{DIGIT} ID {LETTER_}{ALPHANUM}* NUM_ID {ALPHANUM}+ HEX [0-9a-fA-F] HEXNUMBER 0x{HEX}+ OCTNUMBER 0[0-7]+ DECNUMBER 0|([1-9]{DIGIT}*) BINNUMBER [0-1]+b HEX4 {HEX}{1,4} IPV6ADDR ({HEX4}":"){7}{HEX4}|({HEX4}":"){1,7}(":"{HEX4}){1,7}|":"(":"{HEX4}){1,7}|({HEX4}":"){1,7}":"|"::" QUOTES \" TICK \' SLASH "/" SEMICOLON ; RPAREN \) LPAREN \( LBRACE \{ RBRACE \} LBRACK \[ RBRACK \] COMMA "," COLON ":" STAR \* DOT \. CR \n EVENT_RT_NAME [a-zA-Z][0-9a-zA-Z-]*":"[a-zA-Z][0-9a-zA-Z-]* COM_LINE # COM_START "/\*" COM_END "\*/" /* start of pre-processing directives */ PREP_START "#!"|"!!" DEFINE "define"|"def" IFDEF ifdef IFNDEF ifndef ENDIF endif TRYDEF "trydefine"|"trydef" REDEF "redefine"|"redef" /* else is already defined */ EAT_ABLE [\ \t\b\r] /* pre-processing blocks */ SUBST subst SUBSTDEF substdef SUBSTDEFS substdefs /* include files */ INCLUDEFILE "include_file" IMPORTFILE "import_file" %% {EAT_ABLE} { count(); } {FORWARD} {count(); yylval.strval=yytext; return FORWARD; } {FORWARD_TCP} {count(); yylval.strval=yytext; return FORWARD_TCP; } {FORWARD_TLS} {count(); yylval.strval=yytext; return FORWARD_TLS; } {FORWARD_SCTP} {count(); yylval.strval=yytext; return FORWARD_SCTP;} {FORWARD_UDP} {count(); yylval.strval=yytext; return FORWARD_UDP; } {DROP} { count(); yylval.strval=yytext; return DROP; } {EXIT} { count(); yylval.strval=yytext; return EXIT; } {RETURN} { count(); yylval.strval=yytext; return RETURN; } {BREAK} { count(); yylval.strval=yytext; return BREAK; } {LOG} { count(); yylval.strval=yytext; return LOG_TOK; } {ERROR} { count(); yylval.strval=yytext; return ERROR; } {SETFLAG} { count(); yylval.strval=yytext; return SETFLAG; } {RESETFLAG} { count(); yylval.strval=yytext; return RESETFLAG; } {ISFLAGSET} { count(); yylval.strval=yytext; return ISFLAGSET; } {FLAGS_DECL} { count(); yylval.strval=yytext; return FLAGS_DECL; } {SETAVPFLAG} { count(); yylval.strval=yytext; return SETAVPFLAG; } {RESETAVPFLAG} { count(); yylval.strval=yytext; return RESETAVPFLAG; } {ISAVPFLAGSET} { count(); yylval.strval=yytext; return ISAVPFLAGSET; } {AVPFLAGS_DECL} { count(); yylval.strval=yytext; return AVPFLAGS_DECL; } {MSGLEN} { count(); yylval.strval=yytext; return MSGLEN; } {ROUTE} { count(); yylval.strval=yytext; return ROUTE; } {ROUTE_REQUEST} { count(); yylval.strval=yytext; return ROUTE_REQUEST; } {ROUTE_ONREPLY} { count(); yylval.strval=yytext; return ROUTE_ONREPLY; } {ROUTE_REPLY} { count(); yylval.strval=yytext; return ROUTE_REPLY; } {ROUTE_FAILURE} { count(); yylval.strval=yytext; return ROUTE_FAILURE; } {ROUTE_BRANCH} { count(); yylval.strval=yytext; return ROUTE_BRANCH; } {ROUTE_SEND} { count(); yylval.strval=yytext; return ROUTE_SEND; } {ROUTE_EVENT} { count(); yylval.strval=yytext; return ROUTE_EVENT; } {EXEC} { count(); yylval.strval=yytext; return EXEC; } {SET_HOST} { count(); yylval.strval=yytext; return SET_HOST; } {SET_HOSTPORT} { count(); yylval.strval=yytext; return SET_HOSTPORT; } {SET_HOSTPORTTRANS} { count(); yylval.strval=yytext; return SET_HOSTPORTTRANS; } {SET_USER} { count(); yylval.strval=yytext; return SET_USER; } {SET_USERPASS} { count(); yylval.strval=yytext; return SET_USERPASS; } {SET_PORT} { count(); yylval.strval=yytext; return SET_PORT; } {SET_URI} { count(); yylval.strval=yytext; return SET_URI; } {REVERT_URI} { count(); yylval.strval=yytext; return REVERT_URI; } {PREFIX} { count(); yylval.strval=yytext; return PREFIX; } {STRIP} { count(); yylval.strval=yytext; return STRIP; } {STRIP_TAIL} { count(); yylval.strval=yytext; return STRIP_TAIL; } {REMOVE_BRANCH} { count(); yylval.strval=yytext; return REMOVE_BRANCH; } {CLEAR_BRANCHES} { count(); yylval.strval=yytext; return CLEAR_BRANCHES; } {SET_USERPHONE} { count(); yylval.strval=yytext; return SET_USERPHONE; } {FORCE_RPORT} { count(); yylval.strval=yytext; return FORCE_RPORT; } {ADD_LOCAL_RPORT} { count(); yylval.strval=yytext; return ADD_LOCAL_RPORT; } {FORCE_TCP_ALIAS} { count(); yylval.strval=yytext; return FORCE_TCP_ALIAS; } {UDP_MTU} { count(); yylval.strval=yytext; return UDP_MTU; } {UDP_MTU_TRY_PROTO} { count(); yylval.strval=yytext; return UDP_MTU_TRY_PROTO; } {UDP4_RAW} { count(); yylval.strval=yytext; return UDP4_RAW; } {UDP4_RAW_MTU} { count(); yylval.strval=yytext; return UDP4_RAW_MTU; } {UDP4_RAW_TTL} { count(); yylval.strval=yytext; return UDP4_RAW_TTL; } {IF} { count(); yylval.strval=yytext; return IF; } {ELSE} { count(); yylval.strval=yytext; return ELSE; } {SET_ADV_ADDRESS} { count(); yylval.strval=yytext; return SET_ADV_ADDRESS; } {SET_ADV_PORT} { count(); yylval.strval=yytext; return SET_ADV_PORT; } {FORCE_SEND_SOCKET} { count(); yylval.strval=yytext; return FORCE_SEND_SOCKET; } {SET_FWD_NO_CONNECT} { count(); yylval.strval=yytext; return SET_FWD_NO_CONNECT; } {SET_RPL_NO_CONNECT} { count(); yylval.strval=yytext; return SET_RPL_NO_CONNECT; } {SET_FWD_CLOSE} { count(); yylval.strval=yytext; return SET_FWD_CLOSE; } {SET_RPL_CLOSE} { count(); yylval.strval=yytext; return SET_RPL_CLOSE; } {SWITCH} { count(); yylval.strval=yytext; return SWITCH; } {CASE} { count(); yylval.strval=yytext; return CASE; } {DEFAULT} { count(); yylval.strval=yytext; return DEFAULT; } {WHILE} { count(); yylval.strval=yytext; return WHILE; } {INCLUDEFILE} { count(); BEGIN(INCLF); } {PREP_START}{INCLUDEFILE} { count(); BEGIN(INCLF); } {IMPORTFILE} { count(); BEGIN(IMPTF); } {PREP_START}{IMPORTFILE} { count(); BEGIN(IMPTF); } {CFG_SELECT} { count(); yylval.strval=yytext; return CFG_SELECT; } {CFG_RESET} { count(); yylval.strval=yytext; return CFG_RESET; } {URIHOST} { count(); yylval.strval=yytext; return URIHOST; } {URIPORT} { count(); yylval.strval=yytext; return URIPORT; } {MAX_LEN} { count(); yylval.strval=yytext; return MAX_LEN; } {METHOD} { count(); yylval.strval=yytext; return METHOD; } {URI} { count(); yylval.strval=yytext; return URI; } {FROM_URI} { count(); yylval.strval=yytext; return FROM_URI; } {TO_URI} { count(); yylval.strval=yytext; return TO_URI; } {SRCIP} { count(); yylval.strval=yytext; return SRCIP; } {SRCPORT} { count(); yylval.strval=yytext; return SRCPORT; } {DSTIP} { count(); yylval.strval=yytext; return DSTIP; } {DSTPORT} { count(); yylval.strval=yytext; return DSTPORT; } {SNDIP} { count(); yylval.strval=yytext; return SNDIP; } {SNDPORT} { count(); yylval.strval=yytext; return SNDPORT; } {SNDPROTO} { count(); yylval.strval=yytext; return SNDPROTO; } {SNDAF} { count(); yylval.strval=yytext; return SNDAF; } {TOIP} { count(); yylval.strval=yytext; return TOIP; } {TOPORT} { count(); yylval.strval=yytext; return TOPORT; } {PROTO} { count(); yylval.strval=yytext; return PROTO; } {AF} { count(); yylval.strval=yytext; return AF; } {MYSELF} { count(); yylval.strval=yytext; return MYSELF; } {DEBUG} { count(); yylval.strval=yytext; return DEBUG_V; } {FORK} { count(); yylval.strval=yytext; return FORK; } {FORK_DELAY} { count(); yylval.strval=yytext; return FORK_DELAY; } {LOGSTDERROR} { yylval.strval=yytext; return LOGSTDERROR; } {LOGFACILITY} { yylval.strval=yytext; return LOGFACILITY; } {LOGNAME} { yylval.strval=yytext; return LOGNAME; } {LOGCOLOR} { yylval.strval=yytext; return LOGCOLOR; } {LISTEN} { count(); yylval.strval=yytext; return LISTEN; } {ADVERTISE} { count(); yylval.strval=yytext; return ADVERTISE; } {ALIAS} { count(); yylval.strval=yytext; return ALIAS; } {SR_AUTO_ALIASES} { count(); yylval.strval=yytext; return SR_AUTO_ALIASES; } {DNS} { count(); yylval.strval=yytext; return DNS; } {REV_DNS} { count(); yylval.strval=yytext; return REV_DNS; } {DNS_TRY_IPV6} { count(); yylval.strval=yytext; return DNS_TRY_IPV6; } {DNS_TRY_NAPTR} { count(); yylval.strval=yytext; return DNS_TRY_NAPTR; } {DNS_SRV_LB} { count(); yylval.strval=yytext; return DNS_SRV_LB; } {DNS_UDP_PREF} { count(); yylval.strval=yytext; return DNS_UDP_PREF; } {DNS_TCP_PREF} { count(); yylval.strval=yytext; return DNS_TCP_PREF; } {DNS_TLS_PREF} { count(); yylval.strval=yytext; return DNS_TLS_PREF; } {DNS_SCTP_PREF} { count(); yylval.strval=yytext; return DNS_SCTP_PREF; } {DNS_RETR_TIME} { count(); yylval.strval=yytext; return DNS_RETR_TIME; } {DNS_RETR_NO} { count(); yylval.strval=yytext; return DNS_RETR_NO; } {DNS_SERVERS_NO} { count(); yylval.strval=yytext; return DNS_SERVERS_NO; } {DNS_USE_SEARCH} { count(); yylval.strval=yytext; return DNS_USE_SEARCH; } {DNS_SEARCH_FMATCH} { count(); yylval.strval=yytext; return DNS_SEARCH_FMATCH; } {DNS_CACHE_INIT} { count(); yylval.strval=yytext; return DNS_CACHE_INIT; } {DNS_USE_CACHE} { count(); yylval.strval=yytext; return DNS_USE_CACHE; } {DNS_USE_FAILOVER} { count(); yylval.strval=yytext; return DNS_USE_FAILOVER; } {DNS_CACHE_FLAGS} { count(); yylval.strval=yytext; return DNS_CACHE_FLAGS; } {DNS_CACHE_NEG_TTL} { count(); yylval.strval=yytext; return DNS_CACHE_NEG_TTL; } {DNS_CACHE_MIN_TTL} { count(); yylval.strval=yytext; return DNS_CACHE_MIN_TTL; } {DNS_CACHE_MAX_TTL} { count(); yylval.strval=yytext; return DNS_CACHE_MAX_TTL; } {DNS_CACHE_MEM} { count(); yylval.strval=yytext; return DNS_CACHE_MEM; } {DNS_CACHE_GC_INT} { count(); yylval.strval=yytext; return DNS_CACHE_GC_INT; } {DNS_CACHE_DEL_NONEXP} { count(); yylval.strval=yytext; return DNS_CACHE_DEL_NONEXP; } {AUTO_BIND_IPV6} { count(); yylval.strval=yytext; return AUTO_BIND_IPV6; } {DST_BLST_INIT} { count(); yylval.strval=yytext; return DST_BLST_INIT; } {USE_DST_BLST} { count(); yylval.strval=yytext; return USE_DST_BLST; } {DST_BLST_MEM} { count(); yylval.strval=yytext; return DST_BLST_MEM; } {DST_BLST_TTL} { count(); yylval.strval=yytext; return DST_BLST_TTL; } {DST_BLST_GC_INT} { count(); yylval.strval=yytext; return DST_BLST_GC_INT; } {DST_BLST_UDP_IMASK} { count(); yylval.strval=yytext; return DST_BLST_UDP_IMASK; } {DST_BLST_TCP_IMASK} { count(); yylval.strval=yytext; return DST_BLST_TCP_IMASK; } {DST_BLST_TLS_IMASK} { count(); yylval.strval=yytext; return DST_BLST_TLS_IMASK; } {DST_BLST_SCTP_IMASK} { count(); yylval.strval=yytext; return DST_BLST_SCTP_IMASK; } {PORT} { count(); yylval.strval=yytext; return PORT; } {STAT} { count(); yylval.strval=yytext; return STAT; } {MAXBUFFER} { count(); yylval.strval=yytext; return MAXBUFFER; } {SQL_BUFFER_SIZE} { count(); yylval.strval=yytext; return SQL_BUFFER_SIZE; } {CHILDREN} { count(); yylval.strval=yytext; return CHILDREN; } {SOCKET_WORKERS} { count(); yylval.strval=yytext; return SOCKET_WORKERS; } {CHECK_VIA} { count(); yylval.strval=yytext; return CHECK_VIA; } {PHONE2TEL} { count(); yylval.strval=yytext; return PHONE2TEL; } {SYN_BRANCH} { count(); yylval.strval=yytext; return SYN_BRANCH; } {MEMLOG} { count(); yylval.strval=yytext; return MEMLOG; } {MEMDBG} { count(); yylval.strval=yytext; return MEMDBG; } {MEMSUM} { count(); yylval.strval=yytext; return MEMSUM; } {MEMSAFETY} { count(); yylval.strval=yytext; return MEMSAFETY; } {MEMJOIN} { count(); yylval.strval=yytext; return MEMJOIN; } {CORELOG} { count(); yylval.strval=yytext; return CORELOG; } {SIP_WARNING} { count(); yylval.strval=yytext; return SIP_WARNING; } {USER} { count(); yylval.strval=yytext; return USER; } {GROUP} { count(); yylval.strval=yytext; return GROUP; } {CHROOT} { count(); yylval.strval=yytext; return CHROOT; } {WDIR} { count(); yylval.strval=yytext; return WDIR; } {MHOMED} { count(); yylval.strval=yytext; return MHOMED; } {DISABLE_TCP} { count(); yylval.strval=yytext; return DISABLE_TCP; } {TCP_CHILDREN} { count(); yylval.strval=yytext; return TCP_CHILDREN; } {TCP_ACCEPT_ALIASES} { count(); yylval.strval=yytext; return TCP_ACCEPT_ALIASES; } {TCP_SEND_TIMEOUT} { count(); yylval.strval=yytext; return TCP_SEND_TIMEOUT; } {TCP_CONNECT_TIMEOUT} { count(); yylval.strval=yytext; return TCP_CONNECT_TIMEOUT; } {TCP_CON_LIFETIME} { count(); yylval.strval=yytext; return TCP_CON_LIFETIME; } {TCP_POLL_METHOD} { count(); yylval.strval=yytext; return TCP_POLL_METHOD; } {TCP_MAX_CONNECTIONS} { count(); yylval.strval=yytext; return TCP_MAX_CONNECTIONS; } {TLS_MAX_CONNECTIONS} { count(); yylval.strval=yytext; return TLS_MAX_CONNECTIONS; } {TCP_NO_CONNECT} { count(); yylval.strval=yytext; return TCP_NO_CONNECT; } {TCP_SOURCE_IPV4} { count(); yylval.strval=yytext; return TCP_SOURCE_IPV4; } {TCP_SOURCE_IPV6} { count(); yylval.strval=yytext; return TCP_SOURCE_IPV6; } {TCP_OPT_FD_CACHE} { count(); yylval.strval=yytext; return TCP_OPT_FD_CACHE; } {TCP_OPT_CONN_WQ_MAX} { count(); yylval.strval=yytext; return TCP_OPT_CONN_WQ_MAX; } {TCP_OPT_WQ_MAX} { count(); yylval.strval=yytext; return TCP_OPT_WQ_MAX; } {TCP_OPT_RD_BUF} { count(); yylval.strval=yytext; return TCP_OPT_RD_BUF; } {TCP_OPT_WQ_BLK} { count(); yylval.strval=yytext; return TCP_OPT_WQ_BLK; } {TCP_OPT_BUF_WRITE} { count(); yylval.strval=yytext; return TCP_OPT_BUF_WRITE; } {TCP_OPT_DEFER_ACCEPT} { count(); yylval.strval=yytext; return TCP_OPT_DEFER_ACCEPT; } {TCP_OPT_DELAYED_ACK} { count(); yylval.strval=yytext; return TCP_OPT_DELAYED_ACK; } {TCP_OPT_SYNCNT} { count(); yylval.strval=yytext; return TCP_OPT_SYNCNT; } {TCP_OPT_LINGER2} { count(); yylval.strval=yytext; return TCP_OPT_LINGER2; } {TCP_OPT_KEEPALIVE} { count(); yylval.strval=yytext; return TCP_OPT_KEEPALIVE; } {TCP_OPT_KEEPIDLE} { count(); yylval.strval=yytext; return TCP_OPT_KEEPIDLE; } {TCP_OPT_KEEPINTVL} { count(); yylval.strval=yytext; return TCP_OPT_KEEPINTVL; } {TCP_OPT_KEEPCNT} { count(); yylval.strval=yytext; return TCP_OPT_KEEPCNT; } {TCP_OPT_CRLF_PING} { count(); yylval.strval=yytext; return TCP_OPT_CRLF_PING; } {TCP_OPT_ACCEPT_NO_CL} { count(); yylval.strval=yytext; return TCP_OPT_ACCEPT_NO_CL; } {TCP_CLONE_RCVBUF} { count(); yylval.strval=yytext; return TCP_CLONE_RCVBUF; } {DISABLE_TLS} { count(); yylval.strval=yytext; return DISABLE_TLS; } {ENABLE_TLS} { count(); yylval.strval=yytext; return ENABLE_TLS; } {TLSLOG} { count(); yylval.strval=yytext; return TLS_PORT_NO; } {TLS_PORT_NO} { count(); yylval.strval=yytext; return TLS_PORT_NO; } {TLS_METHOD} { count(); yylval.strval=yytext; return TLS_METHOD; } {TLS_VERIFY} { count(); yylval.strval=yytext; return TLS_VERIFY; } {TLS_REQUIRE_CERTIFICATE} { count(); yylval.strval=yytext; return TLS_REQUIRE_CERTIFICATE; } {TLS_CERTIFICATE} { count(); yylval.strval=yytext; return TLS_CERTIFICATE; } {TLS_PRIVATE_KEY} { count(); yylval.strval=yytext; return TLS_PRIVATE_KEY; } {TLS_CA_LIST} { count(); yylval.strval=yytext; return TLS_CA_LIST; } {TLS_HANDSHAKE_TIMEOUT} { count(); yylval.strval=yytext; return TLS_HANDSHAKE_TIMEOUT; } {TLS_SEND_TIMEOUT} { count(); yylval.strval=yytext; return TLS_SEND_TIMEOUT; } {DISABLE_SCTP} { count(); yylval.strval=yytext; return DISABLE_SCTP;} {ENABLE_SCTP} { count(); yylval.strval=yytext; return ENABLE_SCTP;} {SCTP_CHILDREN} { count(); yylval.strval=yytext; return SCTP_CHILDREN; } {SCTP_SOCKET_RCVBUF} { count(); yylval.strval=yytext; return SCTP_SOCKET_RCVBUF; } {SCTP_SOCKET_SNDBUF} { count(); yylval.strval=yytext; return SCTP_SOCKET_SNDBUF; } {SCTP_AUTOCLOSE} { count(); yylval.strval=yytext; return SCTP_AUTOCLOSE; } {SCTP_SEND_TTL} { count(); yylval.strval=yytext; return SCTP_SEND_TTL; } {SCTP_SEND_RETRIES} { count(); yylval.strval=yytext; return SCTP_SEND_RETRIES; } {SCTP_ASSOC_TRACKING} { count(); yylval.strval=yytext; return SCTP_ASSOC_TRACKING; } {SCTP_ASSOC_REUSE} { count(); yylval.strval=yytext; return SCTP_ASSOC_REUSE; } {SCTP_MAX_ASSOCS} { count(); yylval.strval=yytext; return SCTP_MAX_ASSOCS; } {SCTP_SRTO_INITIAL} { count(); yylval.strval=yytext; return SCTP_SRTO_INITIAL; } {SCTP_SRTO_MAX} { count(); yylval.strval=yytext; return SCTP_SRTO_MAX; } {SCTP_SRTO_MIN} { count(); yylval.strval=yytext; return SCTP_SRTO_MIN; } {SCTP_ASOCMAXRXT} { count(); yylval.strval=yytext; return SCTP_ASOCMAXRXT; } {SCTP_INIT_MAX_ATTEMPTS} { count(); yylval.strval=yytext; return SCTP_INIT_MAX_ATTEMPTS; } {SCTP_INIT_MAX_TIMEO} { count(); yylval.strval=yytext; return SCTP_INIT_MAX_TIMEO; } {SCTP_HBINTERVAL} { count(); yylval.strval=yytext; return SCTP_HBINTERVAL; } {SCTP_PATHMAXRXT} { count(); yylval.strval=yytext; return SCTP_PATHMAXRXT; } {SCTP_SACK_DELAY} { count(); yylval.strval=yytext; return SCTP_SACK_DELAY; } {SCTP_SACK_FREQ} { count(); yylval.strval=yytext; return SCTP_SACK_FREQ; } {SCTP_MAX_BURST} { count(); yylval.strval=yytext; return SCTP_MAX_BURST; } {SERVER_SIGNATURE} { count(); yylval.strval=yytext; return SERVER_SIGNATURE; } {SERVER_HEADER} { count(); yylval.strval=yytext; return SERVER_HEADER; } {USER_AGENT_HEADER} { count(); yylval.strval=yytext; return USER_AGENT_HEADER; } {REPLY_TO_VIA} { count(); yylval.strval=yytext; return REPLY_TO_VIA; } {ADVERTISED_ADDRESS} { count(); yylval.strval=yytext; return ADVERTISED_ADDRESS; } {ADVERTISED_PORT} { count(); yylval.strval=yytext; return ADVERTISED_PORT; } {DISABLE_CORE} { count(); yylval.strval=yytext; return DISABLE_CORE; } {OPEN_FD_LIMIT} { count(); yylval.strval=yytext; return OPEN_FD_LIMIT; } {SHM_MEM_SZ} { count(); yylval.strval=yytext; return SHM_MEM_SZ; } {SHM_FORCE_ALLOC} { count(); yylval.strval=yytext; return SHM_FORCE_ALLOC; } {MLOCK_PAGES} { count(); yylval.strval=yytext; return MLOCK_PAGES; } {REAL_TIME} { count(); yylval.strval=yytext; return REAL_TIME; } {RT_PRIO} { count(); yylval.strval=yytext; return RT_PRIO; } {RT_POLICY} { count(); yylval.strval=yytext; return RT_POLICY; } {RT_TIMER1_PRIO} { count(); yylval.strval=yytext; return RT_TIMER1_PRIO; } {RT_TIMER1_POLICY} { count(); yylval.strval=yytext; return RT_TIMER1_POLICY; } {RT_TIMER2_PRIO} { count(); yylval.strval=yytext; return RT_TIMER2_PRIO; } {RT_TIMER2_POLICY} { count(); yylval.strval=yytext; return RT_TIMER2_POLICY; } {MCAST_LOOPBACK} { count(); yylval.strval=yytext; return MCAST_LOOPBACK; } {MCAST_TTL} { count(); yylval.strval=yytext; return MCAST_TTL; } {TOS} { count(); yylval.strval=yytext; return TOS; } {PMTU_DISCOVERY} { count(); yylval.strval=yytext; return PMTU_DISCOVERY; } {KILL_TIMEOUT} { count(); yylval.strval=yytext; return KILL_TIMEOUT; } {MAX_WLOOPS} { count(); yylval.strval=yytext; return MAX_WLOOPS; } {PVBUFSIZE} { count(); yylval.strval=yytext; return PVBUFSIZE; } {PVBUFSLOTS} { count(); yylval.strval=yytext; return PVBUFSLOTS; } {HTTP_REPLY_HACK} { count(); yylval.strval=yytext; return HTTP_REPLY_HACK; } {VERSION_TABLE_CFG} { count(); yylval.strval=yytext; return VERSION_TABLE_CFG;} {SERVER_ID} { count(); yylval.strval=yytext; return SERVER_ID;} {LATENCY_LOG} { count(); yylval.strval=yytext; return LATENCY_LOG;} {MSG_TIME} { count(); yylval.strval=yytext; return MSG_TIME;} {LATENCY_LIMIT_DB} { count(); yylval.strval=yytext; return LATENCY_LIMIT_DB;} {LATENCY_LIMIT_ACTION} { count(); yylval.strval=yytext; return LATENCY_LIMIT_ACTION;} {CFG_DESCRIPTION} { count(); yylval.strval=yytext; return CFG_DESCRIPTION; } {LOADMODULE} { count(); yylval.strval=yytext; return LOADMODULE; } {LOADPATH} { count(); yylval.strval=yytext; return LOADPATH; } {MODPARAM} { count(); yylval.strval=yytext; return MODPARAM; } {STUN_REFRESH_INTERVAL} { count(); yylval.strval=yytext; return STUN_REFRESH_INTERVAL;} {STUN_ALLOW_STUN} { count(); yylval.strval=yytext; return STUN_ALLOW_STUN;} {STUN_ALLOW_FP} { count(); yylval.strval=yytext; return STUN_ALLOW_FP;} {EQUAL} { count(); return EQUAL; } {ADDEQ} { count(); return ADDEQ; } {EQUAL_T} { count(); return EQUAL_T; } {GT} { count(); return GT; } {LT} { count(); return LT; } {GTE} { count(); return GTE; } {LTE} { count(); return LTE; } {DIFF} { count(); return DIFF; } {MATCH} { count(); return MATCH; } {NOT} { count(); return NOT; } {LOG_AND} { count(); return LOG_AND; } {BIN_AND} { count(); return BIN_AND; } {LOG_OR} { count(); return LOG_OR; } {BIN_OR} { count(); return BIN_OR; } {BIN_NOT} { count(); return BIN_NOT; } {BIN_XOR} { count(); return BIN_XOR; } {BIN_LSHIFT} { count(); return BIN_LSHIFT; } {BIN_RSHIFT} { count(); return BIN_RSHIFT; } {PLUS} { count(); return PLUS; } {MINUS} { count(); return MINUS; } {MODULO} { count(); return MODULO; } {STRLEN} { count(); return STRLEN; } {STREMPTY} { count(); return STREMPTY; } {DEFINED} { count(); return DEFINED; } {STREQ} { count(); return STREQ; } {INTEQ} { count(); return INTEQ; } {STRDIFF} { count(); return STRDIFF; } {INTDIFF} { count(); return INTDIFF; } {INTCAST} { count(); return INTCAST; } {STRCAST} { count(); return STRCAST; } {SELECT_MARK} { count(); state = SELECT_S; BEGIN(SELECT); return SELECT_MARK; } {DOT} { count(); return DOT; } {RBRACK} { count(); return RBRACK; } {HEXNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 16); yy_number_str=yytext; return NUMBER; } {BINNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 2); yy_number_str=yytext; return NUMBER; } {ATTR_MARK} { count(); state = ATTR_S; BEGIN(ATTR); return ATTR_MARK; } {ATTR_FROM} { count(); return ATTR_FROM; } {ATTR_TO} { count(); return ATTR_TO; } {ATTR_FROMURI} { count(); return ATTR_FROMURI; } {ATTR_TOURI} { count(); return ATTR_TOURI; } {ATTR_FROMUSER} { count(); return ATTR_FROMUSER; } {ATTR_TOUSER} { count(); return ATTR_TOUSER; } {ATTR_FROMDOMAIN} { count(); return ATTR_FROMDOMAIN; } {ATTR_TODOMAIN} { count(); return ATTR_TODOMAIN; } {ATTR_GLOBAL} { count(); return ATTR_GLOBAL; } {DOT} { count(); return DOT; } {LBRACK} { count(); return LBRACK; } {RBRACK} { count(); return RBRACK; } {STAR} { count(); return STAR; } {DECNUMBER} { count(); yylval.intval=atoi(yytext); yy_number_str=yytext; return NUMBER; } {ID} { count(); addstr(&s_buf, yytext, yyleng); yylval.strval=s_buf.s; memset(&s_buf, 0, sizeof(s_buf)); state = INITIAL_S; BEGIN(INITIAL); return ID; } {VAR_MARK}{LPAREN} { switch(sr_cfg_compat){ case SR_COMPAT_SER: state=ATTR_S; BEGIN(ATTR); yyless(1); count(); return ATTR_MARK; break; case SR_COMPAT_KAMAILIO: case SR_COMPAT_MAX: default: state = PVAR_P_S; BEGIN(PVAR_P); p_nest=1; yymore(); break; } } /* eat everything between 2 () and return PVAR token and a string containing everything (including $ and ()) */ {RPAREN} { p_nest--; if (p_nest==0){ count(); addstr(&s_buf, yytext, yyleng); yylval.strval=s_buf.s; memset(&s_buf, 0, sizeof(s_buf)); state=INITIAL_S; BEGIN(INITIAL); return PVAR; } yymore(); } {LPAREN} { p_nest++; yymore(); } . { yymore(); } {ID}|'\.' {yymore(); } {LPAREN} { state = PVAR_P_S; BEGIN(PVAR_P); p_nest=1; yymore(); } {CR}|{EAT_ABLE}|. { yyless(yyleng-1); count(); addstr(&s_buf, yytext, yyleng); yylval.strval=s_buf.s; memset(&s_buf, 0, sizeof(s_buf)); state=INITIAL_S; BEGIN(INITIAL); return PVAR; } /* if found retcode => it's a built-in pvar */ {RETCODE} { count(); yylval.strval=yytext; return PVAR; } {VAR_MARK} { switch(sr_cfg_compat){ case SR_COMPAT_SER: count(); state=ATTR_S; BEGIN(ATTR); return ATTR_MARK; break; case SR_COMPAT_KAMAILIO: state=PVARID_S; BEGIN(PVARID); yymore(); break; case SR_COMPAT_MAX: default: state=AVP_PVAR_S; BEGIN(AVP_PVAR); yymore(); break; } } /* avp prefix detected -> go to avp mode */ {AVP_PREF} | {ID}{LBRACK} { state = ATTR_S; BEGIN(ATTR); yyless(1); count(); return ATTR_MARK; } {ID}{LPAREN} { state = PVAR_P_S; p_nest=1; BEGIN(PVAR_P); yymore(); } {ID} { count(); addstr(&s_buf, yytext, yyleng); yylval.strval=s_buf.s; memset(&s_buf, 0, sizeof(s_buf)); state = INITIAL_S; BEGIN(INITIAL); return AVP_OR_PVAR; } {IPV6ADDR} { count(); yylval.strval=yytext; return IPV6ADDR; } {DECNUMBER} { count(); yylval.intval=atoi(yytext); yy_number_str=yytext; return NUMBER; } {HEXNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 16); yy_number_str=yytext; return NUMBER; } {OCTNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 8); yy_number_str=yytext; return NUMBER; } {BINNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 2); yy_number_str=yytext; return NUMBER; } {YES} { count(); yylval.intval=1; yy_number_str=yytext; return NUMBER; } {NO} { count(); yylval.intval=0; yy_number_str=yytext; return NUMBER; } {TCP} { count(); return TCP; } {UDP} { count(); return UDP; } {TLS} { count(); return TLS; } {SCTP} { count(); return SCTP; } {WS} { count(); return WS; } {WSS} { count(); return WSS; } {INET} { count(); yylval.intval=AF_INET; yy_number_str=yytext; return NUMBER; } {INET6} { count(); #ifdef USE_IPV6 yylval.intval=AF_INET6; #else yylval.intval=-1; /* no match*/ #endif yy_number_str=yytext; return NUMBER; } {SSLv23} { count(); yylval.strval=yytext; return SSLv23; } {SSLv2} { count(); yylval.strval=yytext; return SSLv2; } {SSLv3} { count(); yylval.strval=yytext; return SSLv3; } {TLSv1} { count(); yylval.strval=yytext; return TLSv1; } {COMMA} { count(); return COMMA; } {SEMICOLON} { count(); return SEMICOLON; } {COLON} { count(); return COLON; } {STAR} { count(); return STAR; } {RPAREN} { count(); return RPAREN; } {LPAREN} { count(); return LPAREN; } {LBRACE} { count(); return LBRACE; } {RBRACE} { count(); return RBRACE; } {LBRACK} { count(); return LBRACK; } {RBRACK} { count(); return RBRACK; } {SLASH} { count(); return SLASH; } {DOT} { count(); return DOT; } \\{CR} {count(); } /* eat the escaped CR */ {CR} { count();/* return CR;*/ } {EVENT_RT_NAME} { count(); addstr(&s_buf, yytext, yyleng); yylval.strval=s_buf.s; memset(&s_buf, 0, sizeof(s_buf)); return EVENT_RT_NAME; } {QUOTES} { count(); old_initial = YY_START; old_state = state; state=STRING_S; BEGIN(STRING1); } {TICK} { count(); old_initial = YY_START; old_state = state; state=STRING_S; BEGIN(STRING2); } {QUOTES} { count_more(); yytext[yyleng-1]=0; yyleng--; addstr(&s_buf, yytext, yyleng); state=STR_BETWEEN_S; BEGIN(STR_BETWEEN); } {TICK} { count_more(); state=old_state; BEGIN(old_initial); yytext[yyleng-1]=0; yyleng--; addstr(&s_buf, yytext, yyleng); r = pp_subst_run(&s_buf.s); yylval.strval=s_buf.s; memset(&s_buf, 0, sizeof(s_buf)); return STRING; } .|{EAT_ABLE}|{CR} { yymore(); } \\n { count_more(); addchar(&s_buf, '\n'); } \\r { count_more(); addchar(&s_buf, '\r'); } \\a { count_more(); addchar(&s_buf, '\a'); } \\t { count_more(); addchar(&s_buf, '\t'); } \\{QUOTES} { count_more(); addchar(&s_buf, '"'); } \\\\ { count_more(); addchar(&s_buf, '\\'); } \\x{HEX}{1,2} { count_more(); addchar(&s_buf, (char)strtol(yytext+2, 0, 16)); } /* don't allow \[0-7]{1}, it will eat the backreferences from subst_uri if allowed (although everybody should use '' in subt_uri) */ \\[0-7]{2,3} { count_more(); addchar(&s_buf, (char)strtol(yytext+1, 0, 8)); } \\{CR} { count_more(); } /* eat escaped CRs */ .|{EAT_ABLE}|{CR} { count_more(); addchar(&s_buf, *yytext); } {EAT_ABLE}|{CR} { count_ignore(); } {QUOTES} { count_more(); state=STRING_S; BEGIN(STRING1);} . { yyless(0); /* reparse it */ /* ignore the whitespace now that is counted, return saved string value */ state=old_state; BEGIN(old_initial); r = pp_subst_run(&s_buf.s); yylval.strval=s_buf.s; memset(&s_buf, 0, sizeof(s_buf)); return STRING; } {COM_START} { count(); comment_nest++; state=COMMENT_S; BEGIN(COMMENT); } {COM_END} { count(); comment_nest--; if (comment_nest==0){ state=INITIAL_S; BEGIN(INITIAL); } } .|{EAT_ABLE}|{CR} { count(); }; {COM_LINE}!{SER_CFG}{CR} { count(); sr_cfg_compat=SR_COMPAT_SER;} {COM_LINE}!{KAMAILIO_CFG}{CR} { count(); sr_cfg_compat=SR_COMPAT_KAMAILIO;} {COM_LINE}!{MAXCOMPAT_CFG}{CR} { count(); sr_cfg_compat=SR_COMPAT_MAX;} {PREP_START}{DEFINE}{EAT_ABLE}+ { count(); pp_define_set_type(0); state = DEFINE_S; BEGIN(DEFINE_ID); } {PREP_START}{TRYDEF}{EAT_ABLE}+ { count(); pp_define_set_type(1); state = DEFINE_S; BEGIN(DEFINE_ID); } {PREP_START}{REDEF}{EAT_ABLE}+ { count(); pp_define_set_type(2); state = DEFINE_S; BEGIN(DEFINE_ID); } {ID} { count(); if (pp_define(yyleng, yytext)) return 1; state = DEFINE_EOL_S; BEGIN(DEFINE_EOL); } {EAT_ABLE} { count(); } {CR} { count(); state = INITIAL; BEGIN(INITIAL); } . { count(); addstr(&s_buf, yytext, yyleng); state = DEFINE_DATA_S; BEGIN(DEFINE_DATA); } \\{CR} { count(); } /* eat the escaped CR */ {CR} { count(); if (pp_define_set(strlen(s_buf.s), s_buf.s)) return 1; memset(&s_buf, 0, sizeof(s_buf)); state = INITIAL; BEGIN(INITIAL); } . { count(); addstr(&s_buf, yytext, yyleng); } {PREP_START}{SUBST} { count(); return SUBST;} {PREP_START}{SUBSTDEF} { count(); return SUBSTDEF;} {PREP_START}{SUBSTDEFS} { count(); return SUBSTDEFS;} {PREP_START}{IFDEF}{EAT_ABLE}+ { count(); if (pp_ifdef_type(1)) return 1; state = IFDEF_S; BEGIN(IFDEF_ID); } {PREP_START}{IFNDEF}{EAT_ABLE}+ { count(); if (pp_ifdef_type(0)) return 1; state = IFDEF_S; BEGIN(IFDEF_ID); } {ID} { count(); pp_ifdef_var(yyleng, yytext); state = IFDEF_EOL_S; BEGIN(IFDEF_EOL); } {EAT_ABLE}*{CR} { count(); pp_ifdef(); } {PREP_START}{ELSE}{EAT_ABLE}*{CR} { count(); pp_else(); } {PREP_START}{ENDIF}{EAT_ABLE}*{CR} { count(); pp_endif(); } /* we're in an ifdef that evaluated to false -- throw it away */ .|{CR} { count(); } /* this is split so the shebangs match more, giving them priority */ {COM_LINE} { count(); state = LINECOMMENT_S; BEGIN(LINECOMMENT); } .*{CR} { count(); state = INITIAL_S; BEGIN(INITIAL); } {ID} { if ((sdef = pp_define_get(yyleng, yytext))!=NULL) { for (r=sdef->len-1; r>=0; r--) unput(sdef->s[r]); /* reverse order */ } else { count(); addstr(&s_buf, yytext, yyleng); yylval.strval=s_buf.s; memset(&s_buf, 0, sizeof(s_buf)); return ID; } } {NUM_ID} { count(); addstr(&s_buf, yytext, yyleng); yylval.strval=s_buf.s; memset(&s_buf, 0, sizeof(s_buf)); return NUM_ID; }