]> jfr.im git - solanum.git/blobdiff - authd/authd.c
authd: try to destroy all providers on the way out.
[solanum.git] / authd / authd.c
index e114518459db8be8a6b887e2fb5a4fd59477dca9..1432a54587fc6b840785b42589cb4ebcbd206ab1 100644 (file)
 #include "authd.h"
 #include "dns.h"
 #include "provider.h"
+#include "notice.h"
 
 #define MAXPARA 10
 
 static void handle_reload(int parc, char *parv[]);
 static void handle_stat(int parc, char *parv[]);
+static void handle_options(int parc, char *parv[]);
 
 rb_helper *authd_helper = NULL;
 authd_cmd_handler authd_cmd_handlers[256] = {
        ['C'] = handle_new_connection,
        ['D'] = resolve_dns,
-       ['H'] = handle_reload,
+       ['O'] = handle_options,
+       ['R'] = handle_reload,
        ['S'] = handle_stat,
 };
 
@@ -43,6 +46,8 @@ authd_reload_handler authd_reload_handlers[256] = {
        ['D'] = reload_nameservers,
 };
 
+rb_dictionary *authd_option_handlers;
+
 static void
 handle_stat(int parc, char *parv[])
 {
@@ -60,6 +65,32 @@ handle_stat(int parc, char *parv[])
        handler(parv[1], parv[2][0]);
 }
 
+static void
+handle_options(int parc, char *parv[])
+{
+       struct auth_opts_handler *handler;
+
+       if(parc < 4)
+       {
+               warn_opers(L_CRIT, "BUG: handle_options received too few parameters (at least 4 expected, got %d)", parc);
+               return;
+       }
+
+       if((handler = rb_dictionary_retrieve(authd_option_handlers, parv[1])) == NULL)
+       {
+               warn_opers(L_CRIT, "BUG: handle_options got a bad option type %s", parv[1]);
+               return;
+       }
+
+       if((parc - 2) < handler->min_parc)
+       {
+               warn_opers(L_CRIT, "BUG: handle_options received too few parameters (at least %d expected, got %d)", handler->min_parc, parc);
+               return;
+       }
+
+       handler->handler(parv[1], parc - 2, (const char **)&parv[2]);
+}
+
 static void
 handle_reload(int parc, char *parv[])
 {
@@ -67,7 +98,13 @@ handle_reload(int parc, char *parv[])
 
        if(parc < 2)
        {
-               warn_opers(L_CRIT, "BUG: handle_reload received too few parameters (at least 2 expected, got %d)", parc);
+               /* Reload all handlers */
+               for(size_t i = 0; i < 256; i++)
+               {
+                       if ((handler = authd_reload_handlers[(unsigned char) i]) != NULL)
+                               handler(parv[1][0]);
+               }
+
                return;
        }
 
@@ -156,11 +193,16 @@ main(int argc, char *argv[])
 
        rb_set_time();
        setup_signals();
+
+       authd_option_handlers = rb_dictionary_create("authd options handlers", strcasecmp);
+
        init_resolver();
        init_providers();
        rb_init_prng(NULL, RB_PRNG_DEFAULT);
 
        rb_helper_loop(authd_helper, 0);
 
+       destroy_providers();
+
        return 0;
 }