cfg.lex 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962
  1. /*
  2. * $Id$
  3. *
  4. * scanner for cfg files
  5. *
  6. * Copyright (C) 2001-2003 FhG Fokus
  7. *
  8. * This file is part of ser, a free SIP server.
  9. *
  10. * ser is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version
  14. *
  15. * For a license to use the ser software under conditions
  16. * other than those described here, or to purchase support for this
  17. * software, please contact iptel.org by e-mail at the following addresses:
  18. * [email protected]
  19. *
  20. * ser is distributed in the hope that it will be useful,
  21. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  23. * GNU General Public License for more details.
  24. *
  25. * You should have received a copy of the GNU General Public License
  26. * along with this program; if not, write to the Free Software
  27. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  28. *
  29. * History:
  30. * -------
  31. * 2003-01-29 src_port added (jiri)
  32. * 2003-01-23 mhomed added (jiri)
  33. * 2003-03-19 replaced all the mallocs/frees w/ pkg_malloc/pkg_free (andrei)
  34. * 2003-04-01 added dst_port, proto (tcp, udp, tls), af(inet, inet6) (andrei)
  35. * 2003-04-05 s/reply_route/failure_route, onreply_route introduced (jiri)
  36. * 2003-04-12 added force_rport, chdir and wdir (andrei)
  37. * 2003-04-22 strip_tail added (jiri)
  38. * 2003-07-03 tls* (disable, certificate, private_key, ca_list, verify,
  39. * require_certificate added (andrei)
  40. * 2003-07-06 more tls config. vars added: tls_method, tls_port_no (andrei)
  41. * 2003-10-02 added {,set_}advertised_{address,port} (andrei)
  42. * 2003-10-07 added hex and octal numbers support (andrei)
  43. * 2003-10-10 replaced len_gt w/ msg:len (andrei)
  44. * 2003-10-13 added fifo_dir (andrei)
  45. * 2003-10-28 added tcp_accept_aliases (andrei)
  46. * 2003-11-29 added {tcp_send, tcp_connect, tls_*}_timeout (andrei)
  47. * 2004-03-30 added DISABLE_CORE and OPEN_FD_LIMIT (andrei)
  48. * 2004-04-28 added sock_mode (replaces fifo_mode), sock_user &
  49. * sock_group (andrei)
  50. * 2004-05-03 applied multicast support patch from janakj
  51. * added MCAST_TTL (andrei)
  52. * 2004-10-08 more escapes: \", \xHH, \nnn and minor optimizations (andrei)
  53. * 2004-10-19 added FROM_URI and TO_URI (andrei)
  54. * 2004-11-30 added force_send_socket
  55. * 2005-07-08 added tcp_connection_lifetime, tcp_poll_method,
  56. * tcp_max_connections (andrei)
  57. * 2005-07-11 added dns_retr_{time,no}, dns_servers_no, dns_use_search_list,
  58. * dns_try_ipv6 (andrei)
  59. * 2005-12-11 added onsend_route, snd_{ip,port,proto,af},
  60. * to_{ip,port} (andrei)
  61. * 2005-12-12 separated drop, exit, break, return, added RETCODE (andrei)
  62. * 2005-12-19 select framework (mma)
  63. * 2006-09-11 added dns cache (use, flags, ttls, mem ,gc) & dst blacklist
  64. * options (andrei)
  65. * 2006-10-13 added STUN_ALLOW_STUN, STUN_ALLOW_FP, STUN_REFRESH_INTERVAL
  66. * (vlada)
  67. * 2007-06-07 added SHM_FORCE_ALLOC, MLOCK_PAGES, REAL_TIME, RT_PRIO,
  68. * RT_POLICY, RT_TIMER1_PRIO, RT_TIMER1_POLICY, RT_TIMER2_PRIO,
  69. * RT_TIMER2_POLICY (andrei)
  70. * 2007-06-16 added DNS_SRV_LB, DNS_TRY_NAPTR (andrei)
  71. * 2007-06-18 added DNS_{UDP,TCP,TLS}_PREF (andrei)
  72. * 2007-09-10 introduced phone2tel option which allows NOT to consider
  73. * user=phone URIs as TEL URIs (jiri)
  74. * 2007-10-10 added DNS_SEARCH_FMATCH (mma)
  75. * 2007-11-28 added TCP_OPT_{FD_CACHE, DEFER_ACCEPT, DELAYED_ACK, SYNCNT,
  76. * LINGER2, KEEPALIVE, KEEPIDLE, KEEPINTVL, KEEPCNT} (andrei)
  77. * 2008-01-24 added CFG_DESCRIPTION used by cfg_var (Miklos)
  78. * 2009-03-10 added SET_USERPHONE action (Miklos)
  79. */
  80. %{
  81. #include "dprint.h"
  82. #include "globals.h"
  83. #include "mem/mem.h"
  84. #include <string.h>
  85. #include <stdlib.h>
  86. #include "ip_addr.h"
  87. #include "usr_avp.h"
  88. #include "select.h"
  89. #include "cfg.tab.h"
  90. /* states */
  91. #define INITIAL_S 0
  92. #define COMMENT_S 1
  93. #define COMMENT_LN_S 2
  94. #define STRING_S 3
  95. #define ATTR_S 4
  96. #define SELECT_S 5
  97. #define STR_BUF_ALLOC_UNIT 128
  98. struct str_buf{
  99. char* s;
  100. char* crt;
  101. int left;
  102. };
  103. static int comment_nest=0;
  104. static int state=0, old_state=0, old_initial=0;
  105. static struct str_buf s_buf;
  106. int line=1;
  107. int column=1;
  108. int startcolumn=1;
  109. static char* addchar(struct str_buf *, char);
  110. static char* addstr(struct str_buf *, char*, int);
  111. static void count();
  112. %}
  113. /* start conditions */
  114. %x STRING1 STRING2 COMMENT COMMENT_LN ATTR SELECT
  115. /* action keywords */
  116. FORWARD forward
  117. FORWARD_TCP forward_tcp
  118. FORWARD_UDP forward_udp
  119. FORWARD_TLS forward_tls
  120. FORWARD_SCTP forward_sctp
  121. DROP "drop"|"exit"
  122. RETURN "return"
  123. BREAK "break"
  124. SEND send
  125. SEND_TCP send_tcp
  126. LOG log
  127. ERROR error
  128. ROUTE route
  129. ROUTE_FAILURE failure_route
  130. ROUTE_ONREPLY onreply_route
  131. ROUTE_BRANCH branch_route
  132. ROUTE_SEND onsend_route
  133. EXEC exec
  134. FORCE_RPORT "force_rport"|"add_rport"
  135. FORCE_TCP_ALIAS "force_tcp_alias"|"add_tcp_alias"
  136. UDP_MTU "udp_mtu"
  137. UDP_MTU_TRY_PROTO "udp_mtu_try_proto"
  138. SETFLAG setflag
  139. RESETFLAG resetflag
  140. ISFLAGSET isflagset
  141. FLAGS_DECL "flags"|"bool"
  142. SETAVPFLAG setavpflag
  143. RESETAVPFLAG resetavpflag
  144. ISAVPFLAGSET isavpflagset
  145. AVPFLAGS_DECL avpflags
  146. SET_HOST "rewritehost"|"sethost"|"seth"
  147. SET_HOSTPORT "rewritehostport"|"sethostport"|"sethp"
  148. SET_HOSTPORTTRANS "rewritehostporttrans"|"sethostporttrans"|"sethpt"
  149. SET_USER "rewriteuser"|"setuser"|"setu"
  150. SET_USERPASS "rewriteuserpass"|"setuserpass"|"setup"
  151. SET_PORT "rewriteport"|"setport"|"setp"
  152. SET_URI "rewriteuri"|"seturi"
  153. REVERT_URI "revert_uri"
  154. PREFIX "prefix"
  155. STRIP "strip"
  156. STRIP_TAIL "strip_tail"
  157. SET_USERPHONE "userphone"
  158. APPEND_BRANCH "append_branch"
  159. IF "if"
  160. ELSE "else"
  161. SET_ADV_ADDRESS "set_advertised_address"
  162. SET_ADV_PORT "set_advertised_port"
  163. FORCE_SEND_SOCKET "force_send_socket"
  164. /*ACTION LVALUES*/
  165. URIHOST "uri:host"
  166. URIPORT "uri:port"
  167. MAX_LEN "max_len"
  168. /* condition keywords */
  169. METHOD method
  170. /* hack -- the second element in first line is referable
  171. as either uri or status; it only would makes sense to
  172. call it "uri" from route{} and status from onreply_route{}
  173. */
  174. URI "uri"|"status"
  175. FROM_URI "from_uri"
  176. TO_URI "to_uri"
  177. SRCIP src_ip
  178. SRCPORT src_port
  179. DSTIP dst_ip
  180. DSTPORT dst_port
  181. SNDIP snd_ip
  182. SNDPORT snd_port
  183. SNDPROTO snd_proto|to_proto
  184. SNDAF snd_af|to_af
  185. TOIP to_ip
  186. TOPORT to_port
  187. PROTO proto
  188. AF af
  189. MYSELF myself
  190. MSGLEN "msg:len"
  191. RETCODE \$\?|\$retcode
  192. /* operators */
  193. EQUAL =
  194. EQUAL_T ==
  195. GT >
  196. LT <
  197. GTE >=
  198. LTE <=
  199. DIFF !=
  200. MATCH =~
  201. ADDEQ "+="
  202. NOT !|"not"
  203. LOG_AND "and"|"&&"
  204. BIN_AND "&"
  205. LOG_OR "or"|"||"
  206. BIN_OR "|"
  207. PLUS "+"
  208. MINUS "-"
  209. /* Attribute specification */
  210. ATTR_MARK "$"|"%"
  211. SELECT_MARK "@"
  212. ATTR_FROM "f"
  213. ATTR_TO "t"
  214. ATTR_FROMURI "fr"
  215. ATTR_TOURI "tr"
  216. ATTR_FROMUSER "fu"
  217. ATTR_TOUSER "tu"
  218. ATTR_FROMDOMAIN "fd"
  219. ATTR_TODOMAIN "td"
  220. ATTR_GLOBAL "g"
  221. /* config vars. */
  222. DEBUG debug
  223. FORK fork
  224. LOGSTDERROR log_stderror
  225. LOGFACILITY log_facility
  226. LISTEN listen
  227. ALIAS alias
  228. DNS dns
  229. REV_DNS rev_dns
  230. DNS_TRY_IPV6 dns_try_ipv6
  231. DNS_TRY_NAPTR dns_try_naptr
  232. DNS_SRV_LB dns_srv_lb|dns_srv_loadbalancing
  233. DNS_UDP_PREF dns_udp_pref|dns_udp_preference
  234. DNS_TCP_PREF dns_tcp_pref|dns_tcp_preference
  235. DNS_TLS_PREF dns_tls_pref|dns_tls_preference
  236. DNS_SCTP_PREF dns_sctp_pref|dns_sctp_preference
  237. DNS_RETR_TIME dns_retr_time
  238. DNS_RETR_NO dns_retr_no
  239. DNS_SERVERS_NO dns_servers_no
  240. DNS_USE_SEARCH dns_use_search_list
  241. DNS_SEARCH_FMATCH dns_search_full_match
  242. /* dns cache */
  243. DNS_CACHE_INIT dns_cache_init
  244. DNS_USE_CACHE use_dns_cache
  245. DNS_USE_FAILOVER use_dns_failover
  246. DNS_CACHE_FLAGS dns_cache_flags
  247. DNS_CACHE_NEG_TTL dns_cache_negative_ttl
  248. DNS_CACHE_MIN_TTL dns_cache_min_ttl
  249. DNS_CACHE_MAX_TTL dns_cache_max_ttl
  250. DNS_CACHE_MEM dns_cache_mem
  251. DNS_CACHE_GC_INT dns_cache_gc_interval
  252. DNS_CACHE_DEL_NONEXP dns_cache_del_nonexp|dns_cache_delete_nonexpired
  253. /* blacklist */
  254. DST_BLST_INIT dst_blacklist_init
  255. USE_DST_BLST use_dst_blacklist
  256. DST_BLST_MEM dst_blacklist_mem
  257. DST_BLST_TTL dst_blacklist_expire|dst_blacklist_ttl
  258. DST_BLST_GC_INT dst_blacklist_gc_interval
  259. PORT port
  260. STAT statistics
  261. MAXBUFFER maxbuffer
  262. CHILDREN children
  263. CHECK_VIA check_via
  264. PHONE2TEL phone2tel
  265. SYN_BRANCH syn_branch
  266. MEMLOG "memlog"|"mem_log"
  267. MEMDBG "memdbg"|"mem_dbg"
  268. SIP_WARNING sip_warning
  269. SERVER_SIGNATURE server_signature
  270. REPLY_TO_VIA reply_to_via
  271. USER "user"|"uid"
  272. GROUP "group"|"gid"
  273. CHROOT "chroot"
  274. WDIR "workdir"|"wdir"
  275. MHOMED mhomed
  276. DISABLE_TCP "disable_tcp"
  277. TCP_CHILDREN "tcp_children"
  278. TCP_ACCEPT_ALIASES "tcp_accept_aliases"
  279. TCP_SEND_TIMEOUT "tcp_send_timeout"
  280. TCP_CONNECT_TIMEOUT "tcp_connect_timeout"
  281. TCP_CON_LIFETIME "tcp_connection_lifetime"
  282. TCP_POLL_METHOD "tcp_poll_method"
  283. TCP_MAX_CONNECTIONS "tcp_max_connections"
  284. TCP_NO_CONNECT "tcp_no_connect"
  285. TCP_SOURCE_IPV4 "tcp_source_ipv4"
  286. TCP_SOURCE_IPV6 "tcp_source_ipv6"
  287. TCP_OPT_FD_CACHE "tcp_fd_cache"
  288. TCP_OPT_BUF_WRITE "tcp_buf_write"|"tcp_async"
  289. TCP_OPT_CONN_WQ_MAX "tcp_conn_wq_max"
  290. TCP_OPT_WQ_MAX "tcp_wq_max"
  291. TCP_OPT_RD_BUF "tcp_rd_buf_size"
  292. TCP_OPT_WQ_BLK "tcp_wq_blk_size"
  293. TCP_OPT_DEFER_ACCEPT "tcp_defer_accept"
  294. TCP_OPT_DELAYED_ACK "tcp_delayed_ack"
  295. TCP_OPT_SYNCNT "tcp_syncnt"
  296. TCP_OPT_LINGER2 "tcp_linger2"
  297. TCP_OPT_KEEPALIVE "tcp_keepalive"
  298. TCP_OPT_KEEPIDLE "tcp_keepidle"
  299. TCP_OPT_KEEPINTVL "tcp_keepintvl"
  300. TCP_OPT_KEEPCNT "tcp_keepcnt"
  301. TCP_OPT_CRLF_PING "tcp_crlf_ping"
  302. DISABLE_TLS "disable_tls"|"tls_disable"
  303. ENABLE_TLS "enable_tls"|"tls_enable"
  304. TLSLOG "tlslog"|"tls_log"
  305. TLS_PORT_NO "tls_port_no"
  306. TLS_METHOD "tls_method"
  307. TLS_VERIFY "tls_verify"
  308. TLS_REQUIRE_CERTIFICATE "tls_require_certificate"
  309. TLS_CERTIFICATE "tls_certificate"
  310. TLS_PRIVATE_KEY "tls_private_key"
  311. TLS_CA_LIST "tls_ca_list"
  312. TLS_HANDSHAKE_TIMEOUT "tls_handshake_timeout"
  313. TLS_SEND_TIMEOUT "tls_send_timeout"
  314. DISABLE_SCTP "disable_sctp"
  315. ENABLE_SCTP "enable_sctp"
  316. SCTP_CHILDREN "sctp_children"
  317. SCTP_SOCKET_RCVBUF "sctp_socket_rcvbuf"|"sctp_socket_receive_buffer"
  318. SCTP_SOCKET_SNDBUF "sctp_socket_sndbuf"|"sctp_socket_send_buffer"
  319. SCTP_AUTOCLOSE "sctp_autoclose"
  320. SCTP_SEND_TTL "sctp_send_ttl"
  321. SCTP_SEND_RETRIES "sctp_send_retries"
  322. ADVERTISED_ADDRESS "advertised_address"
  323. ADVERTISED_PORT "advertised_port"
  324. DISABLE_CORE "disable_core_dump"
  325. OPEN_FD_LIMIT "open_files_limit"
  326. SHM_FORCE_ALLOC "shm_force_alloc"
  327. MLOCK_PAGES "mlock_pages"
  328. REAL_TIME "real_time"
  329. RT_PRIO "rt_prio"
  330. RT_POLICY "rt_policy"
  331. RT_TIMER1_PRIO "rt_timer1_prio"|"rt_fast_timer_prio"|"rt_ftimer_prio"
  332. RT_TIMER1_POLICY "rt_timer1_policy"|"rt_ftimer_policy"
  333. RT_TIMER2_PRIO "rt_timer2_prio"|"rt_stimer_prio"
  334. RT_TIMER2_POLICY "rt_timer2_policy"|"rt_stimer_policy"
  335. MCAST_LOOPBACK "mcast_loopback"
  336. MCAST_TTL "mcast_ttl"
  337. TOS "tos"
  338. PMTU_DISCOVERY "pmtu_discovery"
  339. KILL_TIMEOUT "exit_timeout"|"ser_kill_timeout"
  340. /* stun config variables */
  341. STUN_REFRESH_INTERVAL "stun_refresh_interval"
  342. STUN_ALLOW_STUN "stun_allow_stun"
  343. STUN_ALLOW_FP "stun_allow_fp"
  344. SERVER_ID "server_id"
  345. CFG_DESCRIPTION "description"|"descr"|"desc"
  346. LOADMODULE loadmodule
  347. LOADPATH loadpath
  348. MODPARAM modparam
  349. /* values */
  350. YES "yes"|"true"|"on"|"enable"
  351. NO "no"|"false"|"off"|"disable"
  352. UDP "udp"|"UDP"
  353. TCP "tcp"|"TCP"
  354. TLS "tls"|"TLS"
  355. SCTP "sctp"|"SCTP"
  356. INET "inet"|"INET"
  357. INET6 "inet6"|"INET6"
  358. SSLv23 "sslv23"|"SSLv23"|"SSLV23"
  359. SSLv2 "sslv2"|"SSLv2"|"SSLV2"
  360. SSLv3 "sslv3"|"SSLv3"|"SSLV3"
  361. TLSv1 "tlsv1"|"TLSv1"|"TLSV1"
  362. LETTER [a-zA-Z]
  363. DIGIT [0-9]
  364. ALPHANUM {LETTER}|{DIGIT}|[_]
  365. ID {LETTER}{ALPHANUM}*
  366. HEX [0-9a-fA-F]
  367. HEXNUMBER 0x{HEX}+
  368. OCTNUMBER 0[0-7]+
  369. DECNUMBER 0|-?([1-9]{DIGIT}*)
  370. BINNUMBER [0-1]+b
  371. HEX4 {HEX}{1,4}
  372. IPV6ADDR ({HEX4}":"){7}{HEX4}|({HEX4}":"){1,7}(":"{HEX4}){1,7}|":"(":"{HEX4}){1,7}|({HEX4}":"){1,7}":"|"::"
  373. QUOTES \"
  374. TICK \'
  375. SLASH "/"
  376. SEMICOLON ;
  377. RPAREN \)
  378. LPAREN \(
  379. LBRACE \{
  380. RBRACE \}
  381. LBRACK \[
  382. RBRACK \]
  383. COMMA ","
  384. COLON ":"
  385. STAR \*
  386. DOT \.
  387. CR \n
  388. COM_LINE #
  389. COM_START "/\*"
  390. COM_END "\*/"
  391. EAT_ABLE [\ \t\b\r]
  392. %%
  393. <INITIAL>{EAT_ABLE} { count(); }
  394. <INITIAL>{FORWARD} {count(); yylval.strval=yytext; return FORWARD; }
  395. <INITIAL>{FORWARD_TCP} {count(); yylval.strval=yytext; return FORWARD_TCP; }
  396. <INITIAL>{FORWARD_TLS} {count(); yylval.strval=yytext; return FORWARD_TLS; }
  397. <INITIAL>{FORWARD_SCTP} {count(); yylval.strval=yytext; return FORWARD_SCTP;}
  398. <INITIAL>{FORWARD_UDP} {count(); yylval.strval=yytext; return FORWARD_UDP; }
  399. <INITIAL>{DROP} { count(); yylval.strval=yytext; return DROP; }
  400. <INITIAL>{RETURN} { count(); yylval.strval=yytext; return RETURN; }
  401. <INITIAL>{BREAK} { count(); yylval.strval=yytext; return BREAK; }
  402. <INITIAL>{SEND} { count(); yylval.strval=yytext; return SEND; }
  403. <INITIAL>{SEND_TCP} { count(); yylval.strval=yytext; return SEND_TCP; }
  404. <INITIAL>{LOG} { count(); yylval.strval=yytext; return LOG_TOK; }
  405. <INITIAL>{ERROR} { count(); yylval.strval=yytext; return ERROR; }
  406. <INITIAL>{SETFLAG} { count(); yylval.strval=yytext; return SETFLAG; }
  407. <INITIAL>{RESETFLAG} { count(); yylval.strval=yytext; return RESETFLAG; }
  408. <INITIAL>{ISFLAGSET} { count(); yylval.strval=yytext; return ISFLAGSET; }
  409. <INITIAL>{FLAGS_DECL} { count(); yylval.strval=yytext; return FLAGS_DECL; }
  410. <INITIAL>{SETAVPFLAG} { count(); yylval.strval=yytext; return SETAVPFLAG; }
  411. <INITIAL>{RESETAVPFLAG} { count(); yylval.strval=yytext; return RESETAVPFLAG; }
  412. <INITIAL>{ISAVPFLAGSET} { count(); yylval.strval=yytext; return ISAVPFLAGSET; }
  413. <INITIAL>{AVPFLAGS_DECL} { count(); yylval.strval=yytext; return AVPFLAGS_DECL; }
  414. <INITIAL>{MSGLEN} { count(); yylval.strval=yytext; return MSGLEN; }
  415. <INITIAL>{RETCODE} { count(); yylval.strval=yytext; return RETCODE; }
  416. <INITIAL>{ROUTE} { count(); yylval.strval=yytext; return ROUTE; }
  417. <INITIAL>{ROUTE_ONREPLY} { count(); yylval.strval=yytext;
  418. return ROUTE_ONREPLY; }
  419. <INITIAL>{ROUTE_FAILURE} { count(); yylval.strval=yytext;
  420. return ROUTE_FAILURE; }
  421. <INITIAL>{ROUTE_BRANCH} { count(); yylval.strval=yytext; return ROUTE_BRANCH; }
  422. <INITIAL>{ROUTE_SEND} { count(); yylval.strval=yytext; return ROUTE_SEND; }
  423. <INITIAL>{EXEC} { count(); yylval.strval=yytext; return EXEC; }
  424. <INITIAL>{SET_HOST} { count(); yylval.strval=yytext; return SET_HOST; }
  425. <INITIAL>{SET_HOSTPORT} { count(); yylval.strval=yytext; return SET_HOSTPORT; }
  426. <INITIAL>{SET_HOSTPORTTRANS} { count(); yylval.strval=yytext; return SET_HOSTPORTTRANS; }
  427. <INITIAL>{SET_USER} { count(); yylval.strval=yytext; return SET_USER; }
  428. <INITIAL>{SET_USERPASS} { count(); yylval.strval=yytext; return SET_USERPASS; }
  429. <INITIAL>{SET_PORT} { count(); yylval.strval=yytext; return SET_PORT; }
  430. <INITIAL>{SET_URI} { count(); yylval.strval=yytext; return SET_URI; }
  431. <INITIAL>{REVERT_URI} { count(); yylval.strval=yytext; return REVERT_URI; }
  432. <INITIAL>{PREFIX} { count(); yylval.strval=yytext; return PREFIX; }
  433. <INITIAL>{STRIP} { count(); yylval.strval=yytext; return STRIP; }
  434. <INITIAL>{STRIP_TAIL} { count(); yylval.strval=yytext; return STRIP_TAIL; }
  435. <INITIAL>{APPEND_BRANCH} { count(); yylval.strval=yytext;
  436. return APPEND_BRANCH; }
  437. <INITIAL>{SET_USERPHONE} { count(); yylval.strval=yytext;
  438. return SET_USERPHONE; }
  439. <INITIAL>{FORCE_RPORT} { count(); yylval.strval=yytext; return FORCE_RPORT; }
  440. <INITIAL>{FORCE_TCP_ALIAS} { count(); yylval.strval=yytext;
  441. return FORCE_TCP_ALIAS; }
  442. <INITIAL>{UDP_MTU} { count(); yylval.strval=yytext; return UDP_MTU; }
  443. <INITIAL>{UDP_MTU_TRY_PROTO} { count(); yylval.strval=yytext;
  444. return UDP_MTU_TRY_PROTO; }
  445. <INITIAL>{IF} { count(); yylval.strval=yytext; return IF; }
  446. <INITIAL>{ELSE} { count(); yylval.strval=yytext; return ELSE; }
  447. <INITIAL>{SET_ADV_ADDRESS} { count(); yylval.strval=yytext;
  448. return SET_ADV_ADDRESS; }
  449. <INITIAL>{SET_ADV_PORT} { count(); yylval.strval=yytext;
  450. return SET_ADV_PORT; }
  451. <INITIAL>{FORCE_SEND_SOCKET} { count(); yylval.strval=yytext;
  452. return FORCE_SEND_SOCKET; }
  453. <INITIAL>{URIHOST} { count(); yylval.strval=yytext; return URIHOST; }
  454. <INITIAL>{URIPORT} { count(); yylval.strval=yytext; return URIPORT; }
  455. <INITIAL>{MAX_LEN} { count(); yylval.strval=yytext; return MAX_LEN; }
  456. <INITIAL>{METHOD} { count(); yylval.strval=yytext; return METHOD; }
  457. <INITIAL>{URI} { count(); yylval.strval=yytext; return URI; }
  458. <INITIAL>{FROM_URI} { count(); yylval.strval=yytext; return FROM_URI; }
  459. <INITIAL>{TO_URI} { count(); yylval.strval=yytext; return TO_URI; }
  460. <INITIAL>{SRCIP} { count(); yylval.strval=yytext; return SRCIP; }
  461. <INITIAL>{SRCPORT} { count(); yylval.strval=yytext; return SRCPORT; }
  462. <INITIAL>{DSTIP} { count(); yylval.strval=yytext; return DSTIP; }
  463. <INITIAL>{DSTPORT} { count(); yylval.strval=yytext; return DSTPORT; }
  464. <INITIAL>{SNDIP} { count(); yylval.strval=yytext; return SNDIP; }
  465. <INITIAL>{SNDPORT} { count(); yylval.strval=yytext; return SNDPORT; }
  466. <INITIAL>{SNDPROTO} { count(); yylval.strval=yytext; return SNDPROTO; }
  467. <INITIAL>{SNDAF} { count(); yylval.strval=yytext; return SNDAF; }
  468. <INITIAL>{TOIP} { count(); yylval.strval=yytext; return TOIP; }
  469. <INITIAL>{TOPORT} { count(); yylval.strval=yytext; return TOPORT; }
  470. <INITIAL>{PROTO} { count(); yylval.strval=yytext; return PROTO; }
  471. <INITIAL>{AF} { count(); yylval.strval=yytext; return AF; }
  472. <INITIAL>{MYSELF} { count(); yylval.strval=yytext; return MYSELF; }
  473. <INITIAL>{DEBUG} { count(); yylval.strval=yytext; return DEBUG_V; }
  474. <INITIAL>{FORK} { count(); yylval.strval=yytext; return FORK; }
  475. <INITIAL>{LOGSTDERROR} { yylval.strval=yytext; return LOGSTDERROR; }
  476. <INITIAL>{LOGFACILITY} { yylval.strval=yytext; return LOGFACILITY; }
  477. <INITIAL>{LISTEN} { count(); yylval.strval=yytext; return LISTEN; }
  478. <INITIAL>{ALIAS} { count(); yylval.strval=yytext; return ALIAS; }
  479. <INITIAL>{DNS} { count(); yylval.strval=yytext; return DNS; }
  480. <INITIAL>{REV_DNS} { count(); yylval.strval=yytext; return REV_DNS; }
  481. <INITIAL>{DNS_TRY_IPV6} { count(); yylval.strval=yytext;
  482. return DNS_TRY_IPV6; }
  483. <INITIAL>{DNS_TRY_NAPTR} { count(); yylval.strval=yytext;
  484. return DNS_TRY_NAPTR; }
  485. <INITIAL>{DNS_SRV_LB} { count(); yylval.strval=yytext;
  486. return DNS_SRV_LB; }
  487. <INITIAL>{DNS_UDP_PREF} { count(); yylval.strval=yytext;
  488. return DNS_UDP_PREF; }
  489. <INITIAL>{DNS_TCP_PREF} { count(); yylval.strval=yytext;
  490. return DNS_TCP_PREF; }
  491. <INITIAL>{DNS_TLS_PREF} { count(); yylval.strval=yytext;
  492. return DNS_TLS_PREF; }
  493. <INITIAL>{DNS_SCTP_PREF} { count(); yylval.strval=yytext;
  494. return DNS_SCTP_PREF; }
  495. <INITIAL>{DNS_RETR_TIME} { count(); yylval.strval=yytext;
  496. return DNS_RETR_TIME; }
  497. <INITIAL>{DNS_RETR_NO} { count(); yylval.strval=yytext;
  498. return DNS_RETR_NO; }
  499. <INITIAL>{DNS_SERVERS_NO} { count(); yylval.strval=yytext;
  500. return DNS_SERVERS_NO; }
  501. <INITIAL>{DNS_USE_SEARCH} { count(); yylval.strval=yytext;
  502. return DNS_USE_SEARCH; }
  503. <INITIAL>{DNS_SEARCH_FMATCH} { count(); yylval.strval=yytext;
  504. return DNS_SEARCH_FMATCH; }
  505. <INITIAL>{DNS_CACHE_INIT} { count(); yylval.strval=yytext;
  506. return DNS_CACHE_INIT; }
  507. <INITIAL>{DNS_USE_CACHE} { count(); yylval.strval=yytext;
  508. return DNS_USE_CACHE; }
  509. <INITIAL>{DNS_USE_FAILOVER} { count(); yylval.strval=yytext;
  510. return DNS_USE_FAILOVER; }
  511. <INITIAL>{DNS_CACHE_FLAGS} { count(); yylval.strval=yytext;
  512. return DNS_CACHE_FLAGS; }
  513. <INITIAL>{DNS_CACHE_NEG_TTL} { count(); yylval.strval=yytext;
  514. return DNS_CACHE_NEG_TTL; }
  515. <INITIAL>{DNS_CACHE_MIN_TTL} { count(); yylval.strval=yytext;
  516. return DNS_CACHE_MIN_TTL; }
  517. <INITIAL>{DNS_CACHE_MAX_TTL} { count(); yylval.strval=yytext;
  518. return DNS_CACHE_MAX_TTL; }
  519. <INITIAL>{DNS_CACHE_MEM} { count(); yylval.strval=yytext;
  520. return DNS_CACHE_MEM; }
  521. <INITIAL>{DNS_CACHE_GC_INT} { count(); yylval.strval=yytext;
  522. return DNS_CACHE_GC_INT; }
  523. <INITIAL>{DNS_CACHE_DEL_NONEXP} { count(); yylval.strval=yytext;
  524. return DNS_CACHE_DEL_NONEXP; }
  525. <INITIAL>{DST_BLST_INIT} { count(); yylval.strval=yytext;
  526. return DST_BLST_INIT; }
  527. <INITIAL>{USE_DST_BLST} { count(); yylval.strval=yytext;
  528. return USE_DST_BLST; }
  529. <INITIAL>{DST_BLST_MEM} { count(); yylval.strval=yytext;
  530. return DST_BLST_MEM; }
  531. <INITIAL>{DST_BLST_TTL} { count(); yylval.strval=yytext;
  532. return DST_BLST_TTL; }
  533. <INITIAL>{DST_BLST_GC_INT} { count(); yylval.strval=yytext;
  534. return DST_BLST_GC_INT; }
  535. <INITIAL>{PORT} { count(); yylval.strval=yytext; return PORT; }
  536. <INITIAL>{STAT} { count(); yylval.strval=yytext; return STAT; }
  537. <INITIAL>{MAXBUFFER} { count(); yylval.strval=yytext; return MAXBUFFER; }
  538. <INITIAL>{CHILDREN} { count(); yylval.strval=yytext; return CHILDREN; }
  539. <INITIAL>{CHECK_VIA} { count(); yylval.strval=yytext; return CHECK_VIA; }
  540. <INITIAL>{PHONE2TEL} { count(); yylval.strval=yytext; return PHONE2TEL; }
  541. <INITIAL>{SYN_BRANCH} { count(); yylval.strval=yytext; return SYN_BRANCH; }
  542. <INITIAL>{MEMLOG} { count(); yylval.strval=yytext; return MEMLOG; }
  543. <INITIAL>{MEMDBG} { count(); yylval.strval=yytext; return MEMDBG; }
  544. <INITIAL>{SIP_WARNING} { count(); yylval.strval=yytext; return SIP_WARNING; }
  545. <INITIAL>{USER} { count(); yylval.strval=yytext; return USER; }
  546. <INITIAL>{GROUP} { count(); yylval.strval=yytext; return GROUP; }
  547. <INITIAL>{CHROOT} { count(); yylval.strval=yytext; return CHROOT; }
  548. <INITIAL>{WDIR} { count(); yylval.strval=yytext; return WDIR; }
  549. <INITIAL>{MHOMED} { count(); yylval.strval=yytext; return MHOMED; }
  550. <INITIAL>{DISABLE_TCP} { count(); yylval.strval=yytext; return DISABLE_TCP; }
  551. <INITIAL>{TCP_CHILDREN} { count(); yylval.strval=yytext; return TCP_CHILDREN; }
  552. <INITIAL>{TCP_ACCEPT_ALIASES} { count(); yylval.strval=yytext;
  553. return TCP_ACCEPT_ALIASES; }
  554. <INITIAL>{TCP_SEND_TIMEOUT} { count(); yylval.strval=yytext;
  555. return TCP_SEND_TIMEOUT; }
  556. <INITIAL>{TCP_CONNECT_TIMEOUT} { count(); yylval.strval=yytext;
  557. return TCP_CONNECT_TIMEOUT; }
  558. <INITIAL>{TCP_CON_LIFETIME} { count(); yylval.strval=yytext;
  559. return TCP_CON_LIFETIME; }
  560. <INITIAL>{TCP_POLL_METHOD} { count(); yylval.strval=yytext;
  561. return TCP_POLL_METHOD; }
  562. <INITIAL>{TCP_MAX_CONNECTIONS} { count(); yylval.strval=yytext;
  563. return TCP_MAX_CONNECTIONS; }
  564. <INITIAL>{TCP_NO_CONNECT} { count(); yylval.strval=yytext;
  565. return TCP_NO_CONNECT; }
  566. <INITIAL>{TCP_SOURCE_IPV4} { count(); yylval.strval=yytext;
  567. return TCP_SOURCE_IPV4; }
  568. <INITIAL>{TCP_SOURCE_IPV6} { count(); yylval.strval=yytext;
  569. return TCP_SOURCE_IPV6; }
  570. <INITIAL>{TCP_OPT_FD_CACHE} { count(); yylval.strval=yytext;
  571. return TCP_OPT_FD_CACHE; }
  572. <INITIAL>{TCP_OPT_CONN_WQ_MAX} { count(); yylval.strval=yytext;
  573. return TCP_OPT_CONN_WQ_MAX; }
  574. <INITIAL>{TCP_OPT_WQ_MAX} { count(); yylval.strval=yytext;
  575. return TCP_OPT_WQ_MAX; }
  576. <INITIAL>{TCP_OPT_RD_BUF} { count(); yylval.strval=yytext;
  577. return TCP_OPT_RD_BUF; }
  578. <INITIAL>{TCP_OPT_WQ_BLK} { count(); yylval.strval=yytext;
  579. return TCP_OPT_WQ_BLK; }
  580. <INITIAL>{TCP_OPT_BUF_WRITE} { count(); yylval.strval=yytext;
  581. return TCP_OPT_BUF_WRITE; }
  582. <INITIAL>{TCP_OPT_DEFER_ACCEPT} { count(); yylval.strval=yytext;
  583. return TCP_OPT_DEFER_ACCEPT; }
  584. <INITIAL>{TCP_OPT_DELAYED_ACK} { count(); yylval.strval=yytext;
  585. return TCP_OPT_DELAYED_ACK; }
  586. <INITIAL>{TCP_OPT_SYNCNT} { count(); yylval.strval=yytext;
  587. return TCP_OPT_SYNCNT; }
  588. <INITIAL>{TCP_OPT_LINGER2} { count(); yylval.strval=yytext;
  589. return TCP_OPT_LINGER2; }
  590. <INITIAL>{TCP_OPT_KEEPALIVE} { count(); yylval.strval=yytext;
  591. return TCP_OPT_KEEPALIVE; }
  592. <INITIAL>{TCP_OPT_KEEPIDLE} { count(); yylval.strval=yytext;
  593. return TCP_OPT_KEEPIDLE; }
  594. <INITIAL>{TCP_OPT_KEEPINTVL} { count(); yylval.strval=yytext;
  595. return TCP_OPT_KEEPINTVL; }
  596. <INITIAL>{TCP_OPT_KEEPCNT} { count(); yylval.strval=yytext;
  597. return TCP_OPT_KEEPCNT; }
  598. <INITIAL>{TCP_OPT_CRLF_PING} { count(); yylval.strval=yytext;
  599. return TCP_OPT_CRLF_PING; }
  600. <INITIAL>{DISABLE_TLS} { count(); yylval.strval=yytext; return DISABLE_TLS; }
  601. <INITIAL>{ENABLE_TLS} { count(); yylval.strval=yytext; return ENABLE_TLS; }
  602. <INITIAL>{TLSLOG} { count(); yylval.strval=yytext; return TLS_PORT_NO; }
  603. <INITIAL>{TLS_PORT_NO} { count(); yylval.strval=yytext; return TLS_PORT_NO; }
  604. <INITIAL>{TLS_METHOD} { count(); yylval.strval=yytext; return TLS_METHOD; }
  605. <INITIAL>{TLS_VERIFY} { count(); yylval.strval=yytext; return TLS_VERIFY; }
  606. <INITIAL>{TLS_REQUIRE_CERTIFICATE} { count(); yylval.strval=yytext;
  607. return TLS_REQUIRE_CERTIFICATE; }
  608. <INITIAL>{TLS_CERTIFICATE} { count(); yylval.strval=yytext;
  609. return TLS_CERTIFICATE; }
  610. <INITIAL>{TLS_PRIVATE_KEY} { count(); yylval.strval=yytext;
  611. return TLS_PRIVATE_KEY; }
  612. <INITIAL>{TLS_CA_LIST} { count(); yylval.strval=yytext;
  613. return TLS_CA_LIST; }
  614. <INITIAL>{TLS_HANDSHAKE_TIMEOUT} { count(); yylval.strval=yytext;
  615. return TLS_HANDSHAKE_TIMEOUT; }
  616. <INITIAL>{TLS_SEND_TIMEOUT} { count(); yylval.strval=yytext;
  617. return TLS_SEND_TIMEOUT; }
  618. <INITIAL>{DISABLE_SCTP} { count(); yylval.strval=yytext; return DISABLE_SCTP;}
  619. <INITIAL>{ENABLE_SCTP} { count(); yylval.strval=yytext; return ENABLE_SCTP;}
  620. <INITIAL>{SCTP_CHILDREN} { count(); yylval.strval=yytext;
  621. return SCTP_CHILDREN; }
  622. <INITIAL>{SCTP_SOCKET_RCVBUF} { count(); yylval.strval=yytext;
  623. return SCTP_SOCKET_RCVBUF; }
  624. <INITIAL>{SCTP_SOCKET_SNDBUF} { count(); yylval.strval=yytext;
  625. return SCTP_SOCKET_SNDBUF; }
  626. <INITIAL>{SCTP_AUTOCLOSE} { count(); yylval.strval=yytext;
  627. return SCTP_AUTOCLOSE; }
  628. <INITIAL>{SCTP_SEND_TTL} { count(); yylval.strval=yytext;
  629. return SCTP_SEND_TTL; }
  630. <INITIAL>{SCTP_SEND_RETRIES} { count(); yylval.strval=yytext;
  631. return SCTP_SEND_RETRIES; }
  632. <INITIAL>{SERVER_SIGNATURE} { count(); yylval.strval=yytext; return SERVER_SIGNATURE; }
  633. <INITIAL>{REPLY_TO_VIA} { count(); yylval.strval=yytext; return REPLY_TO_VIA; }
  634. <INITIAL>{ADVERTISED_ADDRESS} { count(); yylval.strval=yytext;
  635. return ADVERTISED_ADDRESS; }
  636. <INITIAL>{ADVERTISED_PORT} { count(); yylval.strval=yytext;
  637. return ADVERTISED_PORT; }
  638. <INITIAL>{DISABLE_CORE} { count(); yylval.strval=yytext;
  639. return DISABLE_CORE; }
  640. <INITIAL>{OPEN_FD_LIMIT} { count(); yylval.strval=yytext;
  641. return OPEN_FD_LIMIT; }
  642. <INITIAL>{SHM_FORCE_ALLOC} { count(); yylval.strval=yytext;
  643. return SHM_FORCE_ALLOC; }
  644. <INITIAL>{MLOCK_PAGES} { count(); yylval.strval=yytext;
  645. return MLOCK_PAGES; }
  646. <INITIAL>{REAL_TIME} { count(); yylval.strval=yytext;
  647. return REAL_TIME; }
  648. <INITIAL>{RT_PRIO} { count(); yylval.strval=yytext;
  649. return RT_PRIO; }
  650. <INITIAL>{RT_POLICY} { count(); yylval.strval=yytext;
  651. return RT_POLICY; }
  652. <INITIAL>{RT_TIMER1_PRIO} { count(); yylval.strval=yytext;
  653. return RT_TIMER1_PRIO; }
  654. <INITIAL>{RT_TIMER1_POLICY} { count(); yylval.strval=yytext;
  655. return RT_TIMER1_POLICY; }
  656. <INITIAL>{RT_TIMER2_PRIO} { count(); yylval.strval=yytext;
  657. return RT_TIMER2_PRIO; }
  658. <INITIAL>{RT_TIMER2_POLICY} { count(); yylval.strval=yytext;
  659. return RT_TIMER2_POLICY; }
  660. <INITIAL>{MCAST_LOOPBACK} { count(); yylval.strval=yytext;
  661. return MCAST_LOOPBACK; }
  662. <INITIAL>{MCAST_TTL} { count(); yylval.strval=yytext;
  663. return MCAST_TTL; }
  664. <INITIAL>{TOS} { count(); yylval.strval=yytext;
  665. return TOS; }
  666. <INITIAL>{PMTU_DISCOVERY} { count(); yylval.strval=yytext;
  667. return PMTU_DISCOVERY; }
  668. <INITIAL>{KILL_TIMEOUT} { count(); yylval.strval=yytext;
  669. return KILL_TIMEOUT; }
  670. <INITIAL>{SERVER_ID} { count(); yylval.strval=yytext; return SERVER_ID;}
  671. <INITIAL>{CFG_DESCRIPTION} { count(); yylval.strval=yytext; return CFG_DESCRIPTION; }
  672. <INITIAL>{LOADMODULE} { count(); yylval.strval=yytext; return LOADMODULE; }
  673. <INITIAL>{LOADPATH} { count(); yylval.strval=yytext; return LOADPATH; }
  674. <INITIAL>{MODPARAM} { count(); yylval.strval=yytext; return MODPARAM; }
  675. <INITIAL>{STUN_REFRESH_INTERVAL} { count(); yylval.strval=yytext; return STUN_REFRESH_INTERVAL;}
  676. <INITIAL>{STUN_ALLOW_STUN} { count(); yylval.strval=yytext; return STUN_ALLOW_STUN;}
  677. <INITIAL>{STUN_ALLOW_FP} { count(); yylval.strval=yytext; return STUN_ALLOW_FP;}
  678. <INITIAL>{EQUAL} { count(); return EQUAL; }
  679. <INITIAL>{ADDEQ} { count(); return ADDEQ; }
  680. <INITIAL>{EQUAL_T} { count(); return EQUAL_T; }
  681. <INITIAL>{GT} { count(); return GT; }
  682. <INITIAL>{LT} { count(); return LT; }
  683. <INITIAL>{GTE} { count(); return GTE; }
  684. <INITIAL>{LTE} { count(); return LTE; }
  685. <INITIAL>{DIFF} { count(); return DIFF; }
  686. <INITIAL>{MATCH} { count(); return MATCH; }
  687. <INITIAL>{NOT} { count(); return NOT; }
  688. <INITIAL>{LOG_AND} { count(); return LOG_AND; }
  689. <INITIAL>{BIN_AND} { count(); return BIN_AND; }
  690. <INITIAL>{LOG_OR} { count(); return LOG_OR; }
  691. <INITIAL>{BIN_OR} { count(); return BIN_OR; }
  692. <INITIAL>{PLUS} { count(); return PLUS; }
  693. <INITIAL>{MINUS} { count(); return MINUS; }
  694. <INITIAL>{SELECT_MARK} { count(); state = SELECT_S; BEGIN(SELECT); return SELECT_MARK; }
  695. <SELECT>{ID} { count(); addstr(&s_buf, yytext, yyleng);
  696. yylval.strval=s_buf.s;
  697. memset(&s_buf, 0, sizeof(s_buf));
  698. return ID;
  699. }
  700. <SELECT>{DOT} { count(); return DOT; }
  701. <SELECT>{LBRACK} { count(); return LBRACK; }
  702. <SELECT>{RBRACK} { count(); return RBRACK; }
  703. <SELECT>{DECNUMBER} { count(); yylval.intval=atoi(yytext);return NUMBER; }
  704. <SELECT>{HEXNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 16); return NUMBER; }
  705. <SELECT>{OCTNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 8); return NUMBER; }
  706. <SELECT>{BINNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 2); return NUMBER; }
  707. <INITIAL>{ATTR_MARK} { count(); state = ATTR_S; BEGIN(ATTR); return ATTR_MARK; }
  708. <ATTR>{ATTR_FROM} { count(); return ATTR_FROM; }
  709. <ATTR>{ATTR_TO} { count(); return ATTR_TO; }
  710. <ATTR>{ATTR_FROMURI} { count(); return ATTR_FROMURI; }
  711. <ATTR>{ATTR_TOURI} { count(); return ATTR_TOURI; }
  712. <ATTR>{ATTR_FROMUSER} { count(); return ATTR_FROMUSER; }
  713. <ATTR>{ATTR_TOUSER} { count(); return ATTR_TOUSER; }
  714. <ATTR>{ATTR_FROMDOMAIN} { count(); return ATTR_FROMDOMAIN; }
  715. <ATTR>{ATTR_TODOMAIN} { count(); return ATTR_TODOMAIN; }
  716. <ATTR>{ATTR_GLOBAL} { count(); return ATTR_GLOBAL; }
  717. <ATTR>{DOT} { count(); return DOT; }
  718. <ATTR>{LBRACK} { count(); return LBRACK; }
  719. <ATTR>{RBRACK} { count(); return RBRACK; }
  720. <ATTR>{STAR} { count(); return STAR; }
  721. <ATTR>{DECNUMBER} { count(); yylval.intval=atoi(yytext);return NUMBER; }
  722. <ATTR>{ID} { count(); addstr(&s_buf, yytext, yyleng);
  723. yylval.strval=s_buf.s;
  724. memset(&s_buf, 0, sizeof(s_buf));
  725. state = INITIAL_S;
  726. BEGIN(INITIAL);
  727. return ID;
  728. }
  729. <INITIAL>{IPV6ADDR} { count(); yylval.strval=yytext; return IPV6ADDR; }
  730. <INITIAL>{DECNUMBER} { count(); yylval.intval=atoi(yytext);return NUMBER; }
  731. <INITIAL>{HEXNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 16);
  732. return NUMBER; }
  733. <INITIAL>{OCTNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 8);
  734. return NUMBER; }
  735. <INITIAL>{BINNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 2); return NUMBER; }
  736. <INITIAL>{YES} { count(); yylval.intval=1; return NUMBER; }
  737. <INITIAL>{NO} { count(); yylval.intval=0; return NUMBER; }
  738. <INITIAL>{TCP} { count(); return TCP; }
  739. <INITIAL>{UDP} { count(); return UDP; }
  740. <INITIAL>{TLS} { count(); return TLS; }
  741. <INITIAL>{SCTP} { count(); return SCTP; }
  742. <INITIAL>{INET} { count(); yylval.intval=AF_INET; return NUMBER; }
  743. <INITIAL>{INET6} { count();
  744. #ifdef USE_IPV6
  745. yylval.intval=AF_INET6;
  746. #else
  747. yylval.intval=-1; /* no match*/
  748. #endif
  749. return NUMBER; }
  750. <INITIAL>{SSLv23} { count(); yylval.strval=yytext; return SSLv23; }
  751. <INITIAL>{SSLv2} { count(); yylval.strval=yytext; return SSLv2; }
  752. <INITIAL>{SSLv3} { count(); yylval.strval=yytext; return SSLv3; }
  753. <INITIAL>{TLSv1} { count(); yylval.strval=yytext; return TLSv1; }
  754. <INITIAL>{COMMA} { count(); return COMMA; }
  755. <INITIAL>{SEMICOLON} { count(); return SEMICOLON; }
  756. <INITIAL>{COLON} { count(); return COLON; }
  757. <INITIAL>{STAR} { count(); return STAR; }
  758. <INITIAL>{RPAREN} { count(); return RPAREN; }
  759. <INITIAL>{LPAREN} { count(); return LPAREN; }
  760. <INITIAL>{LBRACE} { count(); return LBRACE; }
  761. <INITIAL>{RBRACE} { count(); return RBRACE; }
  762. <INITIAL>{LBRACK} { count(); return LBRACK; }
  763. <INITIAL>{RBRACK} { count(); return RBRACK; }
  764. <INITIAL>{SLASH} { count(); return SLASH; }
  765. <INITIAL>{DOT} { count(); return DOT; }
  766. <INITIAL>\\{CR} {count(); } /* eat the escaped CR */
  767. <INITIAL>{CR} { count();/* return CR;*/ }
  768. <INITIAL,SELECT>{QUOTES} { count(); old_initial = YY_START; old_state = state; state=STRING_S; BEGIN(STRING1); }
  769. <INITIAL>{TICK} { count(); old_initial = YY_START; old_state = state; state=STRING_S; BEGIN(STRING2); }
  770. <STRING1>{QUOTES} { count(); state=old_state; BEGIN(old_initial);
  771. yytext[yyleng-1]=0; yyleng--;
  772. addstr(&s_buf, yytext, yyleng);
  773. yylval.strval=s_buf.s;
  774. memset(&s_buf, 0, sizeof(s_buf));
  775. return STRING;
  776. }
  777. <STRING2>{TICK} { count(); state=old_state; BEGIN(old_initial);
  778. yytext[yyleng-1]=0; yyleng--;
  779. addstr(&s_buf, yytext, yyleng);
  780. yylval.strval=s_buf.s;
  781. memset(&s_buf, 0, sizeof(s_buf));
  782. return STRING;
  783. }
  784. <STRING2>.|{EAT_ABLE}|{CR} { yymore(); }
  785. <STRING1>\\n { count(); addchar(&s_buf, '\n'); }
  786. <STRING1>\\r { count(); addchar(&s_buf, '\r'); }
  787. <STRING1>\\a { count(); addchar(&s_buf, '\a'); }
  788. <STRING1>\\t { count(); addchar(&s_buf, '\t'); }
  789. <STRING1>\\{QUOTES} { count(); addchar(&s_buf, '"'); }
  790. <STRING1>\\\\ { count(); addchar(&s_buf, '\\'); }
  791. <STRING1>\\x{HEX}{1,2} { count(); addchar(&s_buf,
  792. (char)strtol(yytext+2, 0, 16)); }
  793. /* don't allow \[0-7]{1}, it will eat the backreferences from
  794. subst_uri if allowed (although everybody should use '' in subt_uri) */
  795. <STRING1>\\[0-7]{2,3} { count(); addchar(&s_buf,
  796. (char)strtol(yytext+1, 0, 8)); }
  797. <STRING1>\\{CR} { count(); } /* eat escaped CRs */
  798. <STRING1>.|{EAT_ABLE}|{CR} { addchar(&s_buf, *yytext); }
  799. <INITIAL,COMMENT>{COM_START} { count(); comment_nest++; state=COMMENT_S;
  800. BEGIN(COMMENT); }
  801. <COMMENT>{COM_END} { count(); comment_nest--;
  802. if (comment_nest==0){
  803. state=INITIAL_S;
  804. BEGIN(INITIAL);
  805. }
  806. }
  807. <COMMENT>.|{EAT_ABLE}|{CR} { count(); };
  808. <INITIAL>{COM_LINE}.*{CR} { count(); }
  809. <INITIAL>{ID} { count(); addstr(&s_buf, yytext, yyleng);
  810. yylval.strval=s_buf.s;
  811. memset(&s_buf, 0, sizeof(s_buf));
  812. return ID; }
  813. <SELECT>. { unput(yytext[0]); state = INITIAL_S; BEGIN(INITIAL); } /* Rescan the token in INITIAL state */
  814. <<EOF>> {
  815. switch(state){
  816. case STRING_S:
  817. LOG(L_CRIT, "ERROR: cfg. parser: unexpected EOF in"
  818. " unclosed string\n");
  819. if (s_buf.s){
  820. pkg_free(s_buf.s);
  821. memset(&s_buf, 0,
  822. sizeof(s_buf));
  823. }
  824. break;
  825. case COMMENT_S:
  826. LOG(L_CRIT, "ERROR: cfg. parser: unexpected EOF:"
  827. " %d comments open\n", comment_nest);
  828. break;
  829. case COMMENT_LN_S:
  830. LOG(L_CRIT, "ERROR: unexpected EOF:"
  831. "comment line open\n");
  832. break;
  833. }
  834. return 0;
  835. }
  836. %%
  837. static char* addchar(struct str_buf* dst, char c)
  838. {
  839. return addstr(dst, &c, 1);
  840. }
  841. static char* addstr(struct str_buf* dst_b, char* src, int len)
  842. {
  843. char *tmp;
  844. unsigned size;
  845. unsigned used;
  846. if (dst_b->left<(len+1)){
  847. used=(unsigned)(dst_b->crt-dst_b->s);
  848. size=used+len+1;
  849. /* round up to next multiple */
  850. size+= STR_BUF_ALLOC_UNIT-size%STR_BUF_ALLOC_UNIT;
  851. tmp=pkg_malloc(size);
  852. if (tmp==0) goto error;
  853. if (dst_b->s){
  854. memcpy(tmp, dst_b->s, used);
  855. pkg_free(dst_b->s);
  856. }
  857. dst_b->s=tmp;
  858. dst_b->crt=dst_b->s+used;
  859. dst_b->left=size-used;
  860. }
  861. memcpy(dst_b->crt, src, len);
  862. dst_b->crt+=len;
  863. *(dst_b->crt)=0;
  864. dst_b->left-=len;
  865. return dst_b->s;
  866. error:
  867. LOG(L_CRIT, "ERROR:lex:addstr: memory allocation error\n");
  868. return 0;
  869. }
  870. static void count()
  871. {
  872. int i;
  873. startcolumn=column;
  874. for (i=0; i<yyleng;i++){
  875. if (yytext[i]=='\n'){
  876. line++;
  877. column=startcolumn=1;
  878. }else if (yytext[i]=='\t'){
  879. column++;
  880. /*column+=8 -(column%8);*/
  881. }else{
  882. column++;
  883. }
  884. }
  885. }
  886. /* replacement yywrap, removes libfl dependency */
  887. int yywrap()
  888. {
  889. return 1;
  890. }