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,
};
['D'] = reload_nameservers,
};
+rb_dictionary *authd_option_handlers;
+
static void
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[])
{
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]);
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);
#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[]);
extern authd_stat_handler authd_stat_handlers[256];
extern authd_reload_handler authd_reload_handlers[256];
+extern rb_dictionary *authd_option_handlers;
+
#endif
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);
}
#define __CHARYBDIS_AUTHD_PROVIDER_H__
#include "stdinc.h"
+#include "authd.h"
#include "rb_dictionary.h"
#define MAX_PROVIDERS 32 /* This should be enough */
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
{
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;