config_scan.l
上传用户:zm130024
上传日期:2007-01-04
资源大小:432k
文件大小:8k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1997, 1998, 1999
  3.  *      Inferno Nettverk A/S, Norway.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. The above copyright notice, this list of conditions and the following
  9.  *    disclaimer must appear in all copies of the software, derivative works
  10.  *    or modified versions, and any portions thereof, aswell as in all
  11.  *    supporting documentation.
  12.  * 2. All advertising materials mentioning features or use of this software
  13.  *    must display the following acknowledgement:
  14.  *      This product includes software developed by
  15.  *      Inferno Nettverk A/S, Norway.
  16.  * 3. The name of the author may not be used to endorse or promote products
  17.  *    derived from this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  20.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  21.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  22.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  23.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  24.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  28.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29.  *
  30.  * Inferno Nettverk A/S requests users of this software to return to
  31.  *
  32.  *  Software Distribution Coordinator  or  sdc@inet.no
  33.  *  Inferno Nettverk A/S
  34.  *  Oslo Research Park
  35.  *  Gaustadal閑n 21
  36.  *  N-0349 Oslo
  37.  *  Norway
  38.  *
  39.  * any improvements or extensions that they make and grant Inferno Nettverk A/S
  40.  * the rights to redistribute these changes.
  41.  *
  42.  */
  43. %{
  44. #include "common.h"
  45. #include "yacconfig.h"
  46. #include "config_parse.h"
  47. extern int parseinit;
  48. extern const int configtype;
  49. static const char rcsid[] =
  50. "$Id: config_scan.l,v 1.51 1999/12/22 09:29:24 karls Exp $";
  51. %}
  52. %option yylineno
  53. %option noyywrap
  54. /*%option debug        */
  55. /* non-exclusive startconditions. */
  56. %s start_address
  57. %s start_port
  58. /* exclusive startconditions */
  59. %x lineprefix
  60. %x start_command
  61. %x start_compatibility
  62. %x start_line
  63. %x start_log
  64. %x start_logoutput
  65. %x start_option
  66. %x start_proxyprotocol
  67. %x start_username
  68. %x start_service
  69. %x start_srchost
  70. %x start_protocol
  71. %%
  72. /*
  73.  * we can operate in more than one mode, find out which it is and
  74.  * let the parser know.
  75.  */
  76. %{
  77. if (!parseinit) {
  78. parseinit = 1;
  79. switch (configtype) {
  80. case CONFIGTYPE_SERVER:
  81. return SERVERCONFIG;
  82. case CONFIGTYPE_CLIENT:
  83. return CLIENTCONFIG;
  84. default:
  85. SERRX(configtype);
  86. }
  87. }
  88. %}
  89. /* start-condition dependent stuff. */
  90. <start_proxyprotocol>socks_v4 {
  91. yylval.string = yytext;
  92. return PROXYPROTOCOL_SOCKS_V4;
  93. }
  94. <start_proxyprotocol>socks_v5 {
  95. yylval.string = yytext;
  96. return PROXYPROTOCOL_SOCKS_V5;
  97. }
  98. <start_proxyprotocol>msproxy_v2 {
  99. yylval.string = yytext;
  100. return PROXYPROTOCOL_MSPROXY_V2;
  101. }
  102. <start_command>bind {
  103. yylval.string = yytext;
  104. return COMMAND_BIND;
  105. }
  106. <start_command>connect {
  107. yylval.string = yytext;
  108. return COMMAND_CONNECT;
  109. }
  110. <start_command>udpassociate {
  111. yylval.string = yytext;
  112. return COMMAND_UDPASSOCIATE;
  113. }
  114. <start_command>bindreply {
  115. yylval.string = yytext;
  116. return COMMAND_BINDREPLY;
  117. }
  118. <start_command>udpreply {
  119. yylval.string = yytext;
  120. return COMMAND_UDPREPLY;
  121. }
  122. <start_address>direct {
  123. yylval.string = yytext;
  124. return DIRECT;
  125. }
  126. <start_port>port {
  127. BEGIN(start_service);
  128. yylval.string = yytext;
  129. return PORT;
  130. }
  131. /* compare */
  132. <start_service>eq|=|neq|!=|ge|>=|le|<=|gt|>|lt|< {
  133. yylval.string = yytext;
  134. return OPERATOR;
  135. }
  136. <start_log>connect {
  137. yylval.string = yytext;
  138. return LOG_CONNECT;
  139. }
  140. <start_log>data {
  141. yylval.string = yytext;
  142. return LOG_DATA;
  143. }
  144. <start_log>disconnect {
  145. yylval.string = yytext;
  146. return LOG_DISCONNECT;
  147. }
  148. <start_log>error {
  149. yylval.string = yytext;
  150. return LOG_ERROR;
  151. }
  152. <start_log>iooperation {
  153. yylval.string = yytext;
  154. return LOG_IOOPERATION;
  155. }
  156. <start_service>[a-zA-Z]+[^: /tn]* {
  157. BEGIN(INITIAL);
  158. yylval.string = yytext;
  159. return SERVICENAME;
  160. }
  161. <start_service>[0-9]{1,5} {
  162. BEGIN(INITIAL);
  163. yylval.string = yytext;
  164. return PORTNUMBER;
  165. }
  166. <start_address>[.a-zA-Z]+[^ tn]* {
  167. BEGIN(start_port);
  168. yylval.string = yytext;
  169. return DOMAIN;
  170. }
  171. <start_logoutput>[^: tn]+ {
  172. yylval.string = yytext;
  173. return LOGFILE;
  174. }
  175. <start_username>[^: tn]+ {
  176. yylval.string = yytext;
  177. return USERNAME;
  178. }
  179. <lineprefix>: {
  180. BEGIN(start_line);
  181. yylval.string = yytext;
  182. return *yytext;
  183. }
  184. <start_line>.* {
  185. BEGIN(INITIAL);
  186. yylval.string = yytext;
  187. return LINE;
  188. }
  189. <start_srchost>nomismatch {
  190. yylval.string = yytext;
  191. return NOMISMATCH;
  192. }
  193. <start_srchost>nounknown {
  194. yylval.string = yytext;
  195. return NOUNKNOWN;
  196. }
  197. <start_protocol>tcp {
  198. yylval.string = yytext;
  199. return PROTOCOL_TCP;
  200. }
  201. <start_protocol>udp {
  202. yylval.string = yytext;
  203. return PROTOCOL_UDP;
  204. }
  205. <start_protocol>fake {
  206. yylval.string = yytext;
  207. return PROTOCOL_FAKE;
  208. }
  209. /* non-startcondition dependents. */
  210. debug {
  211. yylval.string = yytext;
  212. return DEBUGING;
  213. }
  214. route {
  215. yylval.string = yytext;
  216. return ROUTE;
  217. }
  218. resolveprotocol {
  219. BEGIN(start_protocol);
  220. yylval.string = yytext;
  221. return RESOLVEPROTOCOL;
  222. }
  223. srchost {
  224. BEGIN(start_srchost);
  225. yylval.string = yytext;
  226. return SRCHOST;
  227. }
  228. proxyprotocol {
  229. BEGIN(start_proxyprotocol);
  230. yylval.string = yytext;
  231. return PROXYPROTOCOL;
  232. }
  233. logoutput {
  234. BEGIN(start_logoutput);
  235. yylval.string = yytext;
  236. return LOGOUTPUT;
  237. }
  238. protocol {
  239. BEGIN(start_protocol);
  240. yylval.string = yytext;
  241. return PROTOCOL;
  242. }
  243. command {
  244. BEGIN(start_command);
  245. yylval.string = yytext;
  246. return COMMAND;
  247. }
  248. from {
  249. BEGIN(start_address);
  250. yylval.string = yytext;
  251. return FROM;
  252. }
  253. to {
  254. BEGIN(start_address);
  255. yylval.string = yytext;
  256. return TO;
  257. }
  258. via {
  259. BEGIN(start_address);
  260. yylval.string = yytext;
  261. return VIA;
  262. }
  263. /* server configstuff */
  264. internal {
  265. BEGIN(start_address);
  266. yylval.string = yytext;
  267. return INTERNAL;
  268. }
  269. external {
  270. BEGIN(start_address);
  271. yylval.string = yytext;
  272. return EXTERNAL;
  273. }
  274. user {
  275. BEGIN(start_username);
  276. return USER;
  277. }
  278. user.privileged {
  279. BEGIN(start_username);
  280. yylval.string = yytext;
  281. return USER_PRIVILEGED;
  282. }
  283. user.notprivileged {
  284. BEGIN(start_username);
  285. yylval.string = yytext;
  286. return USER_UNPRIVILEGED;
  287. }
  288. user.libwrap {
  289. BEGIN(start_username);
  290. yylval.string = yytext;
  291. return USER_LIBWRAP;
  292. }
  293. iotimeout {
  294. yylval.string = yytext;
  295. return IOTIMEOUT;
  296. }
  297. compatibility {
  298. yylval.string = yytext;
  299. return COMPATIBILITY;
  300. }
  301. reuseaddr {
  302. yylval.string = yytext;
  303. return REUSEADDR;
  304. }
  305. sameport {
  306. yylval.string = yytext;
  307. return SAMEPORT;
  308. }
  309. connecttimeout {
  310. yylval.string = yytext;
  311. return CONNECTTIMEOUT;
  312. }
  313. extension {
  314. yylval.string = yytext;
  315. return EXTENSION;
  316. }
  317. bind {
  318. yylval.string = yytext;
  319. return BIND;
  320. }
  321. client {
  322. yylval.string = yytext;
  323. return CLIENTRULE;
  324. }
  325. method {
  326. yylval.string = yytext;
  327. return METHOD;
  328. }
  329. none {
  330. yylval.string = yytext;
  331. return NONE;
  332. }
  333. gssapi {
  334. yylval.string = yytext;
  335. return GSSAPI;
  336. }
  337. username {
  338. yylval.string = yytext;
  339. return UNAME;
  340. }
  341. rfc931 {
  342. yylval.string = yytext;
  343. return RFC931;
  344. }
  345. /* filterrules */
  346. /*
  347.  * verdicts
  348.  */
  349. block {
  350. yylval.string = yytext;
  351. return VERDICT_BLOCK;
  352. }
  353. pass {
  354. yylval.string = yytext;
  355. return VERDICT_PASS;
  356. }
  357. /*
  358.  * logging
  359.  */
  360. log {
  361. BEGIN(start_log);
  362. yylval.string = yytext;
  363. return LOG;
  364. }
  365. libwrap {
  366. BEGIN(lineprefix);
  367. yylval.string = yytext;
  368. return LIBWRAPSTART;
  369. }
  370.  /*
  371.   * Old keywords that are no longer used.
  372.   */
  373. localdomain.*:.* {
  374. yylval.string = yytext;
  375. return DEPRECATED;
  376. }
  377. /* misc generic stuff. */
  378. <*>[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} {
  379. BEGIN(start_port);
  380. yylval.string = yytext;
  381. return IPADDRESS;
  382. }
  383. <*>[0-9]+ {
  384. yylval.string = yytext;
  385. return NUMBER;
  386. }
  387. /* ignored */
  388. <*>[[:blank:]]+ {
  389. ;
  390. }
  391. /* shell style comment */
  392. <*>[[:blank:]]*#.* {
  393. ;
  394. }
  395. /* state always ends at eol. */
  396. <*>n {
  397. BEGIN(INITIAL);
  398. }
  399. /* unless it's escaped. */
  400. <*>\n {
  401. ;
  402. }
  403. <*>. {
  404. return *yytext;
  405. }