cfg.lex 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643
  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. */
  60. %{
  61. #include "cfg.tab.h"
  62. #include "dprint.h"
  63. #include "globals.h"
  64. #include "mem/mem.h"
  65. #include <string.h>
  66. #include <stdlib.h>
  67. #include "ip_addr.h"
  68. /* states */
  69. #define INITIAL_S 0
  70. #define COMMENT_S 1
  71. #define COMMENT_LN_S 2
  72. #define STRING_S 3
  73. #define STR_BUF_ALLOC_UNIT 128
  74. struct str_buf{
  75. char* s;
  76. char* crt;
  77. int left;
  78. };
  79. static int comment_nest=0;
  80. static int state=0;
  81. static struct str_buf s_buf;
  82. int line=1;
  83. int column=1;
  84. int startcolumn=1;
  85. static char* addchar(struct str_buf *, char);
  86. static char* addstr(struct str_buf *, char*, int);
  87. static void count();
  88. %}
  89. /* start conditions */
  90. %x STRING1 STRING2 COMMENT COMMENT_LN
  91. /* action keywords */
  92. FORWARD forward
  93. FORWARD_TCP forward_tcp
  94. FORWARD_UDP forward_udp
  95. FORWARD_TLS forward_tls
  96. DROP "drop"|"break"
  97. SEND send
  98. SEND_TCP send_tcp
  99. LOG log
  100. ERROR error
  101. ROUTE route
  102. ROUTE_FAILURE failure_route
  103. ROUTE_ONREPLY onreply_route
  104. ROUTE_BRANCH branch_route
  105. EXEC exec
  106. FORCE_RPORT "force_rport"|"add_rport"
  107. FORCE_TCP_ALIAS "force_tcp_alias"|"add_tcp_alias"
  108. SETFLAG setflag
  109. RESETFLAG resetflag
  110. ISFLAGSET isflagset
  111. SET_HOST "rewritehost"|"sethost"|"seth"
  112. SET_HOSTPORT "rewritehostport"|"sethostport"|"sethp"
  113. SET_USER "rewriteuser"|"setuser"|"setu"
  114. SET_USERPASS "rewriteuserpass"|"setuserpass"|"setup"
  115. SET_PORT "rewriteport"|"setport"|"setp"
  116. SET_URI "rewriteuri"|"seturi"
  117. REVERT_URI "revert_uri"
  118. PREFIX "prefix"
  119. STRIP "strip"
  120. STRIP_TAIL "strip_tail"
  121. APPEND_BRANCH "append_branch"
  122. IF "if"
  123. ELSE "else"
  124. SET_ADV_ADDRESS "set_advertised_address"
  125. SET_ADV_PORT "set_advertised_port"
  126. FORCE_SEND_SOCKET "force_send_socket"
  127. /*ACTION LVALUES*/
  128. URIHOST "uri:host"
  129. URIPORT "uri:port"
  130. MAX_LEN "max_len"
  131. /* condition keywords */
  132. METHOD method
  133. /* hack -- the second element in first line is referable
  134. as either uri or status; it only would makes sense to
  135. call it "uri" from route{} and status from onreply_route{}
  136. */
  137. URI "uri"|"status"
  138. FROM_URI "from_uri"
  139. TO_URI "to_uri"
  140. SRCIP src_ip
  141. SRCPORT src_port
  142. DSTIP dst_ip
  143. DSTPORT dst_port
  144. PROTO proto
  145. AF af
  146. MYSELF myself
  147. MSGLEN "msg:len"
  148. /* operators */
  149. EQUAL =
  150. EQUAL_T ==
  151. GT >
  152. LT <
  153. GTE >=
  154. LTE <=
  155. DIFF !=
  156. MATCH =~
  157. NOT !|"not"
  158. AND "and"|"&&"|"&"
  159. OR "or"|"||"|"|"
  160. PLUS "+"
  161. MINUS "-"
  162. /* config vars. */
  163. DEBUG debug
  164. FORK fork
  165. LOGSTDERROR log_stderror
  166. LOGFACILITY log_facility
  167. LISTEN listen
  168. ALIAS alias
  169. DNS dns
  170. REV_DNS rev_dns
  171. DNS_TRY_IPV6 dns_try_ipv6
  172. DNS_RETR_TIME dns_retr_time
  173. DNS_RETR_NO dns_retr_no
  174. DNS_SERVERS_NO dns_servers_no
  175. DNS_USE_SEARCH dns_use_search_list
  176. PORT port
  177. STAT statistics
  178. MAXBUFFER maxbuffer
  179. CHILDREN children
  180. CHECK_VIA check_via
  181. SYN_BRANCH syn_branch
  182. MEMLOG "memlog"|"mem_log"
  183. SIP_WARNING sip_warning
  184. FIFO fifo
  185. FIFO_DIR fifo_dir
  186. SOCK_MODE "fifo_mode"|"sock_mode"|"file_mode"
  187. SOCK_USER "fifo_user"|"sock_user"
  188. SOCK_GROUP "fifo_group"|"sock_group"
  189. FIFO_DB_URL fifo_db_url
  190. UNIX_SOCK unix_sock
  191. UNIX_SOCK_CHILDREN unix_sock_children
  192. UNIX_TX_TIMEOUT unix_tx_timeout
  193. SERVER_SIGNATURE server_signature
  194. REPLY_TO_VIA reply_to_via
  195. USER "user"|"uid"
  196. GROUP "group"|"gid"
  197. CHROOT "chroot"
  198. WDIR "workdir"|"wdir"
  199. MHOMED mhomed
  200. DISABLE_TCP "disable_tcp"
  201. TCP_CHILDREN "tcp_children"
  202. TCP_ACCEPT_ALIASES "tcp_accept_aliases"
  203. TCP_SEND_TIMEOUT "tcp_send_timeout"
  204. TCP_CONNECT_TIMEOUT "tcp_connect_timeout"
  205. TCP_CON_LIFETIME "tcp_connection_lifetime"
  206. TCP_POLL_METHOD "tcp_poll_method"
  207. TCP_MAX_CONNECTIONS "tcp_max_connections"
  208. DISABLE_TLS "disable_tls"
  209. TLSLOG "tlslog"|"tls_log"
  210. TLS_PORT_NO "tls_port_no"
  211. TLS_METHOD "tls_method"
  212. TLS_VERIFY "tls_verify"
  213. TLS_REQUIRE_CERTIFICATE "tls_require_certificate"
  214. TLS_CERTIFICATE "tls_certificate"
  215. TLS_PRIVATE_KEY "tls_private_key"
  216. TLS_CA_LIST "tls_ca_list"
  217. TLS_HANDSHAKE_TIMEOUT "tls_handshake_timeout"
  218. TLS_SEND_TIMEOUT "tls_send_timeout"
  219. ADVERTISED_ADDRESS "advertised_address"
  220. ADVERTISED_PORT "advertised_port"
  221. DISABLE_CORE "disable_core_dump"
  222. OPEN_FD_LIMIT "open_files_limit"
  223. MCAST_LOOPBACK "mcast_loopback"
  224. MCAST_TTL "mcast_ttl"
  225. LOADMODULE loadmodule
  226. MODPARAM modparam
  227. /* values */
  228. YES "yes"|"true"|"on"|"enable"
  229. NO "no"|"false"|"off"|"disable"
  230. UDP "udp"|"UDP"
  231. TCP "tcp"|"TCP"
  232. TLS "tls"|"TLS"
  233. INET "inet"|"INET"
  234. INET6 "inet6"|"INET6"
  235. SSLv23 "sslv23"|"SSLv23"|"SSLV23"
  236. SSLv2 "sslv2"|"SSLv2"|"SSLV2"
  237. SSLv3 "sslv3"|"SSLv3"|"SSLV3"
  238. TLSv1 "tlsv1"|"TLSv1"|"TLSV1"
  239. LETTER [a-zA-Z]
  240. DIGIT [0-9]
  241. ALPHANUM {LETTER}|{DIGIT}|[_]
  242. NUMBER 0|([1-9]{DIGIT}*)
  243. ID {LETTER}{ALPHANUM}*
  244. HEX [0-9a-fA-F]
  245. HEXNUMBER 0x{HEX}+
  246. OCTNUMBER 0[0-7]+
  247. HEX4 {HEX}{1,4}
  248. IPV6ADDR ({HEX4}":"){7}{HEX4}|({HEX4}":"){1,7}(":"{HEX4}){1,7}|":"(":"{HEX4}){1,7}|({HEX4}":"){1,7}":"|"::"
  249. QUOTES \"
  250. TICK \'
  251. SLASH "/"
  252. SEMICOLON ;
  253. RPAREN \)
  254. LPAREN \(
  255. LBRACE \{
  256. RBRACE \}
  257. LBRACK \[
  258. RBRACK \]
  259. COMMA ","
  260. COLON ":"
  261. STAR \*
  262. DOT \.
  263. CR \n
  264. COM_LINE #
  265. COM_START "/\*"
  266. COM_END "\*/"
  267. EAT_ABLE [\ \t\b\r]
  268. %%
  269. <INITIAL>{EAT_ABLE} { count(); }
  270. <INITIAL>{FORWARD} {count(); yylval.strval=yytext; return FORWARD; }
  271. <INITIAL>{FORWARD_TCP} {count(); yylval.strval=yytext; return FORWARD_TCP; }
  272. <INITIAL>{FORWARD_TLS} {count(); yylval.strval=yytext; return FORWARD_TLS; }
  273. <INITIAL>{FORWARD_UDP} {count(); yylval.strval=yytext; return FORWARD_UDP; }
  274. <INITIAL>{DROP} { count(); yylval.strval=yytext; return DROP; }
  275. <INITIAL>{SEND} { count(); yylval.strval=yytext; return SEND; }
  276. <INITIAL>{SEND_TCP} { count(); yylval.strval=yytext; return SEND_TCP; }
  277. <INITIAL>{LOG} { count(); yylval.strval=yytext; return LOG_TOK; }
  278. <INITIAL>{ERROR} { count(); yylval.strval=yytext; return ERROR; }
  279. <INITIAL>{SETFLAG} { count(); yylval.strval=yytext; return SETFLAG; }
  280. <INITIAL>{RESETFLAG} { count(); yylval.strval=yytext; return RESETFLAG; }
  281. <INITIAL>{ISFLAGSET} { count(); yylval.strval=yytext; return ISFLAGSET; }
  282. <INITIAL>{MSGLEN} { count(); yylval.strval=yytext; return MSGLEN; }
  283. <INITIAL>{ROUTE} { count(); yylval.strval=yytext; return ROUTE; }
  284. <INITIAL>{ROUTE_ONREPLY} { count(); yylval.strval=yytext;
  285. return ROUTE_ONREPLY; }
  286. <INITIAL>{ROUTE_FAILURE} { count(); yylval.strval=yytext;
  287. return ROUTE_FAILURE; }
  288. <INITIAL>{ROUTE_BRANCH} { count(); yylval.strval=yytext; return ROUTE_BRANCH; }
  289. <INITIAL>{EXEC} { count(); yylval.strval=yytext; return EXEC; }
  290. <INITIAL>{SET_HOST} { count(); yylval.strval=yytext; return SET_HOST; }
  291. <INITIAL>{SET_HOSTPORT} { count(); yylval.strval=yytext; return SET_HOSTPORT; }
  292. <INITIAL>{SET_USER} { count(); yylval.strval=yytext; return SET_USER; }
  293. <INITIAL>{SET_USERPASS} { count(); yylval.strval=yytext; return SET_USERPASS; }
  294. <INITIAL>{SET_PORT} { count(); yylval.strval=yytext; return SET_PORT; }
  295. <INITIAL>{SET_URI} { count(); yylval.strval=yytext; return SET_URI; }
  296. <INITIAL>{REVERT_URI} { count(); yylval.strval=yytext; return REVERT_URI; }
  297. <INITIAL>{PREFIX} { count(); yylval.strval=yytext; return PREFIX; }
  298. <INITIAL>{STRIP} { count(); yylval.strval=yytext; return STRIP; }
  299. <INITIAL>{STRIP_TAIL} { count(); yylval.strval=yytext; return STRIP_TAIL; }
  300. <INITIAL>{APPEND_BRANCH} { count(); yylval.strval=yytext;
  301. return APPEND_BRANCH; }
  302. <INITIAL>{FORCE_RPORT} { count(); yylval.strval=yytext; return FORCE_RPORT; }
  303. <INITIAL>{FORCE_TCP_ALIAS} { count(); yylval.strval=yytext;
  304. return FORCE_TCP_ALIAS; }
  305. <INITIAL>{IF} { count(); yylval.strval=yytext; return IF; }
  306. <INITIAL>{ELSE} { count(); yylval.strval=yytext; return ELSE; }
  307. <INITIAL>{SET_ADV_ADDRESS} { count(); yylval.strval=yytext;
  308. return SET_ADV_ADDRESS; }
  309. <INITIAL>{SET_ADV_PORT} { count(); yylval.strval=yytext;
  310. return SET_ADV_PORT; }
  311. <INITIAL>{FORCE_SEND_SOCKET} { count(); yylval.strval=yytext;
  312. return FORCE_SEND_SOCKET; }
  313. <INITIAL>{URIHOST} { count(); yylval.strval=yytext; return URIHOST; }
  314. <INITIAL>{URIPORT} { count(); yylval.strval=yytext; return URIPORT; }
  315. <INITIAL>{MAX_LEN} { count(); yylval.strval=yytext; return MAX_LEN; }
  316. <INITIAL>{METHOD} { count(); yylval.strval=yytext; return METHOD; }
  317. <INITIAL>{URI} { count(); yylval.strval=yytext; return URI; }
  318. <INITIAL>{FROM_URI} { count(); yylval.strval=yytext; return FROM_URI; }
  319. <INITIAL>{TO_URI} { count(); yylval.strval=yytext; return TO_URI; }
  320. <INITIAL>{SRCIP} { count(); yylval.strval=yytext; return SRCIP; }
  321. <INITIAL>{SRCPORT} { count(); yylval.strval=yytext; return SRCPORT; }
  322. <INITIAL>{DSTIP} { count(); yylval.strval=yytext; return DSTIP; }
  323. <INITIAL>{DSTPORT} { count(); yylval.strval=yytext; return DSTPORT; }
  324. <INITIAL>{PROTO} { count(); yylval.strval=yytext; return PROTO; }
  325. <INITIAL>{AF} { count(); yylval.strval=yytext; return AF; }
  326. <INITIAL>{MYSELF} { count(); yylval.strval=yytext; return MYSELF; }
  327. <INITIAL>{DEBUG} { count(); yylval.strval=yytext; return DEBUG; }
  328. <INITIAL>{FORK} { count(); yylval.strval=yytext; return FORK; }
  329. <INITIAL>{LOGSTDERROR} { yylval.strval=yytext; return LOGSTDERROR; }
  330. <INITIAL>{LOGFACILITY} { yylval.strval=yytext; return LOGFACILITY; }
  331. <INITIAL>{LISTEN} { count(); yylval.strval=yytext; return LISTEN; }
  332. <INITIAL>{ALIAS} { count(); yylval.strval=yytext; return ALIAS; }
  333. <INITIAL>{DNS} { count(); yylval.strval=yytext; return DNS; }
  334. <INITIAL>{REV_DNS} { count(); yylval.strval=yytext; return REV_DNS; }
  335. <INITIAL>{DNS_TRY_IPV6} { count(); yylval.strval=yytext;
  336. return DNS_TRY_IPV6; }
  337. <INITIAL>{DNS_RETR_TIME} { count(); yylval.strval=yytext;
  338. return DNS_RETR_TIME; }
  339. <INITIAL>{DNS_RETR_NO} { count(); yylval.strval=yytext;
  340. return DNS_RETR_NO; }
  341. <INITIAL>{DNS_SERVERS_NO} { count(); yylval.strval=yytext;
  342. return DNS_SERVERS_NO; }
  343. <INITIAL>{DNS_USE_SEARCH} { count(); yylval.strval=yytext;
  344. return DNS_USE_SEARCH; }
  345. <INITIAL>{PORT} { count(); yylval.strval=yytext; return PORT; }
  346. <INITIAL>{STAT} { count(); yylval.strval=yytext; return STAT; }
  347. <INITIAL>{MAXBUFFER} { count(); yylval.strval=yytext; return MAXBUFFER; }
  348. <INITIAL>{CHILDREN} { count(); yylval.strval=yytext; return CHILDREN; }
  349. <INITIAL>{CHECK_VIA} { count(); yylval.strval=yytext; return CHECK_VIA; }
  350. <INITIAL>{SYN_BRANCH} { count(); yylval.strval=yytext; return SYN_BRANCH; }
  351. <INITIAL>{MEMLOG} { count(); yylval.strval=yytext; return MEMLOG; }
  352. <INITIAL>{SIP_WARNING} { count(); yylval.strval=yytext; return SIP_WARNING; }
  353. <INITIAL>{USER} { count(); yylval.strval=yytext; return USER; }
  354. <INITIAL>{GROUP} { count(); yylval.strval=yytext; return GROUP; }
  355. <INITIAL>{CHROOT} { count(); yylval.strval=yytext; return CHROOT; }
  356. <INITIAL>{WDIR} { count(); yylval.strval=yytext; return WDIR; }
  357. <INITIAL>{MHOMED} { count(); yylval.strval=yytext; return MHOMED; }
  358. <INITIAL>{DISABLE_TCP} { count(); yylval.strval=yytext; return DISABLE_TCP; }
  359. <INITIAL>{TCP_CHILDREN} { count(); yylval.strval=yytext; return TCP_CHILDREN; }
  360. <INITIAL>{TCP_ACCEPT_ALIASES} { count(); yylval.strval=yytext;
  361. return TCP_ACCEPT_ALIASES; }
  362. <INITIAL>{TCP_SEND_TIMEOUT} { count(); yylval.strval=yytext;
  363. return TCP_SEND_TIMEOUT; }
  364. <INITIAL>{TCP_CONNECT_TIMEOUT} { count(); yylval.strval=yytext;
  365. return TCP_CONNECT_TIMEOUT; }
  366. <INITIAL>{TCP_CON_LIFETIME} { count(); yylval.strval=yytext;
  367. return TCP_CON_LIFETIME; }
  368. <INITIAL>{TCP_POLL_METHOD} { count(); yylval.strval=yytext;
  369. return TCP_POLL_METHOD; }
  370. <INITIAL>{TCP_MAX_CONNECTIONS} { count(); yylval.strval=yytext;
  371. return TCP_MAX_CONNECTIONS; }
  372. <INITIAL>{DISABLE_TLS} { count(); yylval.strval=yytext; return DISABLE_TLS; }
  373. <INITIAL>{TLSLOG} { count(); yylval.strval=yytext; return TLS_PORT_NO; }
  374. <INITIAL>{TLS_PORT_NO} { count(); yylval.strval=yytext; return TLS_PORT_NO; }
  375. <INITIAL>{TLS_METHOD} { count(); yylval.strval=yytext; return TLS_METHOD; }
  376. <INITIAL>{TLS_VERIFY} { count(); yylval.strval=yytext; return TLS_VERIFY; }
  377. <INITIAL>{TLS_REQUIRE_CERTIFICATE} { count(); yylval.strval=yytext;
  378. return TLS_REQUIRE_CERTIFICATE; }
  379. <INITIAL>{TLS_CERTIFICATE} { count(); yylval.strval=yytext;
  380. return TLS_CERTIFICATE; }
  381. <INITIAL>{TLS_PRIVATE_KEY} { count(); yylval.strval=yytext;
  382. return TLS_PRIVATE_KEY; }
  383. <INITIAL>{TLS_CA_LIST} { count(); yylval.strval=yytext;
  384. return TLS_CA_LIST; }
  385. <INITIAL>{TLS_HANDSHAKE_TIMEOUT} { count(); yylval.strval=yytext;
  386. return TLS_HANDSHAKE_TIMEOUT; }
  387. <INITIAL>{TLS_SEND_TIMEOUT} { count(); yylval.strval=yytext;
  388. return TLS_SEND_TIMEOUT; }
  389. <INITIAL>{FIFO} { count(); yylval.strval=yytext; return FIFO; }
  390. <INITIAL>{FIFO_DIR} { count(); yylval.strval=yytext; return FIFO_DIR; }
  391. <INITIAL>{FIFO_DB_URL} { count(); yylval.strval=yytext; return FIFO_DB_URL; }
  392. <INITIAL>{SOCK_MODE} { count(); yylval.strval=yytext; return SOCK_MODE; }
  393. <INITIAL>{SOCK_USER} { count(); yylval.strval=yytext; return SOCK_USER; }
  394. <INITIAL>{SOCK_GROUP} { count(); yylval.strval=yytext; return SOCK_GROUP; }
  395. <INITIAL>{UNIX_SOCK} { count(); yylval.strval=yytext; return UNIX_SOCK; }
  396. <INITIAL>{UNIX_SOCK_CHILDREN} { count(); yylval.strval=yytext; return UNIX_SOCK_CHILDREN; }
  397. <INITIAL>{UNIX_TX_TIMEOUT} { count(); yylval.strval=yytext; return UNIX_TX_TIMEOUT; }
  398. <INITIAL>{SERVER_SIGNATURE} { count(); yylval.strval=yytext; return SERVER_SIGNATURE; }
  399. <INITIAL>{REPLY_TO_VIA} { count(); yylval.strval=yytext; return REPLY_TO_VIA; }
  400. <INITIAL>{ADVERTISED_ADDRESS} { count(); yylval.strval=yytext;
  401. return ADVERTISED_ADDRESS; }
  402. <INITIAL>{ADVERTISED_PORT} { count(); yylval.strval=yytext;
  403. return ADVERTISED_PORT; }
  404. <INITIAL>{DISABLE_CORE} { count(); yylval.strval=yytext;
  405. return DISABLE_CORE; }
  406. <INITIAL>{OPEN_FD_LIMIT} { count(); yylval.strval=yytext;
  407. return OPEN_FD_LIMIT; }
  408. <INITIAL>{MCAST_LOOPBACK} { count(); yylval.strval=yytext;
  409. return MCAST_LOOPBACK; }
  410. <INITIAL>{MCAST_TTL} { count(); yylval.strval=yytext;
  411. return MCAST_TTL; }
  412. <INITIAL>{LOADMODULE} { count(); yylval.strval=yytext; return LOADMODULE; }
  413. <INITIAL>{MODPARAM} { count(); yylval.strval=yytext; return MODPARAM; }
  414. <INITIAL>{EQUAL} { count(); return EQUAL; }
  415. <INITIAL>{EQUAL_T} { count(); return EQUAL_T; }
  416. <INITIAL>{GT} { count(); return GT; }
  417. <INITIAL>{LT} { count(); return LT; }
  418. <INITIAL>{GTE} { count(); return GTE; }
  419. <INITIAL>{LTE} { count(); return LTE; }
  420. <INITIAL>{DIFF} { count(); return DIFF; }
  421. <INITIAL>{MATCH} { count(); return MATCH; }
  422. <INITIAL>{NOT} { count(); return NOT; }
  423. <INITIAL>{AND} { count(); return AND; }
  424. <INITIAL>{OR} { count(); return OR; }
  425. <INITIAL>{PLUS} { count(); return PLUS; }
  426. <INITIAL>{MINUS} { count(); return MINUS; }
  427. <INITIAL>{IPV6ADDR} { count(); yylval.strval=yytext; return IPV6ADDR; }
  428. <INITIAL>{NUMBER} { count(); yylval.intval=atoi(yytext);return NUMBER; }
  429. <INITIAL>{HEXNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 16);
  430. return NUMBER; }
  431. <INITIAL>{OCTNUMBER} { count(); yylval.intval=(int)strtol(yytext, 0, 8);
  432. return NUMBER; }
  433. <INITIAL>{YES} { count(); yylval.intval=1; return NUMBER; }
  434. <INITIAL>{NO} { count(); yylval.intval=0; return NUMBER; }
  435. <INITIAL>{TCP} { count(); return TCP; }
  436. <INITIAL>{UDP} { count(); return UDP; }
  437. <INITIAL>{TLS} { count(); return TLS; }
  438. <INITIAL>{INET} { count(); yylval.intval=AF_INET; return NUMBER; }
  439. <INITIAL>{INET6} { count();
  440. #ifdef USE_IPV6
  441. yylval.intval=AF_INET6;
  442. #else
  443. yylval.intval=-1; /* no match*/
  444. #endif
  445. return NUMBER; }
  446. <INITIAL>{SSLv23} { count(); yylval.strval=yytext; return SSLv23; }
  447. <INITIAL>{SSLv2} { count(); yylval.strval=yytext; return SSLv2; }
  448. <INITIAL>{SSLv3} { count(); yylval.strval=yytext; return SSLv3; }
  449. <INITIAL>{TLSv1} { count(); yylval.strval=yytext; return TLSv1; }
  450. <INITIAL>{COMMA} { count(); return COMMA; }
  451. <INITIAL>{SEMICOLON} { count(); return SEMICOLON; }
  452. <INITIAL>{COLON} { count(); return COLON; }
  453. <INITIAL>{STAR} { count(); return STAR; }
  454. <INITIAL>{RPAREN} { count(); return RPAREN; }
  455. <INITIAL>{LPAREN} { count(); return LPAREN; }
  456. <INITIAL>{LBRACE} { count(); return LBRACE; }
  457. <INITIAL>{RBRACE} { count(); return RBRACE; }
  458. <INITIAL>{LBRACK} { count(); return LBRACK; }
  459. <INITIAL>{RBRACK} { count(); return RBRACK; }
  460. <INITIAL>{SLASH} { count(); return SLASH; }
  461. <INITIAL>{DOT} { count(); return DOT; }
  462. <INITIAL>\\{CR} {count(); } /* eat the escaped CR */
  463. <INITIAL>{CR} { count();/* return CR;*/ }
  464. <INITIAL>{QUOTES} { count(); state=STRING_S; BEGIN(STRING1); }
  465. <INITIAL>{TICK} { count(); state=STRING_S; BEGIN(STRING2); }
  466. <STRING1>{QUOTES} { count(); state=INITIAL_S; BEGIN(INITIAL);
  467. yytext[yyleng-1]=0; yyleng--;
  468. addstr(&s_buf, yytext, yyleng);
  469. yylval.strval=s_buf.s;
  470. memset(&s_buf, 0, sizeof(s_buf));
  471. return STRING;
  472. }
  473. <STRING2>{TICK} { count(); state=INITIAL_S; BEGIN(INITIAL);
  474. yytext[yyleng-1]=0; yyleng--;
  475. addstr(&s_buf, yytext, yyleng);
  476. yylval.strval=s_buf.s;
  477. memset(&s_buf, 0, sizeof(s_buf));
  478. return STRING;
  479. }
  480. <STRING2>.|{EAT_ABLE}|{CR} { yymore(); }
  481. <STRING1>\\n { count(); addchar(&s_buf, '\n'); }
  482. <STRING1>\\r { count(); addchar(&s_buf, '\r'); }
  483. <STRING1>\\a { count(); addchar(&s_buf, '\a'); }
  484. <STRING1>\\t { count(); addchar(&s_buf, '\t'); }
  485. <STRING1>\\{QUOTES} { count(); addchar(&s_buf, '"'); }
  486. <STRING1>\\\\ { count(); addchar(&s_buf, '\\'); }
  487. <STRING1>\\x{HEX}{1,2} { count(); addchar(&s_buf,
  488. (char)strtol(yytext+2, 0, 16)); }
  489. /* don't allow \[0-7]{1}, it will eat the backreferences from
  490. subst_uri if allowed (although everybody should use '' in subt_uri) */
  491. <STRING1>\\[0-7]{2,3} { count(); addchar(&s_buf,
  492. (char)strtol(yytext+1, 0, 8)); }
  493. <STRING1>\\{CR} { count(); } /* eat escaped CRs */
  494. <STRING1>.|{EAT_ABLE}|{CR} { addchar(&s_buf, *yytext); }
  495. <INITIAL,COMMENT>{COM_START} { count(); comment_nest++; state=COMMENT_S;
  496. BEGIN(COMMENT); }
  497. <COMMENT>{COM_END} { count(); comment_nest--;
  498. if (comment_nest==0){
  499. state=INITIAL_S;
  500. BEGIN(INITIAL);
  501. }
  502. }
  503. <COMMENT>.|{EAT_ABLE}|{CR} { count(); };
  504. <INITIAL>{COM_LINE}.*{CR} { count(); }
  505. <INITIAL>{ID} { count(); addstr(&s_buf, yytext, yyleng);
  506. yylval.strval=s_buf.s;
  507. memset(&s_buf, 0, sizeof(s_buf));
  508. return ID; }
  509. <<EOF>> {
  510. switch(state){
  511. case STRING_S:
  512. LOG(L_CRIT, "ERROR: cfg. parser: unexpected EOF in"
  513. " unclosed string\n");
  514. if (s_buf.s){
  515. pkg_free(s_buf.s);
  516. memset(&s_buf, 0,
  517. sizeof(s_buf));
  518. }
  519. break;
  520. case COMMENT_S:
  521. LOG(L_CRIT, "ERROR: cfg. parser: unexpected EOF:"
  522. " %d comments open\n", comment_nest);
  523. break;
  524. case COMMENT_LN_S:
  525. LOG(L_CRIT, "ERROR: unexpected EOF:"
  526. "comment line open\n");
  527. break;
  528. }
  529. return 0;
  530. }
  531. %%
  532. static char* addchar(struct str_buf* dst, char c)
  533. {
  534. return addstr(dst, &c, 1);
  535. }
  536. static char* addstr(struct str_buf* dst_b, char* src, int len)
  537. {
  538. char *tmp;
  539. unsigned size;
  540. unsigned used;
  541. if (dst_b->left<(len+1)){
  542. used=(unsigned)(dst_b->crt-dst_b->s);
  543. size=used+len+1;
  544. /* round up to next multiple */
  545. size+= STR_BUF_ALLOC_UNIT-size%STR_BUF_ALLOC_UNIT;
  546. tmp=pkg_malloc(size);
  547. if (tmp==0) goto error;
  548. if (dst_b->s){
  549. memcpy(tmp, dst_b->s, used);
  550. pkg_free(dst_b->s);
  551. }
  552. dst_b->s=tmp;
  553. dst_b->crt=dst_b->s+used;
  554. dst_b->left=size-used;
  555. }
  556. memcpy(dst_b->crt, src, len);
  557. dst_b->crt+=len;
  558. *(dst_b->crt)=0;
  559. dst_b->left-=len;
  560. return dst_b->s;
  561. error:
  562. LOG(L_CRIT, "ERROR:lex:addstr: memory allocation error\n");
  563. return 0;
  564. }
  565. static void count()
  566. {
  567. int i;
  568. startcolumn=column;
  569. for (i=0; i<yyleng;i++){
  570. if (yytext[i]=='\n'){
  571. line++;
  572. column=startcolumn=1;
  573. }else if (yytext[i]=='\t'){
  574. column++;
  575. /*column+=8 -(column%8);*/
  576. }else{
  577. column++;
  578. }
  579. }
  580. }