mirror of
https://github.com/bol-van/zapret.git
synced 2025-02-18 19:12:20 +03:00
Compare commits
No commits in common. "1224206f400da2d34e813bbc113f929acd5e8aa9" and "20839d2fe3e2e5ba44d2a6f4fc11c163cd797312" have entirely different histories.
1224206f40
...
20839d2fe3
@ -10,7 +10,6 @@
|
|||||||
#include <ifaddrs.h>
|
#include <ifaddrs.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <netinet/in.h>
|
|
||||||
|
|
||||||
char *strncasestr(const char *s,const char *find, size_t slen)
|
char *strncasestr(const char *s,const char *find, size_t slen)
|
||||||
{
|
{
|
||||||
@ -133,7 +132,7 @@ void print_addrinfo(const struct addrinfo *ai)
|
|||||||
bool saismapped(const struct sockaddr_in6 *sa)
|
bool saismapped(const struct sockaddr_in6 *sa)
|
||||||
{
|
{
|
||||||
// ::ffff:1.2.3.4
|
// ::ffff:1.2.3.4
|
||||||
return IN6_IS_ADDR_V4MAPPED(sa->sin6_addr.s6_addr);
|
return !memcmp(sa->sin6_addr.s6_addr,"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff",12);
|
||||||
}
|
}
|
||||||
bool samappedcmp(const struct sockaddr_in *sa1,const struct sockaddr_in6 *sa2)
|
bool samappedcmp(const struct sockaddr_in *sa1,const struct sockaddr_in6 *sa2)
|
||||||
{
|
{
|
||||||
@ -155,7 +154,7 @@ bool saconvmapped(struct sockaddr_storage *a)
|
|||||||
{
|
{
|
||||||
if ((a->ss_family == AF_INET6) && saismapped((struct sockaddr_in6*)a))
|
if ((a->ss_family == AF_INET6) && saismapped((struct sockaddr_in6*)a))
|
||||||
{
|
{
|
||||||
uint32_t ip4 = IN6_EXTRACT_MAP4(((struct sockaddr_in6*)a)->sin6_addr.s6_addr);
|
uint32_t ip4 = *(uint32_t*)(((struct sockaddr_in6*)a)->sin6_addr.s6_addr+12);
|
||||||
uint16_t port = ((struct sockaddr_in6*)a)->sin6_port;
|
uint16_t port = ((struct sockaddr_in6*)a)->sin6_port;
|
||||||
a->ss_family = AF_INET;
|
a->ss_family = AF_INET;
|
||||||
((struct sockaddr_in*)a)->sin_addr.s_addr = ip4;
|
((struct sockaddr_in*)a)->sin_addr.s_addr = ip4;
|
||||||
@ -167,14 +166,14 @@ bool saconvmapped(struct sockaddr_storage *a)
|
|||||||
|
|
||||||
bool is_localnet(const struct sockaddr *a)
|
bool is_localnet(const struct sockaddr *a)
|
||||||
{
|
{
|
||||||
// 127.0.0.0/8, ::1 = localhost
|
// 0.0.0.0, ::ffff:0.0.0.0 = localhost in linux
|
||||||
return (a->sa_family==AF_INET && IN_LOOPBACK(((struct sockaddr_in *)a)->sin_addr.s_addr)) ||
|
return (a->sa_family==AF_INET && (*(char*)&((struct sockaddr_in *)a)->sin_addr.s_addr==127 || !((struct sockaddr_in *)a)->sin_addr.s_addr)) ||
|
||||||
(a->sa_family==AF_INET6 && IN6_IS_ADDR_LOOPBACK(((struct sockaddr_in6 *)a)->sin6_addr.s6_addr));
|
(a->sa_family==AF_INET6 && saismapped((struct sockaddr_in6 *)a) && (((struct sockaddr_in6 *)a)->sin6_addr.s6_addr[12]==127 || !*(uint32_t*)(((struct sockaddr_in6 *)a)->sin6_addr.s6_addr+12)));
|
||||||
}
|
}
|
||||||
bool is_linklocal(const struct sockaddr_in6 *a)
|
bool is_linklocal(const struct sockaddr_in6 *a)
|
||||||
{
|
{
|
||||||
// fe80::/10
|
// fe80::/10
|
||||||
return IN6_IS_ADDR_LINKLOCAL(a->sin6_addr.s6_addr);
|
return a->sin6_addr.s6_addr[0]==0xFE && (a->sin6_addr.s6_addr[1] & 0xC0)==0x80;
|
||||||
}
|
}
|
||||||
bool is_private6(const struct sockaddr_in6* a)
|
bool is_private6(const struct sockaddr_in6* a)
|
||||||
{
|
{
|
||||||
|
@ -55,16 +55,3 @@ typedef struct
|
|||||||
} port_filter;
|
} port_filter;
|
||||||
bool pf_in_range(uint16_t port, const port_filter *pf);
|
bool pf_in_range(uint16_t port, const port_filter *pf);
|
||||||
bool pf_parse(const char *s, port_filter *pf);
|
bool pf_parse(const char *s, port_filter *pf);
|
||||||
|
|
||||||
#ifndef IN_LOOPBACK
|
|
||||||
#define IN_LOOPBACK(a) ((((uint32_t) (a)) & 0xff000000) == 0x7f000000)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#define IN6_EXTRACT_MAP4(a) \
|
|
||||||
(__extension__ \
|
|
||||||
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
|
||||||
(((const uint32_t *) (__a))[3]); }))
|
|
||||||
#else
|
|
||||||
#define IN6_EXTRACT_MAP4(a) (((const uint32_t *) (a))[3])
|
|
||||||
#endif
|
|
||||||
|
Loading…
Reference in New Issue
Block a user