forked from lxyfirst/id_server
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathip_range_container.cpp
More file actions
executable file
·111 lines (84 loc) · 2.45 KB
/
Copy pathip_range_container.cpp
File metadata and controls
executable file
·111 lines (84 loc) · 2.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
* ip_range_container.cpp
* Author: lixingyi (lxyfirst@163.com)
*/
#include <stdlib.h>
#include "packet.h"
#include "ip_range_container.h"
namespace framework
{
ip_range_container::ip_range_container()
{
// TODO Auto-generated constructor stub
}
ip_range_container::~ip_range_container()
{
// TODO Auto-generated destructor stub
}
bool ip_range_container::add_ip_mask(const char* str_ip,const char* str_mask)
{
in_addr_t ip = inet_addr(str_ip) ;
in_addr_t mask = inet_addr(str_mask) ;
return add_ip_mask(ip,mask) ;
}
bool ip_range_container::add_ip_mask(in_addr_t ip,in_addr_t mask)
{
ip = ip & mask ;
return add_ip_range(ip,ip | (~mask) ) ;
}
bool ip_range_container::add_ip_range(const char* str_begin_ip,const char* str_end_ip)
{
in_addr_t begin_ip = inet_addr(str_begin_ip) ;
in_addr_t end_ip = inet_addr(str_end_ip) ;
return add_ip_range(begin_ip,end_ip) ;
}
bool ip_range_container::add_ip_range(in_addr_t begin_ip,in_addr_t end_ip)
{
if(begin_ip == INADDR_NONE || end_ip == INADDR_NONE)
{
return false ;
}
begin_ip = ntoh_int32(begin_ip) ;
end_ip = ntoh_int32(end_ip) ;
if(begin_ip > end_ip)
{
return false ;
}
ip_range_t ip_range = { begin_ip , end_ip } ;
if(inner_match(&ip_range))
{
return false ;
}
m_ip_list.push_back(ip_range) ;
resort() ;
return true ;
}
bool ip_range_container::match(const char* str_ip) const
{
in_addr_t ip = inet_addr(str_ip) ;
return match(ip) ;
}
bool ip_range_container::match(in_addr_t ip) const
{
ip = ntoh_int32(ip) ;
ip_range_t obj = { ip,ip } ;
return inner_match(&obj) ;
}
static int cmp_ip_range(const void* a,const void* b)
{
const ip_range_container::ip_range_t* ip_a = (const ip_range_container::ip_range_t*)a ;
const ip_range_container::ip_range_t* ip_b = (const ip_range_container::ip_range_t*)b ;
if ( ip_a->begin_ip > ip_b->end_ip) return 1 ;
if ( ip_a->end_ip < ip_b->begin_ip) return -1 ;
return 0 ;
}
bool ip_range_container::inner_match(const ip_range_t* obj) const
{
void* result=bsearch(obj,m_ip_list.data(),m_ip_list.size(),sizeof(ip_range_t),cmp_ip_range) ;
return result !=NULL ;
}
void ip_range_container::resort()
{
qsort(m_ip_list.data(),m_ip_list.size(),sizeof(ip_range_t),cmp_ip_range) ;
}
} /* namespace framework */