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