mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 18:28:25 +00:00
Use event system to re-send query on new route. Tidies module boundaries.
This commit is contained in:
@@ -401,7 +401,7 @@ void route_sock(void)
|
|||||||
else if (msg->ifm_type == RTM_NEWADDR)
|
else if (msg->ifm_type == RTM_NEWADDR)
|
||||||
{
|
{
|
||||||
del_family = 0;
|
del_family = 0;
|
||||||
send_newaddr();
|
queue_event(EVENT_NEWADDR);
|
||||||
}
|
}
|
||||||
else if (msg->ifm_type == RTM_DELADDR)
|
else if (msg->ifm_type == RTM_DELADDR)
|
||||||
{
|
{
|
||||||
@@ -439,7 +439,7 @@ void route_sock(void)
|
|||||||
of += sizeof(long) - (diff & (sizeof(long) - 1));
|
of += sizeof(long) - (diff & (sizeof(long) - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
send_newaddr();
|
queue_event(EVENT_NEWADDR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ static void sig_handler(int sig);
|
|||||||
static void async_event(int pipe, time_t now);
|
static void async_event(int pipe, time_t now);
|
||||||
static void fatal_event(struct event_desc *ev, char *msg);
|
static void fatal_event(struct event_desc *ev, char *msg);
|
||||||
static int read_event(int fd, struct event_desc *evp, char **msg);
|
static int read_event(int fd, struct event_desc *evp, char **msg);
|
||||||
|
static void poll_resolv(int force, int do_reload, time_t now);
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
int main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
@@ -1037,9 +1038,9 @@ void send_alarm(time_t event, time_t now)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_newaddr(void)
|
void queue_event(int event)
|
||||||
{
|
{
|
||||||
send_event(pipewrite, EVENT_NEWADDR, 0, NULL);
|
send_event(pipewrite, event, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_event(int fd, int event, int data, char *msg)
|
void send_event(int fd, int event, int data, char *msg)
|
||||||
@@ -1240,6 +1241,12 @@ static void async_event(int pipe, time_t now)
|
|||||||
newaddress(now);
|
newaddress(now);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case EVENT_NEWROUTE:
|
||||||
|
resend_query();
|
||||||
|
/* Force re-reading resolv file right now, for luck. */
|
||||||
|
poll_resolv(0, 1, now);
|
||||||
|
break;
|
||||||
|
|
||||||
case EVENT_TERM:
|
case EVENT_TERM:
|
||||||
/* Knock all our children on the head. */
|
/* Knock all our children on the head. */
|
||||||
for (i = 0; i < MAX_PROCS; i++)
|
for (i = 0; i < MAX_PROCS; i++)
|
||||||
@@ -1272,7 +1279,7 @@ static void async_event(int pipe, time_t now)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void poll_resolv(int force, int do_reload, time_t now)
|
static void poll_resolv(int force, int do_reload, time_t now)
|
||||||
{
|
{
|
||||||
struct resolvc *res, *latest;
|
struct resolvc *res, *latest;
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
|
|||||||
@@ -166,6 +166,7 @@ struct event_desc {
|
|||||||
#define EVENT_TFTP_ERR 20
|
#define EVENT_TFTP_ERR 20
|
||||||
#define EVENT_INIT 21
|
#define EVENT_INIT 21
|
||||||
#define EVENT_NEWADDR 22
|
#define EVENT_NEWADDR 22
|
||||||
|
#define EVENT_NEWROUTE 23
|
||||||
|
|
||||||
/* Exit codes. */
|
/* Exit codes. */
|
||||||
#define EC_GOOD 0
|
#define EC_GOOD 0
|
||||||
@@ -1183,6 +1184,7 @@ struct frec *get_new_frec(time_t now, int *wait, int force);
|
|||||||
int send_from(int fd, int nowild, char *packet, size_t len,
|
int send_from(int fd, int nowild, char *packet, size_t len,
|
||||||
union mysockaddr *to, struct all_addr *source,
|
union mysockaddr *to, struct all_addr *source,
|
||||||
unsigned int iface);
|
unsigned int iface);
|
||||||
|
void resend_query();
|
||||||
|
|
||||||
/* network.c */
|
/* network.c */
|
||||||
int indextoname(int fd, int index, char *name);
|
int indextoname(int fd, int index, char *name);
|
||||||
@@ -1290,11 +1292,10 @@ unsigned char *extended_hwaddr(int hwtype, int hwlen, unsigned char *hwaddr,
|
|||||||
int make_icmp_sock(void);
|
int make_icmp_sock(void);
|
||||||
int icmp_ping(struct in_addr addr);
|
int icmp_ping(struct in_addr addr);
|
||||||
#endif
|
#endif
|
||||||
void send_newaddr(void);
|
void queue_event(int event);
|
||||||
void send_alarm(time_t event, time_t now);
|
void send_alarm(time_t event, time_t now);
|
||||||
void send_event(int fd, int event, int data, char *msg);
|
void send_event(int fd, int event, int data, char *msg);
|
||||||
void clear_cache_and_reload(time_t now);
|
void clear_cache_and_reload(time_t now);
|
||||||
void poll_resolv(int force, int do_reload, time_t now);
|
|
||||||
|
|
||||||
/* netlink.c */
|
/* netlink.c */
|
||||||
#ifdef HAVE_LINUX_NETWORK
|
#ifdef HAVE_LINUX_NETWORK
|
||||||
|
|||||||
@@ -2131,6 +2131,25 @@ static struct frec *lookup_frec_by_sender(unsigned short id,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Send query packet again, if we can. */
|
||||||
|
void resend_query()
|
||||||
|
{
|
||||||
|
if (daemon->srv_save)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
if (daemon->srv_save->sfd)
|
||||||
|
fd = daemon->srv_save->sfd->fd;
|
||||||
|
else if (daemon->rfd_save && daemon->rfd_save->refcount != 0)
|
||||||
|
fd = daemon->rfd_save->fd;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
while(sendto(fd, daemon->packet, daemon->packet_len, 0,
|
||||||
|
&daemon->srv_save->addr.sa, sa_len(&daemon->srv_save->addr)) == -1 && retry_send());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* A server record is going away, remove references to it */
|
/* A server record is going away, remove references to it */
|
||||||
void server_gone(struct server *server)
|
void server_gone(struct server *server)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -356,28 +356,10 @@ static void nl_async(struct nlmsghdr *h)
|
|||||||
struct rtmsg *rtm = NLMSG_DATA(h);
|
struct rtmsg *rtm = NLMSG_DATA(h);
|
||||||
|
|
||||||
if (rtm->rtm_type == RTN_UNICAST && rtm->rtm_scope == RT_SCOPE_LINK)
|
if (rtm->rtm_type == RTN_UNICAST && rtm->rtm_scope == RT_SCOPE_LINK)
|
||||||
{
|
queue_event(EVENT_NEWROUTE);
|
||||||
/* Force re-reading resolv file right now, for luck. */
|
|
||||||
daemon->last_resolv = 0;
|
|
||||||
|
|
||||||
if (daemon->srv_save)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
if (daemon->srv_save->sfd)
|
|
||||||
fd = daemon->srv_save->sfd->fd;
|
|
||||||
else if (daemon->rfd_save && daemon->rfd_save->refcount != 0)
|
|
||||||
fd = daemon->rfd_save->fd;
|
|
||||||
else
|
|
||||||
return;
|
|
||||||
|
|
||||||
while(sendto(fd, daemon->packet, daemon->packet_len, 0,
|
|
||||||
&daemon->srv_save->addr.sa, sa_len(&daemon->srv_save->addr)) == -1 && retry_send());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (h->nlmsg_type == RTM_NEWADDR || h->nlmsg_type == RTM_DELADDR)
|
else if (h->nlmsg_type == RTM_NEWADDR || h->nlmsg_type == RTM_DELADDR)
|
||||||
send_newaddr();
|
queue_event(EVENT_NEWADDR);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -1559,7 +1559,6 @@ int reload_servers(char *fname)
|
|||||||
return gotone;
|
return gotone;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAVE_LINUX_NETWORK) || defined(HAVE_BSD_NETWORK)
|
|
||||||
/* Called when addresses are added or deleted from an interface */
|
/* Called when addresses are added or deleted from an interface */
|
||||||
void newaddress(time_t now)
|
void newaddress(time_t now)
|
||||||
{
|
{
|
||||||
@@ -1584,7 +1583,6 @@ void newaddress(time_t now)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user