doveadm.c revision 52ffa11d672a9bd150ae3e758a19f1cc4f01471b
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen#include "lib.h"
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen#include "array.h"
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen#include "master-service.h"
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen#include "doveadm-mail.h"
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen#include "doveadm.h"
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen#include <stdio.h>
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen#include <stdlib.h>
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen#include <unistd.h>
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainenstatic ARRAY_DEFINE(doveadm_cmds, struct doveadm_cmd);
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainenvoid doveadm_register_cmd(const struct doveadm_cmd *cmd)
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen{
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen array_append(&doveadm_cmds, cmd, 1);
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen}
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainenvoid usage(void)
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen{
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen const struct doveadm_cmd *cmd;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen fprintf(stderr, "usage: doveadm\n");
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen array_foreach(&doveadm_cmds, cmd) {
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen fprintf(stderr, USAGE_CMDNAME_FMT" %s\n",
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen cmd->name, cmd->short_usage);
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen }
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen doveadm_mail_usage();
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen exit(1);
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen}
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainenvoid help(const struct doveadm_cmd *cmd)
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen{
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen fprintf(stderr, "doveadm %s %s\n", cmd->name, cmd->short_usage);
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen if (cmd->long_usage != NULL)
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen fprintf(stderr, "%s", cmd->long_usage);
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen exit(0);
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen}
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainenstatic void cmd_help(int argc ATTR_UNUSED, char *argv[])
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen{
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen const struct doveadm_cmd *cmd;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen if (argv[1] == NULL)
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen usage();
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen array_foreach(&doveadm_cmds, cmd) {
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen if (strcmp(cmd->name, argv[1]) == 0)
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen help(cmd);
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen }
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen usage();
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen}
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainenstatic struct doveadm_cmd doveadm_cmd_help = {
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen cmd_help, "help", "<cmd>", NULL
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen};
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainenstatic bool doveadm_try_run(const char *cmd_name, int argc, char *argv[])
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen{
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen const struct doveadm_cmd *cmd;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen array_foreach(&doveadm_cmds, cmd) {
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen if (strcmp(cmd_name, cmd->name) == 0) {
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen cmd->cmd(argc, argv);
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen return TRUE;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen }
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen }
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen return FALSE;
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen}
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainenint main(int argc, char *argv[])
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen{
578ef2538ccf42e2a48234c24a8b709397101d88Timo Sirainen const char *cmd_name;
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen master_service = master_service_init("doveadm",
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen MASTER_SERVICE_FLAG_STANDALONE,
a3fe8c0c54d87822f4b4f8f0d10caac611861b2bTimo Sirainen &argc, &argv, "+");
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen i_array_init(&doveadm_cmds, 32);
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen doveadm_mail_init();
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen doveadm_register_cmd(&doveadm_cmd_help);
f50ea0370137dd93d9953d91ea73486ca0784de9Timo Sirainen doveadm_register_cmd(&doveadm_cmd_auth);
f50ea0370137dd93d9953d91ea73486ca0784de9Timo Sirainen doveadm_register_cmd(&doveadm_cmd_user);
c664d0da658c8d3200d88ea3c4cd580afd33fa73Timo Sirainen doveadm_register_cmd(&doveadm_cmd_dump);
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen doveadm_register_cmd(&doveadm_cmd_pw);
52ffa11d672a9bd150ae3e758a19f1cc4f01471bTimo Sirainen doveadm_register_cmd(&doveadm_cmd_who);
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen /* "+" is GNU extension to stop at the first non-option.
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen others just accept -+ option. */
578ef2538ccf42e2a48234c24a8b709397101d88Timo Sirainen if (master_getopt(master_service) > 0)
578ef2538ccf42e2a48234c24a8b709397101d88Timo Sirainen usage();
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen if (optind == argc)
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen usage();
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen cmd_name = argv[optind];
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen argc -= optind;
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen argv += optind;
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen master_service_init_finish(master_service);
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen if (!doveadm_try_run(cmd_name, argc, argv) &&
f50ea0370137dd93d9953d91ea73486ca0784de9Timo Sirainen !doveadm_mail_try_run(cmd_name, argc, argv))
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen usage();
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen master_service_deinit(&master_service);
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen doveadm_mail_deinit();
acc039dfc0b0f4588cf2feec04727b61e1c672a1Timo Sirainen array_free(&doveadm_cmds);
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen return 0;
a6ab8f00351265e35b79f3a22b1f5a4978ae5c35Timo Sirainen}