/* opt.h -- general-purpose command line option parser
Copyright (C) 2016-2025 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 .
*/
#ifndef _MAILUTILS_CLI_H
#define _MAILUTILS_CLI_H
#include
#include
#include
#include
typedef void (*mu_cli_capa_commit_fp) (void *);
struct mu_cli_capa
{
char *name;
struct mu_option *opt;
struct mu_cfg_param *cfg;
mu_cfg_section_fp parser;
mu_cli_capa_commit_fp commit;
};
void mu_cli_capa_init (void);
void mu_cli_capa_register (struct mu_cli_capa *capa);
void mu_cli_capa_extend_settings (char const *name, mu_list_t opts,
mu_list_t commits);
struct mu_cli_setup
{
struct mu_option **optv; /* Command-line options */
struct mu_cfg_param *cfg; /* Configuration parameters */
char *prog_doc; /* Program documentation string */
char *prog_args; /* Program arguments string */
char const **prog_alt_args; /* Alternative arguments string */
char *prog_extra_doc; /* Extra documentation. This will be
displayed after options. */
int ex_usage; /* If not 0, exit code on usage errors */
int ex_config; /* If not 0, exit code on configuration
errors */
int inorder:1; /* Don't permute options and arguments */
int server:1; /* This is a server: don't read per-user
configuration files */
void (*prog_doc_hook) (mu_stream_t);
};
extern const char mu_version_copyright[];
extern const char mu_general_help_text[];
extern int mu_copyright_year;
void mu_version_print (mu_stream_t stream);
void mu_version_hook (struct mu_parseopt *po, mu_stream_t stream);
void mu_cli (int argc, char **argv, struct mu_cli_setup *setup,
char **capa, void *data,
int *ret_argc, char ***ret_argv);
void mu_cli_ext (int argc, char **argv,
struct mu_cli_setup *setup,
struct mu_parseopt *pohint,
struct mu_cfg_parse_hints *cfhint,
char **capa,
void *data,
int *ret_argc, char ***ret_argv);
char *mu_site_config_file (void);
void mu_acl_cfg_init (void);
/* Simplified interface */
enum
{
MU_CLI_OPTION_END = -1, /* End of options */
/* Argument: struct mu_option *
* Description: Supplies the array of options. Can be given multiple
* times.
* Ref: optv in struct mu_cli_setup.
*/
MU_CLI_OPTION_OPTIONS,
/* Argument: struct mu_cfg_param *
* Description: Supplies configuration definitions.
* NULL argument is a no-op.
* Ref: cfg in struct mu_cli_setup
*/
MU_CLI_OPTION_CONFIG,
/* Argument: char **
* Description: NULL-terminated array of capability strings.
* NULL argument is a no-op.
* Ref: capa argument to mu_cli and mu_cli_ext.
*/
MU_CLI_OPTION_CAPABILITIES,
/* Argument: int
* Description: Exit code to use on usage errors (default: EX_USAGE).
* Ref: ex_usage member of struct mu_cli_setup.
*/
MU_CLI_OPTION_EX_USAGE,
/* Argument: int
* Description: Exit code to use on configuration errors (default:
* EX_CONFIG).
* Ref: ex_config member of struct mu_cli_setup.
*/
MU_CLI_OPTION_EX_CONFIG,
/* Argument: none
* Description: Ignore usage errors.
* Ref: MU_PARSEOPT_IGNORE_ERRORS flag in opt.h
*/
MU_CLI_OPTION_IGNORE_ERRORS,
/* Argument: int *
* Description: A pointer to store the number of command line
* arguments in.
* Ref: ret_argc argument in mu_cli and mu_cli_ext.
*/
MU_CLI_OPTION_RETURN_ARGC,
/* Argument: char ***
* Description: A pointer to store the address of the array of
* command line arguments.
* Ref: ret_argv argument in mu_cli and mu_cli_ext.
*/
MU_CLI_OPTION_RETURN_ARGV,
/* Argument: none
* Description: Do not reorder options and arguments.
* Ref: The inorder member of struct mu_cli_setup and
* MU_PARSEOPT_IN_ORDER flag in opt.h
*/
MU_CLI_OPTION_IN_ORDER,
/* Argument: none
* Description: Don't provide standard options: -h, --help, --usage,
* --version.
* Ref: MU_PARSEOPT_NO_STDOPT flag in opt.h
*/
MU_CLI_OPTION_NO_STDOPT,
/* Argument: none
* Description: Don't exit on errors
* Ref: MU_PARSEOPT_NO_ERREXIT flag in opt.h
*/
MU_CLI_OPTION_NO_ERREXIT,
/* Argument: none
* Description: Apply all options immediately.
* Ref: MU_PARSEOPT_IMMEDIATE
*/
MU_CLI_OPTION_IMMEDIATE,
/* Argument: none
* Description: Don't sort options in help output.
* Ref: MU_PARSEOPT_NO_SORT flag in opt.h.
*/
MU_CLI_OPTION_NO_SORT,
/* Argument: char const *
* Description: Override the name of the program to use in error
* messages.
* NULL argument is a no-op.
* Ref: MU_PARSEOPT_PROG_NAME flag in opt.h
*/
MU_CLI_OPTION_PROG_NAME,
/* Argument: char const *
* Description: Documentation string for the program. It will be
* displayed on the line following the usage summary.
* NULL argument is a no-op.
* Ref: MU_PARSEOPT_PROG_DOC
*/
MU_CLI_OPTION_PROG_DOC,
/* Argument: char const *
* Description: Names of arguments for the program. These are
* displayed in the constructed usage summary. For example, if
* this keyword is set tp "A B" and the program name is "foo", then
* the help output will begin with
* Usage: foo A B
*
* Multiple instances are allowed.
* NULL argument is a no-op.
* Ref: MU_PARSEOPT_PROG_ARGS flag in opt.h
*/
MU_CLI_OPTION_PROG_ARGS,
/* Argument: char const *
* Description: Bug address for the package.
* Ref: MU_PARSEOPT_BUG_ADDRESS in opt.h
*/
MU_CLI_OPTION_BUG_ADDRESS,
/* Argument: char const *
* Description: Sets the PACKAGE_NAME.
* NULL argument is a no-op.
* Ref: MU_PARSEOPT_PACKAGE_NAME in opt.h
*/
MU_CLI_OPTION_PACKAGE_NAME,
/* Argument: char const *
* Description: URL of the package.
* NULL argument is a no-op.
* Ref: MU_PARSEOPT_PACKAGE_URL in opt.h
*/
MU_CLI_OPTION_PACKAGE_URL,
/* Argument: char const *
* Description: Extra help information. This will be displayed after
* the option list.
* NULL argument is a no-op.
* Ref: MU_PARSEOPT_EXTRA_INFO in opt.h
*/
MU_CLI_OPTION_EXTRA_INFO,
/* Argument: void (*) (struct mu_parseopt *, mu_stream_t)
* Description: Pointer to a function to be called as a part of the
* --help option handling, after outputting the option list.
* NULL argument is a no-op.
* Ref: po_help_hook member of struct mu_parseopt and the
* MU_PARSEOPT_HELP_HOOK flag in opt.h
*/
MU_CLI_OPTION_HELP_HOOK,
/* Argument: void *
* Description: Call-specific configuration data. This will be passed
* as the last argument to mu_cfg_tree_reduce.
*
* Ref: mu_cfg_tree_reduce
*/
MU_CLI_OPTION_DATA,
/* Argument: void (*) (struct mu_parseopt *, mu_stream_t)
* Description: User function to be called on --version.
* Ref: po_version_hook member of struct mu_parseopt and the
* MU_PARSEOPT_VERSION_HOOK flag in opt.h
*/
MU_CLI_OPTION_VERSION_HOOK,
/* Argument: void (*) (struct mu_parseopt *, mu_stream_t)
* Description: Pointer to a function to be called as a part of the
* --help option handling. This function will be called after printing
* initial program description (see MU_CLI_OPTION_PROG_DOC) and before
* printing the option summary.
* NULL argument is a no-op.
* Ref: po_prog_doc_hook member of struct mu_parseopt and the
* MU_PARSEOPT_PROG_DOC_HOOK in opt.h
*/
MU_CLI_OPTION_PROG_DOC_HOOK,
/* Argument: none
* Description: Long options start with single dash (a la find).
* Disables recognition of traditional short options.
* Ref: MU_PARSEOPT_SINGLE_DASH flag in opt.h
*/
MU_CLI_OPTION_SINGLE_DASH,
/* Argument: char const *
* Description: Prefix that negates the value of a boolean option.
* NULL argument is a no-op.
* Ref: po_negation member of struct mu_parseopt and the
* MU_PARSEOPT_NEGATION flag in opt.h
*/
MU_CLI_OPTION_NEGATION,
/* Argument: char const *
* Description: Descriptive names of special arguments. If given, this
* will be printed in short usage summary after the regular options.
* NULL argument is a no-op.
* Ref: The po_special_args member of struct mu_parseopt and the
* MU_PARSEOPT_SPECIAL_ARGS flag in opt.h
*/
MU_CLI_OPTION_SPECIAL_ARGS,
/* Argument: char const *
* Description: Name of site-wide configuration file to parse. If NULL,
* the default site-wide configuration is assumed.
* Ref: The site_file member of struct mu_cfg_parse_hints and the
* MU_CFHINT_SITE_FILE flag in cfg.h
*/
MU_CLI_OPTION_CONF_SITE_FILE,
/* Argument: none
* Description: Enable the use of per-user configuration files.
* Ref: MU_CFHINT_PER_USER_FILE flag in cfg.h
*/
MU_CLI_OPTION_CONF_PER_USER_FILE,
/* Argument: none
* Description: Don't allow users to override configuration settings
* from the command line.
* Ref: MU_CFHINT_NO_CONFIG_OVERRIDE flag in cfg.h
*/
MU_CLI_OPTION_CONF_NO_OVERRIDE,
/* Argument: char const *
* Description: Identifier of the per-program section in the configuration
* file or name of the per-program configuration file (used when
* processing the "include" statement with a directory name as its
* argument). If NULL or not set, program name is used. See also
* MU_CLI_OPTION_PROG_NAME.
* Ref: MU_CFHINT_PROGRAM flag in cfg.h
*/
MU_CLI_OPTION_CONF_PROGNAME,
};
void mu_cli_simple (int argc, char **argv, ...);
#endif