1 /* gpgconf.c - Configuration utility for GnuPG
2 * Copyright (C) 2003, 2007, 2009 Free Software Foundation, Inc.
4 * This file is part of GnuPG.
6 * GnuPG is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * GnuPG is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
30 /* Constants to identify the commands and options. */
31 enum cmd_and_opt_values
57 /* The list of commands and options. */
58 static ARGPARSE_OPTS opts
[] =
60 { 300, NULL
, 0, N_("@Commands:\n ") },
62 { aListComponents
, "list-components", 256, N_("list all components") },
63 { aCheckPrograms
, "check-programs", 256, N_("check all programs") },
64 { aListOptions
, "list-options", 256, N_("|COMPONENT|list options") },
65 { aChangeOptions
, "change-options", 256, N_("|COMPONENT|change options") },
66 { aCheckOptions
, "check-options", 256, N_("|COMPONENT|check options") },
67 { aApplyDefaults
, "apply-defaults", 256,
68 N_("apply global default values") },
69 { aListDirs
, "list-dirs", 256,
70 N_("get the configuration directories for gpgconf") },
71 { aListConfig
, "list-config", 256,
72 N_("list global configuration file") },
73 { aCheckConfig
, "check-config", 256,
74 N_("check global configuration file") },
75 { aReload
, "reload", 256, "@" },
77 { 301, NULL
, 0, N_("@\nOptions:\n ") },
79 { oOutput
, "output", 2, N_("use as output file") },
80 { oVerbose
, "verbose", 0, N_("verbose") },
81 { oQuiet
, "quiet", 0, N_("quiet") },
82 { oDryRun
, "dry-run", 0, N_("do not make any changes") },
83 { oRuntime
, "runtime", 0, N_("activate changes at runtime, if possible") },
85 { oNoVerbose
, "no-verbose", 0, "@"},
90 /* Print usage information and and provide strings for help. */
92 my_strusage( int level
)
98 case 11: p
= "gpgconf (GnuPG)";
100 case 13: p
= VERSION
; break;
101 case 17: p
= PRINTABLE_OS_NAME
; break;
102 case 19: p
= _("Please report bugs to <@EMAIL@>.\n"); break;
105 case 40: p
= _("Usage: gpgconf [options] (-h for help)");
108 p
= _("Syntax: gpgconf [options]\n"
109 "Manage configuration options for tools of the GnuPG system\n");
112 default: p
= NULL
; break;
118 /* Return the fp for the output. This is usually stdout unless
119 --output has been used. In the latter case this function opens
122 get_outfp (FILE **fp
)
128 *fp
= fopen (opt
.outfile
, "w");
130 gc_error (1, errno
, "can not open `%s'", opt
.outfile
);
141 main (int argc
, char **argv
)
145 int no_more_options
= 0;
146 enum cmd_and_opt_values cmd
= 0;
149 gnupg_reopen_std ("gpgconf");
150 set_strusage (my_strusage
);
151 log_set_prefix ("gpgconf", 1);
153 /* Make sure that our subsystems are ready. */
155 init_common_subsystems ();
157 /* Parse the command line. */
160 pargs
.flags
= 1; /* Do not remove the args. */
161 while (!no_more_options
&& optfile_parse (NULL
, NULL
, NULL
, &pargs
, opts
))
165 case oOutput
: opt
.outfile
= pargs
.r
.ret_str
; break;
166 case oQuiet
: opt
.quiet
= 1; break;
167 case oDryRun
: opt
.dry_run
= 1; break;
171 case oVerbose
: opt
.verbose
++; break;
172 case oNoVerbose
: opt
.verbose
= 0; break;
175 case aListComponents
:
187 default: pargs
.err
= 2; break;
191 if (log_get_errorcount (0))
194 fname
= argc
? *argv
: NULL
;
198 case aListComponents
:
200 /* List all components. */
201 gc_component_list_components (get_outfp (&outfp
));
205 /* Check all programs. */
206 gc_check_programs (get_outfp (&outfp
));
214 fputs (_("usage: gpgconf [options] "), stderr
);
216 fputs (_("Need one component argument"), stderr
);
222 int idx
= gc_component_find (fname
);
225 fputs (_("Component not found"), stderr
);
229 gc_component_retrieve_options (idx
);
230 if (gc_process_gpgconf_conf (NULL
, 1, 0, NULL
))
232 if (cmd
== aListOptions
)
233 gc_component_list_options (idx
, get_outfp (&outfp
));
234 else if (cmd
== aChangeOptions
)
235 gc_component_change_options (idx
, stdin
, get_outfp (&outfp
));
237 gc_component_check_options (idx
, get_outfp (&outfp
), NULL
);
245 gc_component_reload (-1);
249 /* Reload given component. */
252 idx
= gc_component_find (fname
);
255 fputs (_("Component not found"), stderr
);
261 gc_component_reload (idx
);
267 if (gc_process_gpgconf_conf (fname
, 0, 0, get_outfp (&outfp
)))
272 if (gc_process_gpgconf_conf (fname
, 0, 0, NULL
))
279 fputs (_("usage: gpgconf [options] "), stderr
);
281 fputs (_("No argument allowed"), stderr
);
285 gc_component_retrieve_options (-1);
286 if (gc_process_gpgconf_conf (NULL
, 1, 1, NULL
))
291 /* Show the system configuration directories for gpgconf. */
293 fprintf (outfp
, "sysconfdir:%s\n",
294 gc_percent_escape (gnupg_sysconfdir ()));
295 fprintf (outfp
, "bindir:%s\n",
296 gc_percent_escape (gnupg_bindir ()));
297 fprintf (outfp
, "libexecdir:%s\n",
298 gc_percent_escape (gnupg_libexecdir ()));
299 fprintf (outfp
, "libdir:%s\n",
300 gc_percent_escape (gnupg_libdir ()));
301 fprintf (outfp
, "datadir:%s\n",
302 gc_percent_escape (gnupg_datadir ()));
303 fprintf (outfp
, "localedir:%s\n",
304 gc_percent_escape (gnupg_localedir ()));
305 fprintf (outfp
, "dirmngr-socket:%s\n",
306 gc_percent_escape (dirmngr_socket_name ()));
308 char *infostr
= getenv ("GPG_AGENT_INFO");
310 if (!infostr
|| !*infostr
)
311 infostr
= make_filename (default_homedir (), "S.gpg-agent", NULL
);
316 infostr
= xstrdup (infostr
);
317 tmp
= strchr (infostr
, PATHSEP_C
);
318 if (!tmp
|| tmp
== infostr
)
326 fprintf (outfp
, "agent-socket:%s\n",
327 infostr
? gc_percent_escape (infostr
) : "");
331 /* We need to use make_filename to expand a possible "~/". */
332 char *tmp
= make_filename (default_homedir (), NULL
);
333 fprintf (outfp
, "homedir:%s\n", gc_percent_escape (tmp
));
339 if (outfp
&& outfp
!= stdout
)
341 gc_error (1, errno
, "error closing `%s'", opt
.outfile
);