From: Karl Fleischmann Date: Thu, 22 Jun 2023 09:58:31 +0000 (+0200) Subject: lib-master, doveadm: Progress top level --help option X-Git-Tag: 2.4.0~2645 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b56ed774e661420dca6a207f0c15da825a894554;p=thirdparty%2Fdovecot%2Fcore.git lib-master, doveadm: Progress top level --help option Print usage to stdout and exit successfully if requested via "doveadm help" or "doveadm --help". --- diff --git a/src/doveadm/doveadm.c b/src/doveadm/doveadm.c index 7628fee456..ead2e1a94a 100644 --- a/src/doveadm/doveadm.c +++ b/src/doveadm/doveadm.c @@ -18,6 +18,7 @@ #include "doveadm-dsync.h" #include "doveadm.h" +#include #include const struct doveadm_print_vfuncs *doveadm_print_vfuncs_all[] = { @@ -147,7 +148,7 @@ static void cmd_help(struct doveadm_cmd_context *cctx) const char *cmd, *man_argv[3]; if (!doveadm_cmd_param_str(cctx, "cmd", &cmd)) - usage(); + usage_prefix(stdout, "", EX_OK); env_put("MANPATH", MANDIR); man_argv[0] = "man"; @@ -270,13 +271,24 @@ int main(int argc, char *argv[]) others just accept -+ option. */ master_service = master_service_init("doveadm", service_flags, &argc, &argv, "+Df:hv"); + const struct option longopts[] = { + master_service_helpopt, + {NULL, 0, NULL, 0}, + }; + master_service_register_long_options(master_service, longopts); struct doveadm_cmd_context *cctx = doveadm_cmd_context_create( DOVEADM_CONNECTION_TYPE_CLI, doveadm_verbose || doveadm_debug); i_set_failure_exit_callback(failure_exit_callback); - while ((c = master_getopt(master_service)) > 0) { + bool help_requested = FALSE; + const char *longopt = NULL; + while ((c = master_getopt_long(master_service, &longopt)) >= 0) { switch (c) { + case 0: + if (strcmp(longopt, "help") == 0) + help_requested = TRUE; + break; case 'D': doveadm_debug = TRUE; doveadm_verbose = TRUE; @@ -342,9 +354,11 @@ int main(int argc, char *argv[]) mail_plugins have been loaded. */ doveadm_load_modules(); + /* show usage after registering all plugins */ if (cmd_name == NULL) { - /* show usage after registering all plugins */ - usage(); + FILE *out = help_requested ? stdout : stderr; + int exit_code = help_requested ? EX_OK : EX_USAGE; + usage_prefix(out, "", exit_code); } } diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index 02ea9ab965..5d835d605a 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -51,6 +51,8 @@ struct master_service *master_service; +const struct option master_service_helpopt = {"help", no_argument, NULL, 0}; + static struct event_category master_service_category = { .name = NULL, /* set dynamically later */ }; diff --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index ab9874eeb9..21d8e4c85e 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -110,6 +110,8 @@ master_service_avail_overflow_callback_t(bool kill, struct timeval *created_r); extern struct master_service *master_service; +extern const struct option master_service_helpopt; + const char *master_service_getopt_string(void); /* Start service initialization. */