mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-11 05:14:46 -04:00
When our IP address changes, do not break all existing dns server sockets. Patch from Christopher Davis
svn:r1329
This commit is contained in:
parent
01be8708e9
commit
f901f9867c
10
evdns.c
10
evdns.c
@ -219,6 +219,7 @@ struct reply {
|
|||||||
struct nameserver {
|
struct nameserver {
|
||||||
evutil_socket_t socket; /* a connected UDP socket */
|
evutil_socket_t socket; /* a connected UDP socket */
|
||||||
struct sockaddr_storage address;
|
struct sockaddr_storage address;
|
||||||
|
socklen_t addrlen;
|
||||||
int failed_times; /* number of times which we have given this server a chance */
|
int failed_times; /* number of times which we have given this server a chance */
|
||||||
int timedout; /* number of times in a row a request has timed out */
|
int timedout; /* number of times in a row a request has timed out */
|
||||||
struct event event;
|
struct event event;
|
||||||
@ -2135,7 +2136,8 @@ static int
|
|||||||
evdns_request_transmit_to(struct evdns_request *req, struct nameserver *server) {
|
evdns_request_transmit_to(struct evdns_request *req, struct nameserver *server) {
|
||||||
int r;
|
int r;
|
||||||
ASSERT_LOCKED(req->base);
|
ASSERT_LOCKED(req->base);
|
||||||
r = send(server->socket, req->request, req->request_len, 0);
|
r = sendto(server->socket, req->request, req->request_len, 0,
|
||||||
|
(struct sockaddr *)&server->address, server->addrlen);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
int err = evutil_socket_geterror(server->socket);
|
int err = evutil_socket_geterror(server->socket);
|
||||||
if (EVUTIL_ERR_RW_RETRIABLE(err))
|
if (EVUTIL_ERR_RW_RETRIABLE(err))
|
||||||
@ -2421,12 +2423,8 @@ _evdns_nameserver_add_impl(struct evdns_base *base, const struct sockaddr *addre
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (connect(ns->socket, address, addrlen) != 0) {
|
|
||||||
err = 2;
|
|
||||||
goto out2;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(&ns->address, address, addrlen);
|
memcpy(&ns->address, address, addrlen);
|
||||||
|
ns->addrlen = addrlen;
|
||||||
ns->state = 1;
|
ns->state = 1;
|
||||||
event_assign(&ns->event, ns->base->event_base, ns->socket, EV_READ | EV_PERSIST, nameserver_ready_callback, ns);
|
event_assign(&ns->event, ns->base->event_base, ns->socket, EV_READ | EV_PERSIST, nameserver_ready_callback, ns);
|
||||||
if (event_add(&ns->event, NULL) < 0) {
|
if (event_add(&ns->event, NULL) < 0) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user