From: Timo Sirainen Date: Mon, 12 Jul 2010 14:25:35 +0000 (+0100) Subject: doveadm: Give a better error message if we can guess that unknown command is due... X-Git-Tag: 2.0.rc3~75 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=10515cb90514b169ab6c3693c72c4bf1017476db;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Give a better error message if we can guess that unknown command is due to unloaded plugin. --- diff --git a/src/doveadm/doveadm.c b/src/doveadm/doveadm.c index 595367533d..69fcec1dfd 100644 --- a/src/doveadm/doveadm.c +++ b/src/doveadm/doveadm.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -209,6 +210,41 @@ static bool doveadm_has_subcommands(const char *cmd_name) return doveadm_mail_has_subcommands(cmd_name); } +static bool doveadm_has_unloaded_plugin(const char *name) +{ + struct module *module; + DIR *dir; + struct dirent *d; + const char *plugin_name; + unsigned int name_len = strlen(name); + bool found = FALSE; + + /* first check that it's not actually loaded */ + for (module = modules; module != NULL; module = module->next) { + if (strcmp(module_get_plugin_name(module), name) == 0) + return FALSE; + } + + dir = opendir(DOVEADM_MODULEDIR); + if (dir == NULL) + return FALSE; + + while ((d = readdir(dir)) != NULL) { + plugin_name = module_file_get_name(d->d_name); + if (strncmp(plugin_name, "doveadm_", 8) == 0) + plugin_name += 8; + + if (strncmp(plugin_name, name, name_len) == 0 && + (plugin_name[name_len] == '\0' || + strcmp(plugin_name + name_len, "_plugin") == 0)) { + found = TRUE; + break; + } + } + (void)closedir(dir); + return found; +} + static void cmd_help(int argc ATTR_UNUSED, char *argv[]) { const char *man_argv[3]; @@ -426,8 +462,13 @@ int main(int argc, char *argv[]) if (!doveadm_try_run(cmd_name, argc, argv) && !doveadm_mail_try_run(cmd_name, argc, argv)) { - if (doveadm_has_subcommands(argv[0])) - usage_to(stdout, argv[0]); + if (doveadm_has_subcommands(cmd_name)) + usage_to(stdout, cmd_name); + if (doveadm_has_unloaded_plugin(cmd_name)) { + i_fatal("Unknown command '%s', but plugin %s exists. " + "Try to set mail_plugins=%s", + cmd_name, cmd_name, cmd_name); + } usage(); }