fdf97932f8bcb5b48358c5e3e4b5ec3886bcde0a
[gnupg.git] / tools / gpgconf.c
1 /* gpgconf.c - Configuration utility for GnuPG
2  *      Copyright (C) 2003 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
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 2 of the License, or
9  * (at your option) any later version.
10  *
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.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19  * USA.
20  */
21
22 #include <config.h>
23 #include <errno.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27
28 #include "gpgconf.h"
29 #include "i18n.h"
30
31 /* Constants to identify the commands and options. */
32 enum cmd_and_opt_values
33   {
34     aNull = 0,
35     oDryRun     = 'n',
36     oOutput     = 'o',
37     oQuiet      = 'q',
38     oVerbose    = 'v',
39     oRuntime    = 'r',
40     oComponent  = 'c',
41     oNoVerbose  = 500,
42     oHomedir,
43
44     aListComponents,
45     aListOptions,
46     aChangeOptions,
47     aApplyDefaults,
48     aCheckConfig
49
50   };
51
52
53 /* The list of commands and options. */
54 static ARGPARSE_OPTS opts[] =
55   {
56     { 300, NULL, 0, N_("@Commands:\n ") },
57     
58     { aListComponents, "list-components", 256, N_("list all components") },
59     { aListOptions, "list-options", 256, N_("|COMPONENT|list options") },
60     { aChangeOptions, "change-options", 256, N_("|COMPONENT|change options") },
61     { aApplyDefaults, "apply-defaults", 256,
62       N_("apply global default values") },
63     { aCheckConfig,   "check-config", 256,
64       N_("check global configuration file") },
65
66     { 301, NULL, 0, N_("@\nOptions:\n ") },
67     
68     { oOutput, "output",    2, N_("use as output file") },
69     { oVerbose, "verbose",  0, N_("verbose") },
70     { oQuiet, "quiet",      0, N_("quiet") },
71     { oDryRun, "dry-run",   0, N_("do not make any changes") },
72     { oRuntime, "runtime",  0, N_("activate changes at runtime, if possible") },
73     /* hidden options */
74     { oNoVerbose, "no-verbose",  0, "@"},
75     {0}
76   };
77
78
79 /* Print usage information and and provide strings for help. */
80 static const char *
81 my_strusage( int level )
82 {
83   const char *p;
84
85   switch (level)
86     {
87     case 11: p = "gpgconf (GnuPG)";
88       break;
89     case 13: p = VERSION; break;
90     case 17: p = PRINTABLE_OS_NAME; break;
91     case 19: p = _("Please report bugs to <" PACKAGE_BUGREPORT ">.\n");
92       break;
93     case 1:
94     case 40: p = _("Usage: gpgconf [options] (-h for help)");
95       break;
96     case 41:
97       p = _("Syntax: gpgconf [options]\n"
98             "Manage configuration options for tools of the GnuPG system\n");
99       break;
100
101     default: p = NULL; break;
102     }
103   return p;
104 }
105
106
107 /* gpgconf main. */
108 int
109 main (int argc, char **argv)
110 {
111   ARGPARSE_ARGS pargs;
112   const char *fname;
113   int no_more_options = 0;
114   enum cmd_and_opt_values cmd = 0;
115
116   set_strusage (my_strusage);
117   log_set_prefix ("gpgconf", 1);
118
119   /* Make sure that our subsystems are ready.  */
120   init_common_subsystems ();
121
122   i18n_init();
123
124   /* Parse the command line. */
125   pargs.argc  = &argc;
126   pargs.argv  = &argv;
127   pargs.flags =  1;  /* Do not remove the args.  */
128   while (!no_more_options && optfile_parse (NULL, NULL, NULL, &pargs, opts))
129     {
130       switch (pargs.r_opt)
131         {
132         case oOutput:    opt.outfile = pargs.r.ret_str; break;
133         case oQuiet:     opt.quiet = 1; break;
134         case oDryRun:    opt.dry_run = 1; break;
135         case oRuntime:
136           opt.runtime = 1;
137           break;
138         case oVerbose:   opt.verbose++; break;
139         case oNoVerbose: opt.verbose = 0; break;
140
141         case aListComponents:
142         case aListOptions:
143         case aChangeOptions:
144         case aApplyDefaults:
145         case aCheckConfig:
146           cmd = pargs.r_opt;
147           break;
148
149         default: pargs.err = 2; break;
150         }
151     }
152
153   if (log_get_errorcount (0))
154     exit (2);
155   
156   fname = argc ? *argv : NULL;
157   
158   switch (cmd)
159     {
160     case aListComponents:
161     default:
162       /* List all components. */
163       gc_component_list_components (stdout);
164       break;
165
166     case aListOptions:
167     case aChangeOptions:
168       if (!fname)
169         {
170           fputs (_("usage: gpgconf [options] "), stderr);
171           putc ('\n',stderr);
172           fputs (_("Need one component argument"), stderr);
173           putc ('\n',stderr);
174           exit (2);
175         }
176       else
177         {
178           int idx = gc_component_find (fname);
179           if (idx < 0)
180             {
181               fputs (_("Component not found"), stderr);
182               putc ('\n', stderr);
183               exit (1);
184             }
185           gc_component_retrieve_options (idx);
186           if (gc_process_gpgconf_conf (NULL, 1, 0))
187             exit (1);
188           if (cmd == aListOptions)
189             gc_component_list_options (idx, stdout);
190           else
191             gc_component_change_options (idx, stdin);
192         }
193       break;
194
195     case aCheckConfig:
196       if (gc_process_gpgconf_conf (fname, 0, 0))
197         exit (1);
198       break;
199
200     case aApplyDefaults:
201       if (fname)
202         {
203           fputs (_("usage: gpgconf [options] "), stderr);
204           putc ('\n',stderr);
205           fputs (_("No argument allowed"), stderr);
206           putc ('\n',stderr);
207           exit (2);
208         }
209       gc_component_retrieve_options (-1);
210       if (gc_process_gpgconf_conf (NULL, 1, 1))
211         exit (1);
212       break;
213
214     }
215   
216   return 0; 
217 }
218
219
220