mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 11:09:04 -04:00
Allow checking of overlapped ports. A bit of sensible thought prevents this from being O(n^2)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5694 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
parent
c9029f8db2
commit
a9b538041a
@ -333,10 +333,22 @@ namespace irc
|
|||||||
/** Ending port in a range of ports
|
/** Ending port in a range of ports
|
||||||
*/
|
*/
|
||||||
long range_end;
|
long range_end;
|
||||||
|
/** Allow overlapped port ranges
|
||||||
|
*/
|
||||||
|
bool overlapped;
|
||||||
|
/** Used to determine overlapping of ports
|
||||||
|
* without O(n) algorithm being used
|
||||||
|
*/
|
||||||
|
std::map<long, bool> overlap_set;
|
||||||
|
/** Returns true if val overlaps an existing range
|
||||||
|
*/
|
||||||
|
bool Overlaps(long val);
|
||||||
public:
|
public:
|
||||||
/** Create a portparser and fill it with the provided data
|
/** Create a portparser and fill it with the provided data
|
||||||
|
* @param source The source text to parse from
|
||||||
|
* @param allow_overlapped Allow overlapped ranges
|
||||||
*/
|
*/
|
||||||
portparser(const std::string &source);
|
portparser(const std::string &source, bool allow_overlapped = true);
|
||||||
/** Frees the internal commasepstream object
|
/** Frees the internal commasepstream object
|
||||||
*/
|
*/
|
||||||
~portparser();
|
~portparser();
|
||||||
|
@ -386,9 +386,10 @@ std::string& irc::stringjoiner::GetJoined()
|
|||||||
return joined;
|
return joined;
|
||||||
}
|
}
|
||||||
|
|
||||||
irc::portparser::portparser(const std::string &source) : in_range(0), range_begin(0), range_end(0)
|
irc::portparser::portparser(const std::string &source, bool allow_overlapped) : in_range(0), range_begin(0), range_end(0), overlapped(allow_overlapped)
|
||||||
{
|
{
|
||||||
sep = new irc::commasepstream(source);
|
sep = new irc::commasepstream(source);
|
||||||
|
overlap_set.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
irc::portparser::~portparser()
|
irc::portparser::~portparser()
|
||||||
@ -396,13 +397,40 @@ irc::portparser::~portparser()
|
|||||||
delete sep;
|
delete sep;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool irc::portparser::Overlaps(long val)
|
||||||
|
{
|
||||||
|
if (!overlapped)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (overlap_set.find(val) == overlap_set.end())
|
||||||
|
{
|
||||||
|
overlap_set[val] = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
long irc::portparser::GetToken()
|
long irc::portparser::GetToken()
|
||||||
{
|
{
|
||||||
if (in_range > 0)
|
if (in_range > 0)
|
||||||
{
|
{
|
||||||
in_range++;
|
in_range++;
|
||||||
if (in_range <= range_end)
|
if (in_range <= range_end)
|
||||||
|
{
|
||||||
|
if (!Overlaps(in_range))
|
||||||
|
{
|
||||||
return in_range;
|
return in_range;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (((Overlaps(in_range)) && (in_range <= range_end)))
|
||||||
|
in_range++;
|
||||||
|
|
||||||
|
if (in_range <= range_end)
|
||||||
|
return in_range;
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
in_range = 0;
|
in_range = 0;
|
||||||
}
|
}
|
||||||
@ -412,6 +440,14 @@ long irc::portparser::GetToken()
|
|||||||
if (x == "")
|
if (x == "")
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
while (Overlaps(atoi(x.c_str())))
|
||||||
|
{
|
||||||
|
x = sep->GetToken();
|
||||||
|
|
||||||
|
if (x == "")
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
std::string::size_type dash = x.rfind('-');
|
std::string::size_type dash = x.rfind('-');
|
||||||
if (dash != std::string::npos)
|
if (dash != std::string::npos)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user