From 47a951698083413b366c0354d5e4256bb5180501 Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Tue, 8 Jul 2014 22:22:02 +0100 Subject: Use event system to re-send query on new route. Tidies module boundaries. --- src/bpf.c | 4 ++-- src/dnsmasq.c | 15 +++++++++++---- src/dnsmasq.h | 5 +++-- src/forward.c | 19 +++++++++++++++++++ src/netlink.c | 22 ++-------------------- src/network.c | 2 -- 6 files changed, 37 insertions(+), 30 deletions(-) diff --git a/src/bpf.c b/src/bpf.c index fea84b1..4416b1c 100644 --- a/src/bpf.c +++ b/src/bpf.c @@ -401,7 +401,7 @@ void route_sock(void) else if (msg->ifm_type == RTM_NEWADDR) { del_family = 0; - send_newaddr(); + queue_event(EVENT_NEWADDR); } else if (msg->ifm_type == RTM_DELADDR) { @@ -439,7 +439,7 @@ void route_sock(void) of += sizeof(long) - (diff & (sizeof(long) - 1)); } - send_newaddr(); + queue_event(EVENT_NEWADDR); } } diff --git a/src/dnsmasq.c b/src/dnsmasq.c index 5560aa9..8b375de 100644 --- a/src/dnsmasq.c +++ b/src/dnsmasq.c @@ -30,6 +30,7 @@ static void sig_handler(int sig); static void async_event(int pipe, time_t now); static void fatal_event(struct event_desc *ev, 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) { @@ -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) @@ -1239,7 +1240,13 @@ static void async_event(int pipe, time_t now) case EVENT_NEWADDR: newaddress(now); break; - + + case EVENT_NEWROUTE: + resend_query(); + /* Force re-reading resolv file right now, for luck. */ + poll_resolv(0, 1, now); + break; + case EVENT_TERM: /* Knock all our children on the head. */ 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 stat statbuf; diff --git a/src/dnsmasq.h b/src/dnsmasq.h index dfa9773..30f176a 100644 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -166,6 +166,7 @@ struct event_desc { #define EVENT_TFTP_ERR 20 #define EVENT_INIT 21 #define EVENT_NEWADDR 22 +#define EVENT_NEWROUTE 23 /* Exit codes. */ #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, union mysockaddr *to, struct all_addr *source, unsigned int iface); +void resend_query(); /* network.c */ 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 icmp_ping(struct in_addr addr); #endif -void send_newaddr(void); +void queue_event(int event); void send_alarm(time_t event, time_t now); void send_event(int fd, int event, int data, char *msg); void clear_cache_and_reload(time_t now); -void poll_resolv(int force, int do_reload, time_t now); /* netlink.c */ #ifdef HAVE_LINUX_NETWORK diff --git a/src/forward.c b/src/forward.c index 9fe6afa..1a657bb 100644 --- a/src/forward.c +++ b/src/forward.c @@ -2130,6 +2130,25 @@ static struct frec *lookup_frec_by_sender(unsigned short id, 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 */ void server_gone(struct server *server) diff --git a/src/netlink.c b/src/netlink.c index 022c363..cff43cc 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -356,28 +356,10 @@ static void nl_async(struct nlmsghdr *h) struct rtmsg *rtm = NLMSG_DATA(h); if (rtm->rtm_type == RTN_UNICAST && rtm->rtm_scope == RT_SCOPE_LINK) - { - /* 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()); - } - } + queue_event(EVENT_NEWROUTE); } else if (h->nlmsg_type == RTM_NEWADDR || h->nlmsg_type == RTM_DELADDR) - send_newaddr(); + queue_event(EVENT_NEWADDR); } #endif diff --git a/src/network.c b/src/network.c index ff9cabb..b188f50 100644 --- a/src/network.c +++ b/src/network.c @@ -1559,7 +1559,6 @@ int reload_servers(char *fname) return gotone; } -#if defined(HAVE_LINUX_NETWORK) || defined(HAVE_BSD_NETWORK) /* Called when addresses are added or deleted from an interface */ void newaddress(time_t now) { @@ -1584,7 +1583,6 @@ void newaddress(time_t now) #endif } -#endif -- cgit v1.2.1