fix memory leak
This commit is contained in:
47
dns.c
47
dns.c
@@ -422,11 +422,16 @@ int dns_add_SOA(struct dns_packet *packet, dns_rr_type type, char *domain, int t
|
|||||||
ptr += strnlen(soa->mname, DNS_MAX_CNAME_LEN - 1) + 1;
|
ptr += strnlen(soa->mname, DNS_MAX_CNAME_LEN - 1) + 1;
|
||||||
strncpy((char *)ptr, soa->rname, DNS_MAX_CNAME_LEN - 1);
|
strncpy((char *)ptr, soa->rname, DNS_MAX_CNAME_LEN - 1);
|
||||||
ptr += strnlen(soa->rname, DNS_MAX_CNAME_LEN - 1) + 1;
|
ptr += strnlen(soa->rname, DNS_MAX_CNAME_LEN - 1) + 1;
|
||||||
dns_write_int(&ptr, soa->serial);
|
*((unsigned int *)ptr) = soa->serial;
|
||||||
dns_write_int(&ptr, soa->refresh);
|
ptr += 4;
|
||||||
dns_write_int(&ptr, soa->retry);
|
*((unsigned int *)ptr) = soa->refresh;
|
||||||
dns_write_int(&ptr, soa->expire);
|
ptr += 4;
|
||||||
dns_write_int(&ptr, soa->minimum);
|
*((unsigned int *)ptr) = soa->retry;
|
||||||
|
ptr += 4;
|
||||||
|
*((unsigned int *)ptr) = soa->expire;
|
||||||
|
ptr += 4;
|
||||||
|
*((unsigned int *)ptr) = soa->minimum;
|
||||||
|
ptr += 4;
|
||||||
len = ptr - data;
|
len = ptr - data;
|
||||||
|
|
||||||
return dns_add_RAW(packet, type, DNS_T_SOA, domain, ttl, data, len);
|
return dns_add_RAW(packet, type, DNS_T_SOA, domain, ttl, data, len);
|
||||||
@@ -452,11 +457,16 @@ int dns_get_SOA(struct dns_rrs *rrs, char *domain, int maxsize, int *ttl, struct
|
|||||||
if (ptr - data + 20 > len) {
|
if (ptr - data + 20 > len) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
soa->serial = dns_read_int(&ptr);
|
soa->serial = *((unsigned int *)ptr);
|
||||||
soa->refresh = dns_read_int(&ptr);
|
ptr += 4;
|
||||||
soa->retry = dns_read_int(&ptr);
|
soa->refresh = *((unsigned int *)ptr);
|
||||||
soa->expire = dns_read_int(&ptr);
|
ptr += 4;
|
||||||
soa->minimum = dns_read_int(&ptr);
|
soa->retry = *((unsigned int *)ptr);
|
||||||
|
ptr += 4;
|
||||||
|
soa->expire = *((unsigned int *)ptr);
|
||||||
|
ptr += 4;
|
||||||
|
soa->minimum = *((unsigned int *)ptr);
|
||||||
|
ptr += 4;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -580,7 +590,7 @@ static int _dns_decode_domain(struct dns_context *context, char *output, int siz
|
|||||||
}
|
}
|
||||||
len = *ptr;
|
len = *ptr;
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
*(output - 1) = 0;
|
*output = 0;
|
||||||
ptr++;
|
ptr++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -599,6 +609,11 @@ static int _dns_decode_domain(struct dns_context *context, char *output, int siz
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (output_len > 0) {
|
||||||
|
*output = '.';
|
||||||
|
output++;
|
||||||
|
}
|
||||||
|
|
||||||
if (context->maxsize - (ptr - context->data) < 0) {
|
if (context->maxsize - (ptr - context->data) < 0) {
|
||||||
tlog(TLOG_ERROR, "length is not enouth %d:%d, %p, %p", context->maxsize, ptr - context->data, context->ptr, context->data);
|
tlog(TLOG_ERROR, "length is not enouth %d:%d, %p, %p", context->maxsize, ptr - context->data, context->ptr, context->data);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -617,8 +632,6 @@ static int _dns_decode_domain(struct dns_context *context, char *output, int siz
|
|||||||
ptr += len;
|
ptr += len;
|
||||||
output += len;
|
output += len;
|
||||||
output_len += len;
|
output_len += len;
|
||||||
*output = '.';
|
|
||||||
output++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_compressed == 0) {
|
if (is_compressed == 0) {
|
||||||
@@ -631,6 +644,7 @@ static int _dns_decode_domain(struct dns_context *context, char *output, int siz
|
|||||||
static int _dns_encode_domain(struct dns_context *context, char *domain)
|
static int _dns_encode_domain(struct dns_context *context, char *domain)
|
||||||
{
|
{
|
||||||
int num = 0;
|
int num = 0;
|
||||||
|
int total_len = 0;
|
||||||
unsigned char *ptr_num = context->ptr++;
|
unsigned char *ptr_num = context->ptr++;
|
||||||
|
|
||||||
while (_dns_left_len(context) > 1 && *domain != 0) {
|
while (_dns_left_len(context) > 1 && *domain != 0) {
|
||||||
@@ -646,11 +660,14 @@ static int _dns_encode_domain(struct dns_context *context, char *domain)
|
|||||||
num++;
|
num++;
|
||||||
context->ptr++;
|
context->ptr++;
|
||||||
domain++;
|
domain++;
|
||||||
|
total_len++;
|
||||||
}
|
}
|
||||||
|
|
||||||
*ptr_num = num;
|
*ptr_num = num;
|
||||||
*(context->ptr) = 0;
|
if (total_len > 0) {
|
||||||
context->ptr++;
|
*(context->ptr) = 0;
|
||||||
|
context->ptr++;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
1174
dns_client.c
1174
dns_client.c
File diff suppressed because it is too large
Load Diff
83
dns_server.c
83
dns_server.c
@@ -72,6 +72,8 @@ struct dns_ip_address {
|
|||||||
struct dns_request {
|
struct dns_request {
|
||||||
atomic_t refcnt;
|
atomic_t refcnt;
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
|
struct list_head check_list;
|
||||||
|
|
||||||
char domain[DNS_MAX_CNAME_LEN];
|
char domain[DNS_MAX_CNAME_LEN];
|
||||||
struct dns_head head;
|
struct dns_head head;
|
||||||
unsigned long send_tick;
|
unsigned long send_tick;
|
||||||
@@ -268,7 +270,7 @@ int _dns_server_request_complete(struct dns_request *request)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _dns_server_request_release_lock(struct dns_request *request, int locked)
|
void _dns_server_request_release(struct dns_request *request)
|
||||||
{
|
{
|
||||||
struct dns_ip_address *addr_map;
|
struct dns_ip_address *addr_map;
|
||||||
struct hlist_node *tmp;
|
struct hlist_node *tmp;
|
||||||
@@ -283,13 +285,9 @@ void _dns_server_request_release_lock(struct dns_request *request, int locked)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (locked == 0) {
|
pthread_mutex_lock(&server.request_list_lock);
|
||||||
pthread_mutex_lock(&server.request_list_lock);
|
list_del(&request->list);
|
||||||
list_del(&request->list);
|
pthread_mutex_unlock(&server.request_list_lock);
|
||||||
pthread_mutex_unlock(&server.request_list_lock);
|
|
||||||
} else {
|
|
||||||
list_del(&request->list);
|
|
||||||
}
|
|
||||||
|
|
||||||
_dns_server_request_complete(request);
|
_dns_server_request_complete(request);
|
||||||
hash_for_each_safe(request->ip_map, bucket, tmp, addr_map, node)
|
hash_for_each_safe(request->ip_map, bucket, tmp, addr_map, node)
|
||||||
@@ -302,11 +300,6 @@ void _dns_server_request_release_lock(struct dns_request *request, int locked)
|
|||||||
free(request);
|
free(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _dns_server_request_release(struct dns_request *request)
|
|
||||||
{
|
|
||||||
_dns_server_request_release_lock(request, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _dns_server_request_get(struct dns_request *request)
|
void _dns_server_request_get(struct dns_request *request)
|
||||||
{
|
{
|
||||||
atomic_inc(&request->refcnt);
|
atomic_inc(&request->refcnt);
|
||||||
@@ -451,11 +444,19 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain,
|
|||||||
_dns_server_request_get(request);
|
_dns_server_request_get(request);
|
||||||
dns_get_A(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
|
dns_get_A(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
|
||||||
|
|
||||||
if (addr[0] == 127) {
|
tlog(TLOG_DEBUG, "domain: %s TTL:%d IP: %d.%d.%d.%d", name, ttl, addr[0], addr[1], addr[2], addr[3]);
|
||||||
|
|
||||||
|
if (strncmp(name, domain, DNS_MAX_CNAME_LEN) != 0 && strncmp(request->alias, name, DNS_MAX_CNAME_LEN) != 0) {
|
||||||
_dns_server_request_release(request);
|
_dns_server_request_release(request);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (addr[0] == 0) {
|
||||||
|
_dns_server_request_release(request);
|
||||||
|
tlog(TLOG_ERROR, "Ad blocker, domain: %s", domain);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (request->has_ipv4 == 0) {
|
if (request->has_ipv4 == 0) {
|
||||||
memcpy(request->ipv4_addr, addr, DNS_RR_A_LEN);
|
memcpy(request->ipv4_addr, addr, DNS_RR_A_LEN);
|
||||||
request->has_ipv4 = 1;
|
request->has_ipv4 = 1;
|
||||||
@@ -464,13 +465,10 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain,
|
|||||||
_dns_server_request_release(request);
|
_dns_server_request_release(request);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tlog(TLOG_DEBUG, "domain: %s TTL:%d IP: %d.%d.%d.%d", name, ttl, addr[0], addr[1], addr[2], addr[3]);
|
|
||||||
sprintf(ip, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
|
sprintf(ip, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
|
||||||
|
|
||||||
if (strncmp(name, domain, DNS_MAX_CNAME_LEN) == 0 || strncmp(request->alias, name, DNS_MAX_CNAME_LEN) == 0) {
|
if (fast_ping_start(ip, 1, 0, 1000, _dns_server_ping_result, request) == NULL) {
|
||||||
if (fast_ping_start(ip, 1, 0, 1000, _dns_server_ping_result, request) == NULL) {
|
_dns_server_request_release(request);
|
||||||
_dns_server_request_release(request);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case DNS_T_AAAA: {
|
case DNS_T_AAAA: {
|
||||||
@@ -478,6 +476,13 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain,
|
|||||||
_dns_server_request_get(request);
|
_dns_server_request_get(request);
|
||||||
dns_get_AAAA(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
|
dns_get_AAAA(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
|
||||||
|
|
||||||
|
tlog(TLOG_DEBUG, "domain: %s TTL: %d IP: %.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", name, ttl, addr[0], addr[1],
|
||||||
|
addr[2], addr[3], addr[4], addr[5], addr[6], addr[7], addr[8], addr[9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15]);
|
||||||
|
if (strncmp(name, domain, DNS_MAX_CNAME_LEN) != 0 && strncmp(request->alias, name, DNS_MAX_CNAME_LEN) != 0) {
|
||||||
|
_dns_server_request_release(request);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (request->has_ipv6 == 0) {
|
if (request->has_ipv6 == 0) {
|
||||||
memcpy(request->ipv6_addr, addr, DNS_RR_AAAA_LEN);
|
memcpy(request->ipv6_addr, addr, DNS_RR_AAAA_LEN);
|
||||||
request->has_ipv6 = 1;
|
request->has_ipv6 = 1;
|
||||||
@@ -488,9 +493,6 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
tlog(TLOG_DEBUG, "domain: %s TTL: %d IP: %.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", name, ttl, addr[0], addr[1],
|
|
||||||
addr[2], addr[3], addr[4], addr[5], addr[6], addr[7], addr[8], addr[9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15]);
|
|
||||||
|
|
||||||
sprintf(name, "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5],
|
sprintf(name, "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5],
|
||||||
addr[6], addr[7], addr[8], addr[9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15]);
|
addr[6], addr[7], addr[8], addr[9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15]);
|
||||||
|
|
||||||
@@ -756,7 +758,7 @@ void _dns_server_tcp_ping_check(struct dns_request *request)
|
|||||||
_dns_server_request_get(request);
|
_dns_server_request_get(request);
|
||||||
sprintf(ip, "%d.%d.%d.%d:80", addr_map->ipv4_addr[0], addr_map->ipv4_addr[1], addr_map->ipv4_addr[2], addr_map->ipv4_addr[3]);
|
sprintf(ip, "%d.%d.%d.%d:80", addr_map->ipv4_addr[0], addr_map->ipv4_addr[1], addr_map->ipv4_addr[2], addr_map->ipv4_addr[3]);
|
||||||
if (fast_ping_start(ip, 1, 0, 1000, _dns_server_ping_result, request) == NULL) {
|
if (fast_ping_start(ip, 1, 0, 1000, _dns_server_ping_result, request) == NULL) {
|
||||||
_dns_server_request_release_lock(request, 1);
|
_dns_server_request_release(request);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case DNS_T_AAAA: {
|
case DNS_T_AAAA: {
|
||||||
@@ -767,7 +769,7 @@ void _dns_server_tcp_ping_check(struct dns_request *request)
|
|||||||
addr_map->ipv6_addr[12], addr_map->ipv6_addr[13], addr_map->ipv6_addr[14], addr_map->ipv6_addr[15]);
|
addr_map->ipv6_addr[12], addr_map->ipv6_addr[13], addr_map->ipv6_addr[14], addr_map->ipv6_addr[15]);
|
||||||
|
|
||||||
if (fast_ping_start(name, 1, 0, 1000, _dns_server_ping_result, request) == NULL) {
|
if (fast_ping_start(name, 1, 0, 1000, _dns_server_ping_result, request) == NULL) {
|
||||||
_dns_server_request_release_lock(request, 1);
|
_dns_server_request_release(request);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
default:
|
default:
|
||||||
@@ -782,16 +784,26 @@ void _dns_server_tcp_ping_check(struct dns_request *request)
|
|||||||
void _dns_server_period_run()
|
void _dns_server_period_run()
|
||||||
{
|
{
|
||||||
struct dns_request *request, *tmp;
|
struct dns_request *request, *tmp;
|
||||||
|
LIST_HEAD(check_list);
|
||||||
|
|
||||||
unsigned long now = get_tick_count();
|
unsigned long now = get_tick_count();
|
||||||
|
|
||||||
pthread_mutex_lock(&server.request_list_lock);
|
pthread_mutex_lock(&server.request_list_lock);
|
||||||
list_for_each_entry_safe(request, tmp, &server.request_list, list)
|
list_for_each_entry_safe(request, tmp, &server.request_list, list)
|
||||||
{
|
{
|
||||||
if (request->send_tick < now - 500 && request->has_ping_tcp == 0) {
|
if (request->send_tick < now - 500 && request->has_ping_tcp == 0) {
|
||||||
_dns_server_tcp_ping_check(request);
|
_dns_server_request_get(request);
|
||||||
|
list_add_tail(&request->check_list, &check_list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&server.request_list_lock);
|
pthread_mutex_unlock(&server.request_list_lock);
|
||||||
|
|
||||||
|
list_for_each_entry_safe(request, tmp, &check_list, check_list)
|
||||||
|
{
|
||||||
|
_dns_server_tcp_ping_check(request);
|
||||||
|
list_del_init(&request->check_list);
|
||||||
|
_dns_server_request_release(request);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int dns_server_run(void)
|
int dns_server_run(void)
|
||||||
@@ -872,6 +884,7 @@ errout:
|
|||||||
int dns_server_start(void)
|
int dns_server_start(void)
|
||||||
{
|
{
|
||||||
struct epoll_event event;
|
struct epoll_event event;
|
||||||
|
memset(&event, 0, sizeof(event));
|
||||||
event.events = EPOLLIN;
|
event.events = EPOLLIN;
|
||||||
event.data.fd = server.fd;
|
event.data.fd = server.fd;
|
||||||
if (epoll_ctl(server.epoll_fd, EPOLL_CTL_ADD, server.fd, &event) != 0) {
|
if (epoll_ctl(server.epoll_fd, EPOLL_CTL_ADD, server.fd, &event) != 0) {
|
||||||
@@ -985,8 +998,16 @@ errout:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dns_server_stop(void)
|
||||||
|
{
|
||||||
|
server.run = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void dns_server_exit(void)
|
void dns_server_exit(void)
|
||||||
{
|
{
|
||||||
|
struct dns_request *request, *tmp;
|
||||||
|
LIST_HEAD(remove_list);
|
||||||
|
|
||||||
server.run = 0;
|
server.run = 0;
|
||||||
|
|
||||||
if (server.fd > 0) {
|
if (server.fd > 0) {
|
||||||
@@ -994,5 +1015,17 @@ void dns_server_exit(void)
|
|||||||
server.fd = -1;
|
server.fd = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pthread_mutex_lock(&server.request_list_lock);
|
||||||
|
list_for_each_entry_safe(request, tmp, &server.request_list, list)
|
||||||
|
{
|
||||||
|
list_add_tail(&request->check_list, &remove_list);
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&server.request_list_lock);
|
||||||
|
|
||||||
|
list_for_each_entry_safe(request, tmp, &remove_list, check_list)
|
||||||
|
{
|
||||||
|
_dns_server_request_release(request);
|
||||||
|
}
|
||||||
|
|
||||||
pthread_mutex_destroy(&server.request_list_lock);
|
pthread_mutex_destroy(&server.request_list_lock);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ int dns_server_init(void);
|
|||||||
|
|
||||||
int dns_server_run(void);
|
int dns_server_run(void);
|
||||||
|
|
||||||
|
void dns_server_stop(void);
|
||||||
|
|
||||||
void dns_server_exit(void);
|
void dns_server_exit(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
62
fast_ping.c
62
fast_ping.c
@@ -61,7 +61,6 @@ struct fast_ping_packet {
|
|||||||
struct ping_host_struct {
|
struct ping_host_struct {
|
||||||
atomic_t ref;
|
atomic_t ref;
|
||||||
atomic_t notified;
|
atomic_t notified;
|
||||||
struct hlist_node host_node;
|
|
||||||
struct hlist_node addr_node;
|
struct hlist_node addr_node;
|
||||||
struct list_head action_list;
|
struct list_head action_list;
|
||||||
FAST_PING_TYPE type;
|
FAST_PING_TYPE type;
|
||||||
@@ -102,7 +101,6 @@ struct fast_ping_struct {
|
|||||||
struct ping_host_struct icmp6_host;
|
struct ping_host_struct icmp6_host;
|
||||||
|
|
||||||
pthread_mutex_t map_lock;
|
pthread_mutex_t map_lock;
|
||||||
DECLARE_HASHTABLE(hostmap, 6);
|
|
||||||
DECLARE_HASHTABLE(addrmap, 6);
|
DECLARE_HASHTABLE(addrmap, 6);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -243,7 +241,6 @@ static void _fast_ping_host_put(struct ping_host_struct *ping_host)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&ping.map_lock);
|
pthread_mutex_lock(&ping.map_lock);
|
||||||
hash_del(&ping_host->host_node);
|
|
||||||
hash_del(&ping_host->addr_node);
|
hash_del(&ping_host->addr_node);
|
||||||
pthread_mutex_unlock(&ping.map_lock);
|
pthread_mutex_unlock(&ping.map_lock);
|
||||||
|
|
||||||
@@ -261,6 +258,7 @@ static void _fast_ping_host_put(struct ping_host_struct *ping_host)
|
|||||||
|
|
||||||
tlog(TLOG_DEBUG, "ping %p end", ping_host);
|
tlog(TLOG_DEBUG, "ping %p end", ping_host);
|
||||||
|
|
||||||
|
memset(ping_host, 0, sizeof(*ping_host));
|
||||||
free(ping_host);
|
free(ping_host);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,6 +274,7 @@ static void _fast_ping_host_remove(struct ping_host_struct *ping_host)
|
|||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
ping_host->ping_callback(ping_host, ping_host->host, PING_RESULT_END, &ping_host->addr, ping_host->addr_len, ping_host->seq, &tv, ping_host->userptr);
|
ping_host->ping_callback(ping_host, ping_host->host, PING_RESULT_END, &ping_host->addr, ping_host->addr_len, ping_host->seq, &tv, ping_host->userptr);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return _fast_ping_host_put(ping_host);
|
return _fast_ping_host_put(ping_host);
|
||||||
@@ -380,6 +379,7 @@ static int _fast_ping_sendping_tcp(struct ping_host_struct *ping_host)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset(&event, 0, sizeof(event));
|
||||||
event.events = EPOLLIN | EPOLLOUT;
|
event.events = EPOLLIN | EPOLLOUT;
|
||||||
event.data.ptr = ping_host;
|
event.data.ptr = ping_host;
|
||||||
if (epoll_ctl(ping.epoll_fd, EPOLL_CTL_ADD, fd, &event) != 0) {
|
if (epoll_ctl(ping.epoll_fd, EPOLL_CTL_ADD, fd, &event) != 0) {
|
||||||
@@ -456,6 +456,7 @@ static int _fast_ping_create_icmp_sock(FAST_PING_TYPE type)
|
|||||||
setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (const char *)&buffsize, optlen);
|
setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (const char *)&buffsize, optlen);
|
||||||
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (const char *)&buffsize, optlen);
|
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (const char *)&buffsize, optlen);
|
||||||
|
|
||||||
|
memset(&event, 0, sizeof(event));
|
||||||
event.events = EPOLLIN;
|
event.events = EPOLLIN;
|
||||||
event.data.ptr = icmp_host;
|
event.data.ptr = icmp_host;
|
||||||
if (epoll_ctl(ping.epoll_fd, EPOLL_CTL_ADD, fd, &event) != 0) {
|
if (epoll_ctl(ping.epoll_fd, EPOLL_CTL_ADD, fd, &event) != 0) {
|
||||||
@@ -527,7 +528,6 @@ struct ping_host_struct *fast_ping_start(const char *host, int count, int interv
|
|||||||
struct addrinfo *gai = NULL;
|
struct addrinfo *gai = NULL;
|
||||||
int domain = -1;
|
int domain = -1;
|
||||||
int icmp_proto = 0;
|
int icmp_proto = 0;
|
||||||
uint32_t hostkey;
|
|
||||||
uint32_t addrkey;
|
uint32_t addrkey;
|
||||||
char ip_str[PING_MAX_HOSTLEN];
|
char ip_str[PING_MAX_HOSTLEN];
|
||||||
char port_str[MAX_IP_LEN];
|
char port_str[MAX_IP_LEN];
|
||||||
@@ -613,16 +613,12 @@ struct ping_host_struct *fast_ping_start(const char *host, int count, int interv
|
|||||||
|
|
||||||
tlog(TLOG_DEBUG, "ping %s, id = %d", host, ping_host->sid);
|
tlog(TLOG_DEBUG, "ping %s, id = %d", host, ping_host->sid);
|
||||||
|
|
||||||
hostkey = hash_string(ping_host->host);
|
|
||||||
addrkey = jhash(&ping_host->addr, ping_host->addr_len, 0);
|
addrkey = jhash(&ping_host->addr, ping_host->addr_len, 0);
|
||||||
addrkey = jhash(&ping_host->sid, sizeof(ping_host->sid), addrkey);
|
addrkey = jhash(&ping_host->sid, sizeof(ping_host->sid), addrkey);
|
||||||
pthread_mutex_lock(&ping.map_lock);
|
|
||||||
_fast_ping_host_get(ping_host);
|
_fast_ping_host_get(ping_host);
|
||||||
hash_add(ping.hostmap, &ping_host->host_node, hostkey);
|
|
||||||
pthread_mutex_unlock(&ping.map_lock);
|
|
||||||
|
|
||||||
if (_fast_ping_sendping(ping_host) != 0) {
|
if (_fast_ping_sendping(ping_host) != 0) {
|
||||||
goto errout1;
|
goto errout;
|
||||||
}
|
}
|
||||||
|
|
||||||
freeaddrinfo(gai);
|
freeaddrinfo(gai);
|
||||||
@@ -632,10 +628,6 @@ struct ping_host_struct *fast_ping_start(const char *host, int count, int interv
|
|||||||
pthread_mutex_unlock(&ping.map_lock);
|
pthread_mutex_unlock(&ping.map_lock);
|
||||||
|
|
||||||
return ping_host;
|
return ping_host;
|
||||||
errout1:
|
|
||||||
pthread_mutex_lock(&ping.map_lock);
|
|
||||||
hash_del(&ping_host->host_node);
|
|
||||||
pthread_mutex_unlock(&ping.map_lock);
|
|
||||||
errout:
|
errout:
|
||||||
if (gai) {
|
if (gai) {
|
||||||
freeaddrinfo(gai);
|
freeaddrinfo(gai);
|
||||||
@@ -650,6 +642,8 @@ errout:
|
|||||||
|
|
||||||
int fast_ping_stop(struct ping_host_struct *ping_host)
|
int fast_ping_stop(struct ping_host_struct *ping_host)
|
||||||
{
|
{
|
||||||
|
atomic_inc_return(&ping_host->notified);
|
||||||
|
_fast_ping_host_remove(ping_host);
|
||||||
_fast_ping_host_put(ping_host);
|
_fast_ping_host_put(ping_host);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -875,10 +869,33 @@ static int _fast_ping_process(struct ping_host_struct *ping_host, struct epoll_e
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _fast_ping_remove_all(void)
|
||||||
|
{
|
||||||
|
struct ping_host_struct *ping_host = NULL;
|
||||||
|
struct ping_host_struct *ping_host_tmp = NULL;
|
||||||
|
struct hlist_node *tmp = NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
LIST_HEAD(remove_list);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&ping.map_lock);
|
||||||
|
hash_for_each_safe(ping.addrmap, i, tmp, ping_host, addr_node)
|
||||||
|
{
|
||||||
|
list_add_tail(&ping_host->action_list, &remove_list);
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&ping.map_lock);
|
||||||
|
|
||||||
|
list_for_each_entry_safe(ping_host, ping_host_tmp, &remove_list, action_list)
|
||||||
|
{
|
||||||
|
_fast_ping_host_remove(ping_host);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void _fast_ping_period_run()
|
static void _fast_ping_period_run()
|
||||||
{
|
{
|
||||||
struct ping_host_struct *ping_host;
|
struct ping_host_struct *ping_host = NULL;
|
||||||
struct hlist_node *tmp;
|
struct ping_host_struct *ping_host_tmp = NULL;
|
||||||
|
struct hlist_node *tmp = NULL;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
struct timeval interval;
|
struct timeval interval;
|
||||||
@@ -894,6 +911,7 @@ static void _fast_ping_period_run()
|
|||||||
millisecond = interval.tv_sec * 1000 + interval.tv_usec / 1000;
|
millisecond = interval.tv_sec * 1000 + interval.tv_usec / 1000;
|
||||||
if (millisecond >= ping_host->timeout && ping_host->send == 1) {
|
if (millisecond >= ping_host->timeout && ping_host->send == 1) {
|
||||||
list_add_tail(&ping_host->action_list, &action);
|
list_add_tail(&ping_host->action_list, &action);
|
||||||
|
_fast_ping_host_get(ping_host);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -902,10 +920,11 @@ static void _fast_ping_period_run()
|
|||||||
}
|
}
|
||||||
|
|
||||||
list_add_tail(&ping_host->action_list, &action);
|
list_add_tail(&ping_host->action_list, &action);
|
||||||
|
_fast_ping_host_get(ping_host);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&ping.map_lock);
|
pthread_mutex_unlock(&ping.map_lock);
|
||||||
|
|
||||||
list_for_each_entry(ping_host, &action, action_list)
|
list_for_each_entry_safe(ping_host, ping_host_tmp, &action, action_list)
|
||||||
{
|
{
|
||||||
interval = now;
|
interval = now;
|
||||||
tv_sub(&interval, &ping_host->last);
|
tv_sub(&interval, &ping_host->last);
|
||||||
@@ -917,18 +936,24 @@ static void _fast_ping_period_run()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (millisecond < ping_host->interval) {
|
if (millisecond < ping_host->interval) {
|
||||||
|
list_del(&ping_host->action_list);
|
||||||
|
_fast_ping_host_put(ping_host);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ping_host->count > 0) {
|
if (ping_host->count > 0) {
|
||||||
if (ping_host->count == 1) {
|
if (ping_host->count == 1) {
|
||||||
_fast_ping_host_remove(ping_host);
|
_fast_ping_host_remove(ping_host);
|
||||||
|
list_del(&ping_host->action_list);
|
||||||
|
_fast_ping_host_put(ping_host);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ping_host->count--;
|
ping_host->count--;
|
||||||
}
|
}
|
||||||
|
|
||||||
_fast_ping_sendping(ping_host);
|
_fast_ping_sendping(ping_host);
|
||||||
|
list_del(&ping_host->action_list);
|
||||||
|
_fast_ping_host_put(ping_host);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -998,7 +1023,6 @@ int fast_ping_init()
|
|||||||
|
|
||||||
pthread_mutex_init(&ping.map_lock, 0);
|
pthread_mutex_init(&ping.map_lock, 0);
|
||||||
pthread_mutex_init(&ping.lock, 0);
|
pthread_mutex_init(&ping.lock, 0);
|
||||||
hash_init(ping.hostmap);
|
|
||||||
hash_init(ping.addrmap);
|
hash_init(ping.addrmap);
|
||||||
ping.epoll_fd = epollfd;
|
ping.epoll_fd = epollfd;
|
||||||
ping.ident = getpid();
|
ping.ident = getpid();
|
||||||
@@ -1045,6 +1069,8 @@ void fast_ping_exit()
|
|||||||
ping.fd_icmp6 = -1;
|
ping.fd_icmp6 = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_fast_ping_remove_all();
|
||||||
|
|
||||||
pthread_mutex_destroy(&ping.lock);
|
pthread_mutex_destroy(&ping.lock);
|
||||||
pthread_mutex_destroy(&ping.map_lock);
|
pthread_mutex_destroy(&ping.map_lock);
|
||||||
}
|
}
|
||||||
|
|||||||
18
smartdns.c
18
smartdns.c
@@ -161,14 +161,23 @@ int smartdns_run()
|
|||||||
|
|
||||||
void smartdns_exit()
|
void smartdns_exit()
|
||||||
{
|
{
|
||||||
fast_ping_exit();
|
|
||||||
dns_client_exit();
|
|
||||||
dns_server_exit();
|
dns_server_exit();
|
||||||
|
dns_client_exit();
|
||||||
|
fast_ping_exit();
|
||||||
tlog_exit();
|
tlog_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void sig_handle(int sig)
|
void sig_handle(int sig)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
switch (sig) {
|
||||||
|
case SIGINT:
|
||||||
|
dns_server_stop();
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
tlog(TLOG_ERROR, "process exit.\n");
|
tlog(TLOG_ERROR, "process exit.\n");
|
||||||
_exit(0);
|
_exit(0);
|
||||||
}
|
}
|
||||||
@@ -177,13 +186,16 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
atexit(smartdns_exit);
|
|
||||||
signal(SIGABRT, sig_handle);
|
signal(SIGABRT, sig_handle);
|
||||||
|
|
||||||
ret = smartdns_init();
|
ret = smartdns_init();
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
signal(SIGINT, sig_handle);
|
||||||
|
atexit(smartdns_exit);
|
||||||
|
|
||||||
return smartdns_run();
|
return smartdns_run();
|
||||||
|
|
||||||
errout:
|
errout:
|
||||||
|
|||||||
1
util.c
1
util.c
@@ -31,6 +31,7 @@ char *gethost_by_addr(char *host, struct sockaddr *addr, socklen_t addr_len)
|
|||||||
struct sockaddr_in addr_in4;
|
struct sockaddr_in addr_in4;
|
||||||
memset(&addr_in4, 0, sizeof(addr_in4));
|
memset(&addr_in4, 0, sizeof(addr_in4));
|
||||||
memcpy(&addr_in4.sin_addr.s_addr, addr_in6->sin6_addr.s6_addr + 12, sizeof(addr_in4.sin_addr.s_addr));
|
memcpy(&addr_in4.sin_addr.s_addr, addr_in6->sin6_addr.s6_addr + 12, sizeof(addr_in4.sin_addr.s_addr));
|
||||||
|
inet_ntop(AF_INET, &addr_in4.sin_addr, host, addr_len);
|
||||||
} else {
|
} else {
|
||||||
inet_ntop(AF_INET6, &addr_in6->sin6_addr, host, addr_len);
|
inet_ntop(AF_INET6, &addr_in6->sin6_addr, host, addr_len);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user