doveadm_cmd_server_post(conn, cctx->cmd->name);
}
-static void
-doveadm_cmd_server_run(struct client_connection_tcp *conn,
- int argc, const char *const argv[],
- const struct doveadm_cmd *cmd)
-{
- i_getopt_reset();
- cmd->cmd(argc, (char **)argv);
- doveadm_cmd_server_post(conn, cmd->name);
-}
-
static int
doveadm_mail_cmd_server_parse(const struct doveadm_mail_cmd *cmd,
const struct doveadm_settings *set,
struct doveadm_cmd_context *cctx)
{
struct ioloop *prev_ioloop = current_ioloop;
- const struct doveadm_cmd *cmd = NULL;
const struct doveadm_mail_cmd *mail_cmd;
struct doveadm_mail_cmd_context *mctx = NULL;
const struct doveadm_cmd_ver2 *cmd_ver2;
if ((cmd_ver2 = doveadm_cmd_find_with_args_ver2(cmd_name, &argc, &argv)) == NULL) {
mail_cmd = doveadm_mail_cmd_find(cmd_name);
if (mail_cmd == NULL) {
- cmd = doveadm_cmd_find_with_args(cmd_name, &argc, &argv);
- if (cmd == NULL) {
- i_error("doveadm: Client sent unknown command: %s", cmd_name);
- return -1;
- }
+ i_error("doveadm: Client sent unknown command: %s", cmd_name);
+ return -1;
} else {
if (doveadm_mail_cmd_server_parse(mail_cmd, conn->conn.set,
argc, argv,
if (cmd_ver2 != NULL)
doveadm_cmd_server_run_ver2(conn, argc, argv, cctx);
- else if (cmd != NULL)
- doveadm_cmd_server_run(conn, argc, argv, cmd);
else {
i_assert(mctx != NULL);
doveadm_mail_cmd_server_run(conn, mctx);
{ DOVEADM_EX_NOTFOUND, "NOTFOUND" }
};
-ARRAY_TYPE(doveadm_cmd) doveadm_cmds;
ARRAY_TYPE(doveadm_cmd_ver2) doveadm_cmds_ver2;
ARRAY_DEFINE_TYPE(getopt_option_array, struct option);
return DOVEADM_EX_UNKNOWN;
}
-void doveadm_register_cmd(const struct doveadm_cmd *cmd)
-{
- array_push_back(&doveadm_cmds, cmd);
-}
-
void doveadm_cmd_register_ver2(struct doveadm_cmd_ver2 *cmd)
{
if (cmd->cmd == NULL) {
return NULL;
}
-static bool
-doveadm_cmd_find_multi_word(const char *cmdname, int *_argc,
- const char *const *_argv[])
-{
- int argc = *_argc;
- const char *const *argv = *_argv;
- size_t len;
-
- if (argc < 2)
- return FALSE;
-
- len = strlen(argv[1]);
- if (!str_begins(cmdname, argv[1]))
- return FALSE;
-
- argc--; argv++;
- if (cmdname[len] == ' ') {
- /* more args */
- if (!doveadm_cmd_find_multi_word(cmdname + len + 1,
- &argc, &argv))
- return FALSE;
- } else {
- if (cmdname[len] != '\0')
- return FALSE;
- }
-
- *_argc = argc;
- *_argv = argv;
- return TRUE;
-}
-
-const struct doveadm_cmd *
-doveadm_cmd_find_with_args(const char *cmd_name, int *argc,
- const char *const *argv[])
-{
- const struct doveadm_cmd *cmd;
- size_t 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;
-
- if (doveadm_cmd_find_multi_word(subcmd_name,
- argc, argv))
- return cmd;
- }
- }
- return NULL;
-}
-
void doveadm_cmds_init(void)
{
unsigned int i;
- i_array_init(&doveadm_cmds, 32);
i_array_init(&doveadm_cmds_ver2, 2);
for (i = 0; i < N_ELEMENTS(doveadm_commands_ver2); i++)
void doveadm_cmds_deinit(void)
{
- array_free(&doveadm_cmds);
array_free(&doveadm_cmds_ver2);
}
typedef void doveadm_command_ver2_t(struct doveadm_cmd_context *cctx);
-struct doveadm_cmd {
- doveadm_command_t *cmd;
- const char *name;
- const char *short_usage;
-};
-
struct doveadm_cmd_ver2 {
doveadm_command_ver2_t *cmd;
struct doveadm_mail_cmd_context *(*mail_cmd)(void);
struct ostream *output;
};
-ARRAY_DEFINE_TYPE(doveadm_cmd, struct doveadm_cmd);
-extern ARRAY_TYPE(doveadm_cmd) doveadm_cmds;
-
ARRAY_DEFINE_TYPE(doveadm_cmd_ver2, struct doveadm_cmd_ver2);
extern ARRAY_TYPE(doveadm_cmd_ver2) doveadm_cmds_ver2;
-void doveadm_register_cmd(const struct doveadm_cmd *cmd);
-
-const struct doveadm_cmd *
-doveadm_cmd_find_with_args(const char *cmd_name, int *argc,
- const char *const *argv[]);
-
void doveadm_register_auth_commands(void);
void doveadm_register_auth_server_commands(void);
void doveadm_register_director_commands(void);
usage_to(FILE *out, const char *prefix)
{
const struct doveadm_cmd_ver2 *cmd2;
- const struct doveadm_cmd *cmd;
string_t *str = t_str_new(1024);
fprintf(out, "usage: doveadm [-Dv] [-f <formatter>] ");
fprintf(out, "%s ", prefix);
fprintf(out, "<command> [<args>]\n");
- array_foreach(&doveadm_cmds, cmd)
- str_printfa(str, "%s\t%s\n", cmd->name, cmd->short_usage);
array_foreach(&doveadm_cmds_ver2, cmd2)
str_printfa(str, "%s\t%s\n", cmd2->name, cmd2->usage);
usage_to(stderr, "");
}
-static void ATTR_NORETURN
-help_to(const struct doveadm_cmd *cmd, FILE *out)
-{
- fprintf(out, "doveadm %s %s\n", cmd->name, cmd->short_usage);
- lib_exit(EX_USAGE);
-}
-
-void help(const struct doveadm_cmd *cmd)
-{
- help_to(cmd, stdout);
-}
-
static void ATTR_NORETURN
help_to_ver2(const struct doveadm_cmd_ver2 *cmd, FILE *out)
{
execv_const(argv[0], argv);
}
-static bool doveadm_try_run(const char *cmd_name, int argc,
- const char *const argv[])
-{
- const struct doveadm_cmd *cmd;
-
- cmd = doveadm_cmd_find_with_args(cmd_name, &argc, &argv);
- if (cmd == NULL)
- return FALSE;
- cmd->cmd(argc, (char **)argv);
- return TRUE;
-}
-
static bool doveadm_has_subcommands(const char *cmd_name)
{
const struct doveadm_cmd_ver2 *cmd2;
- const struct doveadm_cmd *cmd;
size_t len = strlen(cmd_name);
- array_foreach(&doveadm_cmds, cmd) {
- if (strncmp(cmd->name, cmd_name, len) == 0 &&
- cmd->name[len] == ' ')
- return TRUE;
- }
array_foreach(&doveadm_cmds_ver2, cmd2) {
if (strncmp(cmd2->name, cmd_name, len) == 0 &&
cmd2->name[len] == ' ')
cctx.username = getenv("USER");
if (!doveadm_cmd_try_run_ver2(cmd_name, argc, (const char**)argv, &cctx) &&
- !doveadm_try_run(cmd_name, argc, (const char **)argv) &&
!doveadm_mail_try_run(cmd_name, argc, argv)) {
if (doveadm_has_subcommands(cmd_name))
usage_to(stdout, cmd_name);
extern int doveadm_exit_code;
void usage(void) ATTR_NORETURN;
-void help(const struct doveadm_cmd *cmd) ATTR_NORETURN;
void help_ver2(const struct doveadm_cmd_ver2 *cmd) ATTR_NORETURN;
void doveadm_master_send_signal(int signo);
}
}
-void help(const struct doveadm_cmd *cmd)
-{
- i_fatal("Client sent invalid command. Usage: %s %s",
- cmd->name, cmd->short_usage);
-}
-
void help_ver2(const struct doveadm_cmd_ver2 *cmd)
{
i_fatal("Client sent invalid command. Usage: %s %s",