diff options
Diffstat (limited to 'pigeonhole/src/managesieve/managesieve-commands.c')
-rw-r--r-- | pigeonhole/src/managesieve/managesieve-commands.c | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/pigeonhole/src/managesieve/managesieve-commands.c b/pigeonhole/src/managesieve/managesieve-commands.c new file mode 100644 index 0000000..87e2048 --- /dev/null +++ b/pigeonhole/src/managesieve/managesieve-commands.c @@ -0,0 +1,110 @@ +/* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file + */ + +#include "lib.h" +#include "array.h" + +#include "managesieve-common.h" +#include "managesieve-commands.h" + + +/* May want to combine this somewhere in a commands-common.c to avoid duplicate + code + */ + +static const struct command managesieve_base_commands[] = { + { "CAPABILITY", cmd_capability }, + { "LOGOUT", cmd_logout }, + { "PUTSCRIPT", cmd_putscript }, + { "CHECKSCRIPT", cmd_checkscript }, + { "GETSCRIPT", cmd_getscript }, + { "SETACTIVE", cmd_setactive }, + { "DELETESCRIPT", cmd_deletescript }, + { "LISTSCRIPTS", cmd_listscripts }, + { "HAVESPACE", cmd_havespace }, + { "RENAMESCRIPT", cmd_renamescript }, + { "NOOP", cmd_noop } +}; + +#define MANAGESIEVE_COMMANDS_COUNT N_ELEMENTS(managesieve_base_commands) + +static ARRAY(struct command) managesieve_commands; +static bool commands_unsorted; + +void command_register(const char *name, command_func_t *func) +{ + struct command cmd; + + i_zero(&cmd); + cmd.name = name; + cmd.func = func; + array_append(&managesieve_commands, &cmd, 1); + + commands_unsorted = TRUE; +} + +void command_unregister(const char *name) +{ + const struct command *cmd; + unsigned int i, count; + + cmd = array_get(&managesieve_commands, &count); + for (i = 0; i < count; i++) { + if (strcasecmp(cmd[i].name, name) == 0) { + array_delete(&managesieve_commands, i, 1); + return; + } + } + + i_error("Trying to unregister unknown command '%s'", name); +} + +void command_register_array(const struct command *cmdarr, unsigned int count) +{ + commands_unsorted = TRUE; + array_append(&managesieve_commands, cmdarr, count); +} + +void command_unregister_array(const struct command *cmdarr, unsigned int count) +{ + while (count > 0) { + command_unregister(cmdarr->name); + count--; cmdarr++; + } +} + +static int command_cmp(const struct command *c1, const struct command *c2) +{ + return strcasecmp(c1->name, c2->name); +} + +static int command_bsearch(const char *name, const struct command *cmd) +{ + return strcasecmp(name, cmd->name); +} + +struct command *command_find(const char *name) +{ + if (commands_unsorted) { + array_sort(&managesieve_commands, command_cmp); + commands_unsorted = FALSE; + } + + return array_bsearch(&managesieve_commands, name, command_bsearch); +} + +void commands_init(void) +{ + i_array_init(&managesieve_commands, 16); + commands_unsorted = FALSE; + + command_register_array(managesieve_base_commands, + MANAGESIEVE_COMMANDS_COUNT); +} + +void commands_deinit(void) +{ + command_unregister_array(managesieve_base_commands, + MANAGESIEVE_COMMANDS_COUNT); + array_free(&managesieve_commands); +} |