X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/2f355b7e3cafdef3a614b723cc2a6c70a1d8339e..60374ac975b735fa9245cb107e5e976bfb107a93:/authd/authd.c diff --git a/authd/authd.c b/authd/authd.c index 335f55f5..6f500a9d 100644 --- a/authd/authd.c +++ b/authd/authd.c @@ -21,17 +21,21 @@ #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, + ['D'] = handle_resolve_dns, + ['E'] = handle_cancel_connection, + ['O'] = handle_options, + ['R'] = handle_reload, ['S'] = handle_stat, }; @@ -43,14 +47,18 @@ authd_reload_handler authd_reload_handlers[256] = { ['D'] = reload_nameservers, }; +rb_dictionary *authd_option_handlers; + static void handle_stat(int parc, char *parv[]) { authd_stat_handler handler; if(parc < 3) - /* XXX Should log this somehow */ + { + warn_opers(L_CRIT, "BUG: handle_stat received too few parameters (at least 3 expected, got %d)", parc); return; + } if (!(handler = authd_stat_handlers[(unsigned char)parv[2][0]])) return; @@ -58,14 +66,48 @@ 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[]) { authd_reload_handler handler; if(parc < 2) - /* XXX Should log this somehow */ + { + /* 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; + } if (!(handler = authd_reload_handlers[(unsigned char)parv[1][0]])) return; @@ -152,11 +194,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; }