1%{
2//
3// This file is part of the aMule Project.
4//
5// Copyright (c) 2009-2011 aMule Team ( admin@amule.org / http://www.amule.org )
6// Copyright (c) 2009-2011 Stu Redman ( sturedman@amule.org )
7//
8// Any parts of this program derived from the xMule, lMule or eMule project,
9// or contributed by third-party developers are copyrighted by their
10// respective authors.
11//
12// This program is free software; you can redistribute it and/or modify
13// it under the terms of the GNU General Public License as published by
14// the Free Software Foundation; either version 2 of the License, or
15// (at your option) any later version.
16//
17// This program is distributed in the hope that it will be useful,
18// but WITHOUT ANY WARRANTY; without even the implied warranty of
19// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20// GNU General Public License for more details.
21//
22// You should have received a copy of the GNU General Public License
23// along with this program; if not, write to the Free Software
24// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
25//
26
27//
28// Read IP filters
29//
30// These have a silly "grammar". For example:
31// 1.2.3.4-1.2.3.5,100,Duh:2.3.4.5-2.3.4.6
32// Now - which format is it, and what range should it take?
33//
34// So just use the lexer to read the file and assure the line format.
35// The actual IP reading is done with the ScanIP() function.
36//
37
38#include <stdio.h>
39#include "Types.h"
40#include "Logger.h"
41#define IPFS_EXTERN
42#include "IPFilterScanner.h"
43#include <common/Format.h>
44#include <common/StringFunctions.h>
45
46#ifdef _MSC_VER
47#define isatty(DUMMY) 0
48#define YY_NO_UNISTD_H
49#pragma warning(disable:4003)
50#endif
51
52#define YY_NEVER_INTERACTIVE 1
53
54// When we get here the IP has been lexed nicely,
55// so we can blaze through without any checks.
56// The total lexing time is more than twice as fast
57// with this than when using sscanf.
58static bool ScanIP(const char * buf, uint32 & ip)
59{
60	while (*buf < '0') {
61		buf++;	// skip whitespace
62	}
63	ip = 0;
64	int a = 0;
65	for (int i = 0; i < 4; buf++) {
66		if (*buf < '0' || *buf > '9') {
67			// finished a number, check it and add to the ip
68			if (a > 255) {
69				return false;
70			}
71			ip = (ip << 8) | a;
72			a = 0;
73			i++;
74		} else {
75			// build number
76			a = a * 10 + *buf - '0';
77		}
78	}
79	return true;
80}
81
82static bool ScanInt(const char * buf, uint32 & a)
83{
84	while (*buf < '0') {
85		buf++;	// skip whitespace
86	}
87	a = 0;
88	while (*buf >= '0' && *buf <= '9') {
89		a = a * 10 + *buf - '0';
90		if (a > 255) {
91			return false;
92		}
93		buf++;
94	}
95	return true;
96}
97
98%}
99
100%option noyywrap
101
102NO		[0-9]{1,3}
103IP		{NO}"."{NO}"."{NO}"."{NO}
104WS		[ \t\r]*
105
106%%
107
108^{WS}{IP}{WS}-{WS}{IP}{WS},{WS}{NO}{WS},.*		{
109		/* PeerGuardian filter line
110		   <IPStart> - <IPEnd> , <AccessLevel> , <Description>
111		*/
112		char * ip1 = yytext;
113		char * ip2 = strchr(ip1 + 7, '-') + 1;
114		char * acc = strchr(ip2 + 7, ',') + 1;
115		char * dsc = strchr(acc + 1, ',') + 1;
116		if (!ScanIP(ip1, IPStart) || !ScanIP(ip2, IPEnd)
117			|| !ScanInt(acc, IPLevel)) {
118			yyip_Bad++;
119		} else {
120			IPDescription = dsc;
121			return 1;
122		}
123	}
124
125^{WS}#.*	{
126		/* Comment */
127	}
128
129^.*:{WS}{IP}{WS}-{WS}{IP}{WS}		{
130		/* AntiP2P filter line
131		   <Description> : <IPStart> - <IPEnd>
132		*/
133		char * ip1 = strrchr(yytext, ':');
134		*ip1++ = 0;		// remove : and terminate comment
135		char * ip2 = strchr(ip1 + 7, '-') + 1;
136		if (!ScanIP(ip1, IPStart) || !ScanIP(ip2, IPEnd)) {
137			yyip_Bad++;
138		} else {
139			IPLevel = 0;
140			IPDescription = yytext;
141			return 1;
142		}
143	}
144
145{WS}"\n"	{
146		yyip_Line++;
147	}
148
149^.			{
150		/* Bad line */
151		yyip_Bad++;
152		AddDebugLogLineN(logIPFilter, CFormat(wxT("error in line %d: %s")) % yyip_Line % wxString(char2unicode(yytext)));
153	}
154
155%%
156