From f9be16e61bfdcbc7c786de6befefbf42aefca4ff Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sat, 23 Nov 2019 22:55:57 +0100 Subject: [PATCH] Reset per-client domain blocking cache at receipt of SIGUSR2. This is a convenient alternative to sending SIGHUP (which also clears the entire DNS cache). Signed-off-by: DL6ER --- src/dnsmasq/dnsmasq.c | 2 ++ src/dnsmasq_interface.c | 20 ++++++++++++++++++++ src/dnsmasq_interface.h | 2 ++ 3 files changed, 24 insertions(+) diff --git a/src/dnsmasq/dnsmasq.c b/src/dnsmasq/dnsmasq.c index f01167e1..2cb2ddc0 100644 --- a/src/dnsmasq/dnsmasq.c +++ b/src/dnsmasq/dnsmasq.c @@ -1412,6 +1412,8 @@ static void async_event(int pipe, time_t now) we leave them logging to the old file. */ if (daemon->log_file != NULL) log_reopen(daemon->log_file); + + FTL_reset_per_client_domain_data(); break; case EVENT_NEWADDR: diff --git a/src/dnsmasq_interface.c b/src/dnsmasq_interface.c index fd6f85f9..37b672b0 100644 --- a/src/dnsmasq_interface.c +++ b/src/dnsmasq_interface.c @@ -1556,3 +1556,23 @@ static void prepare_blocking_metadata(void) // Free IPv6addr clearSetupVarsArray(); } + +void FTL_reset_per_client_domain_data(void) +{ + logg("Received SIGUSR2, resetting domain blocking data"); + + for(int domainID = 0; domainID < counters->domains; domainID++) + { + domainsData *domain = getDomain(domainID, true); + if(domain == NULL) + continue; + + for(int clientID = 0; clientID < counters->clients; clientID++) + { + // Reset all blocking yes/no fields for all domains and clients + // This forces a reprocessing of all available filters for any + // given domain and client the next time they are seen + domain->clientstatus->set(domain->clientstatus, clientID, UNKNOWN_BLOCKED); + } + } +} diff --git a/src/dnsmasq_interface.h b/src/dnsmasq_interface.h index 2c969541..40822080 100644 --- a/src/dnsmasq_interface.h +++ b/src/dnsmasq_interface.h @@ -49,4 +49,6 @@ void _FTL_get_blocking_metadata(struct all_addr **addrp, unsigned int *flags, co void FTL_dnsmasq_reload(void); void FTL_fork_and_bind_sockets(struct passwd *ent_pw); +void FTL_reset_per_client_domain_data(void); + #endif // DNSMASQ_INTERFACE_H