#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] = {
- ['R'] = handle_reload,
+ ['C'] = handle_new_connection,
['D'] = resolve_dns,
+ ['O'] = handle_options,
+ ['R'] = handle_reload,
['S'] = handle_stat,
};
['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;
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[])
{
if(parc < 2)
{
/* Reload all handlers */
- for(size_t i = 0; i < sizeof(authd_reload_handlers); handler = authd_reload_handlers[i++])
- handler(parv[1][0]);
+ for(size_t i = 0; i < 256; i++)
+ {
+ if ((handler = authd_reload_handlers[(unsigned char) i]) != NULL)
+ handler(parv[1][0]);
+ }
return;
}
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;
}