cfg.lex 61 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897
  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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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. * 2008-11-28 added support for kamailio pvars and avp/pvar guessing (andrei)
  79. * 2008-12-11 added support for "string1" "string2" (andrei)
  80. * 2009-03-10 added SET_USERPHONE action (Miklos)
  81. * 2009-04-24 add strlen, strempty and defined operators (andrei)
  82. * 2009-03-07 RETCODE, it's now a core pvar (andrei)
  83. * 2010-01-10 added SHM_MEM_SZ (andrei)
  84. * 2010-02-17 added DST_BLST_{UDP,TCP,TLS,SCTP}_IMASK (andrei)
  85. */
  86. %option noinput
  87. %{
  88. #include "dprint.h"
  89. #include "globals.h"
  90. #include "mem/mem.h"
  91. #include <string.h>
  92. #include <stdlib.h>
  93. #include "ip_addr.h"
  94. #include "usr_avp.h"
  95. #include "select.h"
  96. #include "cfg.tab.h"
  97. #include "sr_compat.h"
  98. #include "ppcfg.h"
  99. /* states */
  100. #define INITIAL_S 0
  101. #define COMMENT_S 1
  102. #define COMMENT_LN_S 2
  103. #define STRING_S 3
  104. #define ATTR_S 4 /* avp/attr */
  105. #define SELECT_S 5
  106. #define AVP_PVAR_S 6 /* avp or pvar */
  107. #define PVAR_P_S 7 /* pvar: $(...) or $foo(...)*/
  108. #define PVARID_S 8 /* $foo.bar...*/
  109. #define STR_BETWEEN_S 9
  110. #define LINECOMMENT_S 10
  111. #define DEFINE_S 11
  112. #define DEFINE_EOL_S 12
  113. #define IFDEF_S 13
  114. #define IFDEF_EOL_S 14
  115. #define IFDEF_SKIP_S 15
  116. #define DEFINE_DATA_S 16
  117. #define STR_BUF_ALLOC_UNIT 128
  118. struct str_buf{
  119. char* s;
  120. char* crt;
  121. int left;
  122. };
  123. static int comment_nest=0;
  124. static int p_nest=0;
  125. static int state=0, old_state=0, old_initial=0;
  126. static struct str_buf s_buf;
  127. int line=1;
  128. int column=1;
  129. int startcolumn=1;
  130. int startline=1;
  131. char *finame = 0;
  132. char *routename = 0;
  133. char *default_routename = 0;
  134. static int ign_lines=0;
  135. static int ign_columns=0;
  136. char* yy_number_str=0; /* str correspondent for the current NUMBER token */
  137. int r = 0;
  138. str *sdef = 0;
  139. static char* addchar(struct str_buf *, char);
  140. static char* addstr(struct str_buf *, char*, int);
  141. static void count();
  142. static void count_more();
  143. static void count_ignore();
  144. #define MAX_INCLUDE_DEPTH 10
  145. static struct sr_yy_state {
  146. YY_BUFFER_STATE state;
  147. int line;
  148. int column;
  149. int startcolumn;
  150. int startline;
  151. char *finame;
  152. char *routename;
  153. } include_stack[MAX_INCLUDE_DEPTH];
  154. static int include_stack_ptr = 0;
  155. static int sr_push_yy_state(char *fin, int mode);
  156. static int sr_pop_yy_state();
  157. static struct sr_yy_fname {
  158. char *fname;
  159. struct sr_yy_fname *next;
  160. } *sr_yy_fname_list = 0;
  161. static str *pp_define_get(int len, const char * text);
  162. static int pp_ifdef_type(int pos);
  163. static void pp_ifdef_var(int len, const char * text);
  164. static void pp_ifdef();
  165. static void pp_else();
  166. static void pp_endif();
  167. %}
  168. /* start conditions */
  169. %x STRING1 STRING2 STR_BETWEEN COMMENT COMMENT_LN ATTR SELECT AVP_PVAR PVAR_P
  170. %x PVARID INCLF IMPTF
  171. %x LINECOMMENT DEFINE_ID DEFINE_EOL DEFINE_DATA IFDEF_ID IFDEF_EOL IFDEF_SKIP
  172. /* config script types : #!SER or #!KAMAILIO or #!MAX_COMPAT */
  173. SER_CFG SER
  174. KAMAILIO_CFG KAMAILIO|OPENSER
  175. MAXCOMPAT_CFG MAXCOMPAT|ALL
  176. /* action keywords */
  177. FORWARD forward
  178. FORWARD_TCP forward_tcp
  179. FORWARD_UDP forward_udp
  180. FORWARD_TLS forward_tls
  181. FORWARD_SCTP forward_sctp
  182. DROP "drop"
  183. EXIT "exit"
  184. RETURN "return"
  185. BREAK "break"
  186. LOG log
  187. ERROR error
  188. ROUTE route
  189. ROUTE_REQUEST request_route
  190. ROUTE_FAILURE failure_route
  191. ROUTE_REPLY reply_route
  192. ROUTE_ONREPLY onreply_route
  193. ROUTE_BRANCH branch_route
  194. ROUTE_SEND onsend_route
  195. ROUTE_EVENT event_route
  196. EXEC exec
  197. FORCE_RPORT "force_rport"|"add_rport"
  198. ADD_LOCAL_RPORT "add_local_rport"
  199. FORCE_TCP_ALIAS "force_tcp_alias"|"add_tcp_alias"
  200. UDP_MTU "udp_mtu"
  201. UDP_MTU_TRY_PROTO "udp_mtu_try_proto"
  202. UDP4_RAW "udp4_raw"
  203. UDP4_RAW_MTU "udp4_raw_mtu"
  204. UDP4_RAW_TTL "udp4_raw_ttl"
  205. SETFLAG setflag
  206. RESETFLAG resetflag
  207. ISFLAGSET isflagset
  208. FLAGS_DECL "flags"|"bool"
  209. SETAVPFLAG setavpflag
  210. RESETAVPFLAG resetavpflag
  211. ISAVPFLAGSET isavpflagset
  212. AVPFLAGS_DECL avpflags
  213. SET_HOST "rewritehost"|"sethost"|"seth"
  214. SET_HOSTPORT "rewritehostport"|"sethostport"|"sethp"
  215. SET_HOSTPORTTRANS "rewritehostporttrans"|"sethostporttrans"|"sethpt"
  216. SET_USER "rewriteuser"|"setuser"|"setu"
  217. SET_USERPASS "rewriteuserpass"|"setuserpass"|"setup"
  218. SET_PORT "rewriteport"|"setport"|"setp"
  219. SET_URI "rewriteuri"|"seturi"
  220. REVERT_URI "revert_uri"
  221. PREFIX "prefix"
  222. STRIP "strip"
  223. STRIP_TAIL "strip_tail"
  224. SET_USERPHONE "userphone"
  225. REMOVE_BRANCH "remove_branch"
  226. CLEAR_BRANCHES "clear_branches"
  227. IF "if"
  228. ELSE "else"
  229. SET_ADV_ADDRESS "set_advertised_address"
  230. SET_ADV_PORT "set_advertised_port"
  231. FORCE_SEND_SOCKET "force_send_socket"
  232. SET_FWD_NO_CONNECT "set_forward_no_connect"
  233. SET_RPL_NO_CONNECT "set_reply_no_connect"
  234. SET_FWD_CLOSE "set_forward_close"
  235. SET_RPL_CLOSE "set_reply_close"
  236. SWITCH "switch"
  237. CASE "case"
  238. DEFAULT "default"
  239. WHILE "while"
  240. CFG_SELECT "cfg_select"
  241. CFG_RESET "cfg_reset"
  242. /*ACTION LVALUES*/
  243. URIHOST "uri:host"
  244. URIPORT "uri:port"
  245. MAX_LEN "max_len"
  246. /* condition keywords */
  247. METHOD method
  248. /* hack -- the second element in first line is referable
  249. as either uri or status; it only would makes sense to
  250. call it "uri" from route{} and status from onreply_route{}
  251. */
  252. URI "uri"|"status"
  253. FROM_URI "from_uri"
  254. TO_URI "to_uri"
  255. SRCIP src_ip
  256. SRCPORT src_port
  257. DSTIP dst_ip
  258. DSTPORT dst_port
  259. SNDIP snd_ip
  260. SNDPORT snd_port
  261. SNDPROTO snd_proto|to_proto
  262. SNDAF snd_af|to_af
  263. TOIP to_ip
  264. TOPORT to_port
  265. PROTO proto
  266. AF af
  267. MYSELF myself
  268. MSGLEN "msg:len"
  269. RETCODE \$\?|\$retcode|\$rc
  270. /* operators */
  271. EQUAL =
  272. EQUAL_T ==
  273. GT >
  274. LT <
  275. GTE >=
  276. LTE <=
  277. DIFF !=
  278. MATCH =~
  279. ADDEQ "+="
  280. NOT !|"not"
  281. LOG_AND "and"|"&&"
  282. BIN_AND "&"
  283. LOG_OR "or"|"||"
  284. BIN_OR "|"
  285. BIN_NOT "~"
  286. BIN_XOR "^"
  287. BIN_LSHIFT "<<"
  288. BIN_RSHIFT ">>"
  289. PLUS "+"
  290. MINUS "-"
  291. MODULO "mod"
  292. STRLEN "strlen"
  293. STREMPTY "strempty"
  294. DEFINED "defined"
  295. STREQ eq
  296. INTEQ ieq
  297. STRDIFF ne
  298. INTDIFF ine
  299. INTCAST \(int\)
  300. STRCAST \(str\)
  301. /* Attribute specification */
  302. ATTR_MARK "%"
  303. VAR_MARK "$"
  304. SELECT_MARK "@"
  305. ATTR_FROM "f"
  306. ATTR_TO "t"
  307. ATTR_FROMURI "fr"
  308. ATTR_TOURI "tr"
  309. ATTR_FROMUSER "fu"
  310. ATTR_TOUSER "tu"
  311. ATTR_FROMDOMAIN "fd"
  312. ATTR_TODOMAIN "td"
  313. ATTR_GLOBAL "g"
  314. /* avp prefix */
  315. AVP_PREF (([ft][rud]?)|g)\.
  316. /* config vars. */
  317. DEBUG debug
  318. FORK fork
  319. FORK_DELAY fork_delay
  320. MODINIT_DELAY modinit_delay
  321. LOGSTDERROR log_stderror
  322. LOGFACILITY log_facility
  323. LOGNAME log_name
  324. LOGCOLOR log_color
  325. LOGPREFIX log_prefix
  326. LISTEN listen
  327. ADVERTISE advertise|ADVERTISE
  328. ALIAS alias
  329. SR_AUTO_ALIASES auto_aliases
  330. DNS dns
  331. REV_DNS rev_dns
  332. DNS_TRY_IPV6 dns_try_ipv6
  333. DNS_TRY_NAPTR dns_try_naptr
  334. DNS_SRV_LB dns_srv_lb|dns_srv_loadbalancing
  335. DNS_UDP_PREF dns_udp_pref|dns_udp_preference
  336. DNS_TCP_PREF dns_tcp_pref|dns_tcp_preference
  337. DNS_TLS_PREF dns_tls_pref|dns_tls_preference
  338. DNS_SCTP_PREF dns_sctp_pref|dns_sctp_preference
  339. DNS_RETR_TIME dns_retr_time
  340. DNS_RETR_NO dns_retr_no
  341. DNS_SERVERS_NO dns_servers_no
  342. DNS_USE_SEARCH dns_use_search_list
  343. DNS_SEARCH_FMATCH dns_search_full_match
  344. DNS_NAPTR_IGNORE_RFC dns_naptr_ignore_rfc
  345. /* dns cache */
  346. DNS_CACHE_INIT dns_cache_init
  347. DNS_USE_CACHE use_dns_cache
  348. DNS_USE_FAILOVER use_dns_failover
  349. DNS_CACHE_FLAGS dns_cache_flags
  350. DNS_CACHE_NEG_TTL dns_cache_negative_ttl
  351. DNS_CACHE_MIN_TTL dns_cache_min_ttl
  352. DNS_CACHE_MAX_TTL dns_cache_max_ttl
  353. DNS_CACHE_MEM dns_cache_mem
  354. DNS_CACHE_GC_INT dns_cache_gc_interval
  355. DNS_CACHE_DEL_NONEXP dns_cache_del_nonexp|dns_cache_delete_nonexpired
  356. /* ipv6 auto bind */
  357. AUTO_BIND_IPV6 auto_bind_ipv6
  358. /* blacklist */
  359. DST_BLST_INIT dst_blacklist_init
  360. USE_DST_BLST use_dst_blacklist
  361. DST_BLST_MEM dst_blacklist_mem
  362. DST_BLST_TTL dst_blacklist_expire|dst_blacklist_ttl
  363. DST_BLST_GC_INT dst_blacklist_gc_interval
  364. DST_BLST_UDP_IMASK dst_blacklist_udp_imask
  365. DST_BLST_TCP_IMASK dst_blacklist_tcp_imask
  366. DST_BLST_TLS_IMASK dst_blacklist_tls_imask
  367. DST_BLST_SCTP_IMASK dst_blacklist_sctp_imask
  368. PORT port
  369. STAT statistics
  370. MAXBUFFER maxbuffer
  371. SQL_BUFFER_SIZE sql_buffer_size
  372. CHILDREN children
  373. SOCKET_WORKERS socket_workers
  374. ASYNC_WORKERS async_workers
  375. CHECK_VIA check_via
  376. PHONE2TEL phone2tel
  377. MEMLOG "memlog"|"mem_log"
  378. MEMDBG "memdbg"|"mem_dbg"
  379. MEMSUM "mem_summary"
  380. MEMSAFETY "mem_safety"
  381. MEMJOIN "mem_join"
  382. CORELOG "corelog"|"core_log"
  383. SIP_WARNING sip_warning
  384. SERVER_SIGNATURE server_signature
  385. SERVER_HEADER server_header
  386. USER_AGENT_HEADER user_agent_header
  387. REPLY_TO_VIA reply_to_via
  388. USER "user"|"uid"
  389. GROUP "group"|"gid"
  390. CHROOT "chroot"
  391. WDIR "workdir"|"wdir"
  392. MHOMED mhomed
  393. DISABLE_TCP "disable_tcp"
  394. TCP_CHILDREN "tcp_children"
  395. TCP_ACCEPT_ALIASES "tcp_accept_aliases"
  396. TCP_SEND_TIMEOUT "tcp_send_timeout"
  397. TCP_CONNECT_TIMEOUT "tcp_connect_timeout"
  398. TCP_CON_LIFETIME "tcp_connection_lifetime"
  399. TCP_POLL_METHOD "tcp_poll_method"
  400. TCP_MAX_CONNECTIONS "tcp_max_connections"
  401. TLS_MAX_CONNECTIONS "tls_max_connections"
  402. TCP_NO_CONNECT "tcp_no_connect"
  403. TCP_SOURCE_IPV4 "tcp_source_ipv4"
  404. TCP_SOURCE_IPV6 "tcp_source_ipv6"
  405. TCP_OPT_FD_CACHE "tcp_fd_cache"
  406. TCP_OPT_BUF_WRITE "tcp_buf_write"|"tcp_async"
  407. TCP_OPT_CONN_WQ_MAX "tcp_conn_wq_max"
  408. TCP_OPT_WQ_MAX "tcp_wq_max"
  409. TCP_OPT_RD_BUF "tcp_rd_buf_size"
  410. TCP_OPT_WQ_BLK "tcp_wq_blk_size"
  411. TCP_OPT_DEFER_ACCEPT "tcp_defer_accept"
  412. TCP_OPT_DELAYED_ACK "tcp_delayed_ack"
  413. TCP_OPT_SYNCNT "tcp_syncnt"
  414. TCP_OPT_LINGER2 "tcp_linger2"
  415. TCP_OPT_KEEPALIVE "tcp_keepalive"
  416. TCP_OPT_KEEPIDLE "tcp_keepidle"
  417. TCP_OPT_KEEPINTVL "tcp_keepintvl"
  418. TCP_OPT_KEEPCNT "tcp_keepcnt"
  419. TCP_OPT_CRLF_PING "tcp_crlf_ping"
  420. TCP_OPT_ACCEPT_NO_CL "tcp_accept_no_cl"
  421. TCP_CLONE_RCVBUF "tcp_clone_rcvbuf"
  422. DISABLE_TLS "disable_tls"|"tls_disable"
  423. ENABLE_TLS "enable_tls"|"tls_enable"
  424. TLSLOG "tlslog"|"tls_log"
  425. TLS_PORT_NO "tls_port_no"
  426. TLS_METHOD "tls_method"
  427. TLS_VERIFY "tls_verify"
  428. TLS_REQUIRE_CERTIFICATE "tls_require_certificate"
  429. TLS_CERTIFICATE "tls_certificate"
  430. TLS_PRIVATE_KEY "tls_private_key"
  431. TLS_CA_LIST "tls_ca_list"
  432. TLS_HANDSHAKE_TIMEOUT "tls_handshake_timeout"
  433. TLS_SEND_TIMEOUT "tls_send_timeout"
  434. DISABLE_SCTP "disable_sctp"
  435. ENABLE_SCTP "enable_sctp"
  436. SCTP_CHILDREN "sctp_children"
  437. ADVERTISED_ADDRESS "advertised_address"
  438. ADVERTISED_PORT "advertised_port"
  439. DISABLE_CORE "disable_core_dump"
  440. OPEN_FD_LIMIT "open_files_limit"
  441. SHM_MEM_SZ "shm"|"shm_mem"|"shm_mem_size"
  442. SHM_FORCE_ALLOC "shm_force_alloc"
  443. MLOCK_PAGES "mlock_pages"
  444. REAL_TIME "real_time"
  445. RT_PRIO "rt_prio"
  446. RT_POLICY "rt_policy"
  447. RT_TIMER1_PRIO "rt_timer1_prio"|"rt_fast_timer_prio"|"rt_ftimer_prio"
  448. RT_TIMER1_POLICY "rt_timer1_policy"|"rt_ftimer_policy"
  449. RT_TIMER2_PRIO "rt_timer2_prio"|"rt_stimer_prio"
  450. RT_TIMER2_POLICY "rt_timer2_policy"|"rt_stimer_policy"
  451. MCAST_LOOPBACK "mcast_loopback"
  452. MCAST_TTL "mcast_ttl"
  453. TOS "tos"
  454. PMTU_DISCOVERY "pmtu_discovery"
  455. KILL_TIMEOUT "exit_timeout"|"ser_kill_timeout"
  456. MAX_WLOOPS "max_while_loops"
  457. PVBUFSIZE "pv_buffer_size"
  458. PVBUFSLOTS "pv_buffer_slots"
  459. HTTP_REPLY_PARSE "http_reply_hack"|"http_reply_parse"
  460. VERSION_TABLE_CFG "version_table"
  461. SERVER_ID "server_id"
  462. MAX_RECURSIVE_LEVEL "max_recursive_level"
  463. MAX_BRANCHES_PARAM "max_branches"|"max_branches"
  464. LATENCY_LOG latency_log
  465. LATENCY_LIMIT_DB latency_limit_db
  466. LATENCY_LIMIT_ACTION latency_limit_action
  467. MSG_TIME msg_time
  468. ONSEND_RT_REPLY "onsend_route_reply"
  469. CFG_DESCRIPTION "description"|"descr"|"desc"
  470. LOADMODULE loadmodule
  471. LOADPATH "loadpath"|"mpath"
  472. MODPARAM modparam
  473. /* values */
  474. YES "yes"|"true"|"on"|"enable"
  475. NO "no"|"false"|"off"|"disable"
  476. UDP "udp"|"UDP"
  477. TCP "tcp"|"TCP"
  478. TLS "tls"|"TLS"
  479. SCTP "sctp"|"SCTP"
  480. WS "ws"|"WS"
  481. WSS "wss"|"WSS"
  482. INET "inet"|"INET"
  483. INET6 "inet6"|"INET6"
  484. SSLv23 "sslv23"|"SSLv23"|"SSLV23"
  485. SSLv2 "sslv2"|"SSLv2"|"SSLV2"
  486. SSLv3 "sslv3"|"SSLv3"|"SSLV3"
  487. TLSv1 "tlsv1"|"TLSv1"|"TLSV1"
  488. LETTER [a-zA-Z]
  489. DIGIT [0-9]
  490. LETTER_ {LETTER}|[_]
  491. ALPHANUM {LETTER_}|{DIGIT}
  492. ID {LETTER_}{ALPHANUM}*
  493. NUM_ID {ALPHANUM}+
  494. HEX [0-9a-fA-F]
  495. HEXNUMBER 0x{HEX}+
  496. OCTNUMBER 0[0-7]+
  497. DECNUMBER 0|([1-9]{DIGIT}*)
  498. BINNUMBER [0-1]+b
  499. HEX4 {HEX}{1,4}
  500. IPV6ADDR ({HEX4}":"){7}{HEX4}|({HEX4}":"){1,7}(":"{HEX4}){1,7}|":"(":"{HEX4}){1,7}|({HEX4}":"){1,7}":"|"::"
  501. QUOTES \"
  502. TICK \'
  503. SLASH "/"
  504. SEMICOLON ;
  505. RPAREN \)
  506. LPAREN \(
  507. LBRACE \{
  508. RBRACE \}
  509. LBRACK \[
  510. RBRACK \]
  511. COMMA ","
  512. COLON ":"
  513. STAR \*
  514. DOT \.
  515. CR \n
  516. EVENT_RT_NAME [a-zA-Z][0-9a-zA-Z-]*(":"[a-zA-Z][0-9a-zA-Z-]*)+
  517. COM_LINE "#"|"//"
  518. COM_START "/\*"
  519. COM_END "\*/"
  520. /* start of pre-processing directives */
  521. PREP_START "#!"|"!!"
  522. DEFINE "define"|"def"
  523. IFDEF ifdef
  524. IFNDEF ifndef
  525. ENDIF endif
  526. TRYDEF "trydefine"|"trydef"
  527. REDEF "redefine"|"redef"
  528. /* else is already defined */
  529. EAT_ABLE [\ \t\b\r]
  530. /* pre-processing blocks */
  531. SUBST subst
  532. SUBSTDEF substdef
  533. SUBSTDEFS substdefs
  534. /* include files */
  535. INCLUDEFILE "include_file"
  536. IMPORTFILE "import_file"
  537. %%
  538. <INITIAL>{EAT_ABLE} { count(); }
  539. <INITIAL>{FORWARD} {count(); yylval.strval=yytext; return FORWARD; }
  540. <INITIAL>{FORWARD_TCP} {count(); yylval.strval=yytext; return FORWARD_TCP; }
  541. <INITIAL>{FORWARD_TLS} {count(); yylval.strval=yytext; return FORWARD_TLS; }
  542. <INITIAL>{FORWARD_SCTP} {count(); yylval.strval=yytext; return FORWARD_SCTP;}
  543. <INITIAL>{FORWARD_UDP} {count(); yylval.strval=yytext; return FORWARD_UDP; }
  544. <INITIAL>{DROP} { count(); yylval.strval=yytext; return DROP; }
  545. <INITIAL>{EXIT} { count(); yylval.strval=yytext; return EXIT; }
  546. <INITIAL>{RETURN} { count(); yylval.strval=yytext; return RETURN; }
  547. <INITIAL>{BREAK} { count(); yylval.strval=yytext; return BREAK; }
  548. <INITIAL>{LOG} { count(); yylval.strval=yytext; return LOG_TOK; }
  549. <INITIAL>{ERROR} { count(); yylval.strval=yytext; return ERROR; }
  550. <INITIAL>{SETFLAG} { count(); yylval.strval=yytext; return SETFLAG; }
  551. <INITIAL>{RESETFLAG} { count(); yylval.strval=yytext; return RESETFLAG; }
  552. <INITIAL>{ISFLAGSET} { count(); yylval.strval=yytext; return ISFLAGSET; }
  553. <INITIAL>{FLAGS_DECL} { count(); yylval.strval=yytext; return FLAGS_DECL; }
  554. <INITIAL>{SETAVPFLAG} { count(); yylval.strval=yytext; return SETAVPFLAG; }
  555. <INITIAL>{RESETAVPFLAG} { count(); yylval.strval=yytext; return RESETAVPFLAG; }
  556. <INITIAL>{ISAVPFLAGSET} { count(); yylval.strval=yytext; return ISAVPFLAGSET; }
  557. <INITIAL>{AVPFLAGS_DECL} { count(); yylval.strval=yytext; return AVPFLAGS_DECL; }
  558. <INITIAL>{MSGLEN} { count(); yylval.strval=yytext; return MSGLEN; }
  559. <INITIAL>{ROUTE} { count(); default_routename="DEFAULT_ROUTE";
  560. yylval.strval=yytext; return ROUTE; }
  561. <INITIAL>{ROUTE_REQUEST} { count(); default_routename="DEFAULT_ROUTE";
  562. yylval.strval=yytext; return ROUTE_REQUEST; }
  563. <INITIAL>{ROUTE_ONREPLY} { count(); default_routename="DEFAULT_ONREPLY";
  564. yylval.strval=yytext;
  565. return ROUTE_ONREPLY; }
  566. <INITIAL>{ROUTE_REPLY} { count(); default_routename="DEFAULT_ONREPLY";
  567. yylval.strval=yytext; return ROUTE_REPLY; }
  568. <INITIAL>{ROUTE_FAILURE} { count(); default_routename="DEFAULT_FAILURE";
  569. yylval.strval=yytext;
  570. return ROUTE_FAILURE; }
  571. <INITIAL>{ROUTE_BRANCH} { count(); default_routename="DEFAULT_BRANCH";
  572. yylval.strval=yytext; return ROUTE_BRANCH; }
  573. <INITIAL>{ROUTE_SEND} { count(); default_routename="DEFAULT_SEND";
  574. yylval.strval=yytext; return ROUTE_SEND; }
  575. <INITIAL>{ROUTE_EVENT} { count(); default_routename="DEFAULT_EVENT";
  576. yylval.strval=yytext; return ROUTE_EVENT; }
  577. <INITIAL>{EXEC} { count(); yylval.strval=yytext; return EXEC; }
  578. <INITIAL>{SET_HOST} { count(); yylval.strval=yytext; return SET_HOST; }
  579. <INITIAL>{SET_HOSTPORT} { count(); yylval.strval=yytext; return SET_HOSTPORT; }
  580. <INITIAL>{SET_HOSTPORTTRANS} { count(); yylval.strval=yytext; return SET_HOSTPORTTRANS; }
  581. <INITIAL>{SET_USER} { count(); yylval.strval=yytext; return SET_USER; }
  582. <INITIAL>{SET_USERPASS} { count(); yylval.strval=yytext; return SET_USERPASS; }
  583. <INITIAL>{SET_PORT} { count(); yylval.strval=yytext; return SET_PORT; }
  584. <INITIAL>{SET_URI} { count(); yylval.strval=yytext; return SET_URI; }
  585. <INITIAL>{REVERT_URI} { count(); yylval.strval=yytext; return REVERT_URI; }
  586. <INITIAL>{PREFIX} { count(); yylval.strval=yytext; return PREFIX; }
  587. <INITIAL>{STRIP} { count(); yylval.strval=yytext; return STRIP; }
  588. <INITIAL>{STRIP_TAIL} { count(); yylval.strval=yytext; return STRIP_TAIL; }
  589. <INITIAL>{REMOVE_BRANCH} { count(); yylval.strval=yytext;
  590. return REMOVE_BRANCH; }
  591. <INITIAL>{CLEAR_BRANCHES} { count(); yylval.strval=yytext;
  592. return CLEAR_BRANCHES; }
  593. <INITIAL>{SET_USERPHONE} { count(); yylval.strval=yytext;
  594. return SET_USERPHONE; }
  595. <INITIAL>{FORCE_RPORT} { count(); yylval.strval=yytext; return FORCE_RPORT; }
  596. <INITIAL>{ADD_LOCAL_RPORT} { count(); yylval.strval=yytext;
  597. return ADD_LOCAL_RPORT; }
  598. <INITIAL>{FORCE_TCP_ALIAS} { count(); yylval.strval=yytext;
  599. return FORCE_TCP_ALIAS; }
  600. <INITIAL>{UDP_MTU} { count(); yylval.strval=yytext; return UDP_MTU; }
  601. <INITIAL>{UDP_MTU_TRY_PROTO} { count(); yylval.strval=yytext;
  602. return UDP_MTU_TRY_PROTO; }
  603. <INITIAL>{UDP4_RAW} { count(); yylval.strval=yytext; return UDP4_RAW; }
  604. <INITIAL>{UDP4_RAW_MTU} { count(); yylval.strval=yytext; return UDP4_RAW_MTU; }
  605. <INITIAL>{UDP4_RAW_TTL} { count(); yylval.strval=yytext; return UDP4_RAW_TTL; }
  606. <INITIAL>{IF} { count(); yylval.strval=yytext; return IF; }
  607. <INITIAL>{ELSE} { count(); yylval.strval=yytext; return ELSE; }
  608. <INITIAL>{SET_ADV_ADDRESS} { count(); yylval.strval=yytext;
  609. return SET_ADV_ADDRESS; }
  610. <INITIAL>{SET_ADV_PORT} { count(); yylval.strval=yytext;
  611. return SET_ADV_PORT; }
  612. <INITIAL>{FORCE_SEND_SOCKET} { count(); yylval.strval=yytext;
  613. return FORCE_SEND_SOCKET; }
  614. <INITIAL>{SET_FWD_NO_CONNECT} { count(); yylval.strval=yytext;
  615. return SET_FWD_NO_CONNECT; }
  616. <INITIAL>{SET_RPL_NO_CONNECT} { count(); yylval.strval=yytext;
  617. return SET_RPL_NO_CONNECT; }
  618. <INITIAL>{SET_FWD_CLOSE} { count(); yylval.strval=yytext;
  619. return SET_FWD_CLOSE; }
  620. <INITIAL>{SET_RPL_CLOSE} { count(); yylval.strval=yytext;
  621. return SET_RPL_CLOSE; }
  622. <INITIAL>{SWITCH} { count(); yylval.strval=yytext; return SWITCH; }
  623. <INITIAL>{CASE} { count(); yylval.strval=yytext; return CASE; }
  624. <INITIAL>{DEFAULT} { count(); yylval.strval=yytext; return DEFAULT; }
  625. <INITIAL>{WHILE} { count(); yylval.strval=yytext; return WHILE; }
  626. <INITIAL>{INCLUDEFILE} { count(); BEGIN(INCLF); }
  627. <INITIAL>{PREP_START}{INCLUDEFILE} { count(); BEGIN(INCLF); }
  628. <INITIAL>{IMPORTFILE} { count(); BEGIN(IMPTF); }
  629. <INITIAL>{PREP_START}{IMPORTFILE} { count(); BEGIN(IMPTF); }
  630. <INITIAL>{CFG_SELECT} { count(); yylval.strval=yytext; return CFG_SELECT; }
  631. <INITIAL>{CFG_RESET} { count(); yylval.strval=yytext; return CFG_RESET; }
  632. <INITIAL>{URIHOST} { count(); yylval.strval=yytext; return URIHOST; }
  633. <INITIAL>{URIPORT} { count(); yylval.strval=yytext; return URIPORT; }
  634. <INITIAL>{MAX_LEN} { count(); yylval.strval=yytext; return MAX_LEN; }
  635. <INITIAL>{METHOD} { count(); yylval.strval=yytext; return METHOD; }
  636. <INITIAL>{URI} { count(); yylval.strval=yytext; return URI; }
  637. <INITIAL>{FROM_URI} { count(); yylval.strval=yytext; return FROM_URI; }
  638. <INITIAL>{TO_URI} { count(); yylval.strval=yytext; return TO_URI; }
  639. <INITIAL>{SRCIP} { count(); yylval.strval=yytext; return SRCIP; }
  640. <INITIAL>{SRCPORT} { count(); yylval.strval=yytext; return SRCPORT; }
  641. <INITIAL>{DSTIP} { count(); yylval.strval=yytext; return DSTIP; }
  642. <INITIAL>{DSTPORT} { count(); yylval.strval=yytext; return DSTPORT; }
  643. <INITIAL>{SNDIP} { count(); yylval.strval=yytext; return SNDIP; }
  644. <INITIAL>{SNDPORT} { count(); yylval.strval=yytext; return SNDPORT; }
  645. <INITIAL>{SNDPROTO} { count(); yylval.strval=yytext; return SNDPROTO; }
  646. <INITIAL>{SNDAF} { count(); yylval.strval=yytext; return SNDAF; }
  647. <INITIAL>{TOIP} { count(); yylval.strval=yytext; return TOIP; }
  648. <INITIAL>{TOPORT} { count(); yylval.strval=yytext; return TOPORT; }
  649. <INITIAL>{PROTO} { count(); yylval.strval=yytext; return PROTO; }
  650. <INITIAL>{AF} { count(); yylval.strval=yytext; return AF; }
  651. <INITIAL>{MYSELF} { count(); yylval.strval=yytext; return MYSELF; }
  652. <INITIAL>{DEBUG} { count(); yylval.strval=yytext; return DEBUG_V; }
  653. <INITIAL>{FORK} { count(); yylval.strval=yytext; return FORK; }
  654. <INITIAL>{FORK_DELAY} { count(); yylval.strval=yytext; return FORK_DELAY; }
  655. <INITIAL>{MODINIT_DELAY} { count(); yylval.strval=yytext; return MODINIT_DELAY; }
  656. <INITIAL>{LOGSTDERROR} { yylval.strval=yytext; return LOGSTDERROR; }
  657. <INITIAL>{LOGFACILITY} { yylval.strval=yytext; return LOGFACILITY; }
  658. <INITIAL>{LOGNAME} { yylval.strval=yytext; return LOGNAME; }
  659. <INITIAL>{LOGCOLOR} { yylval.strval=yytext; return LOGCOLOR; }
  660. <INITIAL>{LOGPREFIX} { yylval.strval=yytext; return LOGPREFIX; }
  661. <INITIAL>{LISTEN} { count(); yylval.strval=yytext; return LISTEN; }
  662. <INITIAL>{ADVERTISE} { count(); yylval.strval=yytext; return ADVERTISE; }
  663. <INITIAL>{ALIAS} { count(); yylval.strval=yytext; return ALIAS; }
  664. <INITIAL>{SR_AUTO_ALIASES} { count(); yylval.strval=yytext;
  665. return SR_AUTO_ALIASES; }
  666. <INITIAL>{DNS} { count(); yylval.strval=yytext; return DNS; }
  667. <INITIAL>{REV_DNS} { count(); yylval.strval=yytext; return REV_DNS; }
  668. <INITIAL>{DNS_TRY_IPV6} { count(); yylval.strval=yytext;
  669. return DNS_TRY_IPV6; }
  670. <INITIAL>{DNS_TRY_NAPTR} { count(); yylval.strval=yytext;
  671. return DNS_TRY_NAPTR; }
  672. <INITIAL>{DNS_SRV_LB} { count(); yylval.strval=yytext;
  673. return DNS_SRV_LB; }
  674. <INITIAL>{DNS_UDP_PREF} { count(); yylval.strval=yytext;
  675. return DNS_UDP_PREF; }
  676. <INITIAL>{DNS_TCP_PREF} { count(); yylval.strval=yytext;
  677. return DNS_TCP_PREF; }
  678. <INITIAL>{DNS_TLS_PREF} { count(); yylval.strval=yytext;
  679. return DNS_TLS_PREF; }
  680. <INITIAL>{DNS_SCTP_PREF} { count(); yylval.strval=yytext;
  681. return DNS_SCTP_PREF; }
  682. <INITIAL>{DNS_RETR_TIME} { count(); yylval.strval=yytext;
  683. return DNS_RETR_TIME; }
  684. <INITIAL>{DNS_RETR_NO} { count(); yylval.strval=yytext;
  685. return DNS_RETR_NO; }
  686. <INITIAL>{DNS_SERVERS_NO} { count(); yylval.strval=yytext;
  687. return DNS_SERVERS_NO; }
  688. <INITIAL>{DNS_USE_SEARCH} { count(); yylval.strval=yytext;
  689. return DNS_USE_SEARCH; }
  690. <INITIAL>{DNS_SEARCH_FMATCH} { count(); yylval.strval=yytext;
  691. return DNS_SEARCH_FMATCH; }
  692. <INITIAL>{DNS_NAPTR_IGNORE_RFC} { count(); yylval.strval=yytext;
  693. return DNS_NAPTR_IGNORE_RFC; }
  694. <INITIAL>{DNS_CACHE_INIT} { count(); yylval.strval=yytext;
  695. return DNS_CACHE_INIT; }
  696. <INITIAL>{DNS_USE_CACHE} { count(); yylval.strval=yytext;
  697. return DNS_USE_CACHE; }
  698. <INITIAL>{DNS_USE_FAILOVER} { count(); yylval.strval=yytext;
  699. return DNS_USE_FAILOVER; }
  700. <INITIAL>{DNS_CACHE_FLAGS} { count(); yylval.strval=yytext;
  701. return DNS_CACHE_FLAGS; }
  702. <INITIAL>{DNS_CACHE_NEG_TTL} { count(); yylval.strval=yytext;
  703. return DNS_CACHE_NEG_TTL; }
  704. <INITIAL>{DNS_CACHE_MIN_TTL} { count(); yylval.strval=yytext;
  705. return DNS_CACHE_MIN_TTL; }
  706. <INITIAL>{DNS_CACHE_MAX_TTL} { count(); yylval.strval=yytext;
  707. return DNS_CACHE_MAX_TTL; }
  708. <INITIAL>{DNS_CACHE_MEM} { count(); yylval.strval=yytext;
  709. return DNS_CACHE_MEM; }
  710. <INITIAL>{DNS_CACHE_GC_INT} { count(); yylval.strval=yytext;
  711. return DNS_CACHE_GC_INT; }
  712. <INITIAL>{DNS_CACHE_DEL_NONEXP} { count(); yylval.strval=yytext;
  713. return DNS_CACHE_DEL_NONEXP; }
  714. <INITIAL>{AUTO_BIND_IPV6} { count(); yylval.strval=yytext;
  715. return AUTO_BIND_IPV6; }
  716. <INITIAL>{DST_BLST_INIT} { count(); yylval.strval=yytext;
  717. return DST_BLST_INIT; }
  718. <INITIAL>{USE_DST_BLST} { count(); yylval.strval=yytext;
  719. return USE_DST_BLST; }
  720. <INITIAL>{DST_BLST_MEM} { count(); yylval.strval=yytext;
  721. return DST_BLST_MEM; }
  722. <INITIAL>{DST_BLST_TTL} { count(); yylval.strval=yytext;
  723. return DST_BLST_TTL; }
  724. <INITIAL>{DST_BLST_GC_INT} { count(); yylval.strval=yytext;
  725. return DST_BLST_GC_INT; }
  726. <INITIAL>{DST_BLST_UDP_IMASK} { count(); yylval.strval=yytext;
  727. return DST_BLST_UDP_IMASK; }
  728. <INITIAL>{DST_BLST_TCP_IMASK} { count(); yylval.strval=yytext;
  729. return DST_BLST_TCP_IMASK; }
  730. <INITIAL>{DST_BLST_TLS_IMASK} { count(); yylval.strval=yytext;
  731. return DST_BLST_TLS_IMASK; }
  732. <INITIAL>{DST_BLST_SCTP_IMASK} { count(); yylval.strval=yytext;
  733. return DST_BLST_SCTP_IMASK; }
  734. <INITIAL>{PORT} { count(); yylval.strval=yytext; return PORT; }
  735. <INITIAL>{STAT} { count(); yylval.strval=yytext; return STAT; }
  736. <INITIAL>{MAXBUFFER} { count(); yylval.strval=yytext; return MAXBUFFER; }
  737. <INITIAL>{SQL_BUFFER_SIZE} { count(); yylval.strval=yytext; return SQL_BUFFER_SIZE; }
  738. <INITIAL>{CHILDREN} { count(); yylval.strval=yytext; return CHILDREN; }
  739. <INITIAL>{SOCKET_WORKERS} { count(); yylval.strval=yytext; return SOCKET_WORKERS; }
  740. <INITIAL>{ASYNC_WORKERS} { count(); yylval.strval=yytext; return ASYNC_WORKERS; }
  741. <INITIAL>{CHECK_VIA} { count(); yylval.strval=yytext; return CHECK_VIA; }
  742. <INITIAL>{PHONE2TEL} { count(); yylval.strval=yytext; return PHONE2TEL; }
  743. <INITIAL>{MEMLOG} { count(); yylval.strval=yytext; return MEMLOG; }
  744. <INITIAL>{MEMDBG} { count(); yylval.strval=yytext; return MEMDBG; }
  745. <INITIAL>{MEMSUM} { count(); yylval.strval=yytext; return MEMSUM; }
  746. <INITIAL>{MEMSAFETY} { count(); yylval.strval=yytext; return MEMSAFETY; }
  747. <INITIAL>{MEMJOIN} { count(); yylval.strval=yytext; return MEMJOIN; }
  748. <INITIAL>{CORELOG} { count(); yylval.strval=yytext; return CORELOG; }
  749. <INITIAL>{SIP_WARNING} { count(); yylval.strval=yytext; return SIP_WARNING; }
  750. <INITIAL>{USER} { count(); yylval.strval=yytext; return USER; }
  751. <INITIAL>{GROUP} { count(); yylval.strval=yytext; return GROUP; }
  752. <INITIAL>{CHROOT} { count(); yylval.strval=yytext; return CHROOT; }
  753. <INITIAL>{WDIR} { count(); yylval.strval=yytext; return WDIR; }
  754. <INITIAL>{MHOMED} { count(); yylval.strval=yytext; return MHOMED; }
  755. <INITIAL>{DISABLE_TCP} { count(); yylval.strval=yytext; return DISABLE_TCP; }
  756. <INITIAL>{TCP_CHILDREN} { count(); yylval.strval=yytext; return TCP_CHILDREN; }
  757. <INITIAL>{TCP_ACCEPT_ALIASES} { count(); yylval.strval=yytext;
  758. return TCP_ACCEPT_ALIASES; }
  759. <INITIAL>{TCP_SEND_TIMEOUT} { count(); yylval.strval=yytext;
  760. return TCP_SEND_TIMEOUT; }
  761. <INITIAL>{TCP_CONNECT_TIMEOUT} { count(); yylval.strval=yytext;
  762. return TCP_CONNECT_TIMEOUT; }
  763. <INITIAL>{TCP_CON_LIFETIME} { count(); yylval.strval=yytext;
  764. return TCP_CON_LIFETIME; }
  765. <INITIAL>{TCP_POLL_METHOD} { count(); yylval.strval=yytext;
  766. return TCP_POLL_METHOD; }
  767. <INITIAL>{TCP_MAX_CONNECTIONS} { count(); yylval.strval=yytext;
  768. return TCP_MAX_CONNECTIONS; }
  769. <INITIAL>{TLS_MAX_CONNECTIONS} { count(); yylval.strval=yytext;
  770. return TLS_MAX_CONNECTIONS; }
  771. <INITIAL>{TCP_NO_CONNECT} { count(); yylval.strval=yytext;
  772. return TCP_NO_CONNECT; }
  773. <INITIAL>{TCP_SOURCE_IPV4} { count(); yylval.strval=yytext;
  774. return TCP_SOURCE_IPV4; }
  775. <INITIAL>{TCP_SOURCE_IPV6} { count(); yylval.strval=yytext;
  776. return TCP_SOURCE_IPV6; }
  777. <INITIAL>{TCP_OPT_FD_CACHE} { count(); yylval.strval=yytext;
  778. return TCP_OPT_FD_CACHE; }
  779. <INITIAL>{TCP_OPT_CONN_WQ_MAX} { count(); yylval.strval=yytext;
  780. return TCP_OPT_CONN_WQ_MAX; }
  781. <INITIAL>{TCP_OPT_WQ_MAX} { count(); yylval.strval=yytext;
  782. return TCP_OPT_WQ_MAX; }
  783. <INITIAL>{TCP_OPT_RD_BUF} { count(); yylval.strval=yytext;
  784. return TCP_OPT_RD_BUF; }
  785. <INITIAL>{TCP_OPT_WQ_BLK} { count(); yylval.strval=yytext;
  786. return TCP_OPT_WQ_BLK; }
  787. <INITIAL>{TCP_OPT_BUF_WRITE} { count(); yylval.strval=yytext;
  788. return TCP_OPT_BUF_WRITE; }
  789. <INITIAL>{TCP_OPT_DEFER_ACCEPT} { count(); yylval.strval=yytext;
  790. return TCP_OPT_DEFER_ACCEPT; }
  791. <INITIAL>{TCP_OPT_DELAYED_ACK} { count(); yylval.strval=yytext;
  792. return TCP_OPT_DELAYED_ACK; }
  793. <INITIAL>{TCP_OPT_SYNCNT} { count(); yylval.strval=yytext;
  794. return TCP_OPT_SYNCNT; }
  795. <INITIAL>{TCP_OPT_LINGER2} { count(); yylval.strval=yytext;
  796. return TCP_OPT_LINGER2; }
  797. <INITIAL>{TCP_OPT_KEEPALIVE} { count(); yylval.strval=yytext;
  798. return TCP_OPT_KEEPALIVE; }
  799. <INITIAL>{TCP_OPT_KEEPIDLE} { count(); yylval.strval=yytext;
  800. return TCP_OPT_KEEPIDLE; }
  801. <INITIAL>{TCP_OPT_KEEPINTVL} { count(); yylval.strval=yytext;
  802. return TCP_OPT_KEEPINTVL; }
  803. <INITIAL>{TCP_OPT_KEEPCNT} { count(); yylval.strval=yytext;
  804. return TCP_OPT_KEEPCNT; }
  805. <INITIAL>{TCP_OPT_CRLF_PING} { count(); yylval.strval=yytext;
  806. return TCP_OPT_CRLF_PING; }
  807. <INITIAL>{TCP_OPT_ACCEPT_NO_CL} { count(); yylval.strval=yytext;
  808. return TCP_OPT_ACCEPT_NO_CL; }
  809. <INITIAL>{TCP_CLONE_RCVBUF} { count(); yylval.strval=yytext;
  810. return TCP_CLONE_RCVBUF; }
  811. <INITIAL>{DISABLE_TLS} { count(); yylval.strval=yytext; return DISABLE_TLS; }
  812. <INITIAL>{ENABLE_TLS} { count(); yylval.strval=yytext; return ENABLE_TLS; }
  813. <INITIAL>{TLSLOG} { count(); yylval.strval=yytext; return TLS_PORT_NO; }
  814. <INITIAL>{TLS_PORT_NO} { count(); yylval.strval=yytext; return TLS_PORT_NO; }
  815. <INITIAL>{TLS_METHOD} { count(); yylval.strval=yytext; return TLS_METHOD; }
  816. <INITIAL>{TLS_VERIFY} { count(); yylval.strval=yytext; return TLS_VERIFY; }
  817. <INITIAL>{TLS_REQUIRE_CERTIFICATE} { count(); yylval.strval=yytext;
  818. return TLS_REQUIRE_CERTIFICATE; }
  819. <INITIAL>{TLS_CERTIFICATE} { count(); yylval.strval=yytext;
  820. return TLS_CERTIFICATE; }
  821. <INITIAL>{TLS_PRIVATE_KEY} { count(); yylval.strval=yytext;
  822. return TLS_PRIVATE_KEY; }
  823. <INITIAL>{TLS_CA_LIST} { count(); yylval.strval=yytext;
  824. return TLS_CA_LIST; }
  825. <INITIAL>{TLS_HANDSHAKE_TIMEOUT} { count(); yylval.strval=yytext;
  826. return TLS_HANDSHAKE_TIMEOUT; }
  827. <INITIAL>{TLS_SEND_TIMEOUT} { count(); yylval.strval=yytext;
  828. return TLS_SEND_TIMEOUT; }
  829. <INITIAL>{DISABLE_SCTP} { count(); yylval.strval=yytext; return DISABLE_SCTP;}
  830. <INITIAL>{ENABLE_SCTP} { count(); yylval.strval=yytext; return ENABLE_SCTP;}
  831. <INITIAL>{SCTP_CHILDREN} { count(); yylval.strval=yytext;
  832. return SCTP_CHILDREN; }
  833. <INITIAL>{SERVER_SIGNATURE} { count(); yylval.strval=yytext; return SERVER_SIGNATURE; }
  834. <INITIAL>{SERVER_HEADER} { count(); yylval.strval=yytext; return SERVER_HEADER; }
  835. <INITIAL>{USER_AGENT_HEADER} { count(); yylval.strval=yytext; return USER_AGENT_HEADER; }
  836. <INITIAL>{REPLY_TO_VIA} { count(); yylval.strval=yytext; return REPLY_TO_VIA; }
  837. <INITIAL>{ADVERTISED_ADDRESS} { count(); yylval.strval=yytext;
  838. return ADVERTISED_ADDRESS; }
  839. <INITIAL>{ADVERTISED_PORT} { count(); yylval.strval=yytext;
  840. return ADVERTISED_PORT; }
  841. <INITIAL>{DISABLE_CORE} { count(); yylval.strval=yytext;
  842. return DISABLE_CORE; }
  843. <INITIAL>{OPEN_FD_LIMIT} { count(); yylval.strval=yytext;
  844. return OPEN_FD_LIMIT; }
  845. <INITIAL>{SHM_MEM_SZ} { count(); yylval.strval=yytext;
  846. return SHM_MEM_SZ; }
  847. <INITIAL>{SHM_FORCE_ALLOC} { count(); yylval.strval=yytext;
  848. return SHM_FORCE_ALLOC; }
  849. <INITIAL>{MLOCK_PAGES} { count(); yylval.strval=yytext;
  850. return MLOCK_PAGES; }
  851. <INITIAL>{REAL_TIME} { count(); yylval.strval=yytext;
  852. return REAL_TIME; }
  853. <INITIAL>{RT_PRIO} { count(); yylval.strval=yytext;
  854. return RT_PRIO; }
  855. <INITIAL>{RT_POLICY} { count(); yylval.strval=yytext;
  856. return RT_POLICY; }
  857. <INITIAL>{RT_TIMER1_PRIO} { count(); yylval.strval=yytext;
  858. return RT_TIMER1_PRIO; }
  859. <INITIAL>{RT_TIMER1_POLICY} { count(); yylval.strval=yytext;
  860. return RT_TIMER1_POLICY; }
  861. <INITIAL>{RT_TIMER2_PRIO} { count(); yylval.strval=yytext;
  862. return RT_TIMER2_PRIO; }
  863. <INITIAL>{RT_TIMER2_POLICY} { count(); yylval.strval=yytext;
  864. return RT_TIMER2_POLICY; }
  865. <INITIAL>{MCAST_LOOPBACK} { count(); yylval.strval=yytext;
  866. return MCAST_LOOPBACK; }
  867. <INITIAL>{MCAST_TTL} { count(); yylval.strval=yytext;
  868. return MCAST_TTL; }
  869. <INITIAL>{TOS} { count(); yylval.strval=yytext;
  870. return TOS; }
  871. <INITIAL>{PMTU_DISCOVERY} { count(); yylval.strval=yytext;
  872. return PMTU_DISCOVERY; }
  873. <INITIAL>{KILL_TIMEOUT} { count(); yylval.strval=yytext;
  874. return KILL_TIMEOUT; }
  875. <INITIAL>{MAX_WLOOPS} { count(); yylval.strval=yytext;
  876. return MAX_WLOOPS; }
  877. <INITIAL>{PVBUFSIZE} { count(); yylval.strval=yytext;
  878. return PVBUFSIZE; }
  879. <INITIAL>{PVBUFSLOTS} { count(); yylval.strval=yytext;
  880. return PVBUFSLOTS; }
  881. <INITIAL>{HTTP_REPLY_PARSE} { count(); yylval.strval=yytext;
  882. return HTTP_REPLY_PARSE; }
  883. <INITIAL>{VERSION_TABLE_CFG} { count(); yylval.strval=yytext; return VERSION_TABLE_CFG;}
  884. <INITIAL>{SERVER_ID} { count(); yylval.strval=yytext; return SERVER_ID;}
  885. <INITIAL>{MAX_RECURSIVE_LEVEL} { count(); yylval.strval=yytext; return MAX_RECURSIVE_LEVEL;}
  886. <INITIAL>{MAX_BRANCHES_PARAM} { count(); yylval.strval=yytext; return MAX_BRANCHES_PARAM;}
  887. <INITIAL>{LATENCY_LOG} { count(); yylval.strval=yytext; return LATENCY_LOG;}
  888. <INITIAL>{MSG_TIME} { count(); yylval.strval=yytext; return MSG_TIME;}
  889. <INITIAL>{ONSEND_RT_REPLY} { count(); yylval.strval=yytext; return ONSEND_RT_REPLY; }
  890. <INITIAL>{LATENCY_LIMIT_DB} { count(); yylval.strval=yytext; return LATENCY_LIMIT_DB;}
  891. <INITIAL>{LATENCY_LIMIT_ACTION} { count(); yylval.strval=yytext; return LATENCY_LIMIT_ACTION;}
  892. <INITIAL>{CFG_DESCRIPTION} { count(); yylval.strval=yytext; return CFG_DESCRIPTION; }
  893. <INITIAL>{LOADMODULE} { count(); yylval.strval=yytext; return LOADMODULE; }
  894. <INITIAL>{LOADPATH} { count(); yylval.strval=yytext; return LOADPATH; }
  895. <INITIAL>{MODPARAM} { count(); yylval.strval=yytext; return MODPARAM; }
  896. <INITIAL>{EQUAL} { count(); return EQUAL; }
  897. <INITIAL>{ADDEQ} { count(); return ADDEQ; }
  898. <INITIAL>{EQUAL_T} { count(); return EQUAL_T; }
  899. <INITIAL>{GT} { count(); return GT; }
  900. <INITIAL>{LT} { count(); return LT; }
  901. <INITIAL>{GTE} { count(); return GTE; }
  902. <INITIAL>{LTE} { count(); return LTE; }
  903. <INITIAL>{DIFF} { count(); return DIFF; }
  904. <INITIAL>{MATCH} { count(); return MATCH; }
  905. <INITIAL>{NOT} { count(); return NOT; }
  906. <INITIAL>{LOG_AND} { count(); return LOG_AND; }
  907. <INITIAL>{BIN_AND} { count(); return BIN_AND; }
  908. <INITIAL>{LOG_OR} { count(); return LOG_OR; }
  909. <INITIAL>{BIN_OR} { count(); return BIN_OR; }
  910. <INITIAL>{BIN_NOT} { count(); return BIN_NOT; }
  911. <INITIAL>{BIN_XOR} { count(); return BIN_XOR; }
  912. <INITIAL>{BIN_LSHIFT} { count(); return BIN_LSHIFT; }
  913. <INITIAL>{BIN_RSHIFT} { count(); return BIN_RSHIFT; }
  914. <INITIAL>{PLUS} { count(); return PLUS; }
  915. <INITIAL>{MINUS} { count(); return MINUS; }
  916. <INITIAL>{MODULO} { count(); return MODULO; }
  917. <INITIAL>{STRLEN} { count(); return STRLEN; }
  918. <INITIAL>{STREMPTY} { count(); return STREMPTY; }
  919. <INITIAL>{DEFINED} { count(); return DEFINED; }
  920. <INITIAL>{STREQ} { count(); return STREQ; }
  921. <INITIAL>{INTEQ} { count(); return INTEQ; }
  922. <INITIAL>{STRDIFF} { count(); return STRDIFF; }
  923. <INITIAL>{INTDIFF} { count(); return INTDIFF; }
  924. <INITIAL>{INTCAST} { count(); return INTCAST; }
  925. <INITIAL>{STRCAST} { count(); return STRCAST; }
  926. <INITIAL>{SELECT_MARK} { count(); state = SELECT_S; BEGIN(SELECT); return SELECT_MARK; }
  927. <SELECT>{ID} { count(); addstr(&s_buf, yytext, yyleng);
  928. yylval.strval=s_buf.s;
  929. memset(&s_buf, 0, sizeof(s_buf));
  930. return ID;
  931. }
  932. <SELECT>{DOT} { count(); return DOT; }
  933. <SELECT>{LBRACK} { count(); return LBRACK; }
  934. <SELECT>{RBRACK} { count(); return RBRACK; }
  935. <SELECT>{DECNUMBER} { count(); yylval.intval=atoi(yytext);
  936. yy_number_str=yytext; return NUMBER; }
  937. <SELECT>{HEXNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 16);
  938. yy_number_str=yytext; return NUMBER; }
  939. <SELECT>{OCTNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 8);
  940. yy_number_str=yytext; return NUMBER; }
  941. <SELECT>{BINNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 2);
  942. yy_number_str=yytext; return NUMBER; }
  943. <INITIAL>{ATTR_MARK} { count(); state = ATTR_S; BEGIN(ATTR);
  944. return ATTR_MARK; }
  945. <ATTR>{ATTR_FROM} { count(); return ATTR_FROM; }
  946. <ATTR>{ATTR_TO} { count(); return ATTR_TO; }
  947. <ATTR>{ATTR_FROMURI} { count(); return ATTR_FROMURI; }
  948. <ATTR>{ATTR_TOURI} { count(); return ATTR_TOURI; }
  949. <ATTR>{ATTR_FROMUSER} { count(); return ATTR_FROMUSER; }
  950. <ATTR>{ATTR_TOUSER} { count(); return ATTR_TOUSER; }
  951. <ATTR>{ATTR_FROMDOMAIN} { count(); return ATTR_FROMDOMAIN; }
  952. <ATTR>{ATTR_TODOMAIN} { count(); return ATTR_TODOMAIN; }
  953. <ATTR>{ATTR_GLOBAL} { count(); return ATTR_GLOBAL; }
  954. <ATTR>{DOT} { count(); return DOT; }
  955. <ATTR>{LBRACK} { count(); return LBRACK; }
  956. <ATTR>{RBRACK} { count(); return RBRACK; }
  957. <ATTR>{STAR} { count(); return STAR; }
  958. <ATTR>{DECNUMBER} { count(); yylval.intval=atoi(yytext);
  959. yy_number_str=yytext; return NUMBER; }
  960. <ATTR>{ID} { count(); addstr(&s_buf, yytext, yyleng);
  961. yylval.strval=s_buf.s;
  962. memset(&s_buf, 0, sizeof(s_buf));
  963. state = INITIAL_S;
  964. BEGIN(INITIAL);
  965. return ID;
  966. }
  967. <INITIAL>{VAR_MARK}{LPAREN} {
  968. switch(sr_cfg_compat){
  969. case SR_COMPAT_SER:
  970. state=ATTR_S; BEGIN(ATTR);
  971. yyless(1);
  972. count();
  973. return ATTR_MARK;
  974. break;
  975. case SR_COMPAT_KAMAILIO:
  976. case SR_COMPAT_MAX:
  977. default:
  978. state = PVAR_P_S; BEGIN(PVAR_P);
  979. p_nest=1; yymore();
  980. break;
  981. }
  982. }
  983. /* eat everything between 2 () and return PVAR token and a string
  984. containing everything (including $ and ()) */
  985. <PVAR_P>{RPAREN} { p_nest--;
  986. if (p_nest==0){
  987. count();
  988. addstr(&s_buf, yytext, yyleng);
  989. yylval.strval=s_buf.s;
  990. memset(&s_buf, 0, sizeof(s_buf));
  991. state=INITIAL_S;
  992. BEGIN(INITIAL);
  993. return PVAR;
  994. }
  995. yymore();
  996. }
  997. <PVAR_P>{LPAREN} { p_nest++; yymore(); }
  998. <PVAR_P>. { yymore(); }
  999. <PVARID>{ID}|'\.' {yymore(); }
  1000. <PVARID>{LPAREN} { state = PVAR_P_S; BEGIN(PVAR_P);
  1001. p_nest=1; yymore(); }
  1002. <PVARID>{CR}|{EAT_ABLE}|. { yyless(yyleng-1);
  1003. count();
  1004. addstr(&s_buf, yytext, yyleng);
  1005. yylval.strval=s_buf.s;
  1006. memset(&s_buf, 0, sizeof(s_buf));
  1007. state=INITIAL_S;
  1008. BEGIN(INITIAL);
  1009. return PVAR;
  1010. }
  1011. /* if found retcode => it's a built-in pvar */
  1012. <INITIAL>{RETCODE} { count(); yylval.strval=yytext; return PVAR; }
  1013. <INITIAL>{VAR_MARK} {
  1014. switch(sr_cfg_compat){
  1015. case SR_COMPAT_SER:
  1016. count();
  1017. state=ATTR_S; BEGIN(ATTR);
  1018. return ATTR_MARK;
  1019. break;
  1020. case SR_COMPAT_KAMAILIO:
  1021. state=PVARID_S; BEGIN(PVARID);
  1022. yymore();
  1023. break;
  1024. case SR_COMPAT_MAX:
  1025. default:
  1026. state=AVP_PVAR_S; BEGIN(AVP_PVAR);
  1027. yymore();
  1028. break;
  1029. }
  1030. }
  1031. /* avp prefix detected -> go to avp mode */
  1032. <AVP_PVAR>{AVP_PREF} |
  1033. <AVP_PVAR>{ID}{LBRACK} { state = ATTR_S; BEGIN(ATTR); yyless(1); count();
  1034. return ATTR_MARK; }
  1035. <AVP_PVAR>{ID}{LPAREN} { state = PVAR_P_S; p_nest=1; BEGIN(PVAR_P);
  1036. yymore(); }
  1037. <AVP_PVAR>{ID} { count(); addstr(&s_buf, yytext, yyleng);
  1038. yylval.strval=s_buf.s;
  1039. memset(&s_buf, 0, sizeof(s_buf));
  1040. state = INITIAL_S;
  1041. BEGIN(INITIAL);
  1042. return AVP_OR_PVAR;
  1043. }
  1044. <INITIAL>{IPV6ADDR} { count(); yylval.strval=yytext; return IPV6ADDR; }
  1045. <INITIAL>{DECNUMBER} { count(); yylval.intval=atoi(yytext);
  1046. yy_number_str=yytext; return NUMBER; }
  1047. <INITIAL>{HEXNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 16);
  1048. yy_number_str=yytext; return NUMBER; }
  1049. <INITIAL>{OCTNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 8);
  1050. yy_number_str=yytext; return NUMBER; }
  1051. <INITIAL>{BINNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 2);
  1052. yy_number_str=yytext; return NUMBER; }
  1053. <INITIAL>{YES} { count(); yylval.intval=1;
  1054. yy_number_str=yytext; return NUMBER; }
  1055. <INITIAL>{NO} { count(); yylval.intval=0;
  1056. yy_number_str=yytext; return NUMBER; }
  1057. <INITIAL>{TCP} { count(); return TCP; }
  1058. <INITIAL>{UDP} { count(); return UDP; }
  1059. <INITIAL>{TLS} { count(); return TLS; }
  1060. <INITIAL>{SCTP} { count(); return SCTP; }
  1061. <INITIAL>{WS} { count(); return WS; }
  1062. <INITIAL>{WSS} { count(); return WSS; }
  1063. <INITIAL>{INET} { count(); yylval.intval=AF_INET;
  1064. yy_number_str=yytext; return NUMBER; }
  1065. <INITIAL>{INET6} { count();
  1066. yylval.intval=AF_INET6;
  1067. yy_number_str=yytext;
  1068. return NUMBER; }
  1069. <INITIAL>{SSLv23} { count(); yylval.strval=yytext; return SSLv23; }
  1070. <INITIAL>{SSLv2} { count(); yylval.strval=yytext; return SSLv2; }
  1071. <INITIAL>{SSLv3} { count(); yylval.strval=yytext; return SSLv3; }
  1072. <INITIAL>{TLSv1} { count(); yylval.strval=yytext; return TLSv1; }
  1073. <INITIAL>{COMMA} { count(); return COMMA; }
  1074. <INITIAL>{SEMICOLON} { count(); return SEMICOLON; }
  1075. <INITIAL>{COLON} { count(); return COLON; }
  1076. <INITIAL>{STAR} { count(); return STAR; }
  1077. <INITIAL>{RPAREN} { count(); return RPAREN; }
  1078. <INITIAL>{LPAREN} { count(); return LPAREN; }
  1079. <INITIAL>{LBRACE} { count(); return LBRACE; }
  1080. <INITIAL>{RBRACE} { count(); return RBRACE; }
  1081. <INITIAL>{LBRACK} { count(); return LBRACK; }
  1082. <INITIAL>{RBRACK} { count(); return RBRACK; }
  1083. <INITIAL>{SLASH} { count(); return SLASH; }
  1084. <INITIAL>{DOT} { count(); return DOT; }
  1085. <INITIAL>\\{CR} {count(); } /* eat the escaped CR */
  1086. <INITIAL>{CR} { count();/* return CR;*/ }
  1087. <INITIAL>{EVENT_RT_NAME} { count();
  1088. addstr(&s_buf, yytext, yyleng);
  1089. yylval.strval=s_buf.s;
  1090. memset(&s_buf, 0, sizeof(s_buf));
  1091. return EVENT_RT_NAME; }
  1092. <INITIAL,SELECT>{QUOTES} { count(); old_initial = YY_START;
  1093. old_state = state; state=STRING_S;
  1094. BEGIN(STRING1); }
  1095. <INITIAL>{TICK} { count(); old_initial = YY_START; old_state = state;
  1096. state=STRING_S; BEGIN(STRING2); }
  1097. <STRING1>{QUOTES} { count_more();
  1098. yytext[yyleng-1]=0; yyleng--;
  1099. addstr(&s_buf, yytext, yyleng);
  1100. state=STR_BETWEEN_S;
  1101. BEGIN(STR_BETWEEN);
  1102. }
  1103. <STRING2>{TICK} { count_more(); state=old_state; BEGIN(old_initial);
  1104. yytext[yyleng-1]=0; yyleng--;
  1105. addstr(&s_buf, yytext, yyleng);
  1106. r = pp_subst_run(&s_buf.s);
  1107. yylval.strval=s_buf.s;
  1108. memset(&s_buf, 0, sizeof(s_buf));
  1109. return STRING;
  1110. }
  1111. <STRING2>.|{EAT_ABLE}|{CR} { yymore(); }
  1112. <STRING1>\\n { count_more(); addchar(&s_buf, '\n'); }
  1113. <STRING1>\\r { count_more(); addchar(&s_buf, '\r'); }
  1114. <STRING1>\\a { count_more(); addchar(&s_buf, '\a'); }
  1115. <STRING1>\\t { count_more(); addchar(&s_buf, '\t'); }
  1116. <STRING1>\\{QUOTES} { count_more(); addchar(&s_buf, '"'); }
  1117. <STRING1>\\\\ { count_more(); addchar(&s_buf, '\\'); }
  1118. <STRING1>\\x{HEX}{1,2} { count_more(); addchar(&s_buf,
  1119. (char)strtol(yytext+2, 0, 16)); }
  1120. /* don't allow \[0-7]{1}, it will eat the backreferences from
  1121. subst_uri if allowed (although everybody should use '' in subt_uri) */
  1122. <STRING1>\\[0-7]{2,3} { count_more(); addchar(&s_buf,
  1123. (char)strtol(yytext+1, 0, 8)); }
  1124. <STRING1>\\{CR} { count_more(); } /* eat escaped CRs */
  1125. <STRING1>.|{EAT_ABLE}|{CR} { count_more(); addchar(&s_buf, *yytext); }
  1126. <STR_BETWEEN>{EAT_ABLE}|{CR} { count_ignore(); }
  1127. <STR_BETWEEN>{QUOTES} { count_more(); state=STRING_S;
  1128. BEGIN(STRING1);}
  1129. <STR_BETWEEN>. {
  1130. yyless(0); /* reparse it */
  1131. /* ignore the whitespace now that is
  1132. counted, return saved string value */
  1133. state=old_state; BEGIN(old_initial);
  1134. r = pp_subst_run(&s_buf.s);
  1135. yylval.strval=s_buf.s;
  1136. memset(&s_buf, 0, sizeof(s_buf));
  1137. return STRING;
  1138. }
  1139. <INITIAL,COMMENT>{COM_START} { count(); comment_nest++; state=COMMENT_S;
  1140. BEGIN(COMMENT); }
  1141. <COMMENT>{COM_END} { count(); comment_nest--;
  1142. if (comment_nest==0){
  1143. state=INITIAL_S;
  1144. BEGIN(INITIAL);
  1145. }
  1146. }
  1147. <COMMENT>.|{EAT_ABLE}|{CR} { count(); };
  1148. <INITIAL>{COM_LINE}!{SER_CFG}{CR} { count();
  1149. sr_cfg_compat=SR_COMPAT_SER;}
  1150. <INITIAL>{COM_LINE}!{KAMAILIO_CFG}{CR} { count();
  1151. sr_cfg_compat=SR_COMPAT_KAMAILIO;}
  1152. <INITIAL>{COM_LINE}!{MAXCOMPAT_CFG}{CR} { count();
  1153. sr_cfg_compat=SR_COMPAT_MAX;}
  1154. <INITIAL>{PREP_START}{DEFINE}{EAT_ABLE}+ { count(); pp_define_set_type(0);
  1155. state = DEFINE_S; BEGIN(DEFINE_ID); }
  1156. <INITIAL>{PREP_START}{TRYDEF}{EAT_ABLE}+ { count(); pp_define_set_type(1);
  1157. state = DEFINE_S; BEGIN(DEFINE_ID); }
  1158. <INITIAL>{PREP_START}{REDEF}{EAT_ABLE}+ { count(); pp_define_set_type(2);
  1159. state = DEFINE_S; BEGIN(DEFINE_ID); }
  1160. <DEFINE_ID>{ID} { count();
  1161. if (pp_define(yyleng, yytext)) return 1;
  1162. state = DEFINE_EOL_S; BEGIN(DEFINE_EOL); }
  1163. <DEFINE_EOL>{EAT_ABLE} { count(); }
  1164. <DEFINE_EOL>{CR} { count();
  1165. state = INITIAL; BEGIN(INITIAL); }
  1166. <DEFINE_EOL>. { count();
  1167. addstr(&s_buf, yytext, yyleng);
  1168. state = DEFINE_DATA_S; BEGIN(DEFINE_DATA); }
  1169. <DEFINE_DATA>\\{CR} { count(); } /* eat the escaped CR */
  1170. <DEFINE_DATA>{CR} { count();
  1171. if (pp_define_set(strlen(s_buf.s), s_buf.s)) return 1;
  1172. memset(&s_buf, 0, sizeof(s_buf));
  1173. state = INITIAL; BEGIN(INITIAL); }
  1174. <DEFINE_DATA>. { count();
  1175. addstr(&s_buf, yytext, yyleng); }
  1176. <INITIAL>{PREP_START}{SUBST} { count(); return SUBST;}
  1177. <INITIAL>{PREP_START}{SUBSTDEF} { count(); return SUBSTDEF;}
  1178. <INITIAL>{PREP_START}{SUBSTDEFS} { count(); return SUBSTDEFS;}
  1179. <INITIAL,IFDEF_SKIP>{PREP_START}{IFDEF}{EAT_ABLE}+ { count();
  1180. if (pp_ifdef_type(1)) return 1;
  1181. state = IFDEF_S; BEGIN(IFDEF_ID); }
  1182. <INITIAL,IFDEF_SKIP>{PREP_START}{IFNDEF}{EAT_ABLE}+ { count();
  1183. if (pp_ifdef_type(0)) return 1;
  1184. state = IFDEF_S; BEGIN(IFDEF_ID); }
  1185. <IFDEF_ID>{ID} { count();
  1186. pp_ifdef_var(yyleng, yytext);
  1187. state = IFDEF_EOL_S; BEGIN(IFDEF_EOL); }
  1188. <IFDEF_EOL>{EAT_ABLE}*{CR} { count(); pp_ifdef(); }
  1189. <INITIAL,IFDEF_SKIP>{PREP_START}{ELSE}{EAT_ABLE}*{CR} { count(); pp_else(); }
  1190. <INITIAL,IFDEF_SKIP>{PREP_START}{ENDIF}{EAT_ABLE}*{CR} { count();
  1191. pp_endif(); }
  1192. /* we're in an ifdef that evaluated to false -- throw it away */
  1193. <IFDEF_SKIP>.|{CR} { count(); }
  1194. /* this is split so the shebangs match more, giving them priority */
  1195. <INITIAL>{COM_LINE} { count(); state = LINECOMMENT_S;
  1196. BEGIN(LINECOMMENT); }
  1197. <LINECOMMENT>.*{CR} { count(); state = INITIAL_S; BEGIN(INITIAL); }
  1198. <INITIAL>{ID} { if ((sdef = pp_define_get(yyleng, yytext))!=NULL) {
  1199. for (r=sdef->len-1; r>=0; r--)
  1200. unput(sdef->s[r]); /* reverse order */
  1201. } else {
  1202. count();
  1203. addstr(&s_buf, yytext, yyleng);
  1204. yylval.strval=s_buf.s;
  1205. memset(&s_buf, 0, sizeof(s_buf));
  1206. return ID;
  1207. }
  1208. }
  1209. <INITIAL>{NUM_ID} { count(); addstr(&s_buf, yytext, yyleng);
  1210. yylval.strval=s_buf.s;
  1211. memset(&s_buf, 0, sizeof(s_buf));
  1212. return NUM_ID; }
  1213. <SELECT>. { unput(yytext[0]); state = INITIAL_S; BEGIN(INITIAL); } /* Rescan the token in INITIAL state */
  1214. <INCLF>[ \t]* /* eat the whitespace */
  1215. <INCLF>[^ \t\r\n]+ { /* get the include file name */
  1216. memset(&s_buf, 0, sizeof(s_buf));
  1217. addstr(&s_buf, yytext, yyleng);
  1218. r = pp_subst_run(&s_buf.s);
  1219. if(sr_push_yy_state(s_buf.s, 0)<0)
  1220. {
  1221. LOG(L_CRIT, "error at %s line %d\n", (finame)?finame:"cfg", line);
  1222. exit(-1);
  1223. }
  1224. memset(&s_buf, 0, sizeof(s_buf));
  1225. BEGIN(INITIAL);
  1226. }
  1227. <IMPTF>[ \t]* /* eat the whitespace */
  1228. <IMPTF>[^ \t\r\n]+ { /* get the import file name */
  1229. memset(&s_buf, 0, sizeof(s_buf));
  1230. addstr(&s_buf, yytext, yyleng);
  1231. r = pp_subst_run(&s_buf.s);
  1232. if(sr_push_yy_state(s_buf.s, 1)<0)
  1233. {
  1234. LOG(L_CRIT, "error at %s line %d\n", (finame)?finame:"cfg", line);
  1235. exit(-1);
  1236. }
  1237. memset(&s_buf, 0, sizeof(s_buf));
  1238. BEGIN(INITIAL);
  1239. }
  1240. <<EOF>> {
  1241. switch(state){
  1242. case STR_BETWEEN_S:
  1243. state=old_state;
  1244. BEGIN(old_initial);
  1245. r = pp_subst_run(&s_buf.s);
  1246. yylval.strval=s_buf.s;
  1247. memset(&s_buf, 0, sizeof(s_buf));
  1248. return STRING;
  1249. case STRING_S:
  1250. LOG(L_CRIT, "ERROR: cfg. parser: unexpected EOF in"
  1251. " unclosed string\n");
  1252. if (s_buf.s){
  1253. pkg_free(s_buf.s);
  1254. memset(&s_buf, 0,
  1255. sizeof(s_buf));
  1256. }
  1257. break;
  1258. case COMMENT_S:
  1259. LOG(L_CRIT, "ERROR: cfg. parser: unexpected EOF:"
  1260. " %d comments open\n", comment_nest);
  1261. break;
  1262. case COMMENT_LN_S:
  1263. LOG(L_CRIT, "ERROR: unexpected EOF:"
  1264. "comment line open\n");
  1265. break;
  1266. case ATTR_S:
  1267. LOG(L_CRIT, "ERROR: unexpected EOF"
  1268. " while parsing"
  1269. " avp name\n");
  1270. break;
  1271. case PVARID_S:
  1272. p_nest=0;
  1273. case PVAR_P_S:
  1274. LOG(L_CRIT, "ERROR: unexpected EOF"
  1275. " while parsing pvar name"
  1276. " (%d paranthesis open)\n",
  1277. p_nest);
  1278. break;
  1279. case AVP_PVAR_S:
  1280. LOG(L_CRIT, "ERROR: unexpected EOF"
  1281. " while parsing"
  1282. " avp or pvar name\n");
  1283. }
  1284. if(sr_pop_yy_state()<0)
  1285. return 0;
  1286. }
  1287. %%
  1288. static char* addchar(struct str_buf* dst, char c)
  1289. {
  1290. return addstr(dst, &c, 1);
  1291. }
  1292. static char* addstr(struct str_buf* dst_b, char* src, int len)
  1293. {
  1294. char *tmp;
  1295. unsigned size;
  1296. unsigned used;
  1297. if (dst_b->left<(len+1)){
  1298. used=(unsigned)(dst_b->crt-dst_b->s);
  1299. size=used+len+1;
  1300. /* round up to next multiple */
  1301. size+= STR_BUF_ALLOC_UNIT-size%STR_BUF_ALLOC_UNIT;
  1302. tmp=pkg_malloc(size);
  1303. if (tmp==0) goto error;
  1304. if (dst_b->s){
  1305. memcpy(tmp, dst_b->s, used);
  1306. pkg_free(dst_b->s);
  1307. }
  1308. dst_b->s=tmp;
  1309. dst_b->crt=dst_b->s+used;
  1310. dst_b->left=size-used;
  1311. }
  1312. memcpy(dst_b->crt, src, len);
  1313. dst_b->crt+=len;
  1314. *(dst_b->crt)=0;
  1315. dst_b->left-=len;
  1316. return dst_b->s;
  1317. error:
  1318. LOG(L_CRIT, "ERROR:lex:addstr: memory allocation error\n");
  1319. LOG(L_CRIT, "ERROR:lex:addstr: try to increase pkg size with"
  1320. " -M parameter\n");
  1321. exit(-1);
  1322. }
  1323. /** helper function for count_*(). */
  1324. static void count_lc(int* l, int* c)
  1325. {
  1326. int i;
  1327. for (i=0; i<yyleng;i++){
  1328. if (yytext[i]=='\n'){
  1329. (*l)++;
  1330. (*c)=1;
  1331. }else if (yytext[i]=='\t'){
  1332. (*c)++;
  1333. /*(*c)+=8 -((*c)%8);*/
  1334. }else{
  1335. (*c)++;
  1336. }
  1337. }
  1338. }
  1339. /* helper function */
  1340. static void count_restore_ignored()
  1341. {
  1342. if (ign_lines) /* ignored line(s) => column has changed */
  1343. column=ign_columns;
  1344. else
  1345. column+=ign_columns;
  1346. line+=ign_lines;
  1347. ign_lines=ign_columns=0;
  1348. }
  1349. /** count/record position for stuff added to the current token. */
  1350. static void count_more()
  1351. {
  1352. count_restore_ignored();
  1353. count_lc(&line, &column);
  1354. }
  1355. /** count/record position for a new token. */
  1356. static void count()
  1357. {
  1358. count_restore_ignored();
  1359. startline=line;
  1360. startcolumn=column;
  1361. count_more();
  1362. }
  1363. /** record discarded stuff (not contained in the token) so that
  1364. the next token position can be adjusted properly*/
  1365. static void count_ignore()
  1366. {
  1367. count_lc(&ign_lines, &ign_columns);
  1368. }
  1369. /* replacement yywrap, removes libfl dependency */
  1370. int yywrap()
  1371. {
  1372. return 1;
  1373. }
  1374. static int sr_push_yy_state(char *fin, int mode)
  1375. {
  1376. struct sr_yy_fname *fn = NULL;
  1377. FILE *fp = NULL;
  1378. char *x = NULL;
  1379. char *newf = NULL;
  1380. #define MAX_INCLUDE_FNAME 128
  1381. char fbuf[MAX_INCLUDE_FNAME];
  1382. int i, j, l;
  1383. char *tmpfiname = 0;
  1384. if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
  1385. {
  1386. LOG(L_CRIT, "too many includes\n");
  1387. return -1;
  1388. }
  1389. l = strlen(fin);
  1390. if(l>=MAX_INCLUDE_FNAME)
  1391. {
  1392. LOG(L_CRIT, "included file name too long: %s\n", fin);
  1393. return -1;
  1394. }
  1395. if(fin[0]!='"' || fin[l-1]!='"')
  1396. {
  1397. LOG(L_CRIT, "included file name must be between quotes: %s\n", fin);
  1398. return -1;
  1399. }
  1400. j = 0;
  1401. for(i=1; i<l-1; i++)
  1402. {
  1403. switch(fin[i]) {
  1404. case '\\':
  1405. if(i+1==l-1)
  1406. {
  1407. LOG(L_CRIT, "invalid escape at %d in included file name: %s\n", i, fin);
  1408. return -1;
  1409. }
  1410. i++;
  1411. switch(fin[i]) {
  1412. case 't':
  1413. fbuf[j++] = '\t';
  1414. break;
  1415. case 'n':
  1416. fbuf[j++] = '\n';
  1417. break;
  1418. case 'r':
  1419. fbuf[j++] = '\r';
  1420. break;
  1421. default:
  1422. fbuf[j++] = fin[i];
  1423. }
  1424. break;
  1425. default:
  1426. fbuf[j++] = fin[i];
  1427. }
  1428. }
  1429. if(j==0)
  1430. {
  1431. LOG(L_CRIT, "invalid included file name: %s\n", fin);
  1432. return -1;
  1433. }
  1434. fbuf[j] = '\0';
  1435. fp = fopen(fbuf, "r" );
  1436. if ( ! fp )
  1437. {
  1438. tmpfiname = (finame==0)?cfg_file:finame;
  1439. if(tmpfiname==0 || fbuf[0]=='/')
  1440. {
  1441. if(mode==0)
  1442. {
  1443. LOG(L_CRIT, "cannot open included file: %s\n", fin);
  1444. return -1;
  1445. } else {
  1446. LOG(L_DBG, "importing file ignored: %s\n", fin);
  1447. return 0;
  1448. }
  1449. }
  1450. x = strrchr(tmpfiname, '/');
  1451. if(x==NULL)
  1452. {
  1453. /* nothing else to try */
  1454. if(mode==0)
  1455. {
  1456. LOG(L_CRIT, "cannot open included file: %s\n", fin);
  1457. return -1;
  1458. } else {
  1459. LOG(L_DBG, "importing file ignored: %s\n", fin);
  1460. return 0;
  1461. }
  1462. }
  1463. newf = (char*)pkg_malloc(x-tmpfiname+strlen(fbuf)+2);
  1464. if(newf==0)
  1465. {
  1466. LOG(L_CRIT, "no more pkg\n");
  1467. return -1;
  1468. }
  1469. newf[0] = '\0';
  1470. strncat(newf, tmpfiname, x-tmpfiname);
  1471. strcat(newf, "/");
  1472. strcat(newf, fbuf);
  1473. fp = fopen(newf, "r" );
  1474. if ( fp==NULL )
  1475. {
  1476. pkg_free(newf);
  1477. if(mode==0)
  1478. {
  1479. LOG(L_CRIT, "cannot open included file: %s (%s)\n", fbuf, newf);
  1480. return -1;
  1481. } else {
  1482. LOG(L_DBG, "importing file ignored: %s (%s)\n", fbuf, newf);
  1483. return 0;
  1484. }
  1485. }
  1486. LOG(L_DBG, "including file: %s (%s)\n", fbuf, newf);
  1487. } else {
  1488. newf = fbuf;
  1489. }
  1490. include_stack[include_stack_ptr].state = YY_CURRENT_BUFFER;
  1491. include_stack[include_stack_ptr].line = line;
  1492. include_stack[include_stack_ptr].column = column;
  1493. include_stack[include_stack_ptr].startline = startline;
  1494. include_stack[include_stack_ptr].startcolumn = startcolumn;
  1495. include_stack[include_stack_ptr].finame = finame;
  1496. include_stack[include_stack_ptr].routename = routename;
  1497. include_stack_ptr++;
  1498. line=1;
  1499. column=1;
  1500. startline=1;
  1501. startcolumn=1;
  1502. yyin = fp;
  1503. /* make a copy in PKG if does not exist */
  1504. fn = sr_yy_fname_list;
  1505. while(fn!=0)
  1506. {
  1507. if(strcmp(fn->fname, newf)==0)
  1508. {
  1509. if(newf!=fbuf)
  1510. pkg_free(newf);
  1511. newf = fbuf;
  1512. break;
  1513. }
  1514. fn = fn->next;
  1515. }
  1516. if(fn==0)
  1517. {
  1518. fn = (struct sr_yy_fname*)pkg_malloc(sizeof(struct sr_yy_fname));
  1519. if(fn==0)
  1520. {
  1521. if(newf!=fbuf)
  1522. pkg_free(newf);
  1523. LOG(L_CRIT, "no more pkg\n");
  1524. return -1;
  1525. }
  1526. if(newf==fbuf)
  1527. {
  1528. fn->fname = (char*)pkg_malloc(strlen(fbuf)+1);
  1529. if(fn->fname==0)
  1530. {
  1531. pkg_free(fn);
  1532. LOG(L_CRIT, "no more pkg!\n");
  1533. return -1;
  1534. }
  1535. strcpy(fn->fname, fbuf);
  1536. } else {
  1537. fn->fname = newf;
  1538. }
  1539. fn->next = sr_yy_fname_list;
  1540. sr_yy_fname_list = fn;
  1541. }
  1542. finame = fn->fname;
  1543. yy_switch_to_buffer( yy_create_buffer(yyin, YY_BUF_SIZE ) );
  1544. return 0;
  1545. }
  1546. static int sr_pop_yy_state()
  1547. {
  1548. include_stack_ptr--;
  1549. if (include_stack_ptr<0 )
  1550. return -1;
  1551. yy_delete_buffer( YY_CURRENT_BUFFER );
  1552. yy_switch_to_buffer(include_stack[include_stack_ptr].state);
  1553. line=include_stack[include_stack_ptr].line;
  1554. column=include_stack[include_stack_ptr].column;
  1555. startline=include_stack[include_stack_ptr].startline;
  1556. startcolumn=include_stack[include_stack_ptr].startcolumn;
  1557. finame = include_stack[include_stack_ptr].finame;
  1558. return 0;
  1559. }
  1560. /* define/ifdef support */
  1561. #define MAX_DEFINES 256
  1562. static str pp_defines[MAX_DEFINES][2];
  1563. static int pp_num_defines = 0;
  1564. static int pp_define_type = 0;
  1565. static int pp_define_index = -1;
  1566. /* pp_ifdef_stack[i] is 1 if the ifdef test at depth i is either
  1567. * ifdef(defined), ifndef(undefined), or the opposite of these
  1568. * two, but in an else branch
  1569. */
  1570. #define MAX_IFDEFS 256
  1571. static int pp_ifdef_stack[MAX_IFDEFS];
  1572. static int pp_sptr = 0; /* stack pointer */
  1573. static int pp_lookup(int len, const char * text)
  1574. {
  1575. str var = {(char *)text, len};
  1576. int i;
  1577. for (i=0; i<pp_num_defines; i++)
  1578. if (STR_EQ(pp_defines[i][0], var))
  1579. return i;
  1580. return -1;
  1581. }
  1582. int pp_define_set_type(int type)
  1583. {
  1584. pp_define_type = type;
  1585. return 0;
  1586. }
  1587. int pp_define(int len, const char * text)
  1588. {
  1589. int ppos;
  1590. LM_DBG("defining id: %.*s\n", len, text);
  1591. if (pp_num_defines == MAX_DEFINES) {
  1592. LOG(L_CRIT, "ERROR: too many defines -- adjust MAX_DEFINES\n");
  1593. return -1;
  1594. }
  1595. pp_define_index = -1;
  1596. ppos = pp_lookup(len, text);
  1597. if(ppos >= 0) {
  1598. if(pp_define_type==1) {
  1599. LOG(L_DBG, "ignoring - already defined: %.*s\n", len, text);
  1600. pp_define_index = -2;
  1601. return 0;
  1602. } else if(pp_define_type==2) {
  1603. LOG(L_DBG, "redefining: %.*s\n", len, text);
  1604. pp_define_index = ppos;
  1605. if(pp_defines[ppos][1].s != NULL) {
  1606. pkg_free(pp_defines[ppos][1].s);
  1607. pp_defines[ppos][1].len = 0;
  1608. pp_defines[ppos][1].s = NULL;
  1609. }
  1610. return 0;
  1611. } else {
  1612. LOG(L_CRIT, "ERROR: already defined: %.*s\n", len, text);
  1613. return -1;
  1614. }
  1615. }
  1616. pp_defines[pp_num_defines][0].len = len;
  1617. pp_defines[pp_num_defines][0].s = (char*)pkg_malloc(len+1);
  1618. if(pp_defines[pp_num_defines][0].s==NULL) {
  1619. LOG(L_CRIT, "no more memory to define: %.*s\n", len, text);
  1620. return -1;
  1621. }
  1622. memcpy(pp_defines[pp_num_defines][0].s, text, len);
  1623. pp_defines[pp_num_defines][1].len = 0;
  1624. pp_defines[pp_num_defines][1].s = NULL;
  1625. pp_define_index = pp_num_defines;
  1626. pp_num_defines++;
  1627. return 0;
  1628. }
  1629. int pp_define_set(int len, char *text)
  1630. {
  1631. int ppos;
  1632. if(pp_define_index == -2) {
  1633. /* #!trydef that should be ignored */
  1634. return 0;
  1635. }
  1636. if(pp_define_index < 0) {
  1637. /* invalid position in define table */
  1638. LOG(L_BUG, "BUG: the index in define table not set yet\n");
  1639. return -1;
  1640. }
  1641. if(len<=0) {
  1642. LOG(L_DBG, "no define value - ignoring\n");
  1643. return 0;
  1644. }
  1645. if (pp_num_defines == MAX_DEFINES) {
  1646. LOG(L_CRIT, "ERROR: too many defines -- adjust MAX_DEFINES\n");
  1647. return -1;
  1648. }
  1649. if (pp_num_defines == 0) {
  1650. LOG(L_BUG, "BUG: setting define value, but no define id yet\n");
  1651. return -1;
  1652. }
  1653. ppos = pp_define_index;
  1654. if (pp_defines[ppos][0].s == NULL) {
  1655. LOG(L_BUG, "BUG: last define ID is null\n");
  1656. return -1;
  1657. }
  1658. if (pp_defines[ppos][1].s != NULL) {
  1659. LOG(L_BUG, "BUG: ID %.*s [%d] overwritten\n",
  1660. pp_defines[ppos][0].len,
  1661. pp_defines[ppos][0].s, ppos);
  1662. return -1;
  1663. }
  1664. pp_defines[ppos][1].len = len;
  1665. pp_defines[ppos][1].s = text;
  1666. LM_DBG("### setting define ID [%.*s] value [%.*s]\n",
  1667. pp_defines[ppos][0].len,
  1668. pp_defines[ppos][0].s,
  1669. pp_defines[ppos][1].len,
  1670. pp_defines[ppos][1].s);
  1671. return 0;
  1672. }
  1673. static str *pp_define_get(int len, const char * text)
  1674. {
  1675. str var = {(char *)text, len};
  1676. int i;
  1677. for (i=0; i<pp_num_defines; i++)
  1678. {
  1679. if (STR_EQ(pp_defines[i][0], var))
  1680. {
  1681. if(pp_defines[i][0].s!=NULL)
  1682. {
  1683. LM_DBG("### returning define ID [%.*s] value [%.*s]\n",
  1684. pp_defines[i][0].len,
  1685. pp_defines[i][0].s,
  1686. pp_defines[i][1].len,
  1687. pp_defines[i][1].s);
  1688. return &pp_defines[i][1];
  1689. }
  1690. return NULL;
  1691. }
  1692. }
  1693. return NULL;
  1694. }
  1695. static int pp_ifdef_type(int type)
  1696. {
  1697. if (pp_sptr == MAX_IFDEFS) {
  1698. LOG(L_CRIT, "ERROR: too many nested ifdefs -- adjust MAX_IFDEFS\n");
  1699. return -1;
  1700. }
  1701. pp_ifdef_stack[pp_sptr] = type;
  1702. pp_ifdef_level_update(1);
  1703. return 0;
  1704. }
  1705. /* this sets the result of the if[n]def expr:
  1706. * ifdef defined -> 1
  1707. * ifdef undefined -> 0
  1708. * ifndef defined -> 0
  1709. * ifndef undefined -> 1
  1710. */
  1711. static void pp_ifdef_var(int len, const char * text)
  1712. {
  1713. pp_ifdef_stack[pp_sptr] ^= (pp_lookup(len, text) < 0);
  1714. }
  1715. static void pp_update_state()
  1716. {
  1717. int i;
  1718. for (i=0; i<pp_sptr; i++)
  1719. if (! pp_ifdef_stack[i]) {
  1720. state = IFDEF_SKIP_S; BEGIN(IFDEF_SKIP);
  1721. return;
  1722. }
  1723. state = INITIAL; BEGIN(INITIAL);
  1724. }
  1725. static void pp_ifdef()
  1726. {
  1727. pp_sptr++;
  1728. pp_update_state();
  1729. }
  1730. static void pp_else()
  1731. {
  1732. pp_ifdef_stack[pp_sptr-1] ^= 1;
  1733. pp_update_state();
  1734. }
  1735. static void pp_endif()
  1736. {
  1737. pp_sptr--;
  1738. pp_ifdef_level_update(-1);
  1739. pp_update_state();
  1740. }