]> jfr.im git - solanum.git/commitdiff
rehash: don't restart authd for DNS reloads
authorElizabeth Myers <redacted>
Wed, 9 Mar 2016 09:46:04 +0000 (03:46 -0600)
committerElizabeth Myers <redacted>
Wed, 9 Mar 2016 09:46:04 +0000 (03:46 -0600)
This could lead to pretty nasty things, like losing DNS (and in the
future, ident) queries. That's a Bad Thing™.

authd/authd.c
authd/authd.h
authd/dns.c
authd/dns.h
include/dns.h
ircd/dns.c
modules/m_rehash.c

index 2e6861ae256877b2a046bad81f527c1addd3e057..999258cae8598eab34b1edf83d8893ea8950237e 100644 (file)
 
 #define MAXPARA 10
 
+static void handle_reload(int parc, char *parv[]);
 static void handle_stat(int parc, char *parv[]);
 
 rb_helper *authd_helper = NULL;
 authd_cmd_handler authd_cmd_handlers[255] = {
+       ['C'] = handle_reload,
        ['D'] = resolve_dns,
        ['S'] = handle_stat,
 };
@@ -35,6 +37,10 @@ authd_stat_handler authd_stat_handlers[255] = {
        ['D'] = enumerate_nameservers,
 };
 
+authd_reload_handler authd_reload_handlers[255] = {
+       ['D'] = reload_nameservers,
+};
+
 static void
 handle_stat(int parc, char *parv[])
 {
@@ -50,6 +56,21 @@ handle_stat(int parc, char *parv[])
        handler(parv[1], parv[2][0]);
 }
 
+static void
+handle_reload(int parc, char *parv[])
+{
+       authd_reload_handler handler;
+
+       if(parc < 2)
+                /* XXX Should log this somehow */
+               return;
+
+       if (!(handler = authd_reload_handlers[parv[1][0]]))
+               return;
+
+       handler(parv[1][0]);
+}
+
 static void
 parse_request(rb_helper *helper)
 {
index 4770e0eb6364e13b14e5e34a9acb3b900cd5a9e0..8c731468ac36d46c715f8b37b3694de9a6fce9d3 100644 (file)
@@ -31,7 +31,10 @@ extern rb_helper *authd_helper;
 
 typedef void (*authd_cmd_handler)(int parc, char *parv[]);
 typedef void (*authd_stat_handler)(const char *rid, const char letter);
+typedef void (*authd_reload_handler)(const char letter);
+
 extern authd_cmd_handler authd_cmd_handlers[255];
 extern authd_stat_handler authd_stat_handlers[255];
+extern authd_reload_handler authd_reload_handlers[255];
 
 #endif
index 9615d4534e672ab802b1dbf79b226b898e6cbd9c..ddac5be42c08ba7b35f733f35f482a21bb8c1892 100644 (file)
@@ -174,3 +174,10 @@ enumerate_nameservers(const char *rid, const char letter)
 
        rb_helper_write(authd_helper, "Y %s %c %s", rid, letter, buf);
 }
+
+void
+reload_nameservers(const char letter)
+{
+       /* Not a whole lot to it */
+       restart_resolver();
+}
index c8c0f16fa968e8c6be7e8de01e152d73b863c95f..3e43520af6e876648a5c6e973b01ee264b62e0e0 100644 (file)
@@ -36,5 +36,6 @@ struct dns_request
 
 extern void resolve_dns(int parc, char *parv[]);
 extern void enumerate_nameservers(const char *rid, const char letter);
+extern void reload_nameservers(const char letter);
 
 #endif
index f433bfe04ecd4b601d702275b9bca607fa8128f0..155bb8430c40990e39c0a7492720cb0ae1555607 100644 (file)
@@ -40,5 +40,6 @@ void cancel_lookup(uint16_t xid);
 void dns_results_callback(const char *callid, const char *status, const char *aftype, const char *results);
 void dns_stats_results_callback(const char *callid, const char *status, int resc, const char *resv[]);
 void init_nameserver_cache(void);
+bool reload_nameservers(void);
 
 #endif
index 5d936ea36c1584beaa2f67feac30b61a36ff367a..4b067ba68ba999625005694f9b863804924bbe7a 100644 (file)
@@ -322,6 +322,20 @@ init_nameserver_cache(void)
        (void)get_nameservers(get_nameservers_cb, NULL);
 }
 
+bool
+reload_nameservers(void)
+{
+       if(authd_helper == NULL)
+       {
+               /* Shit */
+               return false;
+       }
+       rb_helper_write(authd_helper, "C D");
+       init_nameserver_cache();
+       return true;
+}
+
+
 static void
 submit_dns(uint16_t nid, char type, const char *addr)
 {
index ee98377255d2788682d932fb068c8aa5b0d18552..f0380230a42b279ee849754a1a270143e384380a 100644 (file)
@@ -84,8 +84,7 @@ rehash_dns(struct Client *source_p)
        if (!MyConnect(source_p))
                remote_rehash_oper_p = source_p;
 
-       /* reread /etc/resolv.conf and reopen res socket */
-       restart_authd();
+       reload_nameservers();
 }
 
 static void