Use event system to re-send query on new route. Tidies module boundaries.

This commit is contained in:
Simon Kelley
2014-07-08 22:22:02 +01:00
parent cdb755c5f1
commit 47a9516980
6 changed files with 37 additions and 30 deletions

View File

@@ -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);
} }
} }

View File

@@ -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;

View File

@@ -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

View File

@@ -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)
{ {

View File

@@ -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

View File

@@ -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