]> git.ipfire.org Git - thirdparty/squid.git/blob - src/acl/IntRange.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / acl / IntRange.cc
1 /*
2 * DEBUG: section 28 Access Control
3 * AUTHOR: Robert Collins
4 *
5 * SQUID Web Proxy Cache http://www.squid-cache.org/
6 * ----------------------------------------------------------
7 *
8 * Squid is the result of efforts by numerous individuals from
9 * the Internet community; see the CONTRIBUTORS file for full
10 * details. Many organizations have provided support for Squid's
11 * development; see the SPONSORS file for full details. Squid is
12 * Copyrighted (C) 2001 by the Regents of the University of
13 * California; see the COPYRIGHT file for full details. Squid
14 * incorporates software developed and/or copyrighted by other
15 * sources; see the CREDITS file for full details.
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation; either version 2 of the License, or
20 * (at your option) any later version.
21 *
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU General Public License for more details.
26 *
27 * You should have received a copy of the GNU General Public License
28 * along with this program; if not, write to the Free Software
29 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
30 *
31 *
32 * Copyright (c) 2003, Robert Collins <robertc@squid-cache.org>
33 */
34
35 #include "squid.h"
36 #include "acl/IntRange.h"
37 #include "cache_cf.h"
38 #include "Debug.h"
39 #include "Parsing.h"
40 #include "wordlist.h"
41
42 /* explicit instantiation required for some systems */
43 /** \cond AUTODOCS-IGNORE */
44 template cbdata_type CbDataList< Range<int> >::CBDATA_CbDataList;
45 /** \endcond */
46
47 void
48 ACLIntRange::parse()
49 {
50 char *a;
51
52 while ((a = strtokFile())) {
53 char *b = strchr(a, '-');
54 unsigned short port1, port2;
55
56 if (b) {
57 *b = '\0';
58 ++b;
59 }
60
61 port1 = xatos(a);
62
63 if (b)
64 port2 = xatos(b);
65 else
66 port2 = port1;
67
68 if (port2 >= port1) {
69 RangeType temp (0,0);
70 temp.start = port1;
71 temp.end = port2+1;
72 ranges.push_back(temp);
73 } else {
74 debugs(28, DBG_CRITICAL, "ACLIntRange::parse: Invalid port value");
75 self_destruct();
76 }
77 }
78 }
79
80 bool
81 ACLIntRange::empty() const
82 {
83 return ranges.empty();
84 }
85
86 bool
87 ACLIntRange::match(int i)
88 {
89 RangeType const toFind (i, i+1);
90 CbDataListIterator<RangeType> iter(ranges);
91
92 while (!iter.end()) {
93 const RangeType & element = iter.next();
94 RangeType result = element.intersection (toFind);
95
96 if (result.size())
97 return true;
98 }
99
100 return false;
101 }
102
103 ACLData<int> *
104 ACLIntRange::clone() const
105 {
106 if (!ranges.empty())
107 fatal("ACLIntRange::clone: attempt to clone used ACL");
108
109 return new ACLIntRange (*this);
110 }
111
112 ACLIntRange::~ACLIntRange ()
113 {}
114
115 wordlist *
116 ACLIntRange::dump ()
117 {
118 wordlist *W = NULL;
119 char buf[32];
120 CbDataListIterator<RangeType> iter(ranges);
121
122 while (!iter.end()) {
123 const RangeType & element = iter.next();
124
125 if (element.size() == 1)
126 snprintf(buf, sizeof(buf), "%d", element.start);
127 else
128 snprintf(buf, sizeof(buf), "%d-%d", element.start, element.end-1);
129
130 wordlistAdd(&W, buf);
131 }
132
133 return W;
134 }
135