From 451cd1b3928172b312ca2597c3318e6e9e8be97d Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Sat, 14 Mar 2020 18:53:43 +0100 Subject: [PATCH] gpgconf: Further simplify the gpgconf option processing. * common/gc-opt-flags.h (GC_OPT_FLAG_RUNTIME): Move to ... * tools/gpgconf-comp.c: here. (known_options_scdaemon): Remove "options". (known_options_dirmngr): Remove "options". (known_options_gpgsm): Remove "options". (known_options_gpg): Remove "options" and "keyserver". (struct gc_option_s): Rename active t gpgconf_list. (gc_component_list_options): Do not act upon active. (option_check_validity): Ditto. (is_known_option): Make it work correctly for unknown options. (retrieve_options_from_program): Use renamed flag gpgconf_list only to detect duplicated items from --gpgconf-list. Do not set runtime. Only e set the options if set by --gpgconf-list; never clear them. * agent/gpg-agent.c: Simplify the --gpgconf-list output. * dirmngr/dirmngr.c: Ditto. * g10/gpg.c: Ditto. * kbx/keyboxd.c: Ditto. * scd/scdaemon.c: Ditto. * sm/gpgsm.c: Ditto. * tests/openpgp/gpgconf.scm: Use "compliance" instead of "keyserver" for the string arg test. -- There is no need to read the list of options from the components unless they convey a default value. It is better to consult only the list we have in gpgconf-comp.c to decide on whether an option should be displayed. Right, this might mess up thing if a newer gpgconf version is used with an older component, but we already print warnings in this case and in general we do not want to support this anymore - the times of gpg 1.4. and 2.0 are long over now. GnuPG-bug-id: 4788 Signed-off-by: Werner Koch --- agent/gpg-agent.c | 67 +++++++-------------------------------- common/gc-opt-flags.h | 4 --- dirmngr/dirmngr.c | 56 ++------------------------------ g10/gpg.c | 37 ++------------------- kbx/keyboxd.c | 20 ------------ scd/scdaemon.c | 34 +++----------------- sm/gpgsm.c | 19 +---------- tests/openpgp/gpgconf.scm | 6 ++-- tools/gpgconf-comp.c | 41 +++++++++++------------- 9 files changed, 44 insertions(+), 240 deletions(-) diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index bec4ba2e9..a7573c2ab 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -1399,70 +1399,27 @@ main (int argc, char **argv) agent_exit (0); else if (gpgconf_list) { - char *filename_esc; - - /* List options and default values in the GPG Conf format. */ - filename_esc = percent_escape (config_filename, NULL); - - es_printf ("%s-%s.conf:%lu:\"%s\n", - GPGCONF_NAME, GPG_AGENT_NAME, - GC_OPT_FLAG_DEFAULT, filename_esc); - xfree (filename_esc); - - es_printf ("verbose:%lu:\n" - "quiet:%lu:\n" - "debug-level:%lu:\"none:\n" - "log-file:%lu:\n", - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME, - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME, - GC_OPT_FLAG_DEFAULT|GC_OPT_FLAG_RUNTIME, - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME ); + /* Note: If an option is runtime changeable, please set the + * respective flag in the gpgconf-comp.c table. */ + es_printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT); es_printf ("default-cache-ttl:%lu:%d:\n", - GC_OPT_FLAG_DEFAULT|GC_OPT_FLAG_RUNTIME, DEFAULT_CACHE_TTL ); + GC_OPT_FLAG_DEFAULT, DEFAULT_CACHE_TTL ); es_printf ("default-cache-ttl-ssh:%lu:%d:\n", - GC_OPT_FLAG_DEFAULT|GC_OPT_FLAG_RUNTIME, DEFAULT_CACHE_TTL_SSH ); + GC_OPT_FLAG_DEFAULT, DEFAULT_CACHE_TTL_SSH ); es_printf ("max-cache-ttl:%lu:%d:\n", - GC_OPT_FLAG_DEFAULT|GC_OPT_FLAG_RUNTIME, MAX_CACHE_TTL ); + GC_OPT_FLAG_DEFAULT, MAX_CACHE_TTL ); es_printf ("max-cache-ttl-ssh:%lu:%d:\n", - GC_OPT_FLAG_DEFAULT|GC_OPT_FLAG_RUNTIME, MAX_CACHE_TTL_SSH ); - es_printf ("enforce-passphrase-constraints:%lu:\n", - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME); + GC_OPT_FLAG_DEFAULT, MAX_CACHE_TTL_SSH ); es_printf ("min-passphrase-len:%lu:%d:\n", - GC_OPT_FLAG_DEFAULT|GC_OPT_FLAG_RUNTIME, MIN_PASSPHRASE_LEN ); + GC_OPT_FLAG_DEFAULT, MIN_PASSPHRASE_LEN ); es_printf ("min-passphrase-nonalpha:%lu:%d:\n", - GC_OPT_FLAG_DEFAULT|GC_OPT_FLAG_RUNTIME, - MIN_PASSPHRASE_NONALPHA); + GC_OPT_FLAG_DEFAULT, MIN_PASSPHRASE_NONALPHA); es_printf ("check-passphrase-pattern:%lu:\n", - GC_OPT_FLAG_DEFAULT|GC_OPT_FLAG_RUNTIME); + GC_OPT_FLAG_DEFAULT); es_printf ("max-passphrase-days:%lu:%d:\n", - GC_OPT_FLAG_DEFAULT|GC_OPT_FLAG_RUNTIME, - MAX_PASSPHRASE_DAYS); - es_printf ("enable-passphrase-history:%lu:\n", - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME); - es_printf ("no-grab:%lu:\n", - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME); - es_printf ("ignore-cache-for-signing:%lu:\n", - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME); - es_printf ("no-allow-external-cache:%lu:\n", - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME); - es_printf ("no-allow-mark-trusted:%lu:\n", - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME); - es_printf ("disable-scdaemon:%lu:\n", - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME); - es_printf ("enable-ssh-support:%lu:\n", GC_OPT_FLAG_NONE); + GC_OPT_FLAG_DEFAULT, MAX_PASSPHRASE_DAYS); es_printf ("ssh-fingerprint-digest:%lu:\"%s:\n", - GC_OPT_FLAG_DEFAULT|GC_OPT_FLAG_RUNTIME, "md5"); -#ifdef HAVE_W32_SYSTEM - es_printf ("enable-putty-support:%lu:\n", GC_OPT_FLAG_NONE); -#endif - es_printf ("no-allow-loopback-pinentry:%lu:\n", - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME); - es_printf ("allow-emacs-pinentry:%lu:\n", - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME); - es_printf ("pinentry-timeout:%lu:0:\n", - GC_OPT_FLAG_DEFAULT|GC_OPT_FLAG_RUNTIME); - es_printf ("grab:%lu:\n", - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME); + GC_OPT_FLAG_DEFAULT, "md5"); agent_exit (0); } diff --git a/common/gc-opt-flags.h b/common/gc-opt-flags.h index 11ecec030..8458aa04f 100644 --- a/common/gc-opt-flags.h +++ b/common/gc-opt-flags.h @@ -20,10 +20,6 @@ #define GC_OPT_FLAG_NONE 0UL -/* The RUNTIME flag for an option indicates that the option can be - changed at runtime. */ -#define GC_OPT_FLAG_RUNTIME (1UL << 3) - /* The DEFAULT flag for an option indicates that the option has a default value. */ #define GC_OPT_FLAG_DEFAULT (1UL << 4) diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c index c9dc4d17a..95f739a0c 100644 --- a/dirmngr/dirmngr.c +++ b/dirmngr/dirmngr.c @@ -1502,71 +1502,19 @@ main (int argc, char **argv) else if (cmd == aGPGConfList) { unsigned long flags = 0; - char *filename; char *filename_esc; - /* First the configuration file. This is not an option, but it - is vital information for GPG Conf. */ - filename = percent_escape (opt.config_filename, NULL); - es_printf ("gpgconf-dirmngr.conf:%lu:\"%s\n", - GC_OPT_FLAG_DEFAULT, filename); - xfree (filename); - - es_printf ("verbose:%lu:\n", flags | GC_OPT_FLAG_NONE); - es_printf ("quiet:%lu:\n", flags | GC_OPT_FLAG_NONE); es_printf ("debug-level:%lu:\"none\n", flags | GC_OPT_FLAG_DEFAULT); - es_printf ("log-file:%lu:\n", flags | GC_OPT_FLAG_NONE); - es_printf ("force:%lu:\n", flags | GC_OPT_FLAG_NONE); - - /* --csh and --sh are mutually exclusive, something we can not - express in GPG Conf. --options is only usable from the - command line, really. --debug-all interacts with --debug, - and having both of them is thus problematic. --no-detach is - also only usable on the command line. --batch is unused. */ - - filename = make_filename (gnupg_homedir (), - "dirmngr_ldapservers.conf", - NULL); - filename_esc = percent_escape (filename, NULL); - es_printf ("ldapserverlist-file:%lu:\"%s\n", flags | GC_OPT_FLAG_DEFAULT, - filename_esc); - xfree (filename_esc); - xfree (filename); - es_printf ("ldaptimeout:%lu:%u\n", - flags | GC_OPT_FLAG_DEFAULT, DEFAULT_LDAP_TIMEOUT); + flags | GC_OPT_FLAG_DEFAULT, DEFAULT_LDAP_TIMEOUT); es_printf ("max-replies:%lu:%u\n", - flags | GC_OPT_FLAG_DEFAULT, DEFAULT_MAX_REPLIES); - es_printf ("allow-ocsp:%lu:\n", flags | GC_OPT_FLAG_NONE); - es_printf ("allow-version-check:%lu:\n", flags | GC_OPT_FLAG_NONE); - es_printf ("ocsp-responder:%lu:\n", flags | GC_OPT_FLAG_NONE); - es_printf ("ocsp-signer:%lu:\n", flags | GC_OPT_FLAG_NONE); - - es_printf ("faked-system-time:%lu:\n", flags | GC_OPT_FLAG_NONE); - es_printf ("no-greeting:%lu:\n", flags | GC_OPT_FLAG_NONE); - - es_printf ("disable-http:%lu:\n", flags | GC_OPT_FLAG_NONE); - es_printf ("disable-ldap:%lu:\n", flags | GC_OPT_FLAG_NONE); - es_printf ("honor-http-proxy:%lu\n", flags | GC_OPT_FLAG_NONE); - es_printf ("http-proxy:%lu:\n", flags | GC_OPT_FLAG_NONE); - es_printf ("ldap-proxy:%lu:\n", flags | GC_OPT_FLAG_NONE); - es_printf ("only-ldap-proxy:%lu:\n", flags | GC_OPT_FLAG_NONE); - es_printf ("ignore-ldap-dp:%lu:\n", flags | GC_OPT_FLAG_NONE); - es_printf ("ignore-http-dp:%lu:\n", flags | GC_OPT_FLAG_NONE); - es_printf ("ignore-ocsp-service-url:%lu:\n", flags | GC_OPT_FLAG_NONE); - /* Note: The next one is to fix a typo in gpgconf - should be - removed eventually. */ - es_printf ("ignore-ocsp-servic-url:%lu:\n", flags | GC_OPT_FLAG_NONE); - - es_printf ("use-tor:%lu:\n", flags | GC_OPT_FLAG_NONE); + flags | GC_OPT_FLAG_DEFAULT, DEFAULT_MAX_REPLIES); filename_esc = percent_escape (get_default_keyserver (0), NULL); es_printf ("keyserver:%lu:\"%s:\n", flags | GC_OPT_FLAG_DEFAULT, filename_esc); xfree (filename_esc); - - es_printf ("nameserver:%lu:\n", flags | GC_OPT_FLAG_NONE); es_printf ("resolver-timeout:%lu:%u\n", flags | GC_OPT_FLAG_DEFAULT, 0); } diff --git a/g10/gpg.c b/g10/gpg.c index c5ba72fb3..3239983a1 100644 --- a/g10/gpg.c +++ b/g10/gpg.c @@ -1928,48 +1928,17 @@ list_config(char *items) } -/* List options and default values in the GPG Conf format. This is a - new tool distributed with gnupg 1.9.x but we also want some limited - support in older gpg versions. The output is the name of the - configuration file and a list of options available for editing by - gpgconf. */ +/* List default values for use by gpgconf. */ static void -gpgconf_list (const char *configfile) +gpgconf_list (void) { - char *configfile_esc = percent_escape (configfile, NULL); - - es_printf ("%s-%s.conf:%lu:\"%s\n", - GPGCONF_NAME, GPG_NAME, - GC_OPT_FLAG_DEFAULT, - configfile_esc ? configfile_esc : "/dev/null"); - es_printf ("verbose:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("quiet:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("keyserver:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("reader-port:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("default-key:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("encrypt-to:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("try-secret-key:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("auto-key-locate:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("auto-key-import:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("include-key-block:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("auto-key-retrieve:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("log-file:%lu:\n", GC_OPT_FLAG_NONE); es_printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT); - es_printf ("group:%lu:\n", GC_OPT_FLAG_NONE); es_printf ("compliance:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT, "gnupg"); - es_printf ("default-new-key-algo:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("trust-model:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("disable-dirmngr:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("max-cert-depth:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("completes-needed:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("marginals-needed:%lu:\n", GC_OPT_FLAG_NONE); /* The next one is an info only item and should match the macros at the top of keygen.c */ es_printf ("default_pubkey_algo:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT, get_default_pubkey_algo ()); - - xfree (configfile_esc); } @@ -3680,7 +3649,7 @@ main (int argc, char **argv) directly after the option parsing. */ if (cmd == aGPGConfList) { - gpgconf_list (last_configname ? last_configname : "UNKNOWN"); + gpgconf_list (); g10_exit (0); } xfree (last_configname); diff --git a/kbx/keyboxd.c b/kbx/keyboxd.c index ffcd0a3fb..5acac97a5 100644 --- a/kbx/keyboxd.c +++ b/kbx/keyboxd.c @@ -670,26 +670,6 @@ main (int argc, char **argv ) kbxd_exit (0); else if (gpgconf_list) { - char *filename; - char *filename_esc; - - /* List options and default values in the gpgconf format. */ - filename = make_filename (gnupg_homedir (), - "keyboxd" EXTSEP_S "conf", NULL); - filename_esc = percent_escape (filename, NULL); - - es_printf ("%s-%s.conf:%lu:\"%s\n", - GPGCONF_NAME, "keyboxd", GC_OPT_FLAG_DEFAULT, filename_esc); - xfree (filename); - xfree (filename_esc); - - es_printf ("verbose:%lu:\n" - "quiet:%lu:\n" - "log-file:%lu:\n", - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME, - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME, - GC_OPT_FLAG_NONE|GC_OPT_FLAG_RUNTIME ); - kbxd_exit (0); } diff --git a/scd/scdaemon.c b/scd/scdaemon.c index fa8d9c4df..b7bbc0361 100644 --- a/scd/scdaemon.c +++ b/scd/scdaemon.c @@ -694,36 +694,10 @@ main (int argc, char **argv ) if (gpgconf_list) { /* List options and default values in the GPG Conf format. */ - char *filename_esc; - - filename_esc = percent_escape (config_filename, NULL); - - es_printf ("%s-%s.conf:%lu:\"%s\n", - GPGCONF_NAME, SCDAEMON_NAME, - GC_OPT_FLAG_DEFAULT, filename_esc); - xfree (filename_esc); - - es_printf ("verbose:%lu:\n" - "quiet:%lu:\n" - "debug-level:%lu:\"none:\n" - "log-file:%lu:\n", - GC_OPT_FLAG_NONE, - GC_OPT_FLAG_NONE, - GC_OPT_FLAG_DEFAULT, - GC_OPT_FLAG_NONE ); - - es_printf ("reader-port:%lu:\n", GC_OPT_FLAG_NONE ); - es_printf ("ctapi-driver:%lu:\n", GC_OPT_FLAG_NONE ); + es_printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT); es_printf ("pcsc-driver:%lu:\"%s:\n", - GC_OPT_FLAG_DEFAULT, DEFAULT_PCSC_DRIVER ); -#ifdef HAVE_LIBUSB - es_printf ("disable-ccid:%lu:\n", GC_OPT_FLAG_NONE ); -#endif - es_printf ("deny-admin:%lu:\n", GC_OPT_FLAG_NONE ); - es_printf ("disable-pinpad:%lu:\n", GC_OPT_FLAG_NONE ); + GC_OPT_FLAG_DEFAULT, DEFAULT_PCSC_DRIVER ); es_printf ("card-timeout:%lu:%d:\n", GC_OPT_FLAG_DEFAULT, 0); - es_printf ("enable-pinpad-varlen:%lu:\n", GC_OPT_FLAG_NONE ); - es_printf ("application-priority:%lu:\n", GC_OPT_FLAG_NONE ); scd_exit (0); } @@ -732,7 +706,9 @@ main (int argc, char **argv ) if (logfile) { log_set_file (logfile); - log_set_prefix (NULL, GPGRT_LOG_WITH_PREFIX | GPGRT_LOG_WITH_TIME | GPGRT_LOG_WITH_PID); + log_set_prefix (NULL, (GPGRT_LOG_WITH_PREFIX + | GPGRT_LOG_WITH_TIME + | GPGRT_LOG_WITH_PID)); } if (debug_wait && pipe_server) diff --git a/sm/gpgsm.c b/sm/gpgsm.c index 2ae121f91..b4a81e368 100644 --- a/sm/gpgsm.c +++ b/sm/gpgsm.c @@ -1860,33 +1860,16 @@ main ( int argc, char **argv) switch (cmd) { case aGPGConfList: - { /* List options and default values in the GPG Conf format. */ - char *config_filename_esc = percent_escape (opt.config_filename, NULL); + { /* List default option values in the GPG Conf format. */ - es_printf ("%s-%s.conf:%lu:\"%s\n", - GPGCONF_NAME, GPGSM_NAME, - GC_OPT_FLAG_DEFAULT, config_filename_esc); - xfree (config_filename_esc); - - es_printf ("verbose:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("quiet:%lu:\n", GC_OPT_FLAG_NONE); es_printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT); - es_printf ("log-file:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("disable-crl-checks:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("enable-crl-checks:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("disable-trusted-cert-crl-check:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("enable-ocsp:%lu:\n", GC_OPT_FLAG_NONE); es_printf ("include-certs:%lu:%d:\n", GC_OPT_FLAG_DEFAULT, DEFAULT_INCLUDE_CERTS); - es_printf ("disable-policy-checks:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("auto-issuer-key-retrieve:%lu:\n", GC_OPT_FLAG_NONE); - es_printf ("disable-dirmngr:%lu:\n", GC_OPT_FLAG_NONE); es_printf ("cipher-algo:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT, DEFAULT_CIPHER_ALGO); es_printf ("p12-charset:%lu:\n", GC_OPT_FLAG_DEFAULT); es_printf ("default-key:%lu:\n", GC_OPT_FLAG_DEFAULT); es_printf ("encrypt-to:%lu:\n", GC_OPT_FLAG_DEFAULT); - es_printf ("keyserver:%lu:\n", GC_OPT_FLAG_NONE); /* The next one is an info only item and should match what proc_parameters actually implements. */ diff --git a/tests/openpgp/gpgconf.scm b/tests/openpgp/gpgconf.scm index a940b4599..6b70f0af3 100644 --- a/tests/openpgp/gpgconf.scm +++ b/tests/openpgp/gpgconf.scm @@ -37,11 +37,11 @@ (assert (or (not (opt::value)) (string=? "" (opt::value))))))) (progress "."))))) (lambda (name . rest) name) - (list "keyserver" "verbose" "quiet") - (list (gpg-config 'gpg "keyserver") + (list "compliance" "verbose" "quiet") + (list (gpg-config 'gpg "compliance") (gpg-config 'gpg "verbose") (gpg-config 'gpg "quiet")) - (list (lambda (i) (if (even? i) "hkp://foo.bar" "hkps://bar.baz")) + (list (lambda (i) (if (even? i) "rfc4880bis" "rfc4880")) ;; gpgconf: argument for option verbose of type 0 (none) must ;; be positive (lambda (i) (+ 1 i)) diff --git a/tools/gpgconf-comp.c b/tools/gpgconf-comp.c index 0700bcf1b..1643eb94c 100644 --- a/tools/gpgconf-comp.c +++ b/tools/gpgconf-comp.c @@ -278,6 +278,9 @@ static const struct several times. A comma separated list of arguments is used as the argument value. */ #define GC_OPT_FLAG_LIST (1UL << 2) +/* The RUNTIME flag for an option indicates that the option can be + changed at runtime. */ +#define GC_OPT_FLAG_RUNTIME (1UL << 3) /* A human-readable description for each flag. */ @@ -366,8 +369,6 @@ static known_option_t known_options_scdaemon[] = { "verbose", GC_OPT_FLAG_LIST|GC_OPT_FLAG_RUNTIME, GC_LEVEL_BASIC }, { "quiet", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC }, { "no-greeting", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE }, - { "options", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT, - GC_ARG_TYPE_FILENAME }, { "reader-port", GC_OPT_FLAG_RUNTIME, GC_LEVEL_BASIC }, { "ctapi-driver", GC_OPT_FLAG_RUNTIME, GC_LEVEL_ADVANCED }, { "pcsc-driver", GC_OPT_FLAG_RUNTIME, GC_LEVEL_ADVANCED }, @@ -395,8 +396,6 @@ static known_option_t known_options_gpg[] = { "encrypt-to", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC }, { "group", GC_OPT_FLAG_LIST, GC_LEVEL_ADVANCED, GC_ARG_TYPE_ALIAS_LIST}, - { "options", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE, - GC_ARG_TYPE_FILENAME }, { "compliance", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT }, { "default-new-key-algo", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE }, { "trust-model", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE }, @@ -428,8 +427,6 @@ static known_option_t known_options_gpgsm[] = { "no-greeting", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE }, { "default-key", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC }, { "encrypt-to", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC }, - { "options", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT, - GC_ARG_TYPE_FILENAME }, { "disable-dirmngr", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT }, { "p12-charset", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED }, { "keyserver", GC_OPT_FLAG_LIST, GC_LEVEL_BASIC, @@ -462,8 +459,6 @@ static known_option_t known_options_dirmngr[] = { "verbose", GC_OPT_FLAG_LIST, GC_LEVEL_BASIC }, { "quiet", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC }, { "no-greeting", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE }, - { "options", GC_OPT_FLAG_NONE, GC_LEVEL_EXPERT, - GC_ARG_TYPE_FILENAME }, { "resolver-timeout", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE }, { "nameserver", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE }, { "debug-level", GC_OPT_FLAG_ARG_OPT, GC_LEVEL_ADVANCED }, @@ -516,7 +511,7 @@ struct gc_option_s unsigned int opt_arg:1; /* The option's argument is optional. */ unsigned int runtime:1; /* The option is runtime changeable. */ - unsigned int active:1; /* Has been announced in gpgconf-list. */ + unsigned int gpgconf_list:1; /* Mentioned by --gpgconf-list. */ unsigned int has_default:1; /* The option has a default value. */ unsigned int def_in_desc:1; /* The default is in the descrition. */ @@ -1426,7 +1421,7 @@ gc_component_list_options (int component, estream_t out) { /* Do not output unknown or internal options. */ if (!option->is_header - && (!option->active || option->level == GC_LEVEL_INTERNAL)) + && option->level == GC_LEVEL_INTERNAL) continue; if (option->is_header) @@ -1477,7 +1472,7 @@ is_known_option (gc_component_id_t component, const char *name) if (!strcmp (option->name, name)) break; } - return option; + return (option && option->name)? option : NULL; } @@ -1669,7 +1664,7 @@ retrieve_options_from_program (gc_component_id_t component, int only_installed) * We need to check the code whether both specifications match. */ if ((known_option->flags & GC_OPT_FLAG_ARG_OPT)) opt_info[opt_info_used].opt_arg = 1; - /* Same here. */ + if ((known_option->flags & GC_OPT_FLAG_RUNTIME)) opt_info[opt_info_used].runtime = 1; @@ -1766,18 +1761,20 @@ retrieve_options_from_program (gc_component_id_t component, int only_installed) option = find_option (component, line); if (option) { - if (option->active) + if (option->gpgconf_list) gc_error (1, errno, "option %s returned twice from \"%s --gpgconf-list\"", line, pgmname); - option->active = 1; + option->gpgconf_list = 1; - /* Runtime is duplicated - see above. */ - option->runtime = !!(flags & GC_OPT_FLAG_RUNTIME); - option->has_default = !!(flags & GC_OPT_FLAG_DEFAULT); - option->def_in_desc = !!(flags & GC_OPT_FLAG_DEF_DESC); - option->no_arg_desc = !!(flags & GC_OPT_FLAG_NO_ARG_DESC); - option->no_change = !!(flags & GC_OPT_FLAG_NO_CHANGE); + if ((flags & GC_OPT_FLAG_DEFAULT)) + option->has_default = 1; + if ((flags & GC_OPT_FLAG_DEF_DESC)) + option->def_in_desc = 1; + if ((flags & GC_OPT_FLAG_NO_ARG_DESC)) + option->no_arg_desc = 1; + if ((flags & GC_OPT_FLAG_NO_CHANGE)) + option->no_change = 1; if (default_value && *default_value) option->default_value = xstrdup (default_value); @@ -1923,9 +1920,7 @@ option_check_validity (gc_component_id_t component, { char *arg; - if (!option->active) - gc_error (1, 0, "option %s not supported by component %s", - option->name, gc_component[component].name); + (void)component; if (option->new_flags || option->new_value) gc_error (1, 0, "option %s already changed", option->name);