summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Kelley <simon@thekelleys.org.uk>2014-07-08 22:22:02 +0100
committerSimon Kelley <simon@thekelleys.org.uk>2014-07-08 22:22:02 +0100
commit47a951698083413b366c0354d5e4256bb5180501 (patch)
treebad8643af1651436ceda4d044202527ac6d843b9
parentcdb755c5f16a6768c3e8b1f345fe15fc9244228d (diff)
downloaddnsmasq-47a951698083413b366c0354d5e4256bb5180501.tar.gz
Use event system to re-send query on new route. Tidies module boundaries.
-rw-r--r--src/bpf.c4
-rw-r--r--src/dnsmasq.c15
-rw-r--r--src/dnsmasq.h5
-rw-r--r--src/forward.c19
-rw-r--r--src/netlink.c22
-rw-r--r--src/network.c2
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