view src/doveadm/doveadm-cmd.c @ 19552:0f22db71df7a

global: freshen copyright git ls-files | xargs perl -p -i -e 's/(\d+)-201[0-5]/$1-2016/g;s/ (201[0-5]) Dovecot/ $1-2016 Dovecot/'
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Wed, 13 Jan 2016 12:24:03 +0200
parents 3009a1a6f6d5
children a9fd771f2cae
line wrap: on
line source

/* Copyright (c) 2009-2016 Dovecot authors, see the included COPYING file */

#include "lib.h"
#include "array.h"
#include "doveadm-cmd.h"

static struct doveadm_cmd *doveadm_commands[] = {
	&doveadm_cmd_stop,
	&doveadm_cmd_reload,
	&doveadm_cmd_who,
	&doveadm_cmd_penalty,
	&doveadm_cmd_kick,
	&doveadm_cmd_mailbox_mutf7,
	&doveadm_cmd_sis_deduplicate,
	&doveadm_cmd_sis_find,
	&doveadm_cmd_stats_dump
};

ARRAY_TYPE(doveadm_cmd) doveadm_cmds;

void doveadm_register_cmd(const struct doveadm_cmd *cmd)
{
	array_append(&doveadm_cmds, cmd, 1);
}

static const struct doveadm_cmd *
doveadm_cmd_find_multi_word(const struct doveadm_cmd *cmd,
			    const char *cmdname, int *_argc, char **_argv[])
{
	int argc = *_argc;
	char **argv = *_argv;
	const struct doveadm_cmd *subcmd;
	unsigned int len;

	if (argc < 2)
		return NULL;

	len = strlen(argv[1]);
	if (strncmp(cmdname, argv[1], len) != 0)
		return NULL;

	argc--; argv++;
	if (cmdname[len] == ' ') {
		/* more args */
		subcmd = doveadm_cmd_find_multi_word(cmd, cmdname + len + 1,
						     &argc, &argv);
		if (subcmd == NULL)
			return NULL;
	} else {
		if (cmdname[len] != '\0')
			return NULL;
	}

	*_argc = argc;
	*_argv = argv;
	return cmd;
}

const struct doveadm_cmd *
doveadm_cmd_find(const char *cmd_name, int *argc, char **argv[])
{
	const struct doveadm_cmd *cmd, *subcmd;
	unsigned int cmd_name_len;

	i_assert(*argc > 0);

	cmd_name_len = strlen(cmd_name);
	array_foreach(&doveadm_cmds, cmd) {
		if (strcmp(cmd->name, cmd_name) == 0)
			return cmd;

		/* see if it matches a multi-word command */
		if (strncmp(cmd->name, cmd_name, cmd_name_len) == 0 &&
		    cmd->name[cmd_name_len] == ' ') {
			const char *subcmd_name = cmd->name + cmd_name_len + 1;

			subcmd = doveadm_cmd_find_multi_word(cmd, subcmd_name,
							     argc, argv);
			if (subcmd != NULL)
				return subcmd;
		}
	}
	return NULL;
}

void doveadm_cmds_init(void)
{
	unsigned int i;

	i_array_init(&doveadm_cmds, 32);
	for (i = 0; i < N_ELEMENTS(doveadm_commands); i++)
		doveadm_register_cmd(doveadm_commands[i]);

	doveadm_register_auth_commands();
	doveadm_register_director_commands();
	doveadm_register_instance_commands();
	doveadm_register_mount_commands();
	doveadm_register_proxy_commands();
	doveadm_register_log_commands();
	doveadm_register_replicator_commands();
	doveadm_register_dict_commands();
	doveadm_register_fs_commands();
}

void doveadm_cmds_deinit(void)
{
	array_free(&doveadm_cmds);
}