X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/0d73e7db9cc1ecc165bc573404666f2afeb9b463..60374ac975b735fa9245cb107e5e976bfb107a93:/authd/authd.c diff --git a/authd/authd.c b/authd/authd.c index f9f81edf..6f500a9d 100644 --- a/authd/authd.c +++ b/authd/authd.c @@ -18,15 +18,102 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include -#include - -#include "setup.h" -#include "common.h" +#include "authd.h" +#include "dns.h" +#include "provider.h" +#include "notice.h" #define MAXPARA 10 -static rb_helper *authd_helper = NULL; +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'] = handle_resolve_dns, + ['E'] = handle_cancel_connection, + ['O'] = handle_options, + ['R'] = handle_reload, + ['S'] = handle_stat, +}; + +authd_stat_handler authd_stat_handlers[256] = { + ['D'] = enumerate_nameservers, +}; + +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) + { + 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; + + 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) + { + /* 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; + + handler(parv[1][0]); +} static void parse_request(rb_helper *helper) @@ -35,6 +122,7 @@ parse_request(rb_helper *helper) static char readbuf[READBUF_SIZE]; int parc; int len; + authd_cmd_handler handler; while((len = rb_helper_read(helper, readbuf, sizeof(readbuf))) > 0) { @@ -43,11 +131,9 @@ parse_request(rb_helper *helper) if(parc < 1) continue; - switch (parv[0][0]) - { - default: - break; - } + handler = authd_cmd_handlers[(unsigned char)parv[0][0]]; + if (handler != NULL) + handler(parc, parv); } } @@ -57,7 +143,7 @@ error_cb(rb_helper *helper) exit(1); } -#ifndef WINDOWS +#ifndef _WIN32 static void dummy_handler(int sig) { @@ -68,7 +154,7 @@ dummy_handler(int sig) static void setup_signals(void) { -#ifndef WINDOWS +#ifndef _WIN32 struct sigaction act; act.sa_flags = 0; @@ -106,7 +192,18 @@ main(int argc, char *argv[]) exit(1); } + 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; }