summaryrefslogtreecommitdiff
path: root/libmailutils/cli/simple.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmailutils/cli/simple.c')
-rw-r--r--libmailutils/cli/simple.c242
1 files changed, 242 insertions, 0 deletions
diff --git a/libmailutils/cli/simple.c b/libmailutils/cli/simple.c
new file mode 100644
index 000000000..025357f11
--- /dev/null
+++ b/libmailutils/cli/simple.c
@@ -0,0 +1,242 @@
+/* cli.c -- Command line interface for GNU Mailutils
+ Copyright (C) 2016-2024 Free Software Foundation, Inc.
+
+ GNU Mailutils is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 3, or (at
+ your option) any later version.
+
+ GNU Mailutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>.
+*/
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <mailutils/cfg.h>
+#include <mailutils/opt.h>
+#include <mailutils/cli.h>
+#include <mailutils/nls.h>
+
+void
+mu_cli_simple (int argc, char **argv, ...)
+{
+ struct mu_cli_setup setup;
+ struct mu_parseopt pohint;
+ struct mu_cfg_parse_hints cfhint;
+ char **capa = NULL;
+ void *data = NULL;
+ int *ret_argc = NULL;
+ char ***ret_argv = NULL;
+
+ mu_opool_t args_pool = NULL, optv_pool = NULL;
+
+ va_list ap;
+ int opt;
+
+ memset (&setup, 0, sizeof (setup));
+ memset (&pohint, 0, sizeof (pohint));
+ memset (&cfhint, 0, sizeof (cfhint));
+
+ va_start (ap, argv);
+ while ((opt = va_arg (ap, int)) != MU_CLI_OPTION_END)
+ {
+ switch (opt)
+ {
+ case MU_CLI_OPTION_OPTIONS:
+ {
+ struct mu_option *p;
+ if (!optv_pool)
+ mu_opool_create (&optv_pool, MU_OPOOL_ENOMEMABRT);
+ p = va_arg (ap, struct mu_option *);
+ mu_opool_append (optv_pool, &p, sizeof p);
+ }
+ break;
+
+ case MU_CLI_OPTION_CONFIG:
+ setup.cfg = va_arg (ap, struct mu_cfg_param *);
+ break;
+
+ case MU_CLI_OPTION_CAPABILITIES:
+ capa = va_arg (ap, char **);
+ break;
+
+ case MU_CLI_OPTION_EX_USAGE:
+ setup.ex_usage = va_arg (ap, int);
+ break;
+
+ case MU_CLI_OPTION_EX_CONFIG:
+ setup.ex_config = va_arg (ap, int);
+ break;
+
+ case MU_CLI_OPTION_DATA:
+ data = va_arg (ap, void *);
+ break;
+
+ case MU_CLI_OPTION_IN_ORDER:
+ setup.inorder = 1;
+ break;
+
+ case MU_CLI_OPTION_RETURN_ARGC:
+ ret_argc = va_arg (ap, int *);
+ break;
+
+ case MU_CLI_OPTION_RETURN_ARGV:
+ ret_argv = va_arg (ap, char ***);
+ break;
+
+ case MU_CLI_OPTION_IGNORE_ERRORS:
+ pohint.po_flags |= MU_PARSEOPT_IGNORE_ERRORS;
+ break;
+
+ case MU_CLI_OPTION_NO_STDOPT:
+ pohint.po_flags |= MU_PARSEOPT_NO_STDOPT;
+ break;
+
+ case MU_CLI_OPTION_NO_ERREXIT:
+ pohint.po_flags |= MU_PARSEOPT_NO_ERREXIT;
+ break;
+
+ case MU_CLI_OPTION_IMMEDIATE:
+ pohint.po_flags |= MU_PARSEOPT_IMMEDIATE;
+ break;
+
+ case MU_CLI_OPTION_NO_SORT:
+ pohint.po_flags |= MU_PARSEOPT_NO_SORT;
+ break;
+
+ case MU_CLI_OPTION_SINGLE_DASH:
+ pohint.po_flags |= MU_PARSEOPT_SINGLE_DASH;
+ break;
+
+ case MU_CLI_OPTION_PROG_NAME:
+ pohint.po_prog_name = va_arg (ap, char *);
+ if (pohint.po_prog_name)
+ pohint.po_flags |= MU_PARSEOPT_PROG_NAME;
+ break;
+
+ case MU_CLI_OPTION_PROG_DOC:
+ pohint.po_prog_doc = va_arg (ap, char *);
+ if (pohint.po_prog_doc)
+ pohint.po_flags |= MU_PARSEOPT_PROG_DOC;
+ break;
+
+ case MU_CLI_OPTION_PROG_ARGS:
+ {
+ char *p;
+ if (!args_pool)
+ mu_opool_create (&args_pool, MU_OPOOL_ENOMEMABRT);
+ p = va_arg (ap, char *);
+ mu_opool_append (args_pool, &p, sizeof p);
+ }
+ break;
+
+ case MU_CLI_OPTION_BUG_ADDRESS:
+ pohint.po_bug_address = va_arg (ap, char *);
+ if (pohint.po_bug_address)
+ pohint.po_flags |= MU_PARSEOPT_BUG_ADDRESS;
+ break;
+
+ case MU_CLI_OPTION_PACKAGE_NAME:
+ pohint.po_package_name = va_arg (ap, char *);
+ if (pohint.po_package_name)
+ pohint.po_flags |= MU_PARSEOPT_PACKAGE_NAME;
+ break;
+
+ case MU_CLI_OPTION_PACKAGE_URL:
+ pohint.po_package_url = va_arg (ap, char *);
+ if (pohint.po_package_url)
+ pohint.po_flags |= MU_PARSEOPT_PACKAGE_URL;
+ break;
+
+ case MU_CLI_OPTION_EXTRA_INFO:
+ pohint.po_extra_info = va_arg (ap, char *);
+ if (pohint.po_extra_info)
+ pohint.po_flags |= MU_PARSEOPT_EXTRA_INFO;
+ break;
+
+ case MU_CLI_OPTION_HELP_HOOK:
+ pohint.po_help_hook =
+ va_arg (ap, void (*) (struct mu_parseopt *, mu_stream_t));
+ if (pohint.po_help_hook)
+ pohint.po_flags |= MU_PARSEOPT_HELP_HOOK;
+ break;
+
+ case MU_CLI_OPTION_VERSION_HOOK:
+ pohint.po_version_hook =
+ va_arg (ap, void (*) (struct mu_parseopt *, mu_stream_t));
+ if (pohint.po_version_hook)
+ pohint.po_flags |= MU_PARSEOPT_VERSION_HOOK;
+ break;
+
+ case MU_CLI_OPTION_PROG_DOC_HOOK:
+ pohint.po_prog_doc_hook =
+ va_arg (ap, void (*) (struct mu_parseopt *, mu_stream_t));
+ if (pohint.po_prog_doc_hook)
+ pohint.po_flags |= MU_PARSEOPT_PROG_DOC_HOOK;
+ break;
+
+ case MU_CLI_OPTION_NEGATION:
+ pohint.po_negation = va_arg (ap, char *);
+ if (pohint.po_negation)
+ pohint.po_flags |= MU_PARSEOPT_NEGATION;
+ break;
+
+ case MU_CLI_OPTION_SPECIAL_ARGS:
+ pohint.po_special_args = va_arg (ap, char *);
+ if (pohint.po_special_args)
+ pohint.po_flags |= MU_PARSEOPT_SPECIAL_ARGS;
+ break;
+
+ case MU_CLI_OPTION_CONF_SITE_FILE:
+ if ((cfhint.site_file = va_arg (ap, char *)) == NULL)
+ cfhint.site_file = mu_site_config_file ();
+ cfhint.flags = MU_CFHINT_SITE_FILE;
+ break;
+
+ case MU_CLI_OPTION_CONF_PER_USER_FILE:
+ cfhint.flags |= MU_CFHINT_PER_USER_FILE;
+ break;
+
+ case MU_CLI_OPTION_CONF_NO_OVERRIDE:
+ cfhint.flags |= MU_CFHINT_NO_CONFIG_OVERRIDE;
+ break;
+
+ case MU_CLI_OPTION_CONF_PROGNAME:
+ if ((cfhint.program = va_arg (ap, char *)) != NULL)
+ cfhint.flags |= MU_CFHINT_PROGRAM;
+ break;
+
+ default:
+ mu_diag_output (MU_DIAG_CRIT,
+ _("%s:%d: INTERNAL ERROR: unrecognized mu_cli_simple option"),
+ __FILE__, __LINE__);
+ abort ();
+ }
+ }
+ if (optv_pool)
+ {
+ struct mu_option *p = NULL;
+ mu_opool_append (optv_pool, &p, sizeof p);
+ setup.optv = mu_opool_finish (optv_pool, NULL);
+ }
+ if (args_pool)
+ {
+ char *p = NULL;
+ mu_opool_append (args_pool, &p, sizeof p);
+ pohint.po_prog_args = mu_opool_finish (args_pool, NULL);
+ pohint.po_flags |= MU_PARSEOPT_PROG_ARGS;
+ }
+ mu_cli_ext (argc, argv, &setup, &pohint, &cfhint, capa, data,
+ ret_argc, ret_argv);
+ mu_opool_destroy (&args_pool);
+ mu_opool_destroy (&optv_pool);
+ va_end (ap);
+}

Return to:

Send suggestions and report system problems to the System administrator.