diff --git a/doc/tools.texi b/doc/tools.texi index 21db4c716..902f080e2 100644 --- a/doc/tools.texi +++ b/doc/tools.texi @@ -421,7 +421,7 @@ tabulator sheet per component. The command argument @code{--list-components} lists all available components, one per line. The format of each line is: -@code{@var{name}:@var{description}} +@code{@var{name}:@var{description}:@var{pgmname}:} @table @var @item name @@ -435,16 +435,21 @@ The @emph{string} in this field contains a human-readable description of the component. It can be displayed to the user of the GUI for informational purposes. It is @emph{percent-escaped} and @emph{localized}. + +@item pgmname +The @emph{string} in this field contains the absolute name of the +program's file. It can be used to unambiguously invoke that program. +It is @emph{percent-escaped}. @end table Example: @example $ gpgconf --list-components -gpg:GPG for OpenPGP -gpg-agent:GPG Agent -scdaemon:Smartcard Daemon -gpgsm:GPG for S/MIME -dirmngr:Directory Manager +gpg:GPG for OpenPGP:/usr/local/bin/gpg2: +gpg-agent:GPG Agent:/usr/local/bin/gpg-agent: +scdaemon:Smartcard Daemon:/usr/local/bin/scdaemon: +gpgsm:GPG for S/MIME:/usr/local/bin/gpgsm: +dirmngr:Directory Manager:/usr/local/bin/dirmngr: @end example diff --git a/tools/ChangeLog b/tools/ChangeLog index bc020286f..4a1a4ead1 100644 --- a/tools/ChangeLog +++ b/tools/ChangeLog @@ -1,3 +1,8 @@ +2007-08-31 Werner Koch + + * gpgconf-comp.c (gc_component_list_components): List the programs + names. + 2007-08-29 Werner Koch * gpgconf.c: New command --check-programs. diff --git a/tools/gpgconf-comp.c b/tools/gpgconf-comp.c index 349bc29c1..e70a4715b 100644 --- a/tools/gpgconf-comp.c +++ b/tools/gpgconf-comp.c @@ -1142,16 +1142,43 @@ percent_deescape (const char *src) void gc_component_list_components (FILE *out) { - gc_component_t idx; + gc_component_t component; + gc_option_t *option; + gc_backend_t backend; + int backend_seen[GC_BACKEND_NR]; + const char *desc; + const char *pgmname; - for (idx = 0; idx < GC_COMPONENT_NR; idx++) + for (component = 0; component < GC_COMPONENT_NR; component++) { - if (gc_component[idx].options) + option = gc_component[component].options; + if (option) { - const char *desc = gc_component[idx].desc; - desc = my_dgettext (gc_component[idx].desc_domain, desc); - fprintf (out, "%s:%s\n", - gc_component[idx].name, my_percent_escape (desc)); + for (backend = 0; backend < GC_BACKEND_NR; backend++) + backend_seen[backend] = 0; + + pgmname = ""; + for (; option && option->name; option++) + { + if ((option->flags & GC_OPT_FLAG_GROUP)) + continue; + backend = option->backend; + if (backend_seen[backend]) + continue; + backend_seen[backend] = 1; + assert (backend != GC_BACKEND_ANY); + if (gc_backend[backend].program + && !gc_backend[backend].module_name) + continue; + pgmname = gnupg_module_name (gc_backend[backend].module_name); + break; + } + + desc = gc_component[component].desc; + desc = my_dgettext (gc_component[component].desc_domain, desc); + fprintf (out, "%s:%s:", + gc_component[component].name, my_percent_escape (desc)); + fprintf (out, "%s:\n", my_percent_escape (pgmname)); } } }