29 access->
order = order;
37 if(access->
deny != NULL) free(access->
deny);
43 struct in_addr legacy_mask;
46 #ifndef HAVE_INET_PTON
47 if(strchr(mask,
'.') && inet_aton(mask, &legacy_mask))
49 if(inet_pton(AF_INET, mask, &legacy_mask.s_addr) > 0)
53 int temp = ntohl(legacy_mask.s_addr);
56 while(netsize && temp%2==0)
63 netsize =
j_atoi(mask, defaultsize);
72 memset(dst, 0,
sizeof(
struct sockaddr_in));
73 dst->sin_family = AF_INET;
80 struct sockaddr_in *sin_1;
81 struct sockaddr_in *sin_2;
86 sin_1 = (
struct sockaddr_in *)ip_1;
87 sin_2 = (
struct sockaddr_in *)ip_2;
98 struct sockaddr_in *temp;
100 temp = (
struct sockaddr_in *)&t;
112 struct sockaddr_in *temp;
114 temp = (
struct sockaddr_in *)&t;
134 netmask = htonl(-1 << (32-netsize));
136 return ((sin_1->sin_addr.s_addr&netmask) == (sin_2->sin_addr.s_addr&netmask));
142 unsigned char bytemask;
147 for(i=0; i<netsize/8; i++)
154 bytemask = 0xff << (8 - netsize%8);
175 memcpy(&access->
allow[access->
nallow].
ip, &ip_addr,
sizeof(ip_addr));
195 memcpy(&access->
deny[access->
ndeny].
ip, &ip_addr,
sizeof(ip_addr));
207 int i, allow = 0, deny = 0;
213 for(i = 0; !allow && i < access->
nallow; i++)
215 rule = &access->
allow[i];
221 for(i = 0; !deny && i < access->
ndeny; i++)
223 rule = &access->
deny[i];
229 if(access->
order == 0)
uint8_t s6_addr[16]
IPv6 address.
struct sockaddr_storage ip
int access_deny(access_t access, const char *ip, const char *mask)
int j_inet_pton(const char *src, struct sockaddr_storage *dst)
set the address of a struct sockaddr_storage (modeled after the stdlib function inet_pton) ...
struct access_rule_st * access_rule_t
access_t access_new(int order)
sa_family_t ss_family
address family
static int _access_check_match(struct sockaddr_storage *ip_1, struct sockaddr_storage *ip_2, int netsize)
check if two ip addresses are within the same subnet
int j_atoi(const char *a, int def)
static int _access_calc_netsize(const char *mask, int defaultsize)
void access_free(access_t access)
#define IN6_IS_ADDR_V4MAPPED(a)
check if an IPv6 is just a mapped IPv4 address
static void _access_unmap_v4(struct sockaddr_in6 *src, struct sockaddr_in *dst)
convert a IPv6 mapped IPv4 address to a real IPv4 address
int access_allow(access_t access, const char *ip, const char *mask)
int access_check(access_t access, const char *ip)
structure that contains an IPv6 including some additional attributes (only defined if not contained i...
struct access_st * access_t
#define AF_INET6
address family for IPv6
struct in6_addr sin6_addr
IPv6 address.