X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/6f39a80ec6fe9a6e2dd1c9d0e145991275678c20..60374ac975b735fa9245cb107e5e976bfb107a93:/authd/authd.c diff --git a/authd/authd.c b/authd/authd.c index 298d3c4f..6f500a9d 100644 --- a/authd/authd.c +++ b/authd/authd.c @@ -20,16 +20,22 @@ #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_reload, - ['D'] = resolve_dns, + ['C'] = handle_new_connection, + ['D'] = handle_resolve_dns, + ['E'] = handle_cancel_connection, + ['O'] = handle_options, + ['R'] = handle_reload, ['S'] = handle_stat, }; @@ -41,31 +47,69 @@ 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[parv[2][0]])) + if (!(handler = authd_stat_handlers[(unsigned char)parv[2][0]])) return; 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[parv[1][0]])) + if (!(handler = authd_reload_handlers[(unsigned char)parv[1][0]])) return; handler(parv[1][0]); @@ -87,7 +131,7 @@ parse_request(rb_helper *helper) if(parc < 1) continue; - handler = authd_cmd_handlers[parv[0][0]]; + handler = authd_cmd_handlers[(unsigned char)parv[0][0]]; if (handler != NULL) handler(parc, parv); } @@ -99,7 +143,7 @@ error_cb(rb_helper *helper) exit(1); } -#ifndef WINDOWS +#ifndef _WIN32 static void dummy_handler(int sig) { @@ -110,7 +154,7 @@ dummy_handler(int sig) static void setup_signals(void) { -#ifndef WINDOWS +#ifndef _WIN32 struct sigaction act; act.sa_flags = 0; @@ -150,10 +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; }