bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2016-2018 Dovecot authors, see the included COPYING file */
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen#include "login-common.h"
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen#include "array.h"
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen#include "imap-login-commands.h"
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainenstatic ARRAY(struct imap_login_command *) imap_login_commands;
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainenstatic pool_t imap_login_commands_pool;
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainenstruct imap_login_command *imap_login_command_lookup(const char *name)
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen{
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen struct imap_login_command *const *cmdp;
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen array_foreach(&imap_login_commands, cmdp) {
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen if (strcasecmp((*cmdp)->name, name) == 0)
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen return *cmdp;
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen }
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen return NULL;
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen}
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainenvoid imap_login_commands_register(const struct imap_login_command *commands,
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen unsigned int count)
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen{
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen struct imap_login_command *cmd;
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen unsigned int i;
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen for (i = 0; i < count; i++) {
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen cmd = p_new(imap_login_commands_pool, struct imap_login_command, 1);
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen cmd->name = p_strdup(imap_login_commands_pool, commands[i].name);
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen cmd->func = commands[i].func;
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen array_append(&imap_login_commands, &cmd, 1);
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen }
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen}
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainenstatic void
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainenimap_login_command_unregister(const struct imap_login_command *unreg_cmd)
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen{
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen struct imap_login_command *const *cmdp;
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen array_foreach(&imap_login_commands, cmdp) {
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen if ((*cmdp)->func == unreg_cmd->func &&
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen strcmp((*cmdp)->name, unreg_cmd->name) == 0) {
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen array_delete(&imap_login_commands,
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen array_foreach_idx(&imap_login_commands, cmdp), 1);
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen return;
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen }
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen }
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen i_panic("imap_login_command_unregister: Command '%s' not found", unreg_cmd->name);
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen}
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainenvoid imap_login_commands_unregister(const struct imap_login_command *commands,
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen unsigned int count)
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen{
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen unsigned int i;
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen for (i = 0; i < count; i++)
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen imap_login_command_unregister(&commands[i]);
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen}
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainenvoid imap_login_commands_init(void)
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen{
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen imap_login_commands_pool =
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen pool_alloconly_create("imap login commands", 128);
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen p_array_init(&imap_login_commands, imap_login_commands_pool, 8);
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen}
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainenvoid imap_login_commands_deinit(void)
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen{
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen pool_unref(&imap_login_commands_pool);
ba7db1e008078bfbed489e17bee00309e0a7b1f0Timo Sirainen}