]> jfr.im git - solanum.git/commitdiff
authd/provider: add options handlers for providers
authorElizabeth Myers <redacted>
Sat, 26 Mar 2016 04:04:00 +0000 (23:04 -0500)
committerElizabeth Myers <redacted>
Sat, 26 Mar 2016 04:04:00 +0000 (23:04 -0500)
This allows providers to create handlers for changing their
configuration.

authd/authd.c
authd/authd.h
authd/provider.c
authd/provider.h

index d77d87b1b4762a9f7b9943d87b9205bc378e4fcc..c6ed0911c7ce6f33edee21d05380c7a843d4bc20 100644 (file)
 
 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,
+       ['O'] = handle_options,
        ['R'] = handle_reload,
        ['S'] = handle_stat,
 };
@@ -44,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[])
 {
@@ -61,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 + 3));
+}
+
 static void
 handle_reload(int parc, char *parv[])
 {
@@ -69,7 +99,7 @@ handle_reload(int parc, char *parv[])
        if(parc < 2)
        {
                /* Reload all handlers */
-               for(size_t i = 0; i < sizeof(authd_reload_handlers); i++)
+               for(size_t i = 0; i < 256; i++)
                {
                        if ((handler = authd_reload_handlers[(unsigned char) i]) != NULL)
                                handler(parv[1][0]);
@@ -163,6 +193,9 @@ 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);
index b44a85d96de555b1d2591a86df82a1af2892133d..07c746ca6fedcbe01f3dd3c2e7251a853585f5e7 100644 (file)
 #ifndef _AUTHD_H
 #define _AUTHD_H
 
-#include <rb_lib.h>
-#include <stdio.h>
+#include "stdinc.h"
+#include "rb_lib.h"
+#include "rb_dictionary.h"
 
 #include "setup.h"
 #include "ircd_defs.h"
 
+typedef void (*provider_opts_handler_t)(const char *, int, const char **);
+
+struct auth_opts_handler
+{
+       const char *option;
+       int min_parc;
+       provider_opts_handler_t handler;
+};
+
 extern rb_helper *authd_helper;
 
 typedef void (*authd_cmd_handler)(int parc, char *parv[]);
@@ -37,4 +47,6 @@ extern authd_cmd_handler authd_cmd_handlers[256];
 extern authd_stat_handler authd_stat_handlers[256];
 extern authd_reload_handler authd_reload_handlers[256];
 
+extern rb_dictionary *authd_option_handlers;
+
 #endif
index 1a6c6517e6d064fb45157365f6235f1104237d7e..dfabac9551431b100e1b0ecdce852242995fede4 100644 (file)
@@ -65,12 +65,27 @@ void load_provider(struct auth_provider *provider)
                return;
        }
 
+       if(provider->opt_handlers != NULL)
+       {
+               struct auth_opts_handler *handler;
+
+               for(handler = provider->opt_handlers; handler->option != NULL; handler++)
+                       rb_dictionary_add(authd_option_handlers, handler->option, handler);
+       }
+
        provider->init();
        rb_dlinkAdd(provider, &provider->node, &auth_providers);
 }
 
 void unload_provider(struct auth_provider *provider)
 {
+       if(provider->opt_handlers != NULL)
+       {
+               struct auth_opts_handler *handler;
+
+               for(handler = provider->opt_handlers; handler->option != NULL; handler++)
+                       rb_dictionary_delete(authd_option_handlers, handler->option);
+       }
        provider->destroy();
        rb_dlinkDelete(&provider->node, &auth_providers);
 }
index 8fab21cf0de8776900e4c44ae18e5b85caab1413..28deef649aee64231483ff460f3477cf6597f88c 100644 (file)
@@ -22,6 +22,7 @@
 #define __CHARYBDIS_AUTHD_PROVIDER_H__
 
 #include "stdinc.h"
+#include "authd.h"
 #include "rb_dictionary.h"
 
 #define MAX_PROVIDERS 32       /* This should be enough */
@@ -61,7 +62,7 @@ typedef void (*provider_destroy_t)(void);
 
 typedef bool (*provider_start_t)(struct auth_client *);
 typedef void (*provider_cancel_t)(struct auth_client *);
-typedef void (*provider_complete_t)(struct auth_client *, provider_t provider);
+typedef void (*provider_complete_t)(struct auth_client *, provider_t);
 
 struct auth_provider
 {
@@ -75,6 +76,8 @@ struct auth_provider
        provider_start_t start;         /* Perform authentication */
        provider_cancel_t cancel;       /* Authentication cancelled */
        provider_complete_t completed;  /* Callback for when other performers complete (think dependency chains) */
+
+       struct auth_opts_handler *opt_handlers;
 };
 
 extern rb_dlink_list auth_providers;